@oh-my-pi/pi-coding-agent 17.2.4 → 17.2.5

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 (319) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/{CHANGELOG-bpmhv26t.md → CHANGELOG-q2w43aw3.md} +51 -0
  3. package/dist/cli.js +4148 -3717
  4. package/dist/{template-8vdv6xb4.js → template-c2hyaytt.js} +8 -26
  5. package/dist/types/cli/args.d.ts +4 -1
  6. package/dist/types/cli/browser-relay-cli.d.ts +15 -0
  7. package/dist/types/cli/command-help.d.ts +99 -0
  8. package/dist/types/cli/help-extra.d.ts +2 -0
  9. package/dist/types/cli/thinking-levels.d.ts +5 -0
  10. package/dist/types/cli/update-cli.d.ts +13 -0
  11. package/dist/types/commands/browser-relay.d.ts +38 -0
  12. package/dist/types/commands/commit.d.ts +3 -0
  13. package/dist/types/commands/complete.d.ts +1 -1
  14. package/dist/types/commands/completions.d.ts +6 -0
  15. package/dist/types/commands/grep.d.ts +3 -0
  16. package/dist/types/commands/join.d.ts +4 -0
  17. package/dist/types/commands/launch-help.d.ts +171 -0
  18. package/dist/types/commands/launch.d.ts +5 -1
  19. package/dist/types/commands/models.d.ts +3 -0
  20. package/dist/types/commands/say.d.ts +10 -0
  21. package/dist/types/commands/worktree.d.ts +3 -0
  22. package/dist/types/config/keybindings.d.ts +5 -0
  23. package/dist/types/config/model-discovery.d.ts +2 -2
  24. package/dist/types/config/models-config-schema-bundle.d.ts +3 -0
  25. package/dist/types/config/models-config-schema.d.ts +2 -0
  26. package/dist/types/config/models-config.d.ts +1 -0
  27. package/dist/types/config/service-tier.d.ts +2 -0
  28. package/dist/types/config/settings-schema.d.ts +69 -21
  29. package/dist/types/cursor-bridge-tools.d.ts +1 -1
  30. package/dist/types/cursor.d.ts +7 -4
  31. package/dist/types/edit/index.d.ts +3 -3
  32. package/dist/types/edit/modes/replace.d.ts +22 -15
  33. package/dist/types/edit/renderer.d.ts +1 -1
  34. package/dist/types/eval/py/kernel.d.ts +3 -1
  35. package/dist/types/eval/py/spawn-options.d.ts +12 -16
  36. package/dist/types/extensibility/legacy-pi-ai-shim.d.ts +8 -1
  37. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +1 -1
  38. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +2 -0
  39. package/dist/types/launch/broker.d.ts +1 -1
  40. package/dist/types/launch/client.d.ts +6 -3
  41. package/dist/types/launch/ensure.d.ts +8 -0
  42. package/dist/types/launch/paths.d.ts +1 -1
  43. package/dist/types/launch/protocol.d.ts +2 -2
  44. package/dist/types/lsp/client.d.ts +2 -0
  45. package/dist/types/lsp/mux/daemon.d.ts +15 -0
  46. package/dist/types/lsp/mux/protocol.d.ts +57 -0
  47. package/dist/types/lsp/mux/server.d.ts +18 -0
  48. package/dist/types/lsp/types.d.ts +22 -2
  49. package/dist/types/main.d.ts +2 -0
  50. package/dist/types/mnemopi/embed-client.d.ts +1 -1
  51. package/dist/types/mnemopi/state.d.ts +0 -23
  52. package/dist/types/modes/components/assistant-message.d.ts +2 -0
  53. package/dist/types/modes/components/custom-editor.d.ts +2 -1
  54. package/dist/types/modes/components/read-tool-group.d.ts +2 -0
  55. package/dist/types/modes/components/stripped-tool-calls-placeholder.d.ts +12 -0
  56. package/dist/types/modes/components/tool-execution.d.ts +2 -0
  57. package/dist/types/modes/controllers/input-controller.d.ts +1 -0
  58. package/dist/types/modes/interactive-mode.d.ts +1 -0
  59. package/dist/types/modes/types.d.ts +1 -0
  60. package/dist/types/modes/workflow.d.ts +2 -1
  61. package/dist/types/sdk.d.ts +3 -1
  62. package/dist/types/secrets/index.d.ts +1 -1
  63. package/dist/types/session/agent-session-types.d.ts +3 -1
  64. package/dist/types/session/indexed-session-storage.d.ts +1 -0
  65. package/dist/types/session/session-advisors.d.ts +1 -1
  66. package/dist/types/session/session-context.d.ts +2 -1
  67. package/dist/types/session/session-maintenance.d.ts +1 -0
  68. package/dist/types/session/session-manager.d.ts +16 -11
  69. package/dist/types/session/session-stats.d.ts +10 -0
  70. package/dist/types/session/session-storage.d.ts +15 -3
  71. package/dist/types/system-prompt.d.ts +4 -1
  72. package/dist/types/task/index.d.ts +2 -1
  73. package/dist/types/task/spawn-policy.d.ts +5 -0
  74. package/dist/types/thinking.d.ts +1 -7
  75. package/dist/types/tools/ast-grep.d.ts +1 -1
  76. package/dist/types/tools/browser/registry.d.ts +2 -1
  77. package/dist/types/tools/browser/relay/bridge.d.ts +35 -0
  78. package/dist/types/tools/browser/relay/daemon.d.ts +16 -0
  79. package/dist/types/tools/browser/relay/kind.d.ts +19 -0
  80. package/dist/types/tools/browser/relay/protocol.d.ts +97 -0
  81. package/dist/types/tools/browser/relay/server.d.ts +35 -0
  82. package/dist/types/tools/browser/render.d.ts +1 -0
  83. package/dist/types/tools/browser.d.ts +3 -0
  84. package/dist/types/tools/computer/exposure.d.ts +9 -7
  85. package/dist/types/tools/computer/protocol.d.ts +70 -17
  86. package/dist/types/tools/computer/supervisor.d.ts +23 -10
  87. package/dist/types/tools/computer/worker-entry.d.ts +1 -0
  88. package/dist/types/tools/computer/worker.d.ts +42 -7
  89. package/dist/types/tools/computer-renderer.d.ts +7 -5
  90. package/dist/types/tools/computer.d.ts +25 -44
  91. package/dist/types/tools/context.d.ts +3 -0
  92. package/dist/types/tools/glob.d.ts +1 -1
  93. package/dist/types/tools/grep.d.ts +1 -1
  94. package/dist/types/tools/render-utils.d.ts +2 -0
  95. package/dist/types/tools/{browser/run-cancellation.d.ts → run-scope.d.ts} +8 -8
  96. package/dist/types/tools/tool-timeouts.d.ts +5 -0
  97. package/dist/types/tools/xdev.d.ts +8 -0
  98. package/dist/types/utils/clipboard.d.ts +2 -2
  99. package/dist/types/web/kagi.d.ts +1 -0
  100. package/dist/types/web/search/index.d.ts +1 -1
  101. package/dist/types/web/search/providers/anthropic.d.ts +1 -0
  102. package/dist/types/web/search/providers/base.d.ts +2 -0
  103. package/dist/types/web/search/providers/brave.d.ts +1 -0
  104. package/dist/types/web/search/providers/browser-page.d.ts +1 -0
  105. package/dist/types/web/search/providers/codex.d.ts +1 -0
  106. package/dist/types/web/search/providers/exa.d.ts +1 -0
  107. package/dist/types/web/search/providers/firecrawl.d.ts +1 -0
  108. package/dist/types/web/search/providers/gemini.d.ts +1 -0
  109. package/dist/types/web/search/providers/jina.d.ts +1 -0
  110. package/dist/types/web/search/providers/kagi.d.ts +1 -0
  111. package/dist/types/web/search/providers/kimi.d.ts +1 -0
  112. package/dist/types/web/search/providers/parallel.d.ts +1 -0
  113. package/dist/types/web/search/providers/perplexity.d.ts +1 -0
  114. package/dist/types/web/search/providers/searxng.d.ts +1 -0
  115. package/dist/types/web/search/providers/tavily.d.ts +1 -0
  116. package/dist/types/web/search/providers/tinyfish.d.ts +1 -0
  117. package/dist/types/web/search/providers/utils.d.ts +6 -9
  118. package/dist/types/web/search/providers/zai.d.ts +1 -0
  119. package/dist/types/web/search/types.d.ts +4 -0
  120. package/package.json +12 -12
  121. package/src/cli/args.ts +7 -87
  122. package/src/cli/browser-relay-cli.ts +119 -0
  123. package/src/cli/command-help.ts +103 -0
  124. package/src/cli/completion-gen.ts +5 -5
  125. package/src/cli/flag-tables.ts +9 -0
  126. package/src/cli/help-extra.ts +89 -0
  127. package/src/cli/setup-cli.ts +13 -21
  128. package/src/cli/thinking-levels.ts +7 -0
  129. package/src/cli/update-cli.ts +26 -7
  130. package/src/cli-commands.ts +170 -33
  131. package/src/cli.ts +17 -5
  132. package/src/commands/acp.ts +3 -1
  133. package/src/commands/agents.ts +3 -2
  134. package/src/commands/auth-broker.ts +3 -2
  135. package/src/commands/auth-gateway.ts +3 -2
  136. package/src/commands/bench.ts +2 -3
  137. package/src/commands/browser-relay.ts +53 -0
  138. package/src/commands/cleanse.ts +2 -2
  139. package/src/commands/commit.ts +3 -2
  140. package/src/commands/complete.ts +2 -1
  141. package/src/commands/completions.ts +3 -2
  142. package/src/commands/config.ts +3 -2
  143. package/src/commands/dry-balance.ts +2 -2
  144. package/src/commands/gallery.ts +3 -2
  145. package/src/commands/gc.ts +3 -2
  146. package/src/commands/grep.ts +3 -2
  147. package/src/commands/grievances.ts +3 -2
  148. package/src/commands/install.ts +2 -2
  149. package/src/commands/join.ts +3 -2
  150. package/src/commands/launch-help.ts +116 -0
  151. package/src/commands/launch.ts +7 -191
  152. package/src/commands/models.ts +3 -2
  153. package/src/commands/plugin.ts +3 -2
  154. package/src/commands/read.ts +3 -2
  155. package/src/commands/say.ts +3 -2
  156. package/src/commands/setup.ts +3 -2
  157. package/src/commands/shell.ts +3 -2
  158. package/src/commands/ssh.ts +3 -2
  159. package/src/commands/stats.ts +3 -2
  160. package/src/commands/tiny-models.ts +2 -2
  161. package/src/commands/token.ts +2 -2
  162. package/src/commands/ttsr.ts +2 -2
  163. package/src/commands/update.ts +3 -2
  164. package/src/commands/usage.ts +3 -2
  165. package/src/commands/web-search.ts +3 -2
  166. package/src/commands/worktree.ts +3 -2
  167. package/src/config/keybindings.ts +5 -0
  168. package/src/config/model-discovery.ts +30 -13
  169. package/src/config/model-registry.ts +9 -5
  170. package/src/config/models-config-schema-bundle.ts +9 -0
  171. package/src/config/resolve-config-value.ts +2 -1
  172. package/src/config/service-tier.ts +5 -0
  173. package/src/config/settings-schema.ts +72 -20
  174. package/src/cursor-bridge-tools.ts +1 -1
  175. package/src/cursor.ts +10 -14
  176. package/src/edit/diff.ts +17 -8
  177. package/src/edit/index.ts +20 -7
  178. package/src/edit/modes/replace.ts +93 -40
  179. package/src/edit/renderer.ts +1 -1
  180. package/src/edit/streaming.ts +14 -17
  181. package/src/eval/py/kernel.ts +2 -1
  182. package/src/eval/py/spawn-options.ts +24 -29
  183. package/src/export/html/template.js +8 -26
  184. package/src/extensibility/extensions/wrapper.ts +1 -0
  185. package/src/extensibility/legacy-pi-ai-shim.ts +22 -1
  186. package/src/extensibility/legacy-pi-coding-agent-shim.ts +7 -6
  187. package/src/extensibility/plugins/legacy-pi-compat.ts +124 -57
  188. package/src/extensibility/skills.ts +11 -0
  189. package/src/extensibility/utils.ts +10 -2
  190. package/src/launch/broker.ts +1 -1
  191. package/src/launch/client.ts +32 -13
  192. package/src/launch/ensure.ts +73 -0
  193. package/src/launch/paths.ts +1 -1
  194. package/src/launch/protocol.ts +2 -2
  195. package/src/lsp/client.ts +23 -2
  196. package/src/lsp/index.ts +8 -0
  197. package/src/lsp/mux/daemon.ts +348 -0
  198. package/src/lsp/mux/protocol.ts +96 -0
  199. package/src/lsp/mux/server.ts +797 -0
  200. package/src/lsp/types.ts +28 -2
  201. package/src/main.ts +7 -2
  202. package/src/mcp/oauth-flow.ts +11 -1
  203. package/src/mnemopi/embed-client.ts +49 -2
  204. package/src/mnemopi/state.ts +57 -23
  205. package/src/modes/components/assistant-message.ts +11 -0
  206. package/src/modes/components/chat-transcript-builder.ts +4 -0
  207. package/src/modes/components/custom-editor.ts +9 -0
  208. package/src/modes/components/read-tool-group.ts +10 -0
  209. package/src/modes/components/status-line/component.ts +1 -1
  210. package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
  211. package/src/modes/components/tool-execution.ts +8 -0
  212. package/src/modes/components/tree-selector.ts +46 -48
  213. package/src/modes/controllers/event-controller.ts +17 -0
  214. package/src/modes/controllers/input-controller.ts +39 -1
  215. package/src/modes/controllers/mcp-command-controller.ts +11 -5
  216. package/src/modes/controllers/selector-controller.ts +20 -0
  217. package/src/modes/interactive-mode.ts +2 -0
  218. package/src/modes/types.ts +1 -0
  219. package/src/modes/utils/hotkeys-markdown.ts +1 -0
  220. package/src/modes/utils/interactive-context-helpers.ts +1 -0
  221. package/src/modes/utils/ui-helpers.ts +6 -10
  222. package/src/modes/workflow.ts +8 -2
  223. package/src/prompts/agents/init.md +1 -1
  224. package/src/prompts/system/plan-mode-active.md +2 -2
  225. package/src/prompts/system/system-prompt.md +26 -52
  226. package/src/prompts/system/workflow-notice.md +3 -3
  227. package/src/prompts/tools/ast-grep.md +1 -1
  228. package/src/prompts/tools/bash.md +1 -1
  229. package/src/prompts/tools/browser.md +1 -0
  230. package/src/prompts/tools/computer.md +21 -21
  231. package/src/prompts/tools/glob.md +1 -1
  232. package/src/prompts/tools/grep.md +1 -1
  233. package/src/prompts/tools/replace.md +5 -4
  234. package/src/prompts/tools/task.md +4 -4
  235. package/src/sdk.ts +34 -6
  236. package/src/secrets/index.ts +1 -1
  237. package/src/session/agent-session-types.ts +3 -1
  238. package/src/session/agent-session.ts +13 -1
  239. package/src/session/indexed-session-storage.ts +9 -0
  240. package/src/session/prewalk.ts +24 -2
  241. package/src/session/session-advisors.ts +2 -2
  242. package/src/session/session-context.ts +16 -12
  243. package/src/session/session-dump-format.ts +1 -1
  244. package/src/session/session-maintenance.ts +38 -4
  245. package/src/session/session-manager.ts +102 -67
  246. package/src/session/session-paths.ts +118 -55
  247. package/src/session/session-stats.ts +48 -3
  248. package/src/session/session-storage.ts +30 -22
  249. package/src/session/stream-guards.ts +1 -1
  250. package/src/slash-commands/builtin-registry.ts +27 -24
  251. package/src/system-prompt.ts +8 -3
  252. package/src/task/index.ts +23 -8
  253. package/src/task/spawn-policy.ts +14 -0
  254. package/src/thinking.ts +2 -8
  255. package/src/tools/ast-grep.ts +10 -4
  256. package/src/tools/browser/cmux/cmux-tab.ts +5 -10
  257. package/src/tools/browser/cmux/rpc.ts +2 -8
  258. package/src/tools/browser/registry.ts +53 -2
  259. package/src/tools/browser/relay/bridge.ts +945 -0
  260. package/src/tools/browser/relay/daemon.ts +117 -0
  261. package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
  262. package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
  263. package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
  264. package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
  265. package/src/tools/browser/relay/kind.ts +41 -0
  266. package/src/tools/browser/relay/protocol.ts +54 -0
  267. package/src/tools/browser/relay/server.ts +141 -0
  268. package/src/tools/browser/render.ts +4 -1
  269. package/src/tools/browser/shared-daemon.ts +7 -58
  270. package/src/tools/browser/tab-supervisor.ts +5 -4
  271. package/src/tools/browser/tab-worker.ts +33 -12
  272. package/src/tools/browser.ts +26 -1
  273. package/src/tools/computer/exposure.ts +11 -35
  274. package/src/tools/computer/protocol.ts +51 -10
  275. package/src/tools/computer/supervisor.ts +227 -124
  276. package/src/tools/computer/worker-entry.ts +11 -6
  277. package/src/tools/computer/worker.ts +695 -81
  278. package/src/tools/computer-renderer.ts +104 -65
  279. package/src/tools/computer.ts +134 -428
  280. package/src/tools/context.ts +3 -0
  281. package/src/tools/glob.ts +9 -2
  282. package/src/tools/grep.ts +12 -6
  283. package/src/tools/inspect-image.ts +32 -6
  284. package/src/tools/render-utils.ts +2 -0
  285. package/src/tools/{browser/run-cancellation.ts → run-scope.ts} +11 -11
  286. package/src/tools/tool-timeouts.ts +1 -0
  287. package/src/tools/xdev.ts +29 -2
  288. package/src/utils/clipboard.ts +40 -14
  289. package/src/utils/command-args.ts +26 -28
  290. package/src/utils/tool-choice.ts +0 -13
  291. package/src/web/kagi.ts +2 -1
  292. package/src/web/search/index.ts +18 -2
  293. package/src/web/search/providers/anthropic.ts +4 -1
  294. package/src/web/search/providers/base.ts +2 -0
  295. package/src/web/search/providers/brave.ts +3 -1
  296. package/src/web/search/providers/browser-page.ts +6 -4
  297. package/src/web/search/providers/codex.ts +4 -1
  298. package/src/web/search/providers/duckduckgo.ts +2 -1
  299. package/src/web/search/providers/ecosia.ts +2 -1
  300. package/src/web/search/providers/exa.ts +4 -2
  301. package/src/web/search/providers/firecrawl.ts +3 -1
  302. package/src/web/search/providers/gemini.ts +8 -2
  303. package/src/web/search/providers/google.ts +2 -1
  304. package/src/web/search/providers/jina.ts +12 -2
  305. package/src/web/search/providers/kagi.ts +3 -0
  306. package/src/web/search/providers/kimi.ts +5 -1
  307. package/src/web/search/providers/mojeek.ts +2 -1
  308. package/src/web/search/providers/parallel.ts +5 -1
  309. package/src/web/search/providers/perplexity.ts +6 -3
  310. package/src/web/search/providers/public.ts +1 -1
  311. package/src/web/search/providers/searxng.ts +11 -5
  312. package/src/web/search/providers/startpage.ts +10 -4
  313. package/src/web/search/providers/synthetic.ts +11 -5
  314. package/src/web/search/providers/tavily.ts +3 -1
  315. package/src/web/search/providers/tinyfish.ts +3 -1
  316. package/src/web/search/providers/utils.ts +12 -10
  317. package/src/web/search/providers/xai.ts +2 -2
  318. package/src/web/search/providers/zai.ts +18 -3
  319. package/src/web/search/types.ts +6 -0
@@ -924,6 +924,16 @@ export declare const SETTINGS_SCHEMA: {
924
924
  readonly description: "Reveal assistant text and streamed tool input smoothly while chunks arrive";
925
925
  };
926
926
  };
927
+ readonly "display.hideToolActivity": {
928
+ readonly type: "boolean";
929
+ readonly default: false;
930
+ readonly ui: {
931
+ readonly tab: "appearance";
932
+ readonly group: "Display";
933
+ readonly label: "Hide Tool Activity";
934
+ readonly description: "Hide model-initiated tool calls and results from the transcript";
935
+ };
936
+ };
927
937
  readonly "display.showTokenUsage": {
928
938
  readonly type: "boolean";
929
939
  readonly default: false;
@@ -3499,6 +3509,16 @@ export declare const SETTINGS_SCHEMA: {
3499
3509
  readonly description: "Start language servers on first use (lsp tool or editing a matching file type) instead of at session startup";
3500
3510
  };
3501
3511
  };
3512
+ readonly "lsp.shared": {
3513
+ readonly type: "boolean";
3514
+ readonly default: true;
3515
+ readonly ui: {
3516
+ readonly tab: "files";
3517
+ readonly group: "LSP";
3518
+ readonly label: "Shared Language Servers";
3519
+ readonly description: "Share one language server per project across omp instances via the daemon broker (falls back to private servers when unavailable)";
3520
+ };
3521
+ };
3502
3522
  readonly "lsp.formatOnWrite": {
3503
3523
  readonly type: "boolean";
3504
3524
  readonly default: false;
@@ -3994,25 +4014,7 @@ export declare const SETTINGS_SCHEMA: {
3994
4014
  readonly tab: "tools";
3995
4015
  readonly group: "Available Tools";
3996
4016
  readonly label: "Computer";
3997
- readonly description: "Enable native host-desktop screenshots and input for OpenAI computer use";
3998
- };
3999
- };
4000
- readonly "computer.backend": {
4001
- readonly type: "enum";
4002
- readonly values: readonly ["auto", "native"];
4003
- readonly default: "auto";
4004
- readonly ui: {
4005
- readonly tab: "tools";
4006
- readonly group: "Computer";
4007
- readonly label: "Computer Backend";
4008
- readonly description: "Select automatic or explicit platform-native desktop capture and input";
4009
- readonly options: readonly [{
4010
- readonly value: "auto";
4011
- readonly label: "Auto";
4012
- }, {
4013
- readonly value: "native";
4014
- readonly label: "Native";
4015
- }];
4017
+ readonly description: "Enable the scriptable host-desktop control tool (screenshots, input, accessibility)";
4016
4018
  };
4017
4019
  };
4018
4020
  readonly "computer.display": {
@@ -4027,7 +4029,7 @@ export declare const SETTINGS_SCHEMA: {
4027
4029
  };
4028
4030
  readonly "computer.maxWidth": {
4029
4031
  readonly type: "number";
4030
- readonly default: 1920;
4032
+ readonly default: 3840;
4031
4033
  readonly ui: {
4032
4034
  readonly tab: "tools";
4033
4035
  readonly group: "Computer";
@@ -4037,7 +4039,7 @@ export declare const SETTINGS_SCHEMA: {
4037
4039
  };
4038
4040
  readonly "computer.maxHeight": {
4039
4041
  readonly type: "number";
4040
- readonly default: 1200;
4042
+ readonly default: 2400;
4041
4043
  readonly ui: {
4042
4044
  readonly tab: "tools";
4043
4045
  readonly group: "Computer";
@@ -4191,6 +4193,26 @@ export declare const SETTINGS_SCHEMA: {
4191
4193
  readonly description: "Default HTTP CDP discovery endpoint (for example http://127.0.0.1:9222) to attach to instead of launching a browser. Explicit app.cdp_url or app.path on the tool call take precedence.";
4192
4194
  };
4193
4195
  };
4196
+ readonly "browser.relay": {
4197
+ readonly type: "boolean";
4198
+ readonly default: false;
4199
+ readonly ui: {
4200
+ readonly tab: "tools";
4201
+ readonly group: "Grep & Browser";
4202
+ readonly label: "Browser Relay";
4203
+ readonly description: "Drive your own Chrome tabs through the omp browser relay. Install the extension once (`omp browser-relay install`); the relay server auto-starts when the browser tool needs it. Takes precedence over Browser CDP URL; set PI_BROWSER_RELAY=0 or PI_BROWSER_RELAY=1 to override.";
4204
+ };
4205
+ };
4206
+ readonly "browser.relayUrl": {
4207
+ readonly type: "string";
4208
+ readonly default: undefined;
4209
+ readonly ui: {
4210
+ readonly tab: "tools";
4211
+ readonly group: "Grep & Browser";
4212
+ readonly label: "Browser Relay URL";
4213
+ readonly description: "omp browser relay endpoint (default http://127.0.0.1:9224).";
4214
+ };
4215
+ };
4194
4216
  readonly "browser.headless": {
4195
4217
  readonly type: "boolean";
4196
4218
  readonly default: true;
@@ -5186,6 +5208,32 @@ export declare const SETTINGS_SCHEMA: {
5186
5208
  })[];
5187
5209
  };
5188
5210
  };
5211
+ readonly "providers.webSearchTimeoutSeconds": {
5212
+ readonly type: "number";
5213
+ readonly default: 60;
5214
+ readonly ui: {
5215
+ readonly tab: "providers";
5216
+ readonly group: "Services";
5217
+ readonly label: "Web Search Timeout";
5218
+ readonly description: "Hard timeout for each provider's search transport before web_search advances to the next fallback, in seconds (maximum 300)";
5219
+ readonly options: readonly [{
5220
+ readonly value: "30";
5221
+ readonly label: "30 seconds";
5222
+ }, {
5223
+ readonly value: "60";
5224
+ readonly label: "1 minute";
5225
+ }, {
5226
+ readonly value: "120";
5227
+ readonly label: "2 minutes";
5228
+ }, {
5229
+ readonly value: "180";
5230
+ readonly label: "3 minutes";
5231
+ }, {
5232
+ readonly value: "300";
5233
+ readonly label: "5 minutes";
5234
+ }];
5235
+ };
5236
+ };
5189
5237
  readonly "providers.webSearchGeminiModel": {
5190
5238
  readonly type: "string";
5191
5239
  readonly default: undefined;
@@ -25,7 +25,7 @@ export declare function createBridgeGrepFactory(session: ToolSession, extensionR
25
25
  /**
26
26
  * Build the `replace`-mode `edit` the bridge answers `pi_edit` with.
27
27
  *
28
- * `PiEditExecArgs` carries `old_text`/`new_text` pairs, which is exactly
28
+ * `PiEditExecArgs` carries `old_string`/`new_string` replacements, which is exactly
29
29
  * `replace`'s schema and nothing else's. The session's own instance follows the
30
30
  * configured `edit.mode` — `hashline` by default, whose schema is a single
31
31
  * `input` string — so a frame handed that instance fails validation instead of
@@ -38,7 +38,7 @@ interface CursorExecBridgeOptions {
38
38
  *
39
39
  * `PiEditExecArgs` is that mode's schema verbatim, and the session's own
40
40
  * `edit` may be in any mode — `hashline` by default — whose schema rejects
41
- * `old_text`/`new_text` outright. {@link tools} therefore cannot be trusted
41
+ * `old_string`/`new_string` outright. {@link tools} therefore cannot be trusted
42
42
  * for this one frame: a session that starts on another provider keeps its
43
43
  * configured instance in the map (only Cursor sessions move `edit` out), and
44
44
  * switching to Cursor later does not rebuild the roster.
@@ -150,9 +150,12 @@ export declare class CursorExecHandlers implements ICursorExecHandlers {
150
150
  piRead(call: Parameters<NonNullable<ICursorExecHandlers["piRead"]>>[0]): Promise<ToolResultMessage<unknown>>;
151
151
  piBash(call: Parameters<NonNullable<ICursorExecHandlers["piBash"]>>[0]): Promise<ToolResultMessage<unknown>>;
152
152
  /**
153
- * `PiEditExecArgs` is the local `edit` tool's replace mode verbatim: a path
154
- * plus `old_text`/`new_text` pairs. The tool's schema is snake_case, so the
155
- * proto's camelCase accessors are mapped back on the way in.
153
+ * `PiEditExecArgs` carries a path plus `oldText`/`newText` replacement
154
+ * pairs. A single replacement maps onto the model-facing single-edit
155
+ * `replace` schema verbatim; a multi-replacement frame still runs as ONE
156
+ * tool lifecycle (one start/end event pair, one aggregate diff), so it is
157
+ * sent in the tool's internal `edits` batch form (`ReplaceBatchParams`),
158
+ * which only this bridge produces.
156
159
  *
157
160
  * The replace-mode instance is requested explicitly rather than resolved
158
161
  * from {@link CursorExecBridgeOptions.tools}: the registry's `edit` is in
@@ -5,7 +5,7 @@ import { type EditMode } from "../utils/edit-mode.js";
5
5
  import { hashlineEditParamsSchema } from "./hashline/index.js";
6
6
  import { type ApplyPatchParams, applyPatchSchema } from "./modes/apply-patch.js";
7
7
  import { type PatchParams, patchEditSchema } from "./modes/patch.js";
8
- import { type ReplaceParams, replaceEditSchema } from "./modes/replace.js";
8
+ import { type ReplaceBatchParams, type ReplaceParams, replaceEditSchema } from "./modes/replace.js";
9
9
  import { type EditToolDetails } from "./renderer.js";
10
10
  export * from "@oh-my-pi/hashline";
11
11
  export { DEFAULT_EDIT_MODE, type EditMode, normalizeEditMode } from "../utils/edit-mode.js";
@@ -22,7 +22,7 @@ export * from "./snapshot-details.js";
22
22
  export * from "./streaming.js";
23
23
  type TInput = typeof replaceEditSchema | typeof patchEditSchema | typeof hashlineEditParamsSchema | typeof applyPatchSchema;
24
24
  type HashlineParams = typeof hashlineEditParamsSchema.infer;
25
- type EditParams = ReplaceParams | PatchParams | HashlineParams | ApplyPatchParams;
25
+ type EditParams = ReplaceParams | ReplaceBatchParams | PatchParams | HashlineParams | ApplyPatchParams;
26
26
  export declare class EditTool implements AgentTool<TInput> {
27
27
  #private;
28
28
  private readonly session;
@@ -36,7 +36,7 @@ export declare class EditTool implements AgentTool<TInput> {
36
36
  /**
37
37
  * `mode` pins the edit variant for this instance, for callers whose protocol
38
38
  * fixes the shape of an edit. The Cursor `pi_edit` frame carries
39
- * `old_text`/`new_text` pairs, which only `replace` accepts — under the
39
+ * `old_string`/`new_string` args, which only `replace` accepts — under the
40
40
  * default `hashline` mode those args do not match the schema at all. Left
41
41
  * unset, the env/settings resolution applies as before.
42
42
  */
@@ -67,11 +67,15 @@ export declare function levenshteinDistance(a: string, b: string): number;
67
67
  export declare function similarity(a: string, b: string): number;
68
68
  /**
69
69
  * Find a match for target text within content.
70
- * Used primarily for replace-mode edits.
70
+ * Used primarily for replace-mode edits; excluded ranges remain invisible to exact and fuzzy matching.
71
71
  */
72
72
  export declare function findMatch(content: string, target: string, options: {
73
73
  allowFuzzy: boolean;
74
74
  threshold?: number;
75
+ excludedRanges?: readonly {
76
+ startIndex: number;
77
+ endIndex: number;
78
+ }[];
75
79
  }): MatchOutcome;
76
80
  /**
77
81
  * Find a sequence of pattern lines within content lines.
@@ -112,25 +116,28 @@ export declare function findContextLine(lines: string[], context: string, startF
112
116
  allowFuzzy?: boolean;
113
117
  skipFunctionFallback?: boolean;
114
118
  }): ContextLineResult;
115
- export declare const replaceEditEntrySchema: import("arktype/internal/variants/object.ts").ObjectType<{
116
- old_text: string;
117
- new_text: string;
118
- all?: boolean | undefined;
119
- }, {}>;
120
119
  export declare const replaceEditSchema: import("arktype/internal/variants/object.ts").ObjectType<{
121
120
  path: string;
122
- edits: {
123
- old_text: string;
124
- new_text: string;
125
- all?: boolean | undefined;
126
- }[];
121
+ old_string: string;
122
+ new_string: string;
123
+ replace_all?: boolean | undefined;
127
124
  }, {}>;
128
- export type ReplaceEditEntry = typeof replaceEditEntrySchema.infer;
129
125
  export type ReplaceParams = typeof replaceEditSchema.infer;
130
- export interface ExecuteReplaceSingleOptions {
126
+ /**
127
+ * Internal batch form of {@link ReplaceParams}, produced only by the Cursor
128
+ * exec bridge: a `pi_edit` frame carries several replacements against one
129
+ * path but must run as a single tool lifecycle with one aggregate result.
130
+ * Never advertised to the model — the agent loop validates model calls
131
+ * against {@link replaceEditSchema}, which has no `edits` field.
132
+ */
133
+ export interface ReplaceBatchParams {
134
+ path: string;
135
+ edits: Omit<ReplaceParams, "path">[];
136
+ }
137
+ export interface ExecuteReplaceOptions {
131
138
  session: ToolSession;
132
139
  path: string;
133
- params: ReplaceEditEntry;
140
+ params: Omit<ReplaceParams, "path">;
134
141
  signal?: AbortSignal;
135
142
  batchRequest?: LspBatchRequest;
136
143
  allowFuzzy: boolean;
@@ -138,4 +145,4 @@ export interface ExecuteReplaceSingleOptions {
138
145
  writethrough: WritethroughCallback;
139
146
  beginDeferredDiagnosticsForPath: (path: string) => WritethroughDeferredHandle;
140
147
  }
141
- export declare function executeReplaceSingle(options: ExecuteReplaceSingleOptions): Promise<AgentToolResult<EditToolDetails, ReplaceEditEntry>>;
148
+ export declare function executeReplace(options: ExecuteReplaceOptions): Promise<AgentToolResult<EditToolDetails, ReplaceParams>>;
@@ -68,7 +68,7 @@ interface EditRenderArgs {
68
68
  patch?: string;
69
69
  input?: string;
70
70
  _input?: string;
71
- all?: boolean;
71
+ replace_all?: boolean;
72
72
  op?: Operation;
73
73
  rename?: unknown;
74
74
  diff?: string;
@@ -10,7 +10,9 @@ export interface PythonKernelAvailability {
10
10
  /** The probed-working runtime, when one was found. */
11
11
  runtime?: PythonRuntime;
12
12
  }
13
- export declare function checkPythonKernelAvailability(cwd: string, interpreter?: string): Promise<PythonKernelAvailability>;
13
+ export declare function checkPythonKernelAvailability(cwd: string, interpreter?: string, options?: {
14
+ forceProbe?: boolean;
15
+ }): Promise<PythonKernelAvailability>;
14
16
  export declare class PythonKernel extends BaseKernel {
15
17
  private constructor();
16
18
  static start(options: KernelStartOptions): Promise<PythonKernel>;
@@ -37,16 +37,16 @@ export declare function shouldHideKernelWindow(opts: {
37
37
  */
38
38
  export declare function shouldDetachKernel(platform: NodeJS.Platform): boolean;
39
39
  /**
40
- * TTY-based fallback used when the Win32 console probe is unavailable.
40
+ * Combine native Win32 and stdio TTY evidence of an inheritable console.
41
41
  *
42
- * Returns `true` if any of stdin/stdout/stderr is currently a TTY. This
43
- * correctly detects the common interactive launches and the partial-
44
- * redirection cases (`omp -p > out.txt`, `< in.txt`, `2> err.log`) where at
45
- * least one stream stays bound to the terminal. The all-stdio-redirected
46
- * case (`< in > out 2> err` from a console) is the reason we prefer the
47
- * Win32 probe over this fallback whenever possible.
42
+ * `GetConsoleWindow()` detects classic consoles even when every stdio stream
43
+ * is redirected. TTY detection covers ConPTY-backed terminals, where compiled
44
+ * hosts can receive a null HWND despite being attached to Windows Terminal.
45
+ * Either signal must preserve console inheritance: `CREATE_NO_WINDOW` can
46
+ * deadlock NumPy native-extension loading in the Python child.
48
47
  */
49
- export declare function consoleAttachedViaTTY(opts: {
48
+ export declare function consoleAttached(opts: {
49
+ nativeConsole?: boolean | null;
50
50
  stdinIsTTY: boolean;
51
51
  stdoutIsTTY: boolean;
52
52
  stderrIsTTY: boolean;
@@ -56,13 +56,9 @@ export declare function __resetWindowsConsoleProbeCache(): void;
56
56
  /**
57
57
  * Whether the host process owns a console its children can inherit.
58
58
  *
59
- * - On Windows, the authoritative signal is `GetConsoleWindow()`. It returns
60
- * a non-NULL HWND whenever the process has a console attached, regardless
61
- * of how the standard streams are redirected so an `omp -p ... < in.txt
62
- * > out.txt 2> err.log` launched from a real Windows Terminal session is
63
- * correctly classified as console-attached and the kernel keeps its
64
- * inheritable console.
65
- * - On any other platform, or if the FFI probe fails, fall back to the
66
- * TTY-OR heuristic. That still catches the common interactive cases.
59
+ * On Windows, `GetConsoleWindow()` detects classic consoles and all-stdio-
60
+ * redirected launches while stdio TTYs detect ConPTY-backed terminals. Either
61
+ * signal is sufficient. Other platforms use the same TTY evidence, although
62
+ * `windowsHide` is a no-op there.
67
63
  */
68
64
  export declare function hostHasInheritableConsole(): boolean;
@@ -19,7 +19,7 @@
19
19
  * `types.ts` via the `export *` below — pi-ai still exports both as types,
20
20
  * only the runtime `Type` builder and `StringEnum()` helper were removed.
21
21
  */
22
- import type { Api, AssistantMessage, Model } from "@oh-my-pi/pi-ai";
22
+ import { type Api, type AssistantMessage, type AssistantMessageEventStream, type Context, type Model, type SimpleStreamOptions } from "@oh-my-pi/pi-ai";
23
23
  import type { Effort } from "@oh-my-pi/pi-catalog/effort";
24
24
  import { calculateCost, getBundledModel, getBundledModels, getBundledProviders, modelsAreEqual } from "@oh-my-pi/pi-catalog/models";
25
25
  import { type TSchema, Type } from "./typebox.js";
@@ -54,6 +54,13 @@ export * from "@oh-my-pi/pi-ai";
54
54
  export { calculateCost, getBundledModel, getBundledModels, getBundledProviders, modelsAreEqual, Type };
55
55
  export declare const getModel: typeof getBundledModel;
56
56
  export declare const getModels: typeof getBundledModels;
57
+ /**
58
+ * Stream OpenAI Responses through the historical simple-options contract.
59
+ *
60
+ * Legacy `/compat` callers pass {@link SimpleStreamOptions}; routing through
61
+ * `streamSimple` preserves option normalization before provider dispatch.
62
+ */
63
+ export declare function streamSimpleOpenAIResponses(model: Model<"openai-responses">, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream;
57
64
  /**
58
65
  * Compatibility re-exports for runtime helpers that upstream
59
66
  * `@earendil-works/pi-ai` exposed from its package root but omp's
@@ -398,7 +398,7 @@ export { getProjectDir } from "@oh-my-pi/pi-utils";
398
398
  * canonical helper.
399
399
  */
400
400
  export declare function getPackageDir(): string;
401
- export { compact, estimateTokens } from "@oh-my-pi/pi-agent-core/compaction";
401
+ export { compact, estimateTokens, serializeConversation } from "@oh-my-pi/pi-agent-core/compaction";
402
402
  export { CONFIG_DIR_NAME } from "@oh-my-pi/pi-utils";
403
403
  export { parseArgs } from "../cli/args.js";
404
404
  export * from "../index.js";
@@ -71,6 +71,8 @@ export declare function __rewriteLegacyExtensionSourceForTests(source: string, i
71
71
  * no-op.
72
72
  */
73
73
  export declare function ensureGraphCommonJsRequireRegistered(): void;
74
+ /** Test seam for compiled-binary dependency graph discovery and rewriting. */
75
+ export declare function __collectLegacyPiExtensionSourcesForTests(entryPath: string): Promise<ReadonlyMap<string, string>>;
74
76
  /**
75
77
  * Load a legacy Pi extension module from its real on-disk location.
76
78
  *
@@ -1,2 +1,2 @@
1
- /** Start the detached per-project daemon broker selected by the CLI worker host. */
1
+ /** Start the detached project or global daemon broker selected by the CLI worker host. */
2
2
  export declare function startDaemonBrokerFromEnvironment(): Promise<void>;
@@ -6,17 +6,20 @@ export interface DaemonBrokerClientOptions {
6
6
  /** Last-client shutdown grace override in milliseconds. */
7
7
  idleGraceMs?: number;
8
8
  }
9
- /** Persistent per-process connection to one project's daemon broker. */
9
+ /** Persistent per-process connection to one project or global daemon broker. */
10
10
  export interface DaemonBrokerClient {
11
+ /** Canonical project directory or synthetic directory identifying a global scope. */
11
12
  readonly projectDir: string;
12
13
  request(operation: DaemonOperation, signal?: AbortSignal): Promise<DaemonRpcResult>;
13
14
  close(): void;
14
15
  }
15
- /** Create an independent socket connection to one project's shared daemon broker. */
16
+ /** Create an independent socket connection to one daemon broker scope. */
16
17
  export declare function createDaemonBrokerClient(projectDir: string, options?: DaemonBrokerClientOptions): Promise<DaemonBrokerClient>;
17
18
  /** Get the process-shared daemon broker client for one canonical project directory. */
18
19
  export declare function daemonClientForProject(projectDir: string): Promise<DaemonBrokerClient>;
19
- /** Close every project broker connection held by this omp process. */
20
+ /** Get the process-shared client that leases one profile-independent, machine-global daemon broker. */
21
+ export declare function daemonClientForGlobal(service: string): Promise<DaemonBrokerClient>;
22
+ /** Close every project and machine-global broker connection held by this omp process. */
20
23
  export declare function closeDaemonClients(): Promise<void>;
21
24
  /** Exercise worker-host broker startup and authenticated RPC for distribution smoke tests. */
22
25
  export declare function smokeTestDaemonBroker(): Promise<void>;
@@ -0,0 +1,8 @@
1
+ import type { DaemonBrokerClient } from "./client.js";
2
+ import type { DaemonSnapshot } from "./protocol.js";
3
+ /** Snapshot a broker daemon, treating "unknown daemon" and broker errors as absent. */
4
+ export declare function describeQuietly(client: DaemonBrokerClient, name: string, label: string, signal?: AbortSignal): Promise<DaemonSnapshot | undefined>;
5
+ /** Block until the daemon reports ready; undefined on timeout or pre-ready exit. */
6
+ export declare function waitReady(client: DaemonBrokerClient, name: string, label: string, signal?: AbortSignal, timeoutMs?: number): Promise<DaemonSnapshot | undefined>;
7
+ /** Best-effort stop before replacing a wedged or endpoint-less daemon. */
8
+ export declare function stopQuietly(client: DaemonBrokerClient, name: string, label: string, signal?: AbortSignal): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import { getDaemonRuntimeDir } from "@oh-my-pi/pi-utils";
2
2
  /** Resolve the private runtime directory shared by omp processes in one project directory. */
3
3
  export { getDaemonRuntimeDir as daemonRuntimeDir };
4
- /** Resolve the Unix socket or Windows named pipe used by one project broker. */
4
+ /** Resolve the Unix socket or Windows named pipe used by one daemon broker scope. */
5
5
  export declare function daemonBrokerEndpoint(projectDir: string, runtimeDir: string): string;
@@ -6,7 +6,7 @@ export declare const DAEMON_BROKER_WORKER_ARG = "__omp_worker_daemon_broker";
6
6
  /** Fixed dimensions negotiated with every supervised PTY. */
7
7
  export declare const DAEMON_PTY_COLUMNS = 120;
8
8
  export declare const DAEMON_PTY_ROWS = 40;
9
- /** Environment key carrying the broker's canonical project directory. */
9
+ /** Environment key carrying the broker's canonical project or synthetic global scope directory. */
10
10
  export declare const DAEMON_PROJECT_DIR_ENV = "OMP_DAEMON_PROJECT_DIR";
11
11
  /** Environment key carrying the broker's private runtime directory. */
12
12
  export declare const DAEMON_RUNTIME_DIR_ENV = "OMP_DAEMON_RUNTIME_DIR";
@@ -36,7 +36,7 @@ export interface DaemonSpec {
36
36
  persist: boolean;
37
37
  detached: boolean;
38
38
  }
39
- /** Serializable daemon state visible to every client in one project directory. */
39
+ /** Serializable daemon state visible to every client in one broker scope. */
40
40
  export interface DaemonSnapshot {
41
41
  name: string;
42
42
  id: string;
@@ -1,4 +1,6 @@
1
1
  import type { LspClient, ServerConfig } from "./types.js";
2
+ /** Enable or disable attaching to broker-shared language servers. */
3
+ export declare function setSharedLspEnabled(enabled: boolean): void;
2
4
  /**
3
5
  * Configure the idle timeout for LSP clients.
4
6
  * @param ms - Timeout in milliseconds, or null/undefined to disable
@@ -0,0 +1,15 @@
1
+ import type { LspTransport } from "../types.js";
2
+ /**
3
+ * Open a broker-shared transport for one language server, ensuring the mux
4
+ * daemon first. Returns null (after a debug log) when the shared path is
5
+ * unavailable so the caller falls back to a process-local spawn.
6
+ */
7
+ export declare function connectSharedLspTransport(opts: {
8
+ command: string;
9
+ args: string[];
10
+ cwd: string;
11
+ env?: Record<string, string>;
12
+ signal?: AbortSignal;
13
+ }): Promise<LspTransport | null>;
14
+ /** Exercise worker-host mux startup and the ping handshake for distribution smoke tests. */
15
+ export declare function smokeTestLspMux(): Promise<void>;
@@ -0,0 +1,57 @@
1
+ /** Hidden CLI selector used to re-enter the LSP mux worker. */
2
+ export declare const LSP_MUX_WORKER_ARG = "__omp_worker_lsp_mux";
3
+ /** Environment key carrying the socket endpoint the mux must listen on. */
4
+ export declare const LSP_MUX_SOCKET_ENV = "OMP_LSP_MUX_SOCKET";
5
+ /** Environment key carrying the canonical project directory the mux serves. */
6
+ export declare const LSP_MUX_PROJECT_DIR_ENV = "OMP_LSP_MUX_PROJECT_DIR";
7
+ /** Stable broker daemon name for the shared LSP mux. */
8
+ export declare const LSP_MUX_DAEMON_NAME = "omp.lsp.mux";
9
+ /** Broker readiness regex matched against the banner printed by the worker. */
10
+ export declare const LSP_MUX_READY_PATTERN: string;
11
+ /** Banner printed on stdout once the mux socket accepts connections. */
12
+ export declare function lspMuxReadyBanner(endpoint: string): string;
13
+ /** Resolve the Unix socket or Windows named pipe for one project scope. */
14
+ export declare function lspMuxEndpoint(projectDir: string, runtimeDir: string): string;
15
+ /**
16
+ * First (and only pre-LSP) request on a fresh connection: binds the link to
17
+ * one shared server instance, spawning it on first use. Params:
18
+ * {@link MuxConnectParams}, result: {@link MuxConnectResult}. After the
19
+ * response the link carries ordinary LSP traffic for that server.
20
+ */
21
+ export declare const MUX_CONNECT_METHOD = "omp/muxConnect";
22
+ /**
23
+ * Liveness probe answered with {@link MUX_PING_RESULT} without binding the
24
+ * link to a server. Used by the smoke probe and the ensure loop.
25
+ */
26
+ export declare const MUX_PING_METHOD = "omp/muxPing";
27
+ export declare const MUX_PING_RESULT = "pong";
28
+ /**
29
+ * Notification on a bound link: kill the shared server process (all sessions
30
+ * on it are disconnected). Sent by `lsp reload` when the generic reload path
31
+ * decides the server is wedged — a plain per-session `shutdown`/`exit` is
32
+ * intercepted by the mux and would leave the wedged server running for
33
+ * every other instance.
34
+ */
35
+ export declare const MUX_RESTART_METHOD = "omp/muxRestartServer";
36
+ /** Handshake parameters identifying (and if needed spawning) a shared server. */
37
+ export interface MuxConnectParams {
38
+ /** Executable to spawn (the client's `resolvedCommand ?? command`). */
39
+ command: string;
40
+ /** Arguments passed verbatim to the executable. */
41
+ args: string[];
42
+ /** Workspace root the server runs in; part of the server identity key. */
43
+ cwd: string;
44
+ /** Extra environment overlaid on the mux daemon's own env for the spawn. */
45
+ env?: Record<string, string>;
46
+ }
47
+ /** Handshake result. */
48
+ export interface MuxConnectResult {
49
+ /** Server identity key inside the mux (`${command}:${cwd}`). */
50
+ key: string;
51
+ /** True when this handshake spawned the server process. */
52
+ spawned: boolean;
53
+ /** Pid of the shared server process. */
54
+ pid?: number;
55
+ }
56
+ /** Server identity key used by the mux registry. */
57
+ export declare function muxServerKey(command: string, cwd: string): string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Broker-owned, in-process-testable multiplexer for shared language-server children.
3
+ */
4
+ export declare class LspMuxServer {
5
+ #private;
6
+ /** Called after the mux has had no connected sessions for its idle grace period. */
7
+ onIdle?: () => void;
8
+ /** Number of currently connected mux links, including unbound ping links. */
9
+ get sessionCount(): number;
10
+ /** Keys of currently live shared language-server children. */
11
+ get serverKeys(): string[];
12
+ /** Listen for Content-Length framed mux links at a Unix socket or named pipe. */
13
+ listen(endpoint: string): Promise<void>;
14
+ /** Gracefully close all children, links, and the listening endpoint. */
15
+ shutdown(): Promise<void>;
16
+ }
17
+ /** Start the detached LSP mux selected by the CLI worker host environment. */
18
+ export declare function startLspMuxFromEnvironment(): Promise<void>;
@@ -1,4 +1,3 @@
1
- import type { ptree } from "@oh-my-pi/pi-utils";
2
1
  export declare const lspSchema: import("arktype/internal/variants/object.ts").ObjectType<{
3
2
  action: "capabilities" | "code_actions" | "definition" | "diagnostics" | "hover" | "implementation" | "references" | "reload" | "rename" | "rename_file" | "request" | "status" | "symbols" | "type_definition";
4
3
  file?: string | undefined;
@@ -229,6 +228,27 @@ export interface ServerConfig {
229
228
  */
230
229
  createClient?: LinterClientFactory;
231
230
  }
231
+ /** Minimal write sink for the server-bound byte stream (satisfied by `Bun.FileSink` and the mux socket adapter). */
232
+ export interface LspWriteSink {
233
+ write(data: string | Uint8Array): number | Promise<number>;
234
+ flush(): number | void | Promise<number | void>;
235
+ }
236
+ /**
237
+ * Byte transport carrying one LSP JSON-RPC link. Structurally satisfied by
238
+ * `ptree.ChildProcess<"pipe">` (local server spawn) and by the socket adapter
239
+ * in `mux/daemon.ts` (broker-shared server). `exited` may reject (ptree kill).
240
+ */
241
+ export interface LspTransport {
242
+ readonly stdin: LspWriteSink;
243
+ readonly stdout: ReadableStream<Uint8Array>;
244
+ readonly exited: Promise<number>;
245
+ readonly exitCode: number | null;
246
+ readonly pid?: number;
247
+ /** Present and true on broker-shared mux links; `lsp reload` uses it to request a shared-server restart. */
248
+ readonly sharedMux?: boolean;
249
+ kill(): void;
250
+ peekStderr(): string;
251
+ }
232
252
  export interface OpenFile {
233
253
  version: number;
234
254
  languageId: string;
@@ -257,7 +277,7 @@ export interface LspClient {
257
277
  name: string;
258
278
  cwd: string;
259
279
  config: ServerConfig;
260
- proc: ptree.ChildProcess<"pipe">;
280
+ proc: LspTransport;
261
281
  requestId: number;
262
282
  diagnostics: Map<string, PublishedDiagnostics>;
263
283
  diagnosticsVersion: number;
@@ -13,6 +13,8 @@ import { type SessionInfo } from "./session/session-listing.js";
13
13
  import { SessionManager } from "./session/session-manager.js";
14
14
  type RunAcpMode = (createSession: AcpSessionFactory) => Promise<never>;
15
15
  export declare function writeStartupNotice(parsedArgs: Pick<Args, "mode">, text: string): void;
16
+ /** Reads a non-TTY stdin stream as prompt text. */
17
+ export declare function readPipedInput(): Promise<string | undefined>;
16
18
  export interface InteractiveModeNotify {
17
19
  kind: "warn" | "error" | "info";
18
20
  message: string;
@@ -34,7 +34,7 @@ export interface MnemopiSubprocessEmbeddingModel {
34
34
  }
35
35
  export declare class MnemopiEmbedClient {
36
36
  #private;
37
- constructor(spawnWorker?: () => MnemopiEmbedWorkerHandle);
37
+ constructor(spawnWorker?: () => MnemopiEmbedWorkerHandle, requestTimeoutMs?: number);
38
38
  /**
39
39
  * Load the named fastembed model inside the subprocess. Resolves to a
40
40
  * thin wrapper whose `embed()` round-trips through the same worker, or
@@ -162,29 +162,6 @@ export declare class MnemopiSessionState {
162
162
  extract?: boolean;
163
163
  sleep?: boolean;
164
164
  }): Promise<void>;
165
- /**
166
- * Release the per-session resources. Defaults to running a lighter
167
- * {@link consolidate} pass before closing handles: it retains the current
168
- * transcript and flushes in-flight extractions, but skips the synchronous
169
- * bank sleep so normal session shutdown returns promptly. Full promotion of
170
- * working memory into long-term storage is still performed by the explicit
171
- * `/memory enqueue` and backend enqueue paths. Callers that are about to
172
- * delete the DB files — e.g. `mnemopiBackend.clear` — pass
173
- * `{ consolidate: false }` to skip the retain/flush pass, since spending
174
- * tokens on memories that will be wiped on the next line is wasted work
175
- * (PR #2327 review).
176
- *
177
- * `timeoutMs` caps how long the consolidate await blocks the caller
178
- * (the user-visible `/quit` / `/exit` shutdown path passes this so
179
- * dispose returns within a UX budget — issue #3641). When the cap is
180
- * hit, dispose returns immediately and detaches the still-in-flight
181
- * consolidate; the SQLite handles are closed in the background once
182
- * the consolidate settles so writes never race a closed handle, and
183
- * any pending embeddings are SIGKILL'd along with the embed worker
184
- * (a tolerable loss — working memory rows are durable; only the
185
- * episodic promotion / embedding for the LAST few turns is skipped,
186
- * and `maybeRetainOnAgentEnd` has already retained earlier turns).
187
- */
188
165
  dispose(options?: {
189
166
  consolidate?: boolean;
190
167
  timeoutMs?: number;