@otto-code/server 0.5.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 (734) hide show
  1. package/.env.example +31 -0
  2. package/README.md +111 -0
  3. package/dist/scripts/dev-runner.js +37 -0
  4. package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  5. package/dist/scripts/supervisor-entrypoint.js +141 -0
  6. package/dist/scripts/supervisor-log-config.js +31 -0
  7. package/dist/scripts/supervisor.js +252 -0
  8. package/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
  9. package/dist/server/executable-resolution/executable-resolution.js +118 -0
  10. package/dist/server/executable-resolution/windows.d.ts +18 -0
  11. package/dist/server/executable-resolution/windows.js +65 -0
  12. package/dist/server/server/agent/activity-curator.d.ts +28 -0
  13. package/dist/server/server/agent/activity-curator.js +227 -0
  14. package/dist/server/server/agent/agent-archive.d.ts +11 -0
  15. package/dist/server/server/agent/agent-archive.js +16 -0
  16. package/dist/server/server/agent/agent-loading.d.ts +14 -0
  17. package/dist/server/server/agent/agent-loading.js +54 -0
  18. package/dist/server/server/agent/agent-manager.d.ts +470 -0
  19. package/dist/server/server/agent/agent-manager.js +3049 -0
  20. package/dist/server/server/agent/agent-personalities.d.ts +59 -0
  21. package/dist/server/server/agent/agent-personalities.js +103 -0
  22. package/dist/server/server/agent/agent-projections.d.ts +35 -0
  23. package/dist/server/server/agent/agent-projections.js +488 -0
  24. package/dist/server/server/agent/agent-prompt.d.ts +76 -0
  25. package/dist/server/server/agent/agent-prompt.js +230 -0
  26. package/dist/server/server/agent/agent-response-loop.d.ts +72 -0
  27. package/dist/server/server/agent/agent-response-loop.js +333 -0
  28. package/dist/server/server/agent/agent-sdk-types.d.ts +736 -0
  29. package/dist/server/server/agent/agent-sdk-types.js +22 -0
  30. package/dist/server/server/agent/agent-storage.d.ts +147 -0
  31. package/dist/server/server/agent/agent-storage.js +326 -0
  32. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  33. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  34. package/dist/server/server/agent/agent-timeline-store-types.d.ts +50 -0
  35. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  36. package/dist/server/server/agent/agent-timeline-store.d.ts +27 -0
  37. package/dist/server/server/agent/agent-timeline-store.js +230 -0
  38. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  39. package/dist/server/server/agent/audio-utils.js +19 -0
  40. package/dist/server/server/agent/create-agent/create.d.ts +91 -0
  41. package/dist/server/server/agent/create-agent/create.js +370 -0
  42. package/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +54 -0
  43. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +152 -0
  44. package/dist/server/server/agent/create-agent-mode.d.ts +13 -0
  45. package/dist/server/server/agent/create-agent-mode.js +62 -0
  46. package/dist/server/server/agent/create-agent-title.d.ts +10 -0
  47. package/dist/server/server/agent/create-agent-title.js +34 -0
  48. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  49. package/dist/server/server/agent/dictation-debug.js +50 -0
  50. package/dist/server/server/agent/effort-levels.d.ts +2 -0
  51. package/dist/server/server/agent/effort-levels.js +7 -0
  52. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  53. package/dist/server/server/agent/foreground-run-state.js +160 -0
  54. package/dist/server/server/agent/import-sessions.d.ts +47 -0
  55. package/dist/server/server/agent/import-sessions.js +145 -0
  56. package/dist/server/server/agent/lifecycle-command.d.ts +73 -0
  57. package/dist/server/server/agent/lifecycle-command.js +92 -0
  58. package/dist/server/server/agent/mcp-server.d.ts +5 -0
  59. package/dist/server/server/agent/mcp-server.js +66 -0
  60. package/dist/server/server/agent/mcp-shared.d.ts +192 -0
  61. package/dist/server/server/agent/mcp-shared.js +201 -0
  62. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  63. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  64. package/dist/server/server/agent/permission-response.d.ts +15 -0
  65. package/dist/server/server/agent/permission-response.js +14 -0
  66. package/dist/server/server/agent/personality-stats-store.d.ts +23 -0
  67. package/dist/server/server/agent/personality-stats-store.js +65 -0
  68. package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
  69. package/dist/server/server/agent/prompt-attachments.js +117 -0
  70. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  71. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  72. package/dist/server/server/agent/provider-launch-config.d.ts +43 -0
  73. package/dist/server/server/agent/provider-launch-config.js +167 -0
  74. package/dist/server/server/agent/provider-notices.d.ts +3 -0
  75. package/dist/server/server/agent/provider-notices.js +5 -0
  76. package/dist/server/server/agent/provider-registry.d.ts +41 -0
  77. package/dist/server/server/agent/provider-registry.js +532 -0
  78. package/dist/server/server/agent/provider-session-import.d.ts +10 -0
  79. package/dist/server/server/agent/provider-session-import.js +49 -0
  80. package/dist/server/server/agent/provider-snapshot-manager.d.ts +142 -0
  81. package/dist/server/server/agent/provider-snapshot-manager.js +690 -0
  82. package/dist/server/server/agent/providers/acp-agent.d.ts +353 -0
  83. package/dist/server/server/agent/providers/acp-agent.js +2439 -0
  84. package/dist/server/server/agent/providers/claude/agent.d.ts +66 -0
  85. package/dist/server/server/agent/providers/claude/agent.js +4535 -0
  86. package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  87. package/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
  88. package/dist/server/server/agent/providers/claude/model-manifest.d.ts +90 -0
  89. package/dist/server/server/agent/providers/claude/model-manifest.js +205 -0
  90. package/dist/server/server/agent/providers/claude/models.d.ts +11 -0
  91. package/dist/server/server/agent/providers/claude/models.js +97 -0
  92. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  93. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  94. package/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
  95. package/dist/server/server/agent/providers/claude/project-dir.js +57 -0
  96. package/dist/server/server/agent/providers/claude/query.d.ts +17 -0
  97. package/dist/server/server/agent/providers/claude/query.js +86 -0
  98. package/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
  99. package/dist/server/server/agent/providers/claude/rewind.js +30 -0
  100. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
  101. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
  102. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +35 -0
  103. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
  104. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
  105. package/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
  106. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  107. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  108. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  109. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  110. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +90 -0
  111. package/dist/server/server/agent/providers/codex/app-server-transport.js +262 -0
  112. package/dist/server/server/agent/providers/codex/rewind.d.ts +21 -0
  113. package/dist/server/server/agent/providers/codex/rewind.js +46 -0
  114. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +36 -0
  115. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +217 -0
  116. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  117. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  118. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
  119. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +830 -0
  120. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +308 -0
  121. package/dist/server/server/agent/providers/codex-app-server-agent.js +4515 -0
  122. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  123. package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
  124. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
  125. package/dist/server/server/agent/providers/copilot-acp-agent.js +188 -0
  126. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +15 -0
  127. package/dist/server/server/agent/providers/cursor-acp-agent.js +18 -0
  128. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
  129. package/dist/server/server/agent/providers/diagnostic-utils.js +355 -0
  130. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +42 -0
  131. package/dist/server/server/agent/providers/generic-acp-agent.js +160 -0
  132. package/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
  133. package/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
  134. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +85 -0
  135. package/dist/server/server/agent/providers/mock-load-test-agent.js +1010 -0
  136. package/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
  137. package/dist/server/server/agent/providers/mock-slow-provider.js +39 -0
  138. package/dist/server/server/agent/providers/openai-compat-agent.d.ts +422 -0
  139. package/dist/server/server/agent/providers/openai-compat-agent.js +2536 -0
  140. package/dist/server/server/agent/providers/openai-compat-feature-definitions.d.ts +40 -0
  141. package/dist/server/server/agent/providers/openai-compat-feature-definitions.js +82 -0
  142. package/dist/server/server/agent/providers/openai-compat-mcp.d.ts +87 -0
  143. package/dist/server/server/agent/providers/openai-compat-mcp.js +353 -0
  144. package/dist/server/server/agent/providers/openai-compat-otto-tool-permissions.d.ts +29 -0
  145. package/dist/server/server/agent/providers/openai-compat-otto-tool-permissions.js +96 -0
  146. package/dist/server/server/agent/providers/openai-compat-tools.d.ts +69 -0
  147. package/dist/server/server/agent/providers/openai-compat-tools.js +1224 -0
  148. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  149. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  150. package/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
  151. package/dist/server/server/agent/providers/opencode/rewind.js +14 -0
  152. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +91 -0
  153. package/dist/server/server/agent/providers/opencode/server-manager.js +425 -0
  154. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +25 -0
  155. package/dist/server/server/agent/providers/opencode/test-server-manager.js +39 -0
  156. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.d.ts +92 -0
  157. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.js +260 -0
  158. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  159. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
  160. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  161. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  162. package/dist/server/server/agent/providers/opencode-agent.d.ts +286 -0
  163. package/dist/server/server/agent/providers/opencode-agent.js +2830 -0
  164. package/dist/server/server/agent/providers/pi/agent.d.ts +132 -0
  165. package/dist/server/server/agent/providers/pi/agent.js +1649 -0
  166. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
  167. package/dist/server/server/agent/providers/pi/cli-runtime.js +261 -0
  168. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +9 -0
  169. package/dist/server/server/agent/providers/pi/history-mapper.js +140 -0
  170. package/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
  171. package/dist/server/server/agent/providers/pi/rewind.js +8 -0
  172. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +208 -0
  173. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  174. package/dist/server/server/agent/providers/pi/runtime.d.ts +57 -0
  175. package/dist/server/server/agent/providers/pi/runtime.js +56 -0
  176. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
  177. package/dist/server/server/agent/providers/pi/session-descriptor.js +346 -0
  178. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +83 -0
  179. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +184 -0
  180. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  181. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  182. package/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
  183. package/dist/server/server/agent/providers/provider-image-output.js +111 -0
  184. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  185. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  186. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  187. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  188. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
  189. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
  190. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
  191. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
  192. package/dist/server/server/agent/providers/trae-acp-agent.d.ts +15 -0
  193. package/dist/server/server/agent/providers/trae-acp-agent.js +18 -0
  194. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  195. package/dist/server/server/agent/recordings-debug.js +19 -0
  196. package/dist/server/server/agent/rewind/rewind.d.ts +10 -0
  197. package/dist/server/server/agent/rewind/rewind.js +29 -0
  198. package/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
  199. package/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
  200. package/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
  201. package/dist/server/server/agent/runtime-mcp-config.js +53 -0
  202. package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  203. package/dist/server/server/agent/structured-generation-providers.js +236 -0
  204. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  205. package/dist/server/server/agent/stt-debug.js +33 -0
  206. package/dist/server/server/agent/stt-manager.d.ts +38 -0
  207. package/dist/server/server/agent/stt-manager.js +246 -0
  208. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  209. package/dist/server/server/agent/system-prompt.js +8 -0
  210. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  211. package/dist/server/server/agent/timeline-append.js +27 -0
  212. package/dist/server/server/agent/timeline-projection.d.ts +71 -0
  213. package/dist/server/server/agent/timeline-projection.js +373 -0
  214. package/dist/server/server/agent/tools/otto-tools.d.ts +80 -0
  215. package/dist/server/server/agent/tools/otto-tools.js +2912 -0
  216. package/dist/server/server/agent/tools/types.d.ts +36 -0
  217. package/dist/server/server/agent/tools/types.js +2 -0
  218. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  219. package/dist/server/server/agent/tts-debug.js +24 -0
  220. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  221. package/dist/server/server/agent/tts-manager.js +375 -0
  222. package/dist/server/server/agent-attention-policy.d.ts +29 -0
  223. package/dist/server/server/agent-attention-policy.js +36 -0
  224. package/dist/server/server/artifact/artifact-prompt.d.ts +2 -0
  225. package/dist/server/server/artifact/artifact-prompt.js +15 -0
  226. package/dist/server/server/artifact/artifact-service.d.ts +91 -0
  227. package/dist/server/server/artifact/artifact-service.js +419 -0
  228. package/dist/server/server/artifact/artifact-store.d.ts +24 -0
  229. package/dist/server/server/artifact/artifact-store.js +168 -0
  230. package/dist/server/server/artifact/artifact-watcher.d.ts +34 -0
  231. package/dist/server/server/artifact/artifact-watcher.js +146 -0
  232. package/dist/server/server/artifact/html-validator.d.ts +26 -0
  233. package/dist/server/server/artifact/html-validator.js +92 -0
  234. package/dist/server/server/atomic-file.d.ts +5 -0
  235. package/dist/server/server/atomic-file.js +19 -0
  236. package/dist/server/server/auth.d.ts +38 -0
  237. package/dist/server/server/auth.js +143 -0
  238. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  239. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +92 -0
  240. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  241. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  242. package/dist/server/server/bootstrap.d.ts +127 -0
  243. package/dist/server/server/bootstrap.js +1331 -0
  244. package/dist/server/server/browser-tools/broker.d.ts +45 -0
  245. package/dist/server/server/browser-tools/broker.js +390 -0
  246. package/dist/server/server/browser-tools/errors.d.ts +22 -0
  247. package/dist/server/server/browser-tools/errors.js +27 -0
  248. package/dist/server/server/browser-tools/policy.d.ts +10 -0
  249. package/dist/server/server/browser-tools/policy.js +16 -0
  250. package/dist/server/server/browser-tools/tools.d.ts +24 -0
  251. package/dist/server/server/browser-tools/tools.js +967 -0
  252. package/dist/server/server/chat/chat-mentions.d.ts +47 -0
  253. package/dist/server/server/chat/chat-mentions.js +113 -0
  254. package/dist/server/server/chat/chat-service.d.ts +78 -0
  255. package/dist/server/server/chat/chat-service.js +337 -0
  256. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  257. package/dist/server/server/checkout/status-projection.js +117 -0
  258. package/dist/server/server/checkout-diff-manager.d.ts +41 -0
  259. package/dist/server/server/checkout-diff-manager.js +189 -0
  260. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  261. package/dist/server/server/checkout-git-utils.js +34 -0
  262. package/dist/server/server/client-message-id.d.ts +3 -0
  263. package/dist/server/server/client-message-id.js +12 -0
  264. package/dist/server/server/config.d.ts +22 -0
  265. package/dist/server/server/config.js +330 -0
  266. package/dist/server/server/connection-offer.d.ts +20 -0
  267. package/dist/server/server/connection-offer.js +59 -0
  268. package/dist/server/server/daemon-config-store.d.ts +44 -0
  269. package/dist/server/server/daemon-config-store.js +530 -0
  270. package/dist/server/server/daemon-keypair.d.ts +8 -0
  271. package/dist/server/server/daemon-keypair.js +42 -0
  272. package/dist/server/server/daemon-version.d.ts +5 -0
  273. package/dist/server/server/daemon-version.js +22 -0
  274. package/dist/server/server/daemon-worker.d.ts +2 -0
  275. package/dist/server/server/daemon-worker.js +251 -0
  276. package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
  277. package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
  278. package/dist/server/server/exports.d.ts +24 -0
  279. package/dist/server/server/exports.js +24 -0
  280. package/dist/server/server/file-download/token-store.d.ts +24 -0
  281. package/dist/server/server/file-download/token-store.js +40 -0
  282. package/dist/server/server/file-explorer/code-index.d.ts +28 -0
  283. package/dist/server/server/file-explorer/code-index.js +127 -0
  284. package/dist/server/server/file-explorer/file-search.d.ts +72 -0
  285. package/dist/server/server/file-explorer/file-search.js +297 -0
  286. package/dist/server/server/file-explorer/file-watcher.d.ts +40 -0
  287. package/dist/server/server/file-explorer/file-watcher.js +0 -0
  288. package/dist/server/server/file-explorer/gitignore.d.ts +39 -0
  289. package/dist/server/server/file-explorer/gitignore.js +191 -0
  290. package/dist/server/server/file-explorer/service.d.ts +103 -0
  291. package/dist/server/server/file-explorer/service.js +420 -0
  292. package/dist/server/server/file-upload/index.d.ts +27 -0
  293. package/dist/server/server/file-upload/index.js +158 -0
  294. package/dist/server/server/hostnames.d.ts +13 -0
  295. package/dist/server/server/hostnames.js +94 -0
  296. package/dist/server/server/json-utils.d.ts +11 -0
  297. package/dist/server/server/json-utils.js +45 -0
  298. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  299. package/dist/server/server/lifecycle-reasons.js +6 -0
  300. package/dist/server/server/logger.d.ts +29 -0
  301. package/dist/server/server/logger.js +125 -0
  302. package/dist/server/server/loop-service.d.ts +234 -0
  303. package/dist/server/server/loop-service.js +804 -0
  304. package/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  305. package/dist/server/server/managed-processes/managed-processes.js +326 -0
  306. package/dist/server/server/messages.d.ts +9 -0
  307. package/dist/server/server/messages.js +29 -0
  308. package/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
  309. package/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
  310. package/dist/server/server/otto-env.d.ts +13 -0
  311. package/dist/server/server/otto-env.js +53 -0
  312. package/dist/server/server/otto-home.d.ts +2 -0
  313. package/dist/server/server/otto-home.js +19 -0
  314. package/dist/server/server/otto-worktree-service.d.ts +52 -0
  315. package/dist/server/server/otto-worktree-service.js +294 -0
  316. package/dist/server/server/package-version.d.ts +19 -0
  317. package/dist/server/server/package-version.js +60 -0
  318. package/dist/server/server/pagination/cursor.d.ts +16 -0
  319. package/dist/server/server/pagination/cursor.js +62 -0
  320. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  321. package/dist/server/server/pagination/sortable-pager.js +68 -0
  322. package/dist/server/server/pairing-offer.d.ts +18 -0
  323. package/dist/server/server/pairing-offer.js +47 -0
  324. package/dist/server/server/pairing-qr.d.ts +7 -0
  325. package/dist/server/server/pairing-qr.js +45 -0
  326. package/dist/server/server/path-utils.d.ts +5 -0
  327. package/dist/server/server/path-utils.js +34 -0
  328. package/dist/server/server/persisted-config.d.ts +417 -0
  329. package/dist/server/server/persisted-config.js +471 -0
  330. package/dist/server/server/persistence-hooks.d.ts +31 -0
  331. package/dist/server/server/persistence-hooks.js +93 -0
  332. package/dist/server/server/pid-lock.d.ts +32 -0
  333. package/dist/server/server/pid-lock.js +170 -0
  334. package/dist/server/server/preview/dev-server-manager.d.ts +108 -0
  335. package/dist/server/server/preview/dev-server-manager.js +426 -0
  336. package/dist/server/server/preview/launch-config.d.ts +37 -0
  337. package/dist/server/server/preview/launch-config.js +63 -0
  338. package/dist/server/server/preview/preview-tools.d.ts +30 -0
  339. package/dist/server/server/preview/preview-tools.js +249 -0
  340. package/dist/server/server/private-files.d.ts +6 -0
  341. package/dist/server/server/private-files.js +37 -0
  342. package/dist/server/server/process-diagnostics.d.ts +17 -0
  343. package/dist/server/server/process-diagnostics.js +22 -0
  344. package/dist/server/server/push/notifications.d.ts +9 -0
  345. package/dist/server/server/push/notifications.js +15 -0
  346. package/dist/server/server/push/push-service.d.ts +20 -0
  347. package/dist/server/server/push/push-service.js +66 -0
  348. package/dist/server/server/push/token-store.d.ts +18 -0
  349. package/dist/server/server/push/token-store.js +68 -0
  350. package/dist/server/server/relay-transport.d.ts +31 -0
  351. package/dist/server/server/relay-transport.js +514 -0
  352. package/dist/server/server/resolve-workspace-id-for-path.d.ts +3 -0
  353. package/dist/server/server/resolve-workspace-id-for-path.js +41 -0
  354. package/dist/server/server/resolve-worktree-creation-intent.d.ts +32 -0
  355. package/dist/server/server/resolve-worktree-creation-intent.js +121 -0
  356. package/dist/server/server/schedule/cron.d.ts +4 -0
  357. package/dist/server/server/schedule/cron.js +81 -0
  358. package/dist/server/server/schedule/service.d.ts +89 -0
  359. package/dist/server/server/schedule/service.js +882 -0
  360. package/dist/server/server/schedule/store.d.ts +27 -0
  361. package/dist/server/server/schedule/store.js +190 -0
  362. package/dist/server/server/script-health-monitor.d.ts +39 -0
  363. package/dist/server/server/script-health-monitor.js +159 -0
  364. package/dist/server/server/script-proxy.d.ts +3 -0
  365. package/dist/server/server/script-proxy.js +2 -0
  366. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  367. package/dist/server/server/script-route-branch-handler.js +11 -0
  368. package/dist/server/server/script-status-projection.d.ts +36 -0
  369. package/dist/server/server/script-status-projection.js +200 -0
  370. package/dist/server/server/server-id.d.ts +17 -0
  371. package/dist/server/server/server-id.js +68 -0
  372. package/dist/server/server/service-proxy.d.ts +237 -0
  373. package/dist/server/server/service-proxy.js +714 -0
  374. package/dist/server/server/session/agent-config/agent-config-session.d.ts +59 -0
  375. package/dist/server/server/session/agent-config/agent-config-session.js +110 -0
  376. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +65 -0
  377. package/dist/server/server/session/agent-updates/agent-updates-service.js +232 -0
  378. package/dist/server/server/session/artifact/artifact-session.d.ts +45 -0
  379. package/dist/server/server/session/artifact/artifact-session.js +293 -0
  380. package/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
  381. package/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
  382. package/dist/server/server/session/checkout/checkout-session.d.ts +146 -0
  383. package/dist/server/server/session/checkout/checkout-session.js +1000 -0
  384. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  385. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  386. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  387. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  388. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  389. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  390. package/dist/server/server/session/daemon/daemon-session.d.ts +76 -0
  391. package/dist/server/server/session/daemon/daemon-session.js +148 -0
  392. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  393. package/dist/server/server/session/daemon/diagnostics.js +431 -0
  394. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  395. package/dist/server/server/session/daemon/install-origin.js +64 -0
  396. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  397. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  398. package/dist/server/server/session/files/workspace-files-session.d.ts +60 -0
  399. package/dist/server/server/session/files/workspace-files-session.js +518 -0
  400. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  401. package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  402. package/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
  403. package/dist/server/server/session/project-config/project-config-session.js +125 -0
  404. package/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
  405. package/dist/server/server/session/provider/provider-catalog-session.js +343 -0
  406. package/dist/server/server/session/voice/voice-session.d.ts +167 -0
  407. package/dist/server/server/session/voice/voice-session.js +912 -0
  408. package/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
  409. package/dist/server/server/session/voice/voice-turn-controller.js +393 -0
  410. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  411. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  412. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
  413. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
  414. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  415. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  416. package/dist/server/server/session.d.ts +450 -0
  417. package/dist/server/server/session.js +4763 -0
  418. package/dist/server/server/speech/audio.d.ts +10 -0
  419. package/dist/server/server/speech/audio.js +101 -0
  420. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  421. package/dist/server/server/speech/provider-resolver.js +7 -0
  422. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  423. package/dist/server/server/speech/providers/local/config.js +133 -0
  424. package/dist/server/server/speech/providers/local/models.d.ts +13 -0
  425. package/dist/server/server/speech/providers/local/models.js +21 -0
  426. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  427. package/dist/server/server/speech/providers/local/runtime.js +135 -0
  428. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  429. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +109 -0
  430. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +129 -0
  431. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +16 -0
  432. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +195 -0
  433. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  434. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  435. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  436. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  437. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  438. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  439. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  440. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  441. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  442. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  443. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +24 -0
  444. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +145 -0
  445. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  446. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  447. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  448. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  449. package/dist/server/server/speech/providers/local/sherpa/tts-voices.d.ts +10 -0
  450. package/dist/server/server/speech/providers/local/sherpa/tts-voices.js +86 -0
  451. package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  452. package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  453. package/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
  454. package/dist/server/server/speech/providers/local/worker-client.js +591 -0
  455. package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  456. package/dist/server/server/speech/providers/local/worker-process.js +270 -0
  457. package/dist/server/server/speech/providers/local/worker-protocol.d.ts +96 -0
  458. package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  459. package/dist/server/server/speech/providers/openai/config.d.ts +19 -0
  460. package/dist/server/server/speech/providers/openai/config.js +160 -0
  461. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  462. package/dist/server/server/speech/providers/openai/runtime.js +102 -0
  463. package/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
  464. package/dist/server/server/speech/providers/openai/stt.js +209 -0
  465. package/dist/server/server/speech/providers/openai/tts.d.ts +20 -0
  466. package/dist/server/server/speech/providers/openai/tts.js +70 -0
  467. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  468. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  469. package/dist/server/server/speech/speech-provider.d.ts +71 -0
  470. package/dist/server/server/speech/speech-provider.js +2 -0
  471. package/dist/server/server/speech/speech-runtime.d.ts +67 -0
  472. package/dist/server/server/speech/speech-runtime.js +615 -0
  473. package/dist/server/server/speech/speech-settings-options.d.ts +14 -0
  474. package/dist/server/server/speech/speech-settings-options.js +73 -0
  475. package/dist/server/server/speech/speech-types.d.ts +22 -0
  476. package/dist/server/server/speech/speech-types.js +8 -0
  477. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  478. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  479. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  480. package/dist/server/server/utils/diff-highlighter.js +279 -0
  481. package/dist/server/server/voice-config.d.ts +15 -0
  482. package/dist/server/server/voice-config.js +54 -0
  483. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  484. package/dist/server/server/voice-permission-policy.js +13 -0
  485. package/dist/server/server/voice-types.d.ts +12 -0
  486. package/dist/server/server/voice-types.js +2 -0
  487. package/dist/server/server/web-ui.d.ts +10 -0
  488. package/dist/server/server/web-ui.js +205 -0
  489. package/dist/server/server/websocket/runtime-metrics.d.ts +94 -0
  490. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  491. package/dist/server/server/websocket-server.d.ts +187 -0
  492. package/dist/server/server/websocket-server.js +1766 -0
  493. package/dist/server/server/workspace-archive-service.d.ts +65 -0
  494. package/dist/server/server/workspace-archive-service.js +229 -0
  495. package/dist/server/server/workspace-auto-name.d.ts +55 -0
  496. package/dist/server/server/workspace-auto-name.js +128 -0
  497. package/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
  498. package/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
  499. package/dist/server/server/workspace-directory.d.ts +93 -0
  500. package/dist/server/server/workspace-directory.js +422 -0
  501. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  502. package/dist/server/server/workspace-git-metadata.js +55 -0
  503. package/dist/server/server/workspace-git-service.d.ts +270 -0
  504. package/dist/server/server/workspace-git-service.js +1423 -0
  505. package/dist/server/server/workspace-reconciliation-service.d.ts +57 -0
  506. package/dist/server/server/workspace-reconciliation-service.js +278 -0
  507. package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  508. package/dist/server/server/workspace-registry-bootstrap.js +121 -0
  509. package/dist/server/server/workspace-registry-model.d.ts +55 -0
  510. package/dist/server/server/workspace-registry-model.js +190 -0
  511. package/dist/server/server/workspace-registry.d.ts +117 -0
  512. package/dist/server/server/workspace-registry.js +194 -0
  513. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  514. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  515. package/dist/server/server/workspace-service-env.d.ts +18 -0
  516. package/dist/server/server/workspace-service-env.js +85 -0
  517. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  518. package/dist/server/server/workspace-service-port-registry.js +59 -0
  519. package/dist/server/server/worktree/commands.d.ts +55 -0
  520. package/dist/server/server/worktree/commands.js +107 -0
  521. package/dist/server/server/worktree-bootstrap.d.ts +76 -0
  522. package/dist/server/server/worktree-bootstrap.js +720 -0
  523. package/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
  524. package/dist/server/server/worktree-branch-name-generator.js +91 -0
  525. package/dist/server/server/worktree-core.d.ts +31 -0
  526. package/dist/server/server/worktree-core.js +105 -0
  527. package/dist/server/server/worktree-errors.d.ts +12 -0
  528. package/dist/server/server/worktree-errors.js +28 -0
  529. package/dist/server/server/worktree-session.d.ts +152 -0
  530. package/dist/server/server/worktree-session.js +466 -0
  531. package/dist/server/services/git-hosting/bitbucket-cloud-service.d.ts +24 -0
  532. package/dist/server/services/git-hosting/bitbucket-cloud-service.js +754 -0
  533. package/dist/server/services/git-hosting/github-hosting-service.d.ts +4 -0
  534. package/dist/server/services/git-hosting/github-hosting-service.js +11 -0
  535. package/dist/server/services/git-hosting/hosting-http-client.d.ts +20 -0
  536. package/dist/server/services/git-hosting/hosting-http-client.js +131 -0
  537. package/dist/server/services/git-hosting/request-cache.d.ts +20 -0
  538. package/dist/server/services/git-hosting/request-cache.js +68 -0
  539. package/dist/server/services/git-hosting/resolver.d.ts +32 -0
  540. package/dist/server/services/git-hosting/resolver.js +152 -0
  541. package/dist/server/services/git-hosting/router.d.ts +4 -0
  542. package/dist/server/services/git-hosting/router.js +105 -0
  543. package/dist/server/services/git-hosting/status-poller.d.ts +39 -0
  544. package/dist/server/services/git-hosting/status-poller.js +149 -0
  545. package/dist/server/services/git-hosting/types.d.ts +53 -0
  546. package/dist/server/services/git-hosting/types.js +75 -0
  547. package/dist/server/services/github-service.d.ts +339 -0
  548. package/dist/server/services/github-service.js +2109 -0
  549. package/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
  550. package/dist/server/services/quota-fetcher/manifest.js +52 -0
  551. package/dist/server/services/quota-fetcher/provider.d.ts +17 -0
  552. package/dist/server/services/quota-fetcher/provider.js +2 -0
  553. package/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
  554. package/dist/server/services/quota-fetcher/providers/claude.js +217 -0
  555. package/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  556. package/dist/server/services/quota-fetcher/providers/codex.js +211 -0
  557. package/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
  558. package/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
  559. package/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
  560. package/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
  561. package/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
  562. package/dist/server/services/quota-fetcher/providers/grok.js +89 -0
  563. package/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
  564. package/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
  565. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  566. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  567. package/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  568. package/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  569. package/dist/server/services/quota-fetcher/service.d.ts +28 -0
  570. package/dist/server/services/quota-fetcher/service.js +58 -0
  571. package/dist/server/services/quota-fetcher/usage.d.ts +22 -0
  572. package/dist/server/services/quota-fetcher/usage.js +49 -0
  573. package/dist/server/terminal/activity/terminal-activity-tracker.d.ts +20 -0
  574. package/dist/server/terminal/activity/terminal-activity-tracker.js +59 -0
  575. package/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
  576. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
  577. package/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
  578. package/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
  579. package/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
  580. package/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
  581. package/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
  582. package/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
  583. package/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
  584. package/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
  585. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
  586. package/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +46 -0
  587. package/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
  588. package/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
  589. package/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
  590. package/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
  591. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
  592. package/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
  593. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  594. package/dist/server/terminal/shell-integration/zsh/otto-integration.zsh +32 -0
  595. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  596. package/dist/server/terminal/terminal-capture.js +43 -0
  597. package/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
  598. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  599. package/dist/server/terminal/terminal-manager.d.ts +78 -0
  600. package/dist/server/terminal/terminal-manager.js +319 -0
  601. package/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
  602. package/dist/server/terminal/terminal-output-coalescer.js +73 -0
  603. package/dist/server/terminal/terminal-restore.d.ts +18 -0
  604. package/dist/server/terminal/terminal-restore.js +52 -0
  605. package/dist/server/terminal/terminal-session-controller.d.ts +85 -0
  606. package/dist/server/terminal/terminal-session-controller.js +819 -0
  607. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  608. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  609. package/dist/server/terminal/terminal-worker-process.js +304 -0
  610. package/dist/server/terminal/terminal-worker-protocol.d.ts +119 -0
  611. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  612. package/dist/server/terminal/terminal.d.ts +151 -0
  613. package/dist/server/terminal/terminal.js +1155 -0
  614. package/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
  615. package/dist/server/terminal/worker-terminal-manager.js +688 -0
  616. package/dist/server/utils/build-metadata-prompt.d.ts +19 -0
  617. package/dist/server/utils/build-metadata-prompt.js +29 -0
  618. package/dist/server/utils/checkout-git.d.ts +253 -0
  619. package/dist/server/utils/checkout-git.js +2241 -0
  620. package/dist/server/utils/directory-suggestions.d.ts +26 -0
  621. package/dist/server/utils/directory-suggestions.js +830 -0
  622. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  623. package/dist/server/utils/git-rev-parse-path.js +21 -0
  624. package/dist/server/utils/github-remote.d.ts +9 -0
  625. package/dist/server/utils/github-remote.js +62 -0
  626. package/dist/server/utils/otto-config-file.d.ts +30 -0
  627. package/dist/server/utils/otto-config-file.js +90 -0
  628. package/dist/server/utils/path.d.ts +18 -0
  629. package/dist/server/utils/path.js +123 -0
  630. package/dist/server/utils/project-icon.d.ts +39 -0
  631. package/dist/server/utils/project-icon.js +364 -0
  632. package/dist/server/utils/promise-timeout.d.ts +9 -0
  633. package/dist/server/utils/promise-timeout.js +25 -0
  634. package/dist/server/utils/run-git-command.d.ts +37 -0
  635. package/dist/server/utils/run-git-command.js +232 -0
  636. package/dist/server/utils/spawn.d.ts +25 -0
  637. package/dist/server/utils/spawn.js +59 -0
  638. package/dist/server/utils/string-command-shell.d.ts +13 -0
  639. package/dist/server/utils/string-command-shell.js +37 -0
  640. package/dist/server/utils/tree-kill.d.ts +18 -0
  641. package/dist/server/utils/tree-kill.js +77 -0
  642. package/dist/server/utils/windows-command.d.ts +15 -0
  643. package/dist/server/utils/windows-command.js +41 -0
  644. package/dist/server/utils/worktree-metadata.d.ts +39 -0
  645. package/dist/server/utils/worktree-metadata.js +174 -0
  646. package/dist/server/utils/worktree.d.ts +205 -0
  647. package/dist/server/utils/worktree.js +1120 -0
  648. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  649. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  650. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  651. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-a25c6055b348629689f75618db2c83e1.js +1 -0
  652. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-a25c6055b348629689f75618db2c83e1.js.br +0 -0
  653. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-a25c6055b348629689f75618db2c83e1.js.gz +0 -0
  654. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-7dc26ea1611eb9d7c2971a6745e5bf5c.js +1 -0
  655. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-7dc26ea1611eb9d7c2971a6745e5bf5c.js.br +0 -0
  656. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-7dc26ea1611eb9d7c2971a6745e5bf5c.js.gz +0 -0
  657. package/dist/server/web-ui/_expo/static/js/web/index-ea91f496cee180fa5bf308c8cc177646.js +3199 -0
  658. package/dist/server/web-ui/_expo/static/js/web/index-ea91f496cee180fa5bf308c8cc177646.js.br +0 -0
  659. package/dist/server/web-ui/_expo/static/js/web/index-ea91f496cee180fa5bf308c8cc177646.js.gz +0 -0
  660. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b6b853a967343babf305512fe8c5958c.js +1 -0
  661. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b6b853a967343babf305512fe8c5958c.js.br +0 -0
  662. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-b6b853a967343babf305512fe8c5958c.js.gz +0 -0
  663. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-17223e158406802adc686d02d946573d.js +3 -0
  664. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-17223e158406802adc686d02d946573d.js.br +0 -0
  665. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-17223e158406802adc686d02d946573d.js.gz +0 -0
  666. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  667. package/dist/server/web-ui/assets/__node_modules/@expo-google-fonts/inter/400Regular/Inter_400Regular.51b6ad87261f18b6433ec52871ddfabc.ttf +0 -0
  668. package/dist/server/web-ui/assets/__node_modules/@expo-google-fonts/jetbrains-mono/400Regular/JetBrainsMono_400Regular.a0147b5ab9e4946e81879aef45313def.ttf +0 -0
  669. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  670. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  671. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  672. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  673. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  674. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  675. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  676. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  677. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  678. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  679. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  680. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  681. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  682. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  683. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  684. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  685. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  686. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  687. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  688. package/dist/server/web-ui/assets/assets/images/editor-apps/clion.baa1f4eb572e962a6117bdbee95749e4.png +0 -0
  689. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  690. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  691. package/dist/server/web-ui/assets/assets/images/editor-apps/goland.0796ab2b9be2637fd1cdcde891fad3ca.png +0 -0
  692. package/dist/server/web-ui/assets/assets/images/editor-apps/intellij-idea.33bc9ff9c0815d8ad43f618c8c244401.png +0 -0
  693. package/dist/server/web-ui/assets/assets/images/editor-apps/phpstorm.c60b33bc7a8309143d232e14b76554c5.png +0 -0
  694. package/dist/server/web-ui/assets/assets/images/editor-apps/pycharm.88f25ac484989c45c25323e0adccfa9f.png +0 -0
  695. package/dist/server/web-ui/assets/assets/images/editor-apps/rider.1a1091dc3a0ede0461f0aa38a54f080a.png +0 -0
  696. package/dist/server/web-ui/assets/assets/images/editor-apps/rubymine.0e5b66fd7d43f8cbac0f05bba97c9a21.png +0 -0
  697. package/dist/server/web-ui/assets/assets/images/editor-apps/rustrover.3590ef05482369f41d3484c90272570d.png +0 -0
  698. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  699. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  700. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  701. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.3b2c331d11122d8f743c73a5878593be.png +0 -0
  702. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.6077c2ab71021b31c82a42e0b42ad837.png +0 -0
  703. package/dist/server/web-ui/assets/assets/images/favicon-dark.12984efe6d435a13794a74cd2f858dcd.png +0 -0
  704. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.3b2c331d11122d8f743c73a5878593be.png +0 -0
  705. package/dist/server/web-ui/assets/assets/images/favicon-light-running.6077c2ab71021b31c82a42e0b42ad837.png +0 -0
  706. package/dist/server/web-ui/assets/assets/images/favicon-light.12984efe6d435a13794a74cd2f858dcd.png +0 -0
  707. package/dist/server/web-ui/assets/assets/images/notification-icon.2394c3b427c0f5ee2bb84864d8fb0f45.png +0 -0
  708. package/dist/server/web-ui/favicon.ico +0 -0
  709. package/dist/server/web-ui/index.html +147 -0
  710. package/dist/server/web-ui/index.html.br +0 -0
  711. package/dist/server/web-ui/index.html.gz +0 -0
  712. package/dist/server/web-ui/manifest.json +27 -0
  713. package/dist/server/web-ui/manifest.json.br +0 -0
  714. package/dist/server/web-ui/manifest.json.gz +0 -0
  715. package/dist/server/web-ui/metadata.json +1 -0
  716. package/dist/server/web-ui/metadata.json.br +1 -0
  717. package/dist/server/web-ui/metadata.json.gz +0 -0
  718. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  719. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  720. package/dist/server/web-ui/robots.txt +2 -0
  721. package/dist/src/executable-resolution/executable-resolution.js +118 -0
  722. package/dist/src/executable-resolution/windows.js +65 -0
  723. package/dist/src/server/agent/provider-launch-config.js +167 -0
  724. package/dist/src/server/otto-env.js +53 -0
  725. package/dist/src/server/otto-home.js +19 -0
  726. package/dist/src/server/persisted-config.js +471 -0
  727. package/dist/src/server/pid-lock.js +170 -0
  728. package/dist/src/server/private-files.js +37 -0
  729. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  730. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  731. package/dist/src/terminal/shell-integration/zsh/otto-integration.zsh +32 -0
  732. package/dist/src/utils/spawn.js +59 -0
  733. package/dist/src/utils/windows-command.js +41 -0
  734. package/package.json +118 -0
@@ -0,0 +1,1155 @@
1
+ import * as pty from "node-pty";
2
+ import xterm from "@xterm/headless";
3
+ import { randomUUID } from "crypto";
4
+ import { chmodSync, existsSync, mkdirSync, readFileSync, statSync } from "node:fs";
5
+ import { tmpdir, userInfo } from "node:os";
6
+ import { basename, delimiter, dirname, extname, join, resolve as resolvePath } from "node:path";
7
+ import { createRequire } from "node:module";
8
+ import { fileURLToPath } from "node:url";
9
+ import { createExternalProcessEnv } from "../server/otto-env.js";
10
+ import { writePrivateFileAtomicSync } from "../server/private-files.js";
11
+ import { findExecutable } from "../executable-resolution/executable-resolution.js";
12
+ import { TerminalInputModeTracker } from "@otto-code/protocol/terminal-input-mode";
13
+ import { TerminalActivityTracker } from "./activity/terminal-activity-tracker.js";
14
+ const { Terminal } = xterm;
15
+ const require = createRequire(import.meta.url);
16
+ const OTTO_CLI_BIN_ENTRY = "@otto-code/cli/bin/otto";
17
+ let nodePtySpawnHelperChecked = false;
18
+ const TERMINAL_TITLE_DEBOUNCE_MS = 150;
19
+ const TERMINAL_EXIT_OUTPUT_LINE_LIMIT = 12;
20
+ const TERMINAL_EXIT_OUTPUT_CHAR_LIMIT = 16000;
21
+ const TERMINAL_OSC_COLOR_QUERY_RESPONSES = new Map([
22
+ [10, "rgb:e6e6/e6e6/e6e6"],
23
+ [11, "rgb:0b0b/0b0b/0b0b"],
24
+ [12, "rgb:e6e6/e6e6/e6e6"],
25
+ ]);
26
+ function parseCommandFinishedOsc(data) {
27
+ // OSC 633 is terminal control traffic, but a foreground command can still
28
+ // print arbitrary control bytes. Keep this boundary to the exact VS Code
29
+ // command-finished shape emitted by our shell integration.
30
+ const parts = data.split(";");
31
+ if (parts[0] !== "D") {
32
+ return null;
33
+ }
34
+ if (parts.length === 1) {
35
+ return { exitCode: null };
36
+ }
37
+ if (parts.length !== 2 || !/^-?\d+$/.test(parts[1])) {
38
+ return null;
39
+ }
40
+ return { exitCode: Number(parts[1]) };
41
+ }
42
+ function toTerminalActivity(snapshot) {
43
+ if (!snapshot.state) {
44
+ return null;
45
+ }
46
+ return {
47
+ state: snapshot.state,
48
+ ...(snapshot.attentionReason ? { attentionReason: snapshot.attentionReason } : {}),
49
+ changedAt: snapshot.changedAt,
50
+ };
51
+ }
52
+ function resolveInitialTitleMode(presetTitle) {
53
+ return presetTitle?.trim() ? "manual" : "auto";
54
+ }
55
+ function resolveNodePtyPackageRoot() {
56
+ try {
57
+ const packageJsonPath = require.resolve("node-pty/package.json");
58
+ return dirname(packageJsonPath);
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ function ensureExecutableBit(path) {
65
+ if (!existsSync(path)) {
66
+ return;
67
+ }
68
+ const stat = statSync(path);
69
+ if (!stat.isFile()) {
70
+ return;
71
+ }
72
+ // node-pty 1.1.0 shipped darwin prebuild spawn-helper without execute bit.
73
+ if ((stat.mode & 0o111) === 0o111) {
74
+ return;
75
+ }
76
+ chmodSync(path, stat.mode | 0o111);
77
+ }
78
+ export function ensureNodePtySpawnHelperExecutableForCurrentPlatform(options = {}) {
79
+ const platform = options.platform ?? process.platform;
80
+ if (platform !== "darwin") {
81
+ return;
82
+ }
83
+ if (nodePtySpawnHelperChecked && !options.force) {
84
+ return;
85
+ }
86
+ const packageRoot = options.packageRoot ?? resolveNodePtyPackageRoot();
87
+ if (!packageRoot) {
88
+ return;
89
+ }
90
+ const arch = options.arch ?? process.arch;
91
+ const candidates = [
92
+ join(packageRoot, "build", "Release", "spawn-helper"),
93
+ join(packageRoot, "build", "Debug", "spawn-helper"),
94
+ join(packageRoot, "prebuilds", `darwin-${arch}`, "spawn-helper"),
95
+ ];
96
+ for (const candidate of candidates) {
97
+ try {
98
+ ensureExecutableBit(candidate);
99
+ }
100
+ catch {
101
+ // best-effort hardening only
102
+ }
103
+ }
104
+ if (!options.force) {
105
+ nodePtySpawnHelperChecked = true;
106
+ }
107
+ }
108
+ export function resolveDefaultTerminalShell(options = {}) {
109
+ const platform = options.platform ?? process.platform;
110
+ const env = options.env ?? process.env;
111
+ if (platform === "win32") {
112
+ return env.ComSpec || env.COMSPEC || "C:\\Windows\\System32\\cmd.exe";
113
+ }
114
+ return env.SHELL || "/bin/sh";
115
+ }
116
+ /**
117
+ * Resolve a terminal profile command (e.g. `claude`) into something node-pty's
118
+ * conpty backend can actually launch on Windows.
119
+ *
120
+ * On Windows, conpty's underlying `CreateProcess` does not apply `PATHEXT`, so a
121
+ * bare `claude` (installed by npm as `claude.cmd`) fails with `error code: 2`
122
+ * (`ERROR_FILE_NOT_FOUND`). Worse, conpty completes the spawn asynchronously on
123
+ * its own conout worker thread, so that failure surfaces as an uncaught
124
+ * exception that takes down the whole terminal worker process. Resolving the
125
+ * real path up front — and routing `.cmd`/`.bat` shims through `cmd.exe /c`
126
+ * (node-pty has no `shell` option) — keeps the profile launchable.
127
+ *
128
+ * Non-Windows and the default-shell path (no explicit command) are unchanged.
129
+ */
130
+ export async function resolveTerminalSpawnCommand(command, args, options = {}) {
131
+ const platform = options.platform ?? process.platform;
132
+ if (platform !== "win32") {
133
+ return { command, args };
134
+ }
135
+ const resolveExecutable = options.resolveExecutable ?? findExecutable;
136
+ const resolved = await resolveExecutable(command);
137
+ if (!resolved) {
138
+ // Leave the command as-is so the terminal itself surfaces the "not found"
139
+ // error to the user instead of silently doing nothing.
140
+ return { command, args };
141
+ }
142
+ // `.cmd`/`.bat` shims are batch scripts that conpty's CreateProcess cannot
143
+ // launch directly; they must run through cmd.exe (node-pty has no `shell`
144
+ // option, so build the `cmd /c` invocation ourselves). Checked by extension
145
+ // rather than isWindowsCommandScript() because that helper gates on the live
146
+ // process.platform, which is wrong once we're already on the win32 branch.
147
+ const extension = extname(resolved).toLowerCase();
148
+ if (extension === ".cmd" || extension === ".bat") {
149
+ const env = options.env ?? process.env;
150
+ const comSpec = env.ComSpec || env.COMSPEC || "C:\\Windows\\System32\\cmd.exe";
151
+ return { command: comSpec, args: ["/c", resolved, ...args] };
152
+ }
153
+ return { command: resolved, args };
154
+ }
155
+ export function resolveZshShellIntegrationDir() {
156
+ return fileURLToPath(new URL("./shell-integration/zsh", import.meta.url));
157
+ }
158
+ function resolveExternalProcessPath(filePath) {
159
+ return filePath.replace(/\.asar(?=[/\\]|$)/, ".asar.unpacked");
160
+ }
161
+ export function resolveOttoCliBinDir() {
162
+ const cliEntrypoint = resolveOttoCliBinEntrypoint();
163
+ if (!cliEntrypoint) {
164
+ return null;
165
+ }
166
+ const externalCliEntrypoint = resolveExternalProcessPath(cliEntrypoint);
167
+ return findNpmBinDir(dirname(externalCliEntrypoint)) ?? dirname(externalCliEntrypoint);
168
+ }
169
+ export function resolveOttoCliExecutablePath() {
170
+ const cliEntrypoint = resolveOttoCliBinEntrypoint();
171
+ if (!cliEntrypoint) {
172
+ return null;
173
+ }
174
+ const externalCliEntrypoint = resolveExternalProcessPath(cliEntrypoint);
175
+ const npmBinDir = findNpmBinDir(dirname(externalCliEntrypoint));
176
+ if (npmBinDir) {
177
+ const shim = resolveOttoCliShim(npmBinDir);
178
+ if (shim) {
179
+ return shim;
180
+ }
181
+ }
182
+ return externalCliEntrypoint;
183
+ }
184
+ function resolveOttoCliBinEntrypoint() {
185
+ try {
186
+ return require.resolve(OTTO_CLI_BIN_ENTRY);
187
+ }
188
+ catch {
189
+ return null;
190
+ }
191
+ }
192
+ function findNpmBinDir(startPath) {
193
+ let current = startPath;
194
+ while (true) {
195
+ const candidate = join(current, "node_modules", ".bin");
196
+ if (hasOttoCliShim(candidate)) {
197
+ return candidate;
198
+ }
199
+ const parent = dirname(current);
200
+ if (parent === current) {
201
+ return null;
202
+ }
203
+ current = parent;
204
+ }
205
+ }
206
+ function hasOttoCliShim(binDir) {
207
+ return resolveOttoCliShim(binDir) !== null;
208
+ }
209
+ function resolveOttoCliShim(binDir) {
210
+ for (const name of ottoCliShimNames()) {
211
+ const candidate = join(binDir, name);
212
+ if (existsSync(candidate)) {
213
+ return candidate;
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ function ottoCliShimNames() {
219
+ return process.platform === "win32" ? ["otto.cmd", "otto.exe", "otto"] : ["otto"];
220
+ }
221
+ function resolveZshShellIntegrationRuntimeDir() {
222
+ let username = "unknown";
223
+ try {
224
+ username = userInfo().username || username;
225
+ }
226
+ catch {
227
+ // keep fallback
228
+ }
229
+ return join(tmpdir(), `${username}-otto-zsh`);
230
+ }
231
+ function prepareZshShellIntegrationRuntimeDir(sourceDir = resolveZshShellIntegrationDir()) {
232
+ const readableSourceDir = resolveExternalProcessPath(sourceDir);
233
+ const runtimeDir = resolveZshShellIntegrationRuntimeDir();
234
+ mkdirSync(runtimeDir, { recursive: true, mode: 0o700 });
235
+ chmodSync(runtimeDir, 0o700);
236
+ writePrivateFileAtomicSync(join(runtimeDir, ".zshenv"), readFileSync(join(readableSourceDir, ".zshenv")));
237
+ writePrivateFileAtomicSync(join(runtimeDir, "otto-integration.zsh"), readFileSync(join(readableSourceDir, "otto-integration.zsh")));
238
+ return runtimeDir;
239
+ }
240
+ export function buildTerminalEnvironment(input) {
241
+ const baseEnv = createExternalProcessEnv(process.env, input.env, {
242
+ TERM: "xterm-256color",
243
+ TERM_PROGRAM: "kitty",
244
+ });
245
+ const envWithAgentHooks = prependOttoCliToPath(baseEnv, input.ottoCliBinDir === undefined ? resolveOttoCliBinDir() : input.ottoCliBinDir);
246
+ const envWithHookCli = injectOttoHookCli(envWithAgentHooks, input.ottoHookCliPath === undefined ? resolveOttoCliExecutablePath() : input.ottoHookCliPath);
247
+ if (basename(input.shell) !== "zsh") {
248
+ return envWithHookCli;
249
+ }
250
+ const originalZdotdir = envWithHookCli.ZDOTDIR ?? "";
251
+ return {
252
+ ...envWithHookCli,
253
+ OTTO_ZSH_ZDOTDIR: originalZdotdir,
254
+ ZDOTDIR: prepareZshShellIntegrationRuntimeDir(input.zshShellIntegrationDir),
255
+ };
256
+ }
257
+ function injectOttoHookCli(env, cliPath) {
258
+ if (!cliPath) {
259
+ return env;
260
+ }
261
+ return {
262
+ ...env,
263
+ OTTO_HOOK_CLI: resolvePath(resolveExternalProcessPath(cliPath)),
264
+ };
265
+ }
266
+ function prependOttoCliToPath(env, cliBinDir) {
267
+ if (!cliBinDir) {
268
+ return env;
269
+ }
270
+ const pathKey = getPathEnvKey(env);
271
+ const currentPath = env[pathKey] ?? "";
272
+ return {
273
+ ...env,
274
+ [pathKey]: prependPathEntry(currentPath, cliBinDir),
275
+ };
276
+ }
277
+ function getPathEnvKey(env) {
278
+ return Object.keys(env).find((key) => key.toLowerCase() === "path") ?? "PATH";
279
+ }
280
+ function prependPathEntry(currentPath, entry) {
281
+ const entries = currentPath.split(delimiter).filter((value) => value && value !== entry);
282
+ return [entry, ...entries].join(delimiter);
283
+ }
284
+ function extractCell(terminal, row, col) {
285
+ const buffer = terminal.buffer.active;
286
+ const line = buffer.getLine(row);
287
+ if (!line) {
288
+ return { char: " ", fg: undefined, bg: undefined };
289
+ }
290
+ const cell = line.getCell(col);
291
+ if (!cell) {
292
+ return { char: " ", fg: undefined, bg: undefined };
293
+ }
294
+ // Color modes from xterm.js: 0=DEFAULT, 1=16 colors (ANSI), 2=256 colors, 3=RGB
295
+ // getFgColorMode() returns packed value with mode in upper byte (e.g. 0x01000000 for mode 1)
296
+ const fgModeRaw = cell.getFgColorMode();
297
+ const bgModeRaw = cell.getBgColorMode();
298
+ const fgMode = fgModeRaw >> 24;
299
+ const bgMode = bgModeRaw >> 24;
300
+ // Only return color if not default (mode 0)
301
+ const fg = fgMode !== 0 ? cell.getFgColor() : undefined;
302
+ const bg = bgMode !== 0 ? cell.getBgColor() : undefined;
303
+ return {
304
+ char: cell.getChars() || " ",
305
+ fg,
306
+ bg,
307
+ fgMode: fgMode !== 0 ? fgMode : undefined,
308
+ bgMode: bgMode !== 0 ? bgMode : undefined,
309
+ bold: cell.isBold() !== 0,
310
+ italic: cell.isItalic() !== 0,
311
+ underline: cell.isUnderline() !== 0,
312
+ dim: cell.isDim() !== 0,
313
+ inverse: cell.isInverse() !== 0,
314
+ strikethrough: cell.isStrikethrough() !== 0,
315
+ };
316
+ }
317
+ function extractGrid(terminal) {
318
+ const grid = [];
319
+ const buffer = terminal.buffer.active;
320
+ // Visible viewport starts at baseY
321
+ const baseY = buffer.baseY;
322
+ for (let row = 0; row < terminal.rows; row++) {
323
+ const rowCells = [];
324
+ for (let col = 0; col < terminal.cols; col++) {
325
+ rowCells.push(extractCell(terminal, baseY + row, col));
326
+ }
327
+ grid.push(rowCells);
328
+ }
329
+ return grid;
330
+ }
331
+ function extractScrollback(terminal, options) {
332
+ const scrollback = [];
333
+ const buffer = terminal.buffer.active;
334
+ // baseY is the first row of the visible viewport (0-indexed)
335
+ // Lines 0 to baseY-1 are in scrollback, lines baseY onwards are visible
336
+ const scrollbackLines = buffer.baseY;
337
+ const startRow = typeof options?.scrollbackLines === "number"
338
+ ? Math.max(0, scrollbackLines - options.scrollbackLines)
339
+ : 0;
340
+ for (let row = startRow; row < scrollbackLines; row++) {
341
+ const rowCells = [];
342
+ const line = buffer.getLine(row);
343
+ for (let col = 0; col < terminal.cols; col++) {
344
+ if (line) {
345
+ const cell = line.getCell(col);
346
+ if (cell) {
347
+ const fgModeRaw = cell.getFgColorMode();
348
+ const bgModeRaw = cell.getBgColorMode();
349
+ const fgMode = fgModeRaw >> 24;
350
+ const bgMode = bgModeRaw >> 24;
351
+ const fg = fgMode !== 0 ? cell.getFgColor() : undefined;
352
+ const bg = bgMode !== 0 ? cell.getBgColor() : undefined;
353
+ rowCells.push({
354
+ char: cell.getChars() || " ",
355
+ fg,
356
+ bg,
357
+ fgMode: fgMode !== 0 ? fgMode : undefined,
358
+ bgMode: bgMode !== 0 ? bgMode : undefined,
359
+ bold: cell.isBold() !== 0,
360
+ italic: cell.isItalic() !== 0,
361
+ underline: cell.isUnderline() !== 0,
362
+ dim: cell.isDim() !== 0,
363
+ inverse: cell.isInverse() !== 0,
364
+ strikethrough: cell.isStrikethrough() !== 0,
365
+ });
366
+ }
367
+ else {
368
+ rowCells.push({ char: " ", fg: undefined, bg: undefined });
369
+ }
370
+ }
371
+ else {
372
+ rowCells.push({ char: " ", fg: undefined, bg: undefined });
373
+ }
374
+ }
375
+ scrollback.push(rowCells);
376
+ }
377
+ return scrollback;
378
+ }
379
+ // xterm marks a line `isWrapped` when it is a continuation of the PREVIOUS line.
380
+ // The snapshot carries the inverse, tmux-style flag — "this row continues onto the
381
+ // next row" — so the client can rejoin and reflow logical lines. So row y's flag is
382
+ // whether line y+1 is a wrapped continuation.
383
+ function lineContinuesToNext(terminal, absoluteRow) {
384
+ return terminal.buffer.active.getLine(absoluteRow + 1)?.isWrapped === true;
385
+ }
386
+ function extractGridWrapped(terminal) {
387
+ const baseY = terminal.buffer.active.baseY;
388
+ const wrapped = [];
389
+ for (let row = 0; row < terminal.rows; row++) {
390
+ wrapped.push(lineContinuesToNext(terminal, baseY + row));
391
+ }
392
+ return wrapped;
393
+ }
394
+ function extractScrollbackWrapped(terminal, options) {
395
+ const scrollbackLines = terminal.buffer.active.baseY;
396
+ const startRow = typeof options?.scrollbackLines === "number"
397
+ ? Math.max(0, scrollbackLines - options.scrollbackLines)
398
+ : 0;
399
+ const wrapped = [];
400
+ for (let row = startRow; row < scrollbackLines; row++) {
401
+ wrapped.push(lineContinuesToNext(terminal, row));
402
+ }
403
+ return wrapped;
404
+ }
405
+ function extractCursorState(terminal) {
406
+ const coreService = terminal
407
+ ._core?.coreService;
408
+ const cursorStyle = coreService?.decPrivateModes?.cursorStyle;
409
+ const normalizedCursorStyle = cursorStyle === "block" || cursorStyle === "underline" || cursorStyle === "bar"
410
+ ? cursorStyle
411
+ : undefined;
412
+ const cursorBlink = typeof coreService?.decPrivateModes?.cursorBlink === "boolean"
413
+ ? coreService.decPrivateModes.cursorBlink
414
+ : undefined;
415
+ const hidden = Boolean(coreService?.isCursorHidden);
416
+ return {
417
+ row: terminal.buffer.active.cursorY,
418
+ col: terminal.buffer.active.cursorX,
419
+ ...(hidden ? { hidden: true } : {}),
420
+ ...(normalizedCursorStyle ? { style: normalizedCursorStyle } : {}),
421
+ ...(typeof cursorBlink === "boolean" ? { blink: cursorBlink } : {}),
422
+ };
423
+ }
424
+ function normalizeProcessToken(token) {
425
+ if (token.length === 0) {
426
+ return token;
427
+ }
428
+ let quote;
429
+ if (token.startsWith('"') && token.endsWith('"')) {
430
+ quote = '"';
431
+ }
432
+ else if (token.startsWith("'") && token.endsWith("'")) {
433
+ quote = "'";
434
+ }
435
+ else {
436
+ quote = "";
437
+ }
438
+ const rawToken = quote ? token.slice(1, -1) : token;
439
+ if (rawToken.length === 0) {
440
+ return token;
441
+ }
442
+ const assignmentMatch = rawToken.match(/^([A-Za-z_][A-Za-z0-9_]*=)(.+)$/);
443
+ const prefix = assignmentMatch ? assignmentMatch[1] : "";
444
+ const value = assignmentMatch ? assignmentMatch[2] : rawToken;
445
+ if (!value.includes("/")) {
446
+ return token;
447
+ }
448
+ const normalized = `${prefix}${basename(value)}`;
449
+ return quote ? `${quote}${normalized}${quote}` : normalized;
450
+ }
451
+ export function normalizeProcessTitle(processTitle) {
452
+ const trimmed = processTitle.trim().replace(/\s+/g, " ");
453
+ if (trimmed.length === 0) {
454
+ return undefined;
455
+ }
456
+ const normalized = trimmed
457
+ .split(" ")
458
+ .map((token) => normalizeProcessToken(token))
459
+ .join(" ")
460
+ .trim();
461
+ return normalized.length > 0 ? normalized : undefined;
462
+ }
463
+ const PROCESS_INTERPRETERS = new Set([
464
+ "bash",
465
+ "bun",
466
+ "deno",
467
+ "node",
468
+ "nodejs",
469
+ "python",
470
+ "python3",
471
+ "ruby",
472
+ "sh",
473
+ "tsx",
474
+ "zsh",
475
+ ]);
476
+ const PACKAGE_MANAGER_SCRIPT_NAMES = new Map([
477
+ ["bun.js", "bun"],
478
+ ["npm-cli.js", "npm"],
479
+ ["npx-cli.js", "npx"],
480
+ ["pnpm.cjs", "pnpm"],
481
+ ["pnpm.js", "pnpm"],
482
+ ["yarn.cjs", "yarn"],
483
+ ["yarn.js", "yarn"],
484
+ ]);
485
+ export function humanizeProcessTitle(processTitle) {
486
+ const normalized = normalizeProcessTitle(processTitle);
487
+ if (!normalized) {
488
+ return undefined;
489
+ }
490
+ const tokens = normalized.split(" ").filter(Boolean);
491
+ if (tokens.length === 0) {
492
+ return undefined;
493
+ }
494
+ while (tokens[0] === "env") {
495
+ tokens.shift();
496
+ while (tokens[0] && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[0])) {
497
+ tokens.shift();
498
+ }
499
+ }
500
+ if (tokens.length === 0) {
501
+ return normalized;
502
+ }
503
+ const first = tokens[0];
504
+ const second = tokens[1];
505
+ if (PROCESS_INTERPRETERS.has(first) && second) {
506
+ const packageManager = PACKAGE_MANAGER_SCRIPT_NAMES.get(second);
507
+ if (packageManager) {
508
+ return [packageManager, ...tokens.slice(2)].join(" ").trim() || packageManager;
509
+ }
510
+ if (!second.startsWith("-")) {
511
+ return [second, ...tokens.slice(2)].join(" ").trim();
512
+ }
513
+ }
514
+ return normalized;
515
+ }
516
+ function extractLastOutputLines(terminal, limit) {
517
+ const buffer = terminal.buffer.active;
518
+ const mergedLines = [];
519
+ for (let row = 0; row < buffer.length; row++) {
520
+ const line = buffer.getLine(row);
521
+ if (!line) {
522
+ continue;
523
+ }
524
+ const text = line.translateToString(true);
525
+ const isWrapped = line.isWrapped === true;
526
+ if (isWrapped && mergedLines.length > 0) {
527
+ mergedLines[mergedLines.length - 1] += text;
528
+ continue;
529
+ }
530
+ mergedLines.push(text);
531
+ }
532
+ while (mergedLines.length > 0 && mergedLines[0]?.trim().length === 0) {
533
+ mergedLines.shift();
534
+ }
535
+ while (mergedLines.length > 0 && mergedLines[mergedLines.length - 1]?.trim().length === 0) {
536
+ mergedLines.pop();
537
+ }
538
+ return mergedLines.slice(-limit);
539
+ }
540
+ const ESC = String.fromCharCode(0x1b);
541
+ const BEL = String.fromCharCode(0x07);
542
+ const ANSI_SEQUENCE_PATTERN = new RegExp(`${ESC}(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~]|\\].*?(?:${BEL}|${ESC}\\\\))`, "g");
543
+ function stripAnsiSequences(input) {
544
+ return input.replace(ANSI_SEQUENCE_PATTERN, "");
545
+ }
546
+ function extractLastOutputLinesFromText(text, limit) {
547
+ const normalized = stripAnsiSequences(text).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
548
+ const lines = normalized.split("\n").map((line) => line.trimEnd());
549
+ while (lines[0]?.trim().length === 0) {
550
+ lines.shift();
551
+ }
552
+ while (lines[lines.length - 1]?.trim().length === 0) {
553
+ lines.pop();
554
+ }
555
+ return lines.slice(-limit);
556
+ }
557
+ export async function createTerminal(options) {
558
+ const { cwd, workspaceId, shell, env = {}, activityEnv = {}, rows = 24, cols = 80, name = "Terminal", title: presetTitle, command, args = [], } = options;
559
+ const resolvedShell = shell ?? resolveDefaultTerminalShell();
560
+ const id = options.id ?? randomUUID();
561
+ const listeners = new Set();
562
+ const exitListeners = new Set();
563
+ const commandFinishedListeners = new Set();
564
+ const titleChangeListeners = new Set();
565
+ let killed = false;
566
+ let disposed = false;
567
+ let exitEmitted = false;
568
+ let processExited = false;
569
+ const processExitWaiters = new Set();
570
+ let exitInfo = null;
571
+ // Recent output is retained as whole chunks plus a running char length so we
572
+ // avoid reallocating a ~16KB string on every pty chunk. We keep enough whole
573
+ // chunks that their join always contains at least the last
574
+ // TERMINAL_EXIT_OUTPUT_CHAR_LIMIT chars; the exact tail is sliced at exit.
575
+ const recentOutputChunks = [];
576
+ let recentOutputLength = 0;
577
+ let title;
578
+ let titleMode = resolveInitialTitleMode(presetTitle);
579
+ let pendingTitle;
580
+ let titleDebounceTimer = null;
581
+ let pendingInput = "";
582
+ let inputFlushImmediate = null;
583
+ let stateRevision = 0;
584
+ const inputModeTracker = new TerminalInputModeTracker();
585
+ const activityTracker = new TerminalActivityTracker();
586
+ const activityChangeListeners = new Set();
587
+ let titleChangeSubscription = null;
588
+ // Create xterm.js headless terminal
589
+ const terminal = new Terminal({
590
+ rows,
591
+ cols,
592
+ scrollback: 1000,
593
+ allowProposedApi: true,
594
+ });
595
+ ensureNodePtySpawnHelperExecutableForCurrentPlatform();
596
+ // Create PTY
597
+ const { command: spawnCommand, args: spawnArgs } = command
598
+ ? await resolveTerminalSpawnCommand(command, args)
599
+ : { command: resolvedShell, args: [] };
600
+ const ptyProcess = pty.spawn(spawnCommand, spawnArgs, {
601
+ name: "xterm-256color",
602
+ cols,
603
+ rows,
604
+ cwd,
605
+ env: buildTerminalEnvironment({
606
+ shell: spawnCommand,
607
+ env: {
608
+ ...env,
609
+ ...activityEnv,
610
+ OTTO_WORKSPACE_ID: workspaceId,
611
+ },
612
+ }),
613
+ });
614
+ function emitTitleChange(nextTitle) {
615
+ if (title === nextTitle) {
616
+ return;
617
+ }
618
+ title = nextTitle;
619
+ for (const listener of Array.from(titleChangeListeners)) {
620
+ try {
621
+ listener(title);
622
+ }
623
+ catch {
624
+ // no-op
625
+ }
626
+ }
627
+ for (const listener of Array.from(listeners)) {
628
+ try {
629
+ listener({ type: "titleChange", title });
630
+ }
631
+ catch {
632
+ // no-op
633
+ }
634
+ }
635
+ }
636
+ function clearPendingTitleChange() {
637
+ pendingTitle = undefined;
638
+ if (titleDebounceTimer) {
639
+ clearTimeout(titleDebounceTimer);
640
+ titleDebounceTimer = null;
641
+ }
642
+ }
643
+ function disposeTitleChangeSubscription() {
644
+ titleChangeSubscription?.dispose();
645
+ titleChangeSubscription = null;
646
+ }
647
+ function setTitle(nextTitle) {
648
+ const manualTitle = nextTitle.trim();
649
+ if (!manualTitle) {
650
+ return;
651
+ }
652
+ titleMode = "manual";
653
+ disposeTitleChangeSubscription();
654
+ clearPendingTitleChange();
655
+ emitTitleChange(manualTitle);
656
+ }
657
+ const initialManualTitle = presetTitle?.trim() || undefined;
658
+ const processTitle = command ? [command, ...args].join(" ") : null;
659
+ let initialTitle = initialManualTitle;
660
+ if (!initialTitle && processTitle) {
661
+ initialTitle = humanizeProcessTitle(processTitle) ?? normalizeProcessTitle(processTitle);
662
+ }
663
+ emitTitleChange(initialTitle);
664
+ // Respond to DA1 queries (CSI c or CSI 0 c) — apps like nvim query terminal capabilities
665
+ terminal.parser.registerCsiHandler({ final: "c" }, (params) => {
666
+ if (params.length === 0 || (params.length === 1 && params[0] === 0)) {
667
+ ptyProcess.write("\x1b[?62;4;22c");
668
+ return true;
669
+ }
670
+ return false;
671
+ });
672
+ terminal.parser.registerCsiHandler({ final: "n" }, (params) => {
673
+ if (params.length !== 1) {
674
+ return false;
675
+ }
676
+ if (params[0] === 5) {
677
+ ptyProcess.write("\x1b[0n");
678
+ return true;
679
+ }
680
+ if (params[0] === 6) {
681
+ const buffer = terminal.buffer.active;
682
+ ptyProcess.write(`\x1b[${buffer.cursorY + 1};${buffer.cursorX + 1}R`);
683
+ return true;
684
+ }
685
+ return false;
686
+ });
687
+ terminal.parser.registerCsiHandler({ prefix: "?", final: "n" }, (params) => {
688
+ if (params.length !== 1 || params[0] !== 6) {
689
+ return false;
690
+ }
691
+ const buffer = terminal.buffer.active;
692
+ ptyProcess.write(`\x1b[?${buffer.cursorY + 1};${buffer.cursorX + 1}R`);
693
+ return true;
694
+ });
695
+ for (const [code, response] of TERMINAL_OSC_COLOR_QUERY_RESPONSES) {
696
+ terminal.parser.registerOscHandler(code, (data) => {
697
+ if (data.trim() !== "?") {
698
+ return false;
699
+ }
700
+ ptyProcess.write(`\x1b]${code};${response}\x1b\\`);
701
+ return true;
702
+ });
703
+ }
704
+ if (titleMode === "auto") {
705
+ titleChangeSubscription = terminal.onTitleChange((nextTitle) => {
706
+ if (disposed || killed) {
707
+ return;
708
+ }
709
+ pendingTitle = nextTitle.trim().length > 0 ? nextTitle : undefined;
710
+ if (titleDebounceTimer) {
711
+ clearTimeout(titleDebounceTimer);
712
+ }
713
+ titleDebounceTimer = setTimeout(() => {
714
+ titleDebounceTimer = null;
715
+ emitTitleChange(pendingTitle);
716
+ pendingTitle = undefined;
717
+ }, TERMINAL_TITLE_DEBOUNCE_MS);
718
+ });
719
+ }
720
+ const disposeCommandLifecycleSubscription = terminal.parser.registerOscHandler(633, (data) => {
721
+ const commandFinished = parseCommandFinishedOsc(data);
722
+ if (!commandFinished) {
723
+ return true;
724
+ }
725
+ for (const listener of Array.from(commandFinishedListeners)) {
726
+ try {
727
+ listener(commandFinished);
728
+ }
729
+ catch {
730
+ // no-op
731
+ }
732
+ }
733
+ return true;
734
+ });
735
+ activityTracker.onChange((snapshot, previousSnapshot) => {
736
+ if (disposed || killed) {
737
+ return;
738
+ }
739
+ const transition = {
740
+ activity: toTerminalActivity(snapshot),
741
+ previous: toTerminalActivity(previousSnapshot),
742
+ };
743
+ for (const listener of Array.from(activityChangeListeners)) {
744
+ try {
745
+ listener(transition);
746
+ }
747
+ catch {
748
+ // no-op
749
+ }
750
+ }
751
+ });
752
+ function buildExitInfo(input) {
753
+ const lastOutputLines = extractLastOutputLines(terminal, TERMINAL_EXIT_OUTPUT_LINE_LIMIT);
754
+ return {
755
+ exitCode: input?.exitCode ?? null,
756
+ signal: input?.signal && input.signal > 0 ? input.signal : null,
757
+ lastOutputLines: lastOutputLines.length > 0
758
+ ? lastOutputLines
759
+ : extractLastOutputLinesFromText(recentOutputChunks.join("").slice(-TERMINAL_EXIT_OUTPUT_CHAR_LIMIT), TERMINAL_EXIT_OUTPUT_LINE_LIMIT),
760
+ };
761
+ }
762
+ function emitExit(info) {
763
+ if (exitEmitted) {
764
+ return;
765
+ }
766
+ exitEmitted = true;
767
+ exitInfo = info;
768
+ for (const listener of Array.from(exitListeners)) {
769
+ try {
770
+ listener(info);
771
+ }
772
+ catch {
773
+ // no-op
774
+ }
775
+ }
776
+ exitListeners.clear();
777
+ }
778
+ function disposeResources() {
779
+ if (disposed) {
780
+ return;
781
+ }
782
+ disposed = true;
783
+ activityTracker.clear();
784
+ pendingInput = "";
785
+ recentOutputChunks.length = 0;
786
+ recentOutputLength = 0;
787
+ inputModeTracker.reset();
788
+ if (inputFlushImmediate) {
789
+ clearImmediate(inputFlushImmediate);
790
+ inputFlushImmediate = null;
791
+ }
792
+ clearPendingTitleChange();
793
+ disposeTitleChangeSubscription();
794
+ disposeCommandLifecycleSubscription.dispose();
795
+ activityTracker.dispose();
796
+ terminal.dispose();
797
+ listeners.clear();
798
+ exitListeners.clear();
799
+ commandFinishedListeners.clear();
800
+ titleChangeListeners.clear();
801
+ activityChangeListeners.clear();
802
+ }
803
+ function writeOutputToHeadless(data) {
804
+ terminal.write(data, () => {
805
+ if (disposed || killed) {
806
+ return;
807
+ }
808
+ stateRevision += 1;
809
+ for (const listener of listeners) {
810
+ listener({ type: "output", data, revision: stateRevision });
811
+ }
812
+ });
813
+ }
814
+ // Pipe PTY output to terminal emulator
815
+ ptyProcess.onData((data) => {
816
+ if (killed)
817
+ return;
818
+ const inputModeUpdate = inputModeTracker.feed(data);
819
+ for (const response of inputModeUpdate.responses) {
820
+ ptyProcess.write(response);
821
+ }
822
+ recentOutputChunks.push(data);
823
+ recentOutputLength += data.length;
824
+ // Drop whole leading chunks while the rest still covers the char limit, so
825
+ // the retained join always contains at least the last limit chars.
826
+ while (recentOutputChunks.length > 1 &&
827
+ recentOutputLength - recentOutputChunks[0].length >= TERMINAL_EXIT_OUTPUT_CHAR_LIMIT) {
828
+ recentOutputLength -= recentOutputChunks[0].length;
829
+ recentOutputChunks.shift();
830
+ }
831
+ // We never drop the last chunk, so a single chunk larger than the cap would
832
+ // grow the buffer unbounded; slice its tail to keep the cap hard.
833
+ if (recentOutputChunks.length === 1 && recentOutputLength > TERMINAL_EXIT_OUTPUT_CHAR_LIMIT) {
834
+ const tail = recentOutputChunks[0].slice(-TERMINAL_EXIT_OUTPUT_CHAR_LIMIT);
835
+ recentOutputChunks[0] = tail;
836
+ recentOutputLength = tail.length;
837
+ }
838
+ writeOutputToHeadless(data);
839
+ });
840
+ ptyProcess.onExit((event) => {
841
+ killed = true;
842
+ processExited = true;
843
+ for (const waiter of Array.from(processExitWaiters)) {
844
+ try {
845
+ waiter();
846
+ }
847
+ catch {
848
+ // no-op
849
+ }
850
+ }
851
+ processExitWaiters.clear();
852
+ emitExit(buildExitInfo({
853
+ exitCode: event.exitCode,
854
+ signal: event.signal,
855
+ }));
856
+ disposeResources();
857
+ });
858
+ async function waitForPtyProcessStart() {
859
+ if (process.platform !== "win32") {
860
+ return;
861
+ }
862
+ const started = () => {
863
+ const windowsPtyProcess = ptyProcess;
864
+ return ptyProcess.pid > 0 || (windowsPtyProcess._agent?.innerPid ?? 0) > 0 || processExited;
865
+ };
866
+ const deadline = Date.now() + 5000;
867
+ while (!started() && Date.now() < deadline) {
868
+ await new Promise((resolve) => setTimeout(resolve, 10));
869
+ }
870
+ }
871
+ function getState(snapshotOptions) {
872
+ return {
873
+ rows: terminal.rows,
874
+ cols: terminal.cols,
875
+ grid: extractGrid(terminal),
876
+ scrollback: extractScrollback(terminal, {
877
+ scrollbackLines: snapshotOptions?.scrollbackLines,
878
+ }),
879
+ cursor: extractCursorState(terminal),
880
+ ...(title ? { title } : {}),
881
+ ...(snapshotOptions?.includeWrapFlags
882
+ ? {
883
+ gridWrapped: extractGridWrapped(terminal),
884
+ scrollbackWrapped: extractScrollbackWrapped(terminal, {
885
+ scrollbackLines: snapshotOptions?.scrollbackLines,
886
+ }),
887
+ }
888
+ : {}),
889
+ };
890
+ }
891
+ function getStateSnapshot(snapshotOptions) {
892
+ return {
893
+ state: getState(snapshotOptions),
894
+ revision: stateRevision,
895
+ };
896
+ }
897
+ function getSize() {
898
+ return {
899
+ rows: terminal.rows,
900
+ cols: terminal.cols,
901
+ };
902
+ }
903
+ function getReplayPreamble() {
904
+ return inputModeTracker.getPreamble();
905
+ }
906
+ function writeInputToPty(data) {
907
+ ptyProcess.write(data);
908
+ }
909
+ function flushPendingInput() {
910
+ if (inputFlushImmediate) {
911
+ clearImmediate(inputFlushImmediate);
912
+ inputFlushImmediate = null;
913
+ }
914
+ const data = pendingInput;
915
+ pendingInput = "";
916
+ if (!data || killed || disposed) {
917
+ return;
918
+ }
919
+ writeInputToPty(data);
920
+ }
921
+ function scheduleInputFlush() {
922
+ if (inputFlushImmediate) {
923
+ return;
924
+ }
925
+ inputFlushImmediate = setImmediate(() => {
926
+ inputFlushImmediate = null;
927
+ flushPendingInput();
928
+ });
929
+ }
930
+ function send(msg) {
931
+ if (killed)
932
+ return;
933
+ switch (msg.type) {
934
+ case "input": {
935
+ pendingInput += msg.data;
936
+ scheduleInputFlush();
937
+ break;
938
+ }
939
+ case "resize":
940
+ flushPendingInput();
941
+ terminal.resize(msg.cols, msg.rows);
942
+ ptyProcess.resize(msg.cols, msg.rows);
943
+ stateRevision += 1;
944
+ break;
945
+ case "mouse":
946
+ // Mouse events can be sent as escape sequences if terminal supports it
947
+ // For now, we'll just ignore them - can be implemented later
948
+ break;
949
+ }
950
+ }
951
+ function subscribe(listener, subscribeOptions) {
952
+ let active = true;
953
+ let snapshotDelivered = false;
954
+ const queuedMessages = [];
955
+ const initialSnapshot = subscribeOptions?.initialSnapshot ?? "state";
956
+ const subscriptionListener = (msg) => {
957
+ if (!active) {
958
+ return;
959
+ }
960
+ if (!snapshotDelivered) {
961
+ queuedMessages.push(msg);
962
+ return;
963
+ }
964
+ listener(msg);
965
+ };
966
+ listeners.add(subscriptionListener);
967
+ terminal.write("", () => {
968
+ if (!disposed && active && listeners.has(subscriptionListener)) {
969
+ snapshotDelivered = true;
970
+ if (initialSnapshot === "ready") {
971
+ // Carry the input-mode preamble so the snapshot-less "ready" path
972
+ // (live restore) can replay it without a separate state fetch.
973
+ listener({
974
+ type: "snapshotReady",
975
+ revision: stateRevision,
976
+ replayPreamble: getReplayPreamble(),
977
+ });
978
+ }
979
+ else {
980
+ listener({ type: "snapshot", ...getStateSnapshot() });
981
+ }
982
+ for (const message of queuedMessages.splice(0)) {
983
+ listener(message);
984
+ }
985
+ }
986
+ });
987
+ return () => {
988
+ active = false;
989
+ queuedMessages.length = 0;
990
+ listeners.delete(subscriptionListener);
991
+ };
992
+ }
993
+ function onExit(listener) {
994
+ if (killed) {
995
+ queueMicrotask(() => {
996
+ try {
997
+ listener(exitInfo ?? buildExitInfo());
998
+ }
999
+ catch {
1000
+ // no-op
1001
+ }
1002
+ });
1003
+ return () => { };
1004
+ }
1005
+ exitListeners.add(listener);
1006
+ return () => {
1007
+ exitListeners.delete(listener);
1008
+ };
1009
+ }
1010
+ function onCommandFinished(listener) {
1011
+ commandFinishedListeners.add(listener);
1012
+ return () => {
1013
+ commandFinishedListeners.delete(listener);
1014
+ };
1015
+ }
1016
+ function onTitleChange(listener) {
1017
+ titleChangeListeners.add(listener);
1018
+ if (title !== undefined) {
1019
+ queueMicrotask(() => {
1020
+ if (disposed || !titleChangeListeners.has(listener)) {
1021
+ return;
1022
+ }
1023
+ try {
1024
+ listener(title);
1025
+ }
1026
+ catch {
1027
+ // no-op
1028
+ }
1029
+ });
1030
+ }
1031
+ return () => {
1032
+ titleChangeListeners.delete(listener);
1033
+ };
1034
+ }
1035
+ function onActivityChange(listener) {
1036
+ activityChangeListeners.add(listener);
1037
+ return () => {
1038
+ activityChangeListeners.delete(listener);
1039
+ };
1040
+ }
1041
+ function getTitle() {
1042
+ return title;
1043
+ }
1044
+ function getActivity() {
1045
+ return toTerminalActivity(activityTracker.getSnapshot());
1046
+ }
1047
+ function setActivity(state) {
1048
+ activityTracker.set(state);
1049
+ }
1050
+ function clearActivityAttention() {
1051
+ return activityTracker.clearAttention();
1052
+ }
1053
+ function getExitInfo() {
1054
+ return exitInfo;
1055
+ }
1056
+ function kill() {
1057
+ if (!killed) {
1058
+ killed = true;
1059
+ if (!processExited) {
1060
+ killPtyProcess();
1061
+ }
1062
+ emitExit(buildExitInfo());
1063
+ }
1064
+ if (processExited) {
1065
+ disposeResources();
1066
+ return;
1067
+ }
1068
+ void waitForProcessExit(1000).finally(disposeResources);
1069
+ }
1070
+ function killPtyProcess(signal) {
1071
+ if (process.platform === "win32") {
1072
+ ptyProcess.kill();
1073
+ return;
1074
+ }
1075
+ ptyProcess.kill(signal);
1076
+ }
1077
+ function waitForProcessExit(timeoutMs) {
1078
+ if (processExited) {
1079
+ return Promise.resolve(true);
1080
+ }
1081
+ return new Promise((resolve) => {
1082
+ let pendingResolve = resolve;
1083
+ const settle = (value) => {
1084
+ if (!pendingResolve)
1085
+ return;
1086
+ const fn = pendingResolve;
1087
+ pendingResolve = null;
1088
+ fn(value);
1089
+ };
1090
+ const waiter = () => {
1091
+ clearTimeout(timer);
1092
+ settle(true);
1093
+ };
1094
+ const timer = setTimeout(() => {
1095
+ processExitWaiters.delete(waiter);
1096
+ settle(false);
1097
+ }, timeoutMs);
1098
+ processExitWaiters.add(waiter);
1099
+ });
1100
+ }
1101
+ async function killAndWait(killOptions) {
1102
+ const gracefulTimeoutMs = killOptions?.gracefulTimeoutMs ?? 2000;
1103
+ const forceTimeoutMs = killOptions?.forceTimeoutMs ?? 1000;
1104
+ if (processExited) {
1105
+ kill();
1106
+ return;
1107
+ }
1108
+ try {
1109
+ killPtyProcess();
1110
+ }
1111
+ catch {
1112
+ // process may already be gone
1113
+ }
1114
+ const exitedGracefully = await waitForProcessExit(gracefulTimeoutMs);
1115
+ if (!exitedGracefully) {
1116
+ try {
1117
+ killPtyProcess("SIGKILL");
1118
+ }
1119
+ catch {
1120
+ // process may already be gone
1121
+ }
1122
+ await waitForProcessExit(forceTimeoutMs);
1123
+ }
1124
+ // Finalize bookkeeping (idempotent if ptyProcess.onExit already fired).
1125
+ kill();
1126
+ }
1127
+ await waitForPtyProcessStart();
1128
+ // Small delay to let shell initialize
1129
+ await new Promise((resolve) => setTimeout(resolve, 50));
1130
+ return {
1131
+ id,
1132
+ name,
1133
+ cwd,
1134
+ workspaceId,
1135
+ send,
1136
+ subscribe,
1137
+ onExit,
1138
+ onCommandFinished,
1139
+ onTitleChange,
1140
+ onActivityChange,
1141
+ getSize,
1142
+ getState,
1143
+ getStateSnapshot,
1144
+ getReplayPreamble,
1145
+ getTitle,
1146
+ getActivity,
1147
+ setActivity,
1148
+ clearActivityAttention,
1149
+ setTitle,
1150
+ getExitInfo,
1151
+ kill,
1152
+ killAndWait,
1153
+ };
1154
+ }
1155
+ //# sourceMappingURL=terminal.js.map