gsd-pi 2.77.0-dev.538325aea → 2.77.0-dev.58d3d4d6c

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 (1018) hide show
  1. package/dist/cli-web-branch.d.ts +1 -0
  2. package/dist/cli-web-branch.js +3 -0
  3. package/dist/cli.js +59 -15
  4. package/dist/extension-discovery.d.ts +6 -0
  5. package/dist/extension-discovery.js +37 -0
  6. package/dist/extension-registry.d.ts +3 -0
  7. package/dist/extension-registry.js +1 -1
  8. package/dist/extension-sort.d.ts +18 -0
  9. package/dist/extension-sort.js +114 -0
  10. package/dist/extension-validator.d.ts +47 -0
  11. package/dist/extension-validator.js +127 -0
  12. package/dist/headless-ui.d.ts +1 -1
  13. package/dist/headless.js +4 -2
  14. package/dist/loader.js +36 -7
  15. package/dist/onboarding.js +5 -5
  16. package/dist/provider-migrations.d.ts +20 -2
  17. package/dist/provider-migrations.js +15 -2
  18. package/dist/remote-questions-config.js +1 -1
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -1
  20. package/dist/resources/extensions/aws-auth/index.js +1 -2
  21. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +9 -6
  22. package/dist/resources/extensions/bg-shell/process-manager.js +1 -2
  23. package/dist/resources/extensions/browser-tools/index.js +1 -0
  24. package/dist/resources/extensions/claude-code-cli/index.js +1 -1
  25. package/dist/resources/extensions/claude-code-cli/partial-builder.js +17 -106
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +71 -57
  27. package/dist/resources/extensions/cmux/index.js +20 -0
  28. package/dist/resources/extensions/github-sync/templates.js +103 -0
  29. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  30. package/dist/resources/extensions/google-search/index.js +3 -375
  31. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +81 -2
  33. package/dist/resources/extensions/gsd/auto/phases.js +42 -18
  34. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  35. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  36. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  37. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  38. package/dist/resources/extensions/gsd/auto-dispatch.js +64 -5
  39. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  40. package/dist/resources/extensions/gsd/auto-post-unit.js +110 -0
  41. package/dist/resources/extensions/gsd/auto-prompts.js +48 -7
  42. package/dist/resources/extensions/gsd/auto-recovery.js +2 -25
  43. package/dist/resources/extensions/gsd/auto-start.js +73 -5
  44. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  45. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  46. package/dist/resources/extensions/gsd/auto-worktree.js +58 -8
  47. package/dist/resources/extensions/gsd/auto.js +76 -15
  48. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +10 -0
  49. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +4 -2
  50. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  51. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  52. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  53. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  54. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  55. package/dist/resources/extensions/gsd/context-store.js +23 -7
  56. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
  57. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  58. package/dist/resources/extensions/gsd/forensics.js +106 -0
  59. package/dist/resources/extensions/gsd/git-service.js +1 -0
  60. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  61. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  62. package/dist/resources/extensions/gsd/guided-flow.js +23 -9
  63. package/dist/resources/extensions/gsd/journal.js +17 -2
  64. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  65. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  66. package/dist/resources/extensions/gsd/notifications.js +30 -16
  67. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  68. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  69. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  70. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  71. package/dist/resources/extensions/gsd/reports.js +5 -4
  72. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  73. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  74. package/dist/resources/extensions/gsd/state.js +25 -25
  75. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  76. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  77. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  78. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  79. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  80. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  81. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  82. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  83. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  84. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  85. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  86. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  87. package/dist/resources/extensions/gsd/worktree-manager.js +52 -0
  88. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  89. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  90. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  91. package/dist/resources/extensions/mcp-client/index.js +119 -10
  92. package/dist/resources/extensions/ollama/index.js +2 -1
  93. package/dist/resources/extensions/ollama/ollama-chat-provider.js +15 -5
  94. package/dist/resources/extensions/remote-questions/config.js +1 -12
  95. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  96. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  97. package/dist/resources/extensions/universal-config/index.js +1 -1
  98. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  99. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  100. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  101. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  102. package/dist/security-overrides.d.ts +1 -4
  103. package/dist/security-overrides.js +3 -16
  104. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  105. package/dist/web/standalone/.next/BUILD_ID +1 -1
  106. package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
  107. package/dist/web/standalone/.next/build-manifest.json +3 -3
  108. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  109. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  128. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/index.html +1 -1
  193. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  199. package/dist/web/standalone/.next/server/app-paths-manifest.json +4 -4
  200. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  201. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  202. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  204. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  206. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  207. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  208. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  209. package/dist/web/standalone/.next/static/chunks/{webpack-1832629448831fdc.js → webpack-2e68521d7c82f7c2.js} +1 -1
  210. package/dist/web-mode.js +1 -1
  211. package/dist/welcome-screen.js +20 -19
  212. package/dist/wizard.js +5 -2
  213. package/package.json +16 -32
  214. package/packages/mcp-server/README.md +3 -3
  215. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  216. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  217. package/packages/mcp-server/dist/env-writer.js +74 -6
  218. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  219. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  220. package/packages/mcp-server/dist/server.js +36 -17
  221. package/packages/mcp-server/dist/server.js.map +1 -1
  222. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  223. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  224. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  225. package/packages/mcp-server/package.json +5 -0
  226. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  227. package/packages/mcp-server/src/env-writer.ts +76 -6
  228. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  229. package/packages/mcp-server/src/server.ts +45 -19
  230. package/packages/mcp-server/src/workflow-tools.test.ts +44 -0
  231. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  232. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  233. package/packages/native/package.json +5 -0
  234. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  235. package/packages/native/tsconfig.json +1 -2
  236. package/packages/native/tsconfig.tsbuildinfo +1 -0
  237. package/packages/pi-agent-core/package.json +5 -0
  238. package/packages/pi-agent-core/src/agent-loop.test.ts +220 -15
  239. package/packages/pi-ai/package.json +5 -0
  240. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  241. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  242. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  244. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  246. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  248. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  250. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  252. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  254. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  256. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  257. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  258. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  259. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  260. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  262. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  264. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  265. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  266. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  267. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  268. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  269. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  270. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  271. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -2
  272. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/extensions/loader.js +24 -8
  274. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  276. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +11 -0
  279. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -2
  281. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  283. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  285. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  287. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  289. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/system-prompt.js +3 -3
  291. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  293. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -0
  309. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  310. package/packages/pi-coding-agent/package.json +5 -0
  311. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  312. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  313. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  314. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  315. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  316. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  317. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  318. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  319. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  320. package/packages/pi-coding-agent/src/core/extensions/loader.ts +24 -11
  321. package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
  322. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +13 -0
  323. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -2
  324. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  325. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  326. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  327. package/packages/pi-coding-agent/src/core/system-prompt.ts +3 -3
  328. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  329. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  330. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  331. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  332. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  333. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  334. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +14 -0
  335. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  336. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +12 -5
  337. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  338. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +21 -0
  339. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  340. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  341. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  342. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  343. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  344. package/packages/pi-tui/package.json +5 -0
  345. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -5
  346. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +27 -0
  347. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  348. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  349. package/packages/rpc-client/package.json +5 -0
  350. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  351. package/pkg/dist/core/export-html/ansi-to-html.js +0 -1
  352. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  353. package/pkg/dist/core/export-html/index.d.ts +1 -1
  354. package/pkg/dist/core/export-html/index.d.ts.map +1 -1
  355. package/pkg/dist/core/export-html/index.js +5 -39
  356. package/pkg/dist/core/export-html/index.js.map +1 -1
  357. package/pkg/dist/core/export-html/tool-renderer.d.ts +2 -2
  358. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  359. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -1
  360. package/scripts/ensure-workspace-builds.cjs +0 -2
  361. package/scripts/lib/workspace-manifest.cjs +86 -0
  362. package/scripts/link-workspace-packages.cjs +5 -19
  363. package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -1
  364. package/src/resources/extensions/aws-auth/index.ts +1 -2
  365. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +7 -4
  366. package/src/resources/extensions/bg-shell/index.ts +1 -2
  367. package/src/resources/extensions/bg-shell/process-manager.ts +1 -2
  368. package/src/resources/extensions/browser-tools/index.ts +1 -2
  369. package/src/resources/extensions/claude-code-cli/index.ts +1 -1
  370. package/src/resources/extensions/claude-code-cli/partial-builder.ts +23 -115
  371. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +81 -61
  372. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +91 -22
  373. package/src/resources/extensions/cmux/index.ts +35 -10
  374. package/src/resources/extensions/github-sync/templates.ts +151 -0
  375. package/src/resources/extensions/github-sync/tests/templates.test.ts +59 -0
  376. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  377. package/src/resources/extensions/google-search/index.ts +9 -470
  378. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  379. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  380. package/src/resources/extensions/gsd/auto/loop.ts +95 -2
  381. package/src/resources/extensions/gsd/auto/phases.ts +46 -18
  382. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  383. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  384. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  385. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  386. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  387. package/src/resources/extensions/gsd/auto-dispatch.ts +63 -5
  388. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  389. package/src/resources/extensions/gsd/auto-post-unit.ts +111 -0
  390. package/src/resources/extensions/gsd/auto-prompts.ts +59 -7
  391. package/src/resources/extensions/gsd/auto-recovery.ts +5 -27
  392. package/src/resources/extensions/gsd/auto-start.ts +73 -3
  393. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  394. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  395. package/src/resources/extensions/gsd/auto-worktree.ts +60 -5
  396. package/src/resources/extensions/gsd/auto.ts +84 -19
  397. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +11 -0
  398. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -2
  399. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  400. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  401. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  402. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  403. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  404. package/src/resources/extensions/gsd/context-store.ts +25 -8
  405. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
  406. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  407. package/src/resources/extensions/gsd/forensics.ts +118 -1
  408. package/src/resources/extensions/gsd/git-service.ts +17 -0
  409. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  410. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  411. package/src/resources/extensions/gsd/guided-flow.ts +38 -10
  412. package/src/resources/extensions/gsd/journal.ts +38 -3
  413. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  414. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  415. package/src/resources/extensions/gsd/notifications.ts +27 -15
  416. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  417. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  418. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  419. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  420. package/src/resources/extensions/gsd/reports.ts +5 -4
  421. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  422. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  423. package/src/resources/extensions/gsd/state.ts +35 -30
  424. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  425. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +55 -10
  426. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  427. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  428. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -9
  429. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
  430. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  431. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +4 -3
  432. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  433. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  434. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  435. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  436. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  437. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  438. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  439. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  440. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  441. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  442. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  443. package/src/resources/extensions/gsd/tests/derive-state.test.ts +1 -2
  444. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  445. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  446. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
  447. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  448. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  449. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  450. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  451. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  452. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  453. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +2 -2
  454. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +2 -1
  455. package/src/resources/extensions/gsd/tests/forensics-worktree-telemetry.test.ts +145 -0
  456. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  457. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  458. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +6 -1
  459. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +2 -1
  460. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +2 -1
  461. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  462. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  463. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  464. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  465. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  466. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +76 -0
  467. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +10 -3
  468. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  469. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  470. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +2 -1
  471. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  472. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  473. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +4 -1
  474. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  475. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  476. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  477. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  478. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +39 -25
  479. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +181 -0
  480. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  481. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  482. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  483. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  484. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  485. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  486. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  487. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  488. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  489. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  490. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  491. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +24 -0
  492. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  493. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  494. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  495. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  496. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  497. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +147 -0
  498. package/src/resources/extensions/gsd/tests/test-helpers.ts +140 -0
  499. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  500. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  501. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  502. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  503. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  504. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  505. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  506. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  507. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  508. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  509. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +11 -0
  510. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +6 -5
  511. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  512. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +2 -2
  513. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +2 -2
  514. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +2 -2
  515. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  516. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +3 -3
  517. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  518. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  519. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  520. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  521. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  522. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  523. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  524. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  525. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  526. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  527. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  528. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  529. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  530. package/src/resources/extensions/gsd/worktree-manager.ts +54 -0
  531. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  532. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  533. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  534. package/src/resources/extensions/mcp-client/index.ts +130 -11
  535. package/src/resources/extensions/ollama/index.ts +3 -3
  536. package/src/resources/extensions/ollama/ollama-chat-provider.ts +18 -6
  537. package/src/resources/extensions/remote-questions/config.ts +4 -15
  538. package/src/resources/extensions/search-the-web/index.ts +1 -2
  539. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  540. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  541. package/src/resources/extensions/shared/tests/format-utils.test.ts +3 -5
  542. package/src/resources/extensions/universal-config/index.ts +1 -1
  543. package/src/resources/skills/create-skill/SKILL.md +2 -2
  544. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  545. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  546. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  547. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/2826.d445fb428ef41fa1.js +0 -9
  549. package/packages/gsd-agent-core/dist/agent-session.d.ts +0 -716
  550. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +0 -1
  551. package/packages/gsd-agent-core/dist/agent-session.js +0 -2595
  552. package/packages/gsd-agent-core/dist/agent-session.js.map +0 -1
  553. package/packages/gsd-agent-core/dist/artifact-manager.d.ts +0 -52
  554. package/packages/gsd-agent-core/dist/artifact-manager.d.ts.map +0 -1
  555. package/packages/gsd-agent-core/dist/artifact-manager.js +0 -118
  556. package/packages/gsd-agent-core/dist/artifact-manager.js.map +0 -1
  557. package/packages/gsd-agent-core/dist/bash-executor.d.ts +0 -57
  558. package/packages/gsd-agent-core/dist/bash-executor.d.ts.map +0 -1
  559. package/packages/gsd-agent-core/dist/bash-executor.js +0 -282
  560. package/packages/gsd-agent-core/dist/bash-executor.js.map +0 -1
  561. package/packages/gsd-agent-core/dist/blob-store.d.ts +0 -39
  562. package/packages/gsd-agent-core/dist/blob-store.d.ts.map +0 -1
  563. package/packages/gsd-agent-core/dist/blob-store.js +0 -151
  564. package/packages/gsd-agent-core/dist/blob-store.js.map +0 -1
  565. package/packages/gsd-agent-core/dist/compaction/branch-summarization.d.ts +0 -90
  566. package/packages/gsd-agent-core/dist/compaction/branch-summarization.d.ts.map +0 -1
  567. package/packages/gsd-agent-core/dist/compaction/branch-summarization.js +0 -207
  568. package/packages/gsd-agent-core/dist/compaction/branch-summarization.js.map +0 -1
  569. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +0 -137
  570. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +0 -1
  571. package/packages/gsd-agent-core/dist/compaction/compaction.js +0 -621
  572. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +0 -1
  573. package/packages/gsd-agent-core/dist/compaction/index.d.ts +0 -7
  574. package/packages/gsd-agent-core/dist/compaction/index.d.ts.map +0 -1
  575. package/packages/gsd-agent-core/dist/compaction/index.js +0 -7
  576. package/packages/gsd-agent-core/dist/compaction/index.js.map +0 -1
  577. package/packages/gsd-agent-core/dist/compaction/utils.d.ts +0 -78
  578. package/packages/gsd-agent-core/dist/compaction/utils.d.ts.map +0 -1
  579. package/packages/gsd-agent-core/dist/compaction/utils.js +0 -263
  580. package/packages/gsd-agent-core/dist/compaction/utils.js.map +0 -1
  581. package/packages/gsd-agent-core/dist/compaction-orchestrator.d.ts +0 -90
  582. package/packages/gsd-agent-core/dist/compaction-orchestrator.d.ts.map +0 -1
  583. package/packages/gsd-agent-core/dist/compaction-orchestrator.js +0 -338
  584. package/packages/gsd-agent-core/dist/compaction-orchestrator.js.map +0 -1
  585. package/packages/gsd-agent-core/dist/contextual-tips.d.ts +0 -43
  586. package/packages/gsd-agent-core/dist/contextual-tips.d.ts.map +0 -1
  587. package/packages/gsd-agent-core/dist/contextual-tips.js +0 -208
  588. package/packages/gsd-agent-core/dist/contextual-tips.js.map +0 -1
  589. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.d.ts +0 -18
  590. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.d.ts.map +0 -1
  591. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.js +0 -250
  592. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.js.map +0 -1
  593. package/packages/gsd-agent-core/dist/export-html/index.d.ts +0 -37
  594. package/packages/gsd-agent-core/dist/export-html/index.d.ts.map +0 -1
  595. package/packages/gsd-agent-core/dist/export-html/index.js +0 -257
  596. package/packages/gsd-agent-core/dist/export-html/index.js.map +0 -1
  597. package/packages/gsd-agent-core/dist/export-html/template.css +0 -971
  598. package/packages/gsd-agent-core/dist/export-html/template.html +0 -54
  599. package/packages/gsd-agent-core/dist/export-html/template.js +0 -1583
  600. package/packages/gsd-agent-core/dist/export-html/tool-renderer.d.ts +0 -38
  601. package/packages/gsd-agent-core/dist/export-html/tool-renderer.d.ts.map +0 -1
  602. package/packages/gsd-agent-core/dist/export-html/tool-renderer.js +0 -70
  603. package/packages/gsd-agent-core/dist/export-html/tool-renderer.js.map +0 -1
  604. package/packages/gsd-agent-core/dist/export-html/vendor/highlight.min.js +0 -1213
  605. package/packages/gsd-agent-core/dist/export-html/vendor/marked.min.js +0 -6
  606. package/packages/gsd-agent-core/dist/fallback-resolver.d.ts +0 -75
  607. package/packages/gsd-agent-core/dist/fallback-resolver.d.ts.map +0 -1
  608. package/packages/gsd-agent-core/dist/fallback-resolver.js +0 -118
  609. package/packages/gsd-agent-core/dist/fallback-resolver.js.map +0 -1
  610. package/packages/gsd-agent-core/dist/image-overflow-recovery.d.ts +0 -44
  611. package/packages/gsd-agent-core/dist/image-overflow-recovery.d.ts.map +0 -1
  612. package/packages/gsd-agent-core/dist/image-overflow-recovery.js +0 -99
  613. package/packages/gsd-agent-core/dist/image-overflow-recovery.js.map +0 -1
  614. package/packages/gsd-agent-core/dist/index.d.ts +0 -14
  615. package/packages/gsd-agent-core/dist/index.d.ts.map +0 -1
  616. package/packages/gsd-agent-core/dist/index.js +0 -19
  617. package/packages/gsd-agent-core/dist/index.js.map +0 -1
  618. package/packages/gsd-agent-core/dist/keybindings.d.ts +0 -47
  619. package/packages/gsd-agent-core/dist/keybindings.d.ts.map +0 -1
  620. package/packages/gsd-agent-core/dist/keybindings.js +0 -156
  621. package/packages/gsd-agent-core/dist/keybindings.js.map +0 -1
  622. package/packages/gsd-agent-core/dist/lifecycle-hooks.d.ts +0 -42
  623. package/packages/gsd-agent-core/dist/lifecycle-hooks.d.ts.map +0 -1
  624. package/packages/gsd-agent-core/dist/lifecycle-hooks.js +0 -204
  625. package/packages/gsd-agent-core/dist/lifecycle-hooks.js.map +0 -1
  626. package/packages/gsd-agent-core/dist/retry-handler.d.ts +0 -128
  627. package/packages/gsd-agent-core/dist/retry-handler.d.ts.map +0 -1
  628. package/packages/gsd-agent-core/dist/retry-handler.js +0 -518
  629. package/packages/gsd-agent-core/dist/retry-handler.js.map +0 -1
  630. package/packages/gsd-agent-core/dist/sdk.d.ts +0 -159
  631. package/packages/gsd-agent-core/dist/sdk.d.ts.map +0 -1
  632. package/packages/gsd-agent-core/dist/sdk.js +0 -375
  633. package/packages/gsd-agent-core/dist/sdk.js.map +0 -1
  634. package/packages/gsd-agent-core/dist/system-prompt.d.ts +0 -28
  635. package/packages/gsd-agent-core/dist/system-prompt.d.ts.map +0 -1
  636. package/packages/gsd-agent-core/dist/system-prompt.js +0 -201
  637. package/packages/gsd-agent-core/dist/system-prompt.js.map +0 -1
  638. package/packages/gsd-agent-core/package.json +0 -25
  639. package/packages/gsd-agent-core/scripts/copy-assets.cjs +0 -43
  640. package/packages/gsd-agent-core/src/agent-session.test.ts +0 -169
  641. package/packages/gsd-agent-core/src/agent-session.ts +0 -3358
  642. package/packages/gsd-agent-core/src/artifact-manager.ts +0 -126
  643. package/packages/gsd-agent-core/src/bash-executor.ts +0 -352
  644. package/packages/gsd-agent-core/src/blob-store.ts +0 -154
  645. package/packages/gsd-agent-core/src/compaction/branch-summarization.ts +0 -317
  646. package/packages/gsd-agent-core/src/compaction/compaction.ts +0 -855
  647. package/packages/gsd-agent-core/src/compaction/index.ts +0 -7
  648. package/packages/gsd-agent-core/src/compaction/utils.ts +0 -312
  649. package/packages/gsd-agent-core/src/compaction-orchestrator.ts +0 -449
  650. package/packages/gsd-agent-core/src/contextual-tips.ts +0 -232
  651. package/packages/gsd-agent-core/src/export-html/ansi-to-html.ts +0 -259
  652. package/packages/gsd-agent-core/src/export-html/index.ts +0 -345
  653. package/packages/gsd-agent-core/src/export-html/template.css +0 -971
  654. package/packages/gsd-agent-core/src/export-html/template.html +0 -54
  655. package/packages/gsd-agent-core/src/export-html/template.js +0 -1583
  656. package/packages/gsd-agent-core/src/export-html/tool-renderer.ts +0 -114
  657. package/packages/gsd-agent-core/src/export-html/vendor/highlight.min.js +0 -1213
  658. package/packages/gsd-agent-core/src/export-html/vendor/marked.min.js +0 -6
  659. package/packages/gsd-agent-core/src/fallback-resolver.ts +0 -193
  660. package/packages/gsd-agent-core/src/image-overflow-recovery.ts +0 -120
  661. package/packages/gsd-agent-core/src/index.ts +0 -68
  662. package/packages/gsd-agent-core/src/keybindings.ts +0 -220
  663. package/packages/gsd-agent-core/src/lifecycle-hooks.ts +0 -284
  664. package/packages/gsd-agent-core/src/retry-handler.ts +0 -620
  665. package/packages/gsd-agent-core/src/sdk.ts +0 -550
  666. package/packages/gsd-agent-core/src/system-prompt.ts +0 -270
  667. package/packages/gsd-agent-core/tsconfig.json +0 -28
  668. package/packages/gsd-agent-core/tsconfig.tsbuildinfo +0 -1
  669. package/packages/gsd-agent-modes/dist/cli/args.d.ts +0 -58
  670. package/packages/gsd-agent-modes/dist/cli/args.d.ts.map +0 -1
  671. package/packages/gsd-agent-modes/dist/cli/args.js +0 -324
  672. package/packages/gsd-agent-modes/dist/cli/args.js.map +0 -1
  673. package/packages/gsd-agent-modes/dist/cli/config-selector.d.ts +0 -13
  674. package/packages/gsd-agent-modes/dist/cli/config-selector.d.ts.map +0 -1
  675. package/packages/gsd-agent-modes/dist/cli/config-selector.js +0 -32
  676. package/packages/gsd-agent-modes/dist/cli/config-selector.js.map +0 -1
  677. package/packages/gsd-agent-modes/dist/cli/file-processor.d.ts +0 -15
  678. package/packages/gsd-agent-modes/dist/cli/file-processor.d.ts.map +0 -1
  679. package/packages/gsd-agent-modes/dist/cli/file-processor.js +0 -86
  680. package/packages/gsd-agent-modes/dist/cli/file-processor.js.map +0 -1
  681. package/packages/gsd-agent-modes/dist/cli/list-models.d.ts +0 -21
  682. package/packages/gsd-agent-modes/dist/cli/list-models.d.ts.map +0 -1
  683. package/packages/gsd-agent-modes/dist/cli/list-models.js +0 -114
  684. package/packages/gsd-agent-modes/dist/cli/list-models.js.map +0 -1
  685. package/packages/gsd-agent-modes/dist/cli/session-picker.d.ts +0 -10
  686. package/packages/gsd-agent-modes/dist/cli/session-picker.d.ts.map +0 -1
  687. package/packages/gsd-agent-modes/dist/cli/session-picker.js +0 -37
  688. package/packages/gsd-agent-modes/dist/cli/session-picker.js.map +0 -1
  689. package/packages/gsd-agent-modes/dist/index.d.ts +0 -7
  690. package/packages/gsd-agent-modes/dist/index.d.ts.map +0 -1
  691. package/packages/gsd-agent-modes/dist/index.js +0 -7
  692. package/packages/gsd-agent-modes/dist/index.js.map +0 -1
  693. package/packages/gsd-agent-modes/dist/main.d.ts +0 -8
  694. package/packages/gsd-agent-modes/dist/main.d.ts.map +0 -1
  695. package/packages/gsd-agent-modes/dist/main.js +0 -491
  696. package/packages/gsd-agent-modes/dist/main.js.map +0 -1
  697. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.d.ts +0 -34
  698. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.d.ts.map +0 -1
  699. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.js +0 -330
  700. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.js.map +0 -1
  701. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +0 -29
  702. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +0 -1
  703. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +0 -141
  704. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +0 -1
  705. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.d.ts +0 -36
  706. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.d.ts.map +0 -1
  707. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +0 -157
  708. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +0 -1
  709. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  710. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.d.ts.map +0 -1
  711. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.js +0 -48
  712. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.js.map +0 -1
  713. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  714. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +0 -1
  715. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +0 -43
  716. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +0 -1
  717. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.d.ts +0 -11
  718. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.d.ts.map +0 -1
  719. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.js +0 -47
  720. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.js.map +0 -1
  721. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  722. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +0 -1
  723. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +0 -44
  724. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +0 -1
  725. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.d.ts +0 -71
  726. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.d.ts.map +0 -1
  727. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.js +0 -474
  728. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.js.map +0 -1
  729. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.d.ts +0 -15
  730. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.d.ts.map +0 -1
  731. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.js +0 -32
  732. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.js.map +0 -1
  733. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +0 -22
  734. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +0 -1
  735. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +0 -70
  736. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +0 -1
  737. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.d.ts +0 -20
  738. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.d.ts.map +0 -1
  739. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.js +0 -75
  740. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.js.map +0 -1
  741. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  742. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
  743. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.js +0 -140
  744. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.js.map +0 -1
  745. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.d.ts +0 -12
  746. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.d.ts.map +0 -1
  747. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.js +0 -133
  748. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.js.map +0 -1
  749. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.d.ts +0 -33
  750. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.d.ts.map +0 -1
  751. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.js +0 -82
  752. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.js.map +0 -1
  753. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +0 -20
  754. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +0 -1
  755. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +0 -111
  756. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +0 -1
  757. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +0 -24
  758. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +0 -1
  759. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +0 -63
  760. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +0 -1
  761. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +0 -33
  762. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +0 -1
  763. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +0 -118
  764. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +0 -1
  765. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +0 -32
  766. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +0 -1
  767. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +0 -230
  768. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +0 -1
  769. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +0 -34
  770. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +0 -1
  771. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +0 -36
  772. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +0 -1
  773. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.d.ts +0 -48
  774. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.d.ts.map +0 -1
  775. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.js +0 -72
  776. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.js.map +0 -1
  777. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +0 -63
  778. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +0 -1
  779. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +0 -213
  780. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +0 -1
  781. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.d.ts +0 -86
  782. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.d.ts.map +0 -1
  783. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.js +0 -536
  784. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.js.map +0 -1
  785. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +0 -19
  786. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +0 -1
  787. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +0 -93
  788. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +0 -1
  789. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.d.ts +0 -30
  790. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.d.ts.map +0 -1
  791. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.js +0 -169
  792. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.js.map +0 -1
  793. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -49
  794. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.d.ts.map +0 -1
  795. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.js +0 -267
  796. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.js.map +0 -1
  797. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.d.ts +0 -21
  798. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.d.ts.map +0 -1
  799. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.js +0 -155
  800. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.js.map +0 -1
  801. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.d.ts +0 -97
  802. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.d.ts.map +0 -1
  803. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.js +0 -810
  804. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.js.map +0 -1
  805. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +0 -71
  806. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +0 -1
  807. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +0 -320
  808. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +0 -1
  809. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  810. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.d.ts.map +0 -1
  811. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.js +0 -34
  812. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.js.map +0 -1
  813. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  814. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +0 -1
  815. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +0 -46
  816. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +0 -1
  817. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  818. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.d.ts.map +0 -1
  819. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.js +0 -45
  820. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.js.map +0 -1
  821. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  822. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +0 -1
  823. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +0 -46
  824. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +0 -1
  825. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.d.ts +0 -15
  826. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.d.ts.map +0 -1
  827. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.js +0 -40
  828. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.js.map +0 -1
  829. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +0 -111
  830. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
  831. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +0 -984
  832. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +0 -1
  833. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.d.ts +0 -44
  834. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.d.ts.map +0 -1
  835. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.js +0 -61
  836. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.js.map +0 -1
  837. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.d.ts +0 -109
  838. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.d.ts.map +0 -1
  839. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.js +0 -1035
  840. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.js.map +0 -1
  841. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  842. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.d.ts.map +0 -1
  843. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.js +0 -112
  844. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.js.map +0 -1
  845. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +0 -12
  846. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +0 -1
  847. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +0 -38
  848. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +0 -1
  849. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  850. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.d.ts.map +0 -1
  851. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.js +0 -33
  852. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.js.map +0 -1
  853. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +0 -27
  854. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +0 -1
  855. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +0 -793
  856. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +0 -1
  857. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts +0 -4
  858. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +0 -1
  859. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +0 -62
  860. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +0 -1
  861. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts +0 -22
  862. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +0 -1
  863. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +0 -118
  864. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +0 -1
  865. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.d.ts +0 -7
  866. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.d.ts.map +0 -1
  867. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.js +0 -68
  868. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.js.map +0 -1
  869. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +0 -50
  870. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +0 -1
  871. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +0 -2
  872. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +0 -1
  873. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +0 -358
  874. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +0 -1
  875. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +0 -3409
  876. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +0 -1
  877. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.d.ts +0 -77
  878. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.d.ts.map +0 -1
  879. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.js +0 -529
  880. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.js.map +0 -1
  881. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.d.ts +0 -6
  882. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.d.ts.map +0 -1
  883. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.js +0 -15
  884. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.js.map +0 -1
  885. package/packages/gsd-agent-modes/dist/modes/print-mode.d.ts +0 -28
  886. package/packages/gsd-agent-modes/dist/modes/print-mode.d.ts.map +0 -1
  887. package/packages/gsd-agent-modes/dist/modes/print-mode.js +0 -84
  888. package/packages/gsd-agent-modes/dist/modes/print-mode.js.map +0 -1
  889. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.d.ts +0 -17
  890. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.d.ts.map +0 -1
  891. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.js +0 -49
  892. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.js.map +0 -1
  893. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.d.ts +0 -37
  894. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.d.ts.map +0 -1
  895. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.js +0 -84
  896. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.js.map +0 -1
  897. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +0 -243
  898. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +0 -1
  899. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +0 -464
  900. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +0 -1
  901. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts +0 -25
  902. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +0 -1
  903. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +0 -750
  904. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +0 -1
  905. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.d.ts +0 -511
  906. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.d.ts.map +0 -1
  907. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.js +0 -8
  908. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.js.map +0 -1
  909. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.d.ts +0 -19
  910. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.d.ts.map +0 -1
  911. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.js +0 -45
  912. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.js.map +0 -1
  913. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.d.ts +0 -22
  914. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.d.ts.map +0 -1
  915. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.js +0 -21
  916. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.js.map +0 -1
  917. package/packages/gsd-agent-modes/dist/pi-tui-compat.d.ts +0 -4
  918. package/packages/gsd-agent-modes/dist/pi-tui-compat.d.ts.map +0 -1
  919. package/packages/gsd-agent-modes/dist/pi-tui-compat.js +0 -3
  920. package/packages/gsd-agent-modes/dist/pi-tui-compat.js.map +0 -1
  921. package/packages/gsd-agent-modes/dist/theme.d.ts +0 -15
  922. package/packages/gsd-agent-modes/dist/theme.d.ts.map +0 -1
  923. package/packages/gsd-agent-modes/dist/theme.js +0 -23
  924. package/packages/gsd-agent-modes/dist/theme.js.map +0 -1
  925. package/packages/gsd-agent-modes/dist/utils/theme.d.ts +0 -16
  926. package/packages/gsd-agent-modes/dist/utils/theme.d.ts.map +0 -1
  927. package/packages/gsd-agent-modes/dist/utils/theme.js +0 -11
  928. package/packages/gsd-agent-modes/dist/utils/theme.js.map +0 -1
  929. package/packages/gsd-agent-modes/package.json +0 -23
  930. package/packages/gsd-agent-modes/src/cli/args.ts +0 -350
  931. package/packages/gsd-agent-modes/src/cli/config-selector.ts +0 -54
  932. package/packages/gsd-agent-modes/src/cli/file-processor.ts +0 -107
  933. package/packages/gsd-agent-modes/src/cli/list-models.ts +0 -141
  934. package/packages/gsd-agent-modes/src/cli/session-picker.ts +0 -59
  935. package/packages/gsd-agent-modes/src/index.ts +0 -6
  936. package/packages/gsd-agent-modes/src/main.ts +0 -614
  937. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/login-dialog.test.ts +0 -24
  938. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/provider-display-name.test.ts +0 -18
  939. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/timestamp.test.ts +0 -38
  940. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/tool-execution.test.ts +0 -171
  941. package/packages/gsd-agent-modes/src/modes/interactive/components/armin.ts +0 -382
  942. package/packages/gsd-agent-modes/src/modes/interactive/components/assistant-message.ts +0 -178
  943. package/packages/gsd-agent-modes/src/modes/interactive/components/bash-execution.ts +0 -212
  944. package/packages/gsd-agent-modes/src/modes/interactive/components/bordered-loader.ts +0 -66
  945. package/packages/gsd-agent-modes/src/modes/interactive/components/branch-summary-message.ts +0 -59
  946. package/packages/gsd-agent-modes/src/modes/interactive/components/chat-frame.ts +0 -67
  947. package/packages/gsd-agent-modes/src/modes/interactive/components/compaction-summary-message.ts +0 -60
  948. package/packages/gsd-agent-modes/src/modes/interactive/components/config-selector.ts +0 -597
  949. package/packages/gsd-agent-modes/src/modes/interactive/components/countdown-timer.ts +0 -41
  950. package/packages/gsd-agent-modes/src/modes/interactive/components/custom-editor.ts +0 -88
  951. package/packages/gsd-agent-modes/src/modes/interactive/components/custom-message.ts +0 -100
  952. package/packages/gsd-agent-modes/src/modes/interactive/components/daxnuts.ts +0 -165
  953. package/packages/gsd-agent-modes/src/modes/interactive/components/diff.ts +0 -147
  954. package/packages/gsd-agent-modes/src/modes/interactive/components/dynamic-border.test.ts +0 -73
  955. package/packages/gsd-agent-modes/src/modes/interactive/components/dynamic-border.ts +0 -89
  956. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-editor.ts +0 -151
  957. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-input.ts +0 -100
  958. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-selector.ts +0 -156
  959. package/packages/gsd-agent-modes/src/modes/interactive/components/footer.ts +0 -257
  960. package/packages/gsd-agent-modes/src/modes/interactive/components/index.ts +0 -35
  961. package/packages/gsd-agent-modes/src/modes/interactive/components/keybinding-hints.ts +0 -84
  962. package/packages/gsd-agent-modes/src/modes/interactive/components/login-dialog.ts +0 -257
  963. package/packages/gsd-agent-modes/src/modes/interactive/components/model-selector.ts +0 -656
  964. package/packages/gsd-agent-modes/src/modes/interactive/components/oauth-selector.ts +0 -122
  965. package/packages/gsd-agent-modes/src/modes/interactive/components/provider-manager.ts +0 -210
  966. package/packages/gsd-agent-modes/src/modes/interactive/components/scoped-models-selector.ts +0 -342
  967. package/packages/gsd-agent-modes/src/modes/interactive/components/session-selector-search.ts +0 -194
  968. package/packages/gsd-agent-modes/src/modes/interactive/components/session-selector.ts +0 -1011
  969. package/packages/gsd-agent-modes/src/modes/interactive/components/settings-selector.ts +0 -452
  970. package/packages/gsd-agent-modes/src/modes/interactive/components/show-images-selector.ts +0 -45
  971. package/packages/gsd-agent-modes/src/modes/interactive/components/skill-invocation-message.ts +0 -56
  972. package/packages/gsd-agent-modes/src/modes/interactive/components/theme-selector.ts +0 -63
  973. package/packages/gsd-agent-modes/src/modes/interactive/components/thinking-selector.ts +0 -64
  974. package/packages/gsd-agent-modes/src/modes/interactive/components/timestamp.ts +0 -48
  975. package/packages/gsd-agent-modes/src/modes/interactive/components/tool-execution.ts +0 -1157
  976. package/packages/gsd-agent-modes/src/modes/interactive/components/tree-render-utils.ts +0 -81
  977. package/packages/gsd-agent-modes/src/modes/interactive/components/tree-selector.ts +0 -1208
  978. package/packages/gsd-agent-modes/src/modes/interactive/components/user-message-selector.ts +0 -145
  979. package/packages/gsd-agent-modes/src/modes/interactive/components/user-message.ts +0 -44
  980. package/packages/gsd-agent-modes/src/modes/interactive/components/visual-truncate.ts +0 -50
  981. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller-ordering.test.ts +0 -1430
  982. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller.test.ts +0 -71
  983. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller.ts +0 -957
  984. package/packages/gsd-agent-modes/src/modes/interactive/controllers/extension-ui-controller.ts +0 -63
  985. package/packages/gsd-agent-modes/src/modes/interactive/controllers/input-controller.test.ts +0 -183
  986. package/packages/gsd-agent-modes/src/modes/interactive/controllers/input-controller.ts +0 -140
  987. package/packages/gsd-agent-modes/src/modes/interactive/controllers/model-controller.ts +0 -77
  988. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode-ordering.test.ts +0 -44
  989. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode-state.ts +0 -49
  990. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode.ts +0 -4195
  991. package/packages/gsd-agent-modes/src/modes/interactive/slash-command-handlers.ts +0 -670
  992. package/packages/gsd-agent-modes/src/modes/interactive/utils/shorten-path.ts +0 -14
  993. package/packages/gsd-agent-modes/src/modes/print-mode.ts +0 -106
  994. package/packages/gsd-agent-modes/src/modes/rpc/jsonl.ts +0 -58
  995. package/packages/gsd-agent-modes/src/modes/rpc/remote-terminal.ts +0 -109
  996. package/packages/gsd-agent-modes/src/modes/rpc/rpc-client.ts +0 -572
  997. package/packages/gsd-agent-modes/src/modes/rpc/rpc-mode.ts +0 -902
  998. package/packages/gsd-agent-modes/src/modes/rpc/rpc-protocol-v2.test.ts +0 -971
  999. package/packages/gsd-agent-modes/src/modes/rpc/rpc-types.ts +0 -335
  1000. package/packages/gsd-agent-modes/src/modes/shared/command-context-actions.ts +0 -53
  1001. package/packages/gsd-agent-modes/src/pi-coding-agent-compat.ts +0 -42
  1002. package/packages/gsd-agent-modes/src/pi-tui-compat.ts +0 -4
  1003. package/packages/gsd-agent-modes/src/theme.ts +0 -25
  1004. package/packages/gsd-agent-modes/src/utils/theme.ts +0 -24
  1005. package/packages/gsd-agent-modes/tsconfig.json +0 -28
  1006. package/packages/gsd-agent-modes/tsconfig.tsbuildinfo +0 -1
  1007. package/packages/gsd-agent-types/dist/index.d.ts +0 -176
  1008. package/packages/gsd-agent-types/dist/index.d.ts.map +0 -1
  1009. package/packages/gsd-agent-types/dist/index.js +0 -24
  1010. package/packages/gsd-agent-types/dist/index.js.map +0 -1
  1011. package/packages/gsd-agent-types/package.json +0 -24
  1012. package/packages/gsd-agent-types/src/index.ts +0 -206
  1013. package/packages/gsd-agent-types/tsconfig.json +0 -25
  1014. package/packages/gsd-agent-types/tsconfig.tsbuildinfo +0 -1
  1015. package/packages/native/dist/tsconfig.tsbuildinfo +0 -1
  1016. package/src/resources/extensions/claude-code-cli/tests/provider-registration.test.ts +0 -27
  1017. /package/dist/web/standalone/.next/static/{gy6_foLMsEzdGBT19c3hr → Cev5xrAYA3ZGTRLyjR2fX}/_buildManifest.js +0 -0
  1018. /package/dist/web/standalone/.next/static/{gy6_foLMsEzdGBT19c3hr → Cev5xrAYA3ZGTRLyjR2fX}/_ssgManifest.js +0 -0
@@ -38,11 +38,18 @@ describe("CombinedAutocompleteProvider — slash commands", () => {
38
38
  assert.ok(result);
39
39
  assert.equal(result.items[0]?.description, "Select model");
40
40
  });
41
- it("does not trigger slash commands mid-line", () => {
42
- const provider = makeProvider(sampleCommands);
43
- // "/" not at position 0 in the line — should not match slash commands
44
- const result = provider.getSuggestions(["hello /se"], 0, 9);
45
- assert.equal(result, null);
41
+ it("does not offer slash command suggestions mid-line", () => {
42
+ const sentinelCommands = [
43
+ { name: "codexmidlinecommand", description: "Sentinel slash command" },
44
+ ];
45
+ const provider = makeProvider(sentinelCommands);
46
+ const line = "hello /codexmid";
47
+ const result = provider.getSuggestions([line], 0, line.length);
48
+ if (result === null) {
49
+ return;
50
+ }
51
+ assert.ok(result.items.every((item) => item.value !== "codexmidlinecommand"), "mid-line slash-like text should not return slash command completions");
52
+ assert.ok(result.items.every((item) => item.description !== "Sentinel slash command"), "mid-line slash-like text should not return slash command metadata");
46
53
  });
47
54
  it("triggers slash commands after leading whitespace", () => {
48
55
  const provider = makeProvider(sampleCommands);
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.test.js","sourceRoot":"","sources":["../../src/__tests__/autocomplete.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { CombinedAutocompleteProvider } from \"../autocomplete.js\";\nimport type { SlashCommand } from \"../autocomplete.js\";\n\nfunction makeProvider(commands: SlashCommand[] = [], basePath: string = \"/tmp\") {\n\treturn new CombinedAutocompleteProvider(commands, basePath);\n}\n\nconst sampleCommands: SlashCommand[] = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{ name: \"model\", description: \"Select model\" },\n\t{ name: \"session\", description: \"Show session info\" },\n\t{ name: \"export\", description: \"Export session\" },\n\t{ name: \"thinking\", description: \"Set thinking level\" },\n];\n\ndescribe(\"CombinedAutocompleteProvider — slash commands\", () => {\n\tit(\"returns all commands for bare /\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/\"], 0, 1);\n\t\tassert.ok(result, \"should return suggestions\");\n\t\tassert.equal(result!.items.length, sampleCommands.length);\n\t\tassert.equal(result!.prefix, \"/\");\n\t});\n\n\tit(\"filters commands by typed prefix\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/se\"], 0, 3);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items.length, 2); // settings, session\n\t\tassert.ok(result!.items.some((i) => i.value === \"settings\"));\n\t\tassert.ok(result!.items.some((i) => i.value === \"session\"));\n\t});\n\n\tit(\"returns null when no commands match\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/zzz\"], 0, 4);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"includes description in suggestions\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/mod\"], 0, 4);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items[0]?.description, \"Select model\");\n\t});\n\n\tit(\"does not trigger slash commands mid-line\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\t// \"/\" not at position 0 in the line — should not match slash commands\n\t\tconst result = provider.getSuggestions([\"hello /se\"], 0, 9);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"triggers slash commands after leading whitespace\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\" /se\"], 0, 5);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.prefix, \"/se\");\n\t\tassert.ok(result!.items.some((item) => item.value === \"settings\"));\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — argument completions\", () => {\n\tit(\"returns argument completions for commands that support them\", () => {\n\t\tconst commands: SlashCommand[] = [\n\t\t\t{\n\t\t\t\tname: \"thinking\",\n\t\t\t\tdescription: \"Set thinking level\",\n\t\t\t\tgetArgumentCompletions: (prefix) => {\n\t\t\t\t\tconst levels = [\"off\", \"low\", \"medium\", \"high\"];\n\t\t\t\t\tconst filtered = levels\n\t\t\t\t\t\t.filter((l) => l.startsWith(prefix.trim()))\n\t\t\t\t\t\t.map((l) => ({ value: l, label: l }));\n\t\t\t\t\treturn filtered.length > 0 ? filtered : null;\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst provider = makeProvider(commands);\n\t\tconst result = provider.getSuggestions([\"/thinking m\"], 0, 11);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items.length, 1);\n\t\tassert.equal(result!.items[0]?.value, \"medium\");\n\t});\n\n\tit(\"returns null for commands without argument completions\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/settings foo\"], 0, 13);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"returns all arg completions for empty prefix after space\", () => {\n\t\tconst commands: SlashCommand[] = [\n\t\t\t{\n\t\t\t\tname: \"test\",\n\t\t\t\tdescription: \"Test command\",\n\t\t\t\tgetArgumentCompletions: (prefix) => {\n\t\t\t\t\tconst subs = [\"start\", \"stop\", \"status\"];\n\t\t\t\t\tconst filtered = subs\n\t\t\t\t\t\t.filter((s) => s.startsWith(prefix.trim()))\n\t\t\t\t\t\t.map((s) => ({ value: s, label: s }));\n\t\t\t\t\treturn filtered.length > 0 ? filtered : null;\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst provider = makeProvider(commands);\n\t\tconst result = provider.getSuggestions([\"/test \"], 0, 6);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items.length, 3);\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — @ file prefix extraction\", () => {\n\tit(\"detects @ at start of line\", () => {\n\t\tconst provider = makeProvider();\n\t\t// @ triggers fuzzy file search — we can't test the actual file results\n\t\t// but we can test that getSuggestions returns null (no files in /tmp matching)\n\t\t// rather than crashing\n\t\tconst result = provider.getSuggestions([\"@nonexistent_xyz\"], 0, 16);\n\t\t// May return null or empty — the key thing is it doesn't crash\n\t\tassert.ok(result === null || result.items.length >= 0);\n\t});\n\n\tit(\"detects @ after space\", () => {\n\t\tconst provider = makeProvider();\n\t\tconst result = provider.getSuggestions([\"check @nonexistent_xyz\"], 0, 22);\n\t\tassert.ok(result === null || result.items.length >= 0);\n\t});\n\n\tit(\"returns null for bare @ with no query to avoid full tree walk (#1824)\", () => {\n\t\tconst provider = makeProvider([], process.cwd());\n\t\t// A bare \"@\" produces an empty rawPrefix after stripping the \"@\".\n\t\t// This must return null to avoid a synchronous full filesystem walk\n\t\t// via the native fuzzyFind addon, which freezes the TUI on large repos.\n\t\tconst result = provider.getSuggestions([\"@\"], 0, 1);\n\t\tassert.equal(result, null, \"bare @ should not trigger fuzzy file search\");\n\t});\n\n\tit(\"returns null for @ after space with no query (#1824)\", () => {\n\t\tconst provider = makeProvider([], process.cwd());\n\t\tconst result = provider.getSuggestions([\"look at @\"], 0, 9);\n\t\tassert.equal(result, null, \"@ after space with no query should not trigger fuzzy file search\");\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — applyCompletion\", () => {\n\tit(\"applies slash command completion with trailing space\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.applyCompletion([\"/se\"], 0, 3, { value: \"settings\", label: \"settings\" }, \"/se\");\n\t\tassert.equal(result.lines[0], \"/settings \");\n\t\tassert.equal(result.cursorCol, 10); // after \"/settings \"\n\t});\n\n\tit(\"preserves leading whitespace when applying slash command completion\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.applyCompletion([\" /se\"], 0, 5, { value: \"settings\", label: \"settings\" }, \"/se\");\n\t\tassert.equal(result.lines[0], \" /settings \");\n\t\tassert.equal(result.cursorCol, 12);\n\t});\n\n\tit(\"applies file path completion for @ prefix\", () => {\n\t\tconst provider = makeProvider();\n\t\tconst result = provider.applyCompletion(\n\t\t\t[\"@src/\"],\n\t\t\t0,\n\t\t\t5,\n\t\t\t{ value: \"@src/index.ts\", label: \"index.ts\" },\n\t\t\t\"@src/\",\n\t\t);\n\t\tassert.equal(result.lines[0], \"@src/index.ts \");\n\t});\n\n\tit(\"applies directory completion without trailing space\", () => {\n\t\tconst provider = makeProvider();\n\t\tconst result = provider.applyCompletion(\n\t\t\t[\"@sr\"],\n\t\t\t0,\n\t\t\t3,\n\t\t\t{ value: \"@src/\", label: \"src/\" },\n\t\t\t\"@sr\",\n\t\t);\n\t\t// Directories should not get trailing space so user can continue typing\n\t\tassert.ok(!result.lines[0]!.endsWith(\" \"));\n\t});\n\n\tit(\"preserves text after cursor\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.applyCompletion(\n\t\t\t[\"/se and more text\"],\n\t\t\t0,\n\t\t\t3,\n\t\t\t{ value: \"settings\", label: \"settings\" },\n\t\t\t\"/se\",\n\t\t);\n\t\tassert.ok(result.lines[0]!.includes(\"and more text\"));\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — force file suggestions\", () => {\n\tit(\"does not trigger for slash commands\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getForceFileSuggestions([\"/set\"], 0, 4);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"shouldTriggerFileCompletion returns false for slash commands\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tassert.equal(provider.shouldTriggerFileCompletion([\"/set\"], 0, 4), false);\n\t});\n\n\tit(\"shouldTriggerFileCompletion returns true for regular text\", () => {\n\t\tconst provider = makeProvider();\n\t\tassert.equal(provider.shouldTriggerFileCompletion([\"some text\"], 0, 9), true);\n\t});\n});\n"]}
1
+ {"version":3,"file":"autocomplete.test.js","sourceRoot":"","sources":["../../src/__tests__/autocomplete.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGlE,SAAS,YAAY,CAAC,WAA2B,EAAE,EAAE,WAAmB,MAAM;IAC7E,OAAO,IAAI,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,cAAc,GAAmB;IACtC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACvD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE;IAC9C,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACrD,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACjD,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE;CACvD,CAAC;AAEF,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB;QAC3D,MAAM,CAAC,EAAE,CAAC,MAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,EAAE,CAAC,MAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,gBAAgB,GAAmB;YACxC,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE;SACtE,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO;QACR,CAAC;QAED,MAAM,CAAC,EAAE,CACR,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,qBAAqB,CAAC,EAClE,sEAAsE,CACtE,CAAC;QACF,MAAM,CAAC,EAAE,CACR,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,wBAAwB,CAAC,EAC3E,mEAAmE,CACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,MAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACpE,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,QAAQ,GAAmB;YAChC;gBACC,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,oBAAoB;gBACjC,sBAAsB,EAAE,CAAC,MAAM,EAAE,EAAE;oBAClC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAChD,MAAM,QAAQ,GAAG,MAAM;yBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;yBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9C,CAAC;aACD;SACD,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAmB;YAChC;gBACC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,cAAc;gBAC3B,sBAAsB,EAAE,CAAC,MAAM,EAAE,EAAE;oBAClC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;oBACzC,MAAM,QAAQ,GAAG,IAAI;yBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;yBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9C,CAAC;aACD;SACD,CAAC;QACF,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACxE,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,uEAAuE;QACvE,+EAA+E;QAC/E,uBAAuB;QACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,+DAA+D;QAC/D,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAChC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAChF,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,kEAAkE;QAClE,oEAAoE;QACpE,wEAAwE;QACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,6CAA6C,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,kEAAkE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC9E,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1G,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CACtC,CAAC,OAAO,CAAC,EACT,CAAC,EACD,CAAC,EACD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,EAC7C,OAAO,CACP,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CACtC,CAAC,KAAK,CAAC,EACP,CAAC,EACD,CAAC,EACD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EACjC,KAAK,CACL,CAAC;QACF,wEAAwE;QACxE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CACtC,CAAC,mBAAmB,CAAC,EACrB,CAAC,EACD,CAAC,EACD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,EACxC,KAAK,CACL,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { CombinedAutocompleteProvider } from \"../autocomplete.js\";\nimport type { SlashCommand } from \"../autocomplete.js\";\n\nfunction makeProvider(commands: SlashCommand[] = [], basePath: string = \"/tmp\") {\n\treturn new CombinedAutocompleteProvider(commands, basePath);\n}\n\nconst sampleCommands: SlashCommand[] = [\n\t{ name: \"settings\", description: \"Open settings menu\" },\n\t{ name: \"model\", description: \"Select model\" },\n\t{ name: \"session\", description: \"Show session info\" },\n\t{ name: \"export\", description: \"Export session\" },\n\t{ name: \"thinking\", description: \"Set thinking level\" },\n];\n\ndescribe(\"CombinedAutocompleteProvider — slash commands\", () => {\n\tit(\"returns all commands for bare /\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/\"], 0, 1);\n\t\tassert.ok(result, \"should return suggestions\");\n\t\tassert.equal(result!.items.length, sampleCommands.length);\n\t\tassert.equal(result!.prefix, \"/\");\n\t});\n\n\tit(\"filters commands by typed prefix\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/se\"], 0, 3);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items.length, 2); // settings, session\n\t\tassert.ok(result!.items.some((i) => i.value === \"settings\"));\n\t\tassert.ok(result!.items.some((i) => i.value === \"session\"));\n\t});\n\n\tit(\"returns null when no commands match\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/zzz\"], 0, 4);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"includes description in suggestions\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/mod\"], 0, 4);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items[0]?.description, \"Select model\");\n\t});\n\n\tit(\"does not offer slash command suggestions mid-line\", () => {\n\t\tconst sentinelCommands: SlashCommand[] = [\n\t\t\t{ name: \"codexmidlinecommand\", description: \"Sentinel slash command\" },\n\t\t];\n\t\tconst provider = makeProvider(sentinelCommands);\n\t\tconst line = \"hello /codexmid\";\n\t\tconst result = provider.getSuggestions([line], 0, line.length);\n\n\t\tif (result === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tassert.ok(\n\t\t\tresult.items.every((item) => item.value !== \"codexmidlinecommand\"),\n\t\t\t\"mid-line slash-like text should not return slash command completions\",\n\t\t);\n\t\tassert.ok(\n\t\t\tresult.items.every((item) => item.description !== \"Sentinel slash command\"),\n\t\t\t\"mid-line slash-like text should not return slash command metadata\",\n\t\t);\n\t});\n\n\tit(\"triggers slash commands after leading whitespace\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\" /se\"], 0, 5);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.prefix, \"/se\");\n\t\tassert.ok(result!.items.some((item) => item.value === \"settings\"));\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — argument completions\", () => {\n\tit(\"returns argument completions for commands that support them\", () => {\n\t\tconst commands: SlashCommand[] = [\n\t\t\t{\n\t\t\t\tname: \"thinking\",\n\t\t\t\tdescription: \"Set thinking level\",\n\t\t\t\tgetArgumentCompletions: (prefix) => {\n\t\t\t\t\tconst levels = [\"off\", \"low\", \"medium\", \"high\"];\n\t\t\t\t\tconst filtered = levels\n\t\t\t\t\t\t.filter((l) => l.startsWith(prefix.trim()))\n\t\t\t\t\t\t.map((l) => ({ value: l, label: l }));\n\t\t\t\t\treturn filtered.length > 0 ? filtered : null;\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst provider = makeProvider(commands);\n\t\tconst result = provider.getSuggestions([\"/thinking m\"], 0, 11);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items.length, 1);\n\t\tassert.equal(result!.items[0]?.value, \"medium\");\n\t});\n\n\tit(\"returns null for commands without argument completions\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getSuggestions([\"/settings foo\"], 0, 13);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"returns all arg completions for empty prefix after space\", () => {\n\t\tconst commands: SlashCommand[] = [\n\t\t\t{\n\t\t\t\tname: \"test\",\n\t\t\t\tdescription: \"Test command\",\n\t\t\t\tgetArgumentCompletions: (prefix) => {\n\t\t\t\t\tconst subs = [\"start\", \"stop\", \"status\"];\n\t\t\t\t\tconst filtered = subs\n\t\t\t\t\t\t.filter((s) => s.startsWith(prefix.trim()))\n\t\t\t\t\t\t.map((s) => ({ value: s, label: s }));\n\t\t\t\t\treturn filtered.length > 0 ? filtered : null;\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst provider = makeProvider(commands);\n\t\tconst result = provider.getSuggestions([\"/test \"], 0, 6);\n\t\tassert.ok(result);\n\t\tassert.equal(result!.items.length, 3);\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — @ file prefix extraction\", () => {\n\tit(\"detects @ at start of line\", () => {\n\t\tconst provider = makeProvider();\n\t\t// @ triggers fuzzy file search — we can't test the actual file results\n\t\t// but we can test that getSuggestions returns null (no files in /tmp matching)\n\t\t// rather than crashing\n\t\tconst result = provider.getSuggestions([\"@nonexistent_xyz\"], 0, 16);\n\t\t// May return null or empty — the key thing is it doesn't crash\n\t\tassert.ok(result === null || result.items.length >= 0);\n\t});\n\n\tit(\"detects @ after space\", () => {\n\t\tconst provider = makeProvider();\n\t\tconst result = provider.getSuggestions([\"check @nonexistent_xyz\"], 0, 22);\n\t\tassert.ok(result === null || result.items.length >= 0);\n\t});\n\n\tit(\"returns null for bare @ with no query to avoid full tree walk (#1824)\", () => {\n\t\tconst provider = makeProvider([], process.cwd());\n\t\t// A bare \"@\" produces an empty rawPrefix after stripping the \"@\".\n\t\t// This must return null to avoid a synchronous full filesystem walk\n\t\t// via the native fuzzyFind addon, which freezes the TUI on large repos.\n\t\tconst result = provider.getSuggestions([\"@\"], 0, 1);\n\t\tassert.equal(result, null, \"bare @ should not trigger fuzzy file search\");\n\t});\n\n\tit(\"returns null for @ after space with no query (#1824)\", () => {\n\t\tconst provider = makeProvider([], process.cwd());\n\t\tconst result = provider.getSuggestions([\"look at @\"], 0, 9);\n\t\tassert.equal(result, null, \"@ after space with no query should not trigger fuzzy file search\");\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — applyCompletion\", () => {\n\tit(\"applies slash command completion with trailing space\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.applyCompletion([\"/se\"], 0, 3, { value: \"settings\", label: \"settings\" }, \"/se\");\n\t\tassert.equal(result.lines[0], \"/settings \");\n\t\tassert.equal(result.cursorCol, 10); // after \"/settings \"\n\t});\n\n\tit(\"preserves leading whitespace when applying slash command completion\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.applyCompletion([\" /se\"], 0, 5, { value: \"settings\", label: \"settings\" }, \"/se\");\n\t\tassert.equal(result.lines[0], \" /settings \");\n\t\tassert.equal(result.cursorCol, 12);\n\t});\n\n\tit(\"applies file path completion for @ prefix\", () => {\n\t\tconst provider = makeProvider();\n\t\tconst result = provider.applyCompletion(\n\t\t\t[\"@src/\"],\n\t\t\t0,\n\t\t\t5,\n\t\t\t{ value: \"@src/index.ts\", label: \"index.ts\" },\n\t\t\t\"@src/\",\n\t\t);\n\t\tassert.equal(result.lines[0], \"@src/index.ts \");\n\t});\n\n\tit(\"applies directory completion without trailing space\", () => {\n\t\tconst provider = makeProvider();\n\t\tconst result = provider.applyCompletion(\n\t\t\t[\"@sr\"],\n\t\t\t0,\n\t\t\t3,\n\t\t\t{ value: \"@src/\", label: \"src/\" },\n\t\t\t\"@sr\",\n\t\t);\n\t\t// Directories should not get trailing space so user can continue typing\n\t\tassert.ok(!result.lines[0]!.endsWith(\" \"));\n\t});\n\n\tit(\"preserves text after cursor\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.applyCompletion(\n\t\t\t[\"/se and more text\"],\n\t\t\t0,\n\t\t\t3,\n\t\t\t{ value: \"settings\", label: \"settings\" },\n\t\t\t\"/se\",\n\t\t);\n\t\tassert.ok(result.lines[0]!.includes(\"and more text\"));\n\t});\n});\n\ndescribe(\"CombinedAutocompleteProvider — force file suggestions\", () => {\n\tit(\"does not trigger for slash commands\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tconst result = provider.getForceFileSuggestions([\"/set\"], 0, 4);\n\t\tassert.equal(result, null);\n\t});\n\n\tit(\"shouldTriggerFileCompletion returns false for slash commands\", () => {\n\t\tconst provider = makeProvider(sampleCommands);\n\t\tassert.equal(provider.shouldTriggerFileCompletion([\"/set\"], 0, 4), false);\n\t});\n\n\tit(\"shouldTriggerFileCompletion returns true for regular text\", () => {\n\t\tconst provider = makeProvider();\n\t\tassert.equal(provider.shouldTriggerFileCompletion([\"some text\"], 0, 9), true);\n\t});\n});\n"]}
@@ -31,5 +31,26 @@ describe("StdinBuffer", () => {
31
31
  assert.deepEqual(received, ["\x1b[I", "\x1b[<35;20;5m"]);
32
32
  assert.equal(buffer.getBuffer(), "");
33
33
  });
34
+ it("flushes a stale incomplete escape prefix after the stale timeout", async () => {
35
+ // Timers must exceed Windows setTimeout resolution (~15.6ms) so the
36
+ // sequence timeout + stale timeout both fire within the delay window.
37
+ const buffer = new StdinBuffer({ timeout: 20, staleTimeout: 40 });
38
+ const received = [];
39
+ buffer.on("data", (sequence) => received.push(sequence));
40
+ buffer.process("\x1b[");
41
+ await delay(150);
42
+ assert.deepEqual(received, ["\x1b["]);
43
+ assert.equal(buffer.getBuffer(), "");
44
+ });
45
+ it("still allows an incomplete escape prefix to complete before the stale timeout", async () => {
46
+ const buffer = new StdinBuffer({ timeout: 5, staleTimeout: 30 });
47
+ const received = [];
48
+ buffer.on("data", (sequence) => received.push(sequence));
49
+ buffer.process("\x1b[");
50
+ await delay(10);
51
+ buffer.process("I");
52
+ assert.deepEqual(received, ["\x1b[I"]);
53
+ assert.equal(buffer.getBuffer(), "");
54
+ });
34
55
  });
35
56
  //# sourceMappingURL=stdin-buffer.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdin-buffer.test.js","sourceRoot":"","sources":["../../src/__tests__/stdin-buffer.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QAE1C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAErC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;QAEjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { StdinBuffer } from \"../stdin-buffer.js\";\n\ndescribe(\"StdinBuffer\", () => {\n\tit(\"flushes a lone Escape keypress\", async () => {\n\t\tconst buffer = new StdinBuffer({ timeout: 5 });\n\t\tconst received: string[] = [];\n\t\tbuffer.on(\"data\", (sequence) => received.push(sequence));\n\n\t\tbuffer.process(\"\\x1b\");\n\t\tawait delay(20);\n\n\t\tassert.deepEqual(received, [\"\\x1b\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\t});\n\n\tit(\"keeps split CSI focus and mouse sequences buffered until completion\", async () => {\n\t\tconst buffer = new StdinBuffer({ timeout: 5 });\n\t\tconst received: string[] = [];\n\t\tbuffer.on(\"data\", (sequence) => received.push(sequence));\n\n\t\tbuffer.process(\"\\x1b[\");\n\t\tawait delay(20);\n\t\tassert.deepEqual(received, []);\n\t\tassert.equal(buffer.getBuffer(), \"\\x1b[\");\n\n\t\tbuffer.process(\"I\");\n\t\tassert.deepEqual(received, [\"\\x1b[I\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\n\t\tbuffer.process(\"\\x1b[<35;20;\");\n\t\tawait delay(20);\n\t\tassert.deepEqual(received, [\"\\x1b[I\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\\x1b[<35;20;\");\n\n\t\tbuffer.process(\"5m\");\n\t\tassert.deepEqual(received, [\"\\x1b[I\", \"\\x1b[<35;20;5m\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"stdin-buffer.test.js","sourceRoot":"","sources":["../../src/__tests__/stdin-buffer.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QAE1C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAErC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;QAEjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QACjF,oEAAoE;QACpE,sEAAsE;QACtE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEpB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { StdinBuffer } from \"../stdin-buffer.js\";\n\ndescribe(\"StdinBuffer\", () => {\n\tit(\"flushes a lone Escape keypress\", async () => {\n\t\tconst buffer = new StdinBuffer({ timeout: 5 });\n\t\tconst received: string[] = [];\n\t\tbuffer.on(\"data\", (sequence) => received.push(sequence));\n\n\t\tbuffer.process(\"\\x1b\");\n\t\tawait delay(20);\n\n\t\tassert.deepEqual(received, [\"\\x1b\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\t});\n\n\tit(\"keeps split CSI focus and mouse sequences buffered until completion\", async () => {\n\t\tconst buffer = new StdinBuffer({ timeout: 5 });\n\t\tconst received: string[] = [];\n\t\tbuffer.on(\"data\", (sequence) => received.push(sequence));\n\n\t\tbuffer.process(\"\\x1b[\");\n\t\tawait delay(20);\n\t\tassert.deepEqual(received, []);\n\t\tassert.equal(buffer.getBuffer(), \"\\x1b[\");\n\n\t\tbuffer.process(\"I\");\n\t\tassert.deepEqual(received, [\"\\x1b[I\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\n\t\tbuffer.process(\"\\x1b[<35;20;\");\n\t\tawait delay(20);\n\t\tassert.deepEqual(received, [\"\\x1b[I\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\\x1b[<35;20;\");\n\n\t\tbuffer.process(\"5m\");\n\t\tassert.deepEqual(received, [\"\\x1b[I\", \"\\x1b[<35;20;5m\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\t});\n\n\tit(\"flushes a stale incomplete escape prefix after the stale timeout\", async () => {\n\t\t// Timers must exceed Windows setTimeout resolution (~15.6ms) so the\n\t\t// sequence timeout + stale timeout both fire within the delay window.\n\t\tconst buffer = new StdinBuffer({ timeout: 20, staleTimeout: 40 });\n\t\tconst received: string[] = [];\n\t\tbuffer.on(\"data\", (sequence) => received.push(sequence));\n\n\t\tbuffer.process(\"\\x1b[\");\n\t\tawait delay(150);\n\n\t\tassert.deepEqual(received, [\"\\x1b[\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\t});\n\n\tit(\"still allows an incomplete escape prefix to complete before the stale timeout\", async () => {\n\t\tconst buffer = new StdinBuffer({ timeout: 5, staleTimeout: 30 });\n\t\tconst received: string[] = [];\n\t\tbuffer.on(\"data\", (sequence) => received.push(sequence));\n\n\t\tbuffer.process(\"\\x1b[\");\n\t\tawait delay(10);\n\t\tbuffer.process(\"I\");\n\n\t\tassert.deepEqual(received, [\"\\x1b[I\"]);\n\t\tassert.equal(buffer.getBuffer(), \"\");\n\t});\n});\n"]}
@@ -23,6 +23,11 @@ export type StdinBufferOptions = {
23
23
  * After this time, the buffer is flushed even if incomplete
24
24
  */
25
25
  timeout?: number;
26
+ /**
27
+ * Maximum time to retain an incomplete escape prefix after the normal
28
+ * sequence timeout has fired (default: 1000ms).
29
+ */
30
+ staleTimeout?: number;
26
31
  };
27
32
  export type StdinBufferEventMap = {
28
33
  data: [string];
@@ -35,7 +40,9 @@ export type StdinBufferEventMap = {
35
40
  export declare class StdinBuffer extends EventEmitter<StdinBufferEventMap> {
36
41
  private buffer;
37
42
  private timeout;
43
+ private staleTimeout;
38
44
  private readonly timeoutMs;
45
+ private readonly staleTimeoutMs;
39
46
  private pasteMode;
40
47
  private pasteBuffer;
41
48
  constructor(options?: StdinBufferOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"stdin-buffer.d.ts","sourceRoot":"","sources":["../src/stdin-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA8MtC,MAAM,MAAM,kBAAkB,GAAG;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IACjE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,WAAW,CAAc;gBAErB,OAAO,GAAE,kBAAuB;IAKrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmG3C,KAAK,IAAI,MAAM,EAAE;IAsBjB,KAAK,IAAI,IAAI;IAUb,SAAS,IAAI,MAAM;IAInB,OAAO,IAAI,IAAI;CAGf"}
1
+ {"version":3,"file":"stdin-buffer.d.ts","sourceRoot":"","sources":["../src/stdin-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA8MtC,MAAM,MAAM,kBAAkB,GAAG;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IACf,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IACjE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,WAAW,CAAc;gBAErB,OAAO,GAAE,kBAAuB;IAMrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuG3C,KAAK,IAAI,MAAM,EAAE;IAgCjB,KAAK,IAAI,IAAI;IAcb,SAAS,IAAI,MAAM;IAInB,OAAO,IAAI,IAAI;CAGf"}
@@ -199,9 +199,11 @@ export class StdinBuffer extends EventEmitter {
199
199
  super();
200
200
  this.buffer = "";
201
201
  this.timeout = null;
202
+ this.staleTimeout = null;
202
203
  this.pasteMode = false;
203
204
  this.pasteBuffer = "";
204
205
  this.timeoutMs = options.timeout ?? 10;
206
+ this.staleTimeoutMs = options.staleTimeout ?? 1000;
205
207
  }
206
208
  process(data) {
207
209
  // Clear any pending timeout
@@ -209,6 +211,10 @@ export class StdinBuffer extends EventEmitter {
209
211
  clearTimeout(this.timeout);
210
212
  this.timeout = null;
211
213
  }
214
+ if (this.staleTimeout) {
215
+ clearTimeout(this.staleTimeout);
216
+ this.staleTimeout = null;
217
+ }
212
218
  // Handle high-byte conversion (for compatibility with parseKeypress)
213
219
  // If buffer has single byte > 127, convert to ESC + (byte - 128)
214
220
  let str;
@@ -297,6 +303,16 @@ export class StdinBuffer extends EventEmitter {
297
303
  // sequences do not get emitted as literal text on timeout.
298
304
  // A lone ESC is still flushed so an actual Escape keypress is not lost.
299
305
  if (this.buffer.length > 1 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === "incomplete") {
306
+ if (!this.staleTimeout) {
307
+ this.staleTimeout = setTimeout(() => {
308
+ this.staleTimeout = null;
309
+ if (this.buffer.length > 0 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === "incomplete") {
310
+ const stale = this.buffer;
311
+ this.buffer = "";
312
+ this.emit("data", stale);
313
+ }
314
+ }, this.staleTimeoutMs);
315
+ }
300
316
  return [];
301
317
  }
302
318
  const sequences = [this.buffer];
@@ -308,6 +324,10 @@ export class StdinBuffer extends EventEmitter {
308
324
  clearTimeout(this.timeout);
309
325
  this.timeout = null;
310
326
  }
327
+ if (this.staleTimeout) {
328
+ clearTimeout(this.staleTimeout);
329
+ this.staleTimeout = null;
330
+ }
311
331
  this.buffer = "";
312
332
  this.pasteMode = false;
313
333
  this.pasteBuffer = "";
@@ -1 +1 @@
1
- {"version":3,"file":"stdin-buffer.js","sourceRoot":"","sources":["../src/stdin-buffer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * StdinBuffer buffers input and emits complete sequences.\n *\n * This is necessary because stdin data events can arrive in partial chunks,\n * especially for escape sequences like mouse events. Without buffering,\n * partial sequences can be misinterpreted as regular keypresses.\n *\n * For example, the mouse SGR sequence `\\x1b[<35;20;5m` might arrive as:\n * - Event 1: `\\x1b`\n * - Event 2: `[<35`\n * - Event 3: `;20;5m`\n *\n * The buffer accumulates these until a complete sequence is detected.\n * Call the `process()` method to feed input data.\n *\n * Based on code from OpenTUI (https://github.com/anomalyco/opentui)\n * MIT License - Copyright (c) 2025 opentui\n */\n\nimport { EventEmitter } from \"events\";\n\nconst ESC = \"\\x1b\";\nconst BRACKETED_PASTE_START = \"\\x1b[200~\";\nconst BRACKETED_PASTE_END = \"\\x1b[201~\";\n\n/**\n * Check if a string is a complete escape sequence or needs more data\n */\nfunction isCompleteSequence(data: string): \"complete\" | \"incomplete\" | \"not-escape\" {\n\tif (!data.startsWith(ESC)) {\n\t\treturn \"not-escape\";\n\t}\n\n\tif (data.length === 1) {\n\t\treturn \"incomplete\";\n\t}\n\n\tconst afterEsc = data.slice(1);\n\n\t// CSI sequences: ESC [\n\tif (afterEsc.startsWith(\"[\")) {\n\t\t// Check for old-style mouse sequence: ESC[M + 3 bytes\n\t\tif (afterEsc.startsWith(\"[M\")) {\n\t\t\t// Old-style mouse needs ESC[M + 3 bytes = 6 total\n\t\t\treturn data.length >= 6 ? \"complete\" : \"incomplete\";\n\t\t}\n\t\treturn isCompleteCsiSequence(data);\n\t}\n\n\t// OSC sequences: ESC ]\n\tif (afterEsc.startsWith(\"]\")) {\n\t\treturn isCompleteOscSequence(data);\n\t}\n\n\t// DCS sequences: ESC P ... ESC \\ (includes XTVersion responses)\n\tif (afterEsc.startsWith(\"P\")) {\n\t\treturn isCompleteDcsSequence(data);\n\t}\n\n\t// APC sequences: ESC _ ... ESC \\ (includes Kitty graphics responses)\n\tif (afterEsc.startsWith(\"_\")) {\n\t\treturn isCompleteApcSequence(data);\n\t}\n\n\t// SS3 sequences: ESC O\n\tif (afterEsc.startsWith(\"O\")) {\n\t\t// ESC O followed by a single character\n\t\treturn afterEsc.length >= 2 ? \"complete\" : \"incomplete\";\n\t}\n\n\t// Meta key sequences: ESC followed by a single character\n\tif (afterEsc.length === 1) {\n\t\treturn \"complete\";\n\t}\n\n\t// Unknown escape sequence - treat as complete\n\treturn \"complete\";\n}\n\n/**\n * Check if CSI sequence is complete\n * CSI sequences: ESC [ ... followed by a final byte (0x40-0x7E)\n */\nfunction isCompleteCsiSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}[`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// Need at least ESC [ and one more character\n\tif (data.length < 3) {\n\t\treturn \"incomplete\";\n\t}\n\n\tconst payload = data.slice(2);\n\n\t// CSI sequences end with a byte in the range 0x40-0x7E (@-~)\n\t// This includes all letters and several special characters\n\tconst lastChar = payload[payload.length - 1];\n\tconst lastCharCode = lastChar.charCodeAt(0);\n\n\tif (lastCharCode >= 0x40 && lastCharCode <= 0x7e) {\n\t\t// Special handling for SGR mouse sequences\n\t\t// Format: ESC[<B;X;Ym or ESC[<B;X;YM\n\t\tif (payload.startsWith(\"<\")) {\n\t\t\t// Must have format: <digits;digits;digits[Mm]\n\t\t\tconst mouseMatch = /^<\\d+;\\d+;\\d+[Mm]$/.test(payload);\n\t\t\tif (mouseMatch) {\n\t\t\t\treturn \"complete\";\n\t\t\t}\n\t\t\t// If it ends with M or m but doesn't match the pattern, still incomplete\n\t\t\tif (lastChar === \"M\" || lastChar === \"m\") {\n\t\t\t\t// Check if we have the right structure\n\t\t\t\tconst parts = payload.slice(1, -1).split(\";\");\n\t\t\t\tif (parts.length === 3 && parts.every((p) => /^\\d+$/.test(p))) {\n\t\t\t\t\treturn \"complete\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"incomplete\";\n\t\t}\n\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Check if OSC sequence is complete\n * OSC sequences: ESC ] ... ST (where ST is ESC \\ or BEL)\n */\nfunction isCompleteOscSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}]`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// OSC sequences end with ST (ESC \\) or BEL (\\x07)\n\tif (data.endsWith(`${ESC}\\\\`) || data.endsWith(\"\\x07\")) {\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Check if DCS (Device Control String) sequence is complete\n * DCS sequences: ESC P ... ST (where ST is ESC \\)\n * Used for XTVersion responses like ESC P >| ... ESC \\\n */\nfunction isCompleteDcsSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}P`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// DCS sequences end with ST (ESC \\)\n\tif (data.endsWith(`${ESC}\\\\`)) {\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Check if APC (Application Program Command) sequence is complete\n * APC sequences: ESC _ ... ST (where ST is ESC \\)\n * Used for Kitty graphics responses like ESC _ G ... ESC \\\n */\nfunction isCompleteApcSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}_`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// APC sequences end with ST (ESC \\)\n\tif (data.endsWith(`${ESC}\\\\`)) {\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Split accumulated buffer into complete sequences\n */\nfunction extractCompleteSequences(buffer: string): { sequences: string[]; remainder: string } {\n\tconst sequences: string[] = [];\n\tlet pos = 0;\n\n\twhile (pos < buffer.length) {\n\t\tconst remaining = buffer.slice(pos);\n\n\t\t// Try to extract a sequence starting at this position\n\t\tif (remaining.startsWith(ESC)) {\n\t\t\t// Find the end of this escape sequence\n\t\t\tlet seqEnd = 1;\n\t\t\twhile (seqEnd <= remaining.length) {\n\t\t\t\tconst candidate = remaining.slice(0, seqEnd);\n\t\t\t\tconst status = isCompleteSequence(candidate);\n\n\t\t\t\tif (status === \"complete\") {\n\t\t\t\t\tsequences.push(candidate);\n\t\t\t\t\tpos += seqEnd;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status === \"incomplete\") {\n\t\t\t\t\tseqEnd++;\n\t\t\t\t} else {\n\t\t\t\t\t// Should not happen when starting with ESC\n\t\t\t\t\tsequences.push(candidate);\n\t\t\t\t\tpos += seqEnd;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (seqEnd > remaining.length) {\n\t\t\t\treturn { sequences, remainder: remaining };\n\t\t\t}\n\t\t} else {\n\t\t\t// Not an escape sequence - take a single character\n\t\t\tsequences.push(remaining[0]!);\n\t\t\tpos++;\n\t\t}\n\t}\n\n\treturn { sequences, remainder: \"\" };\n}\n\nexport type StdinBufferOptions = {\n\t/**\n\t * Maximum time to wait for sequence completion (default: 10ms)\n\t * After this time, the buffer is flushed even if incomplete\n\t */\n\ttimeout?: number;\n};\n\nexport type StdinBufferEventMap = {\n\tdata: [string];\n\tpaste: [string];\n};\n\n/**\n * Buffers stdin input and emits complete sequences via the 'data' event.\n * Handles partial escape sequences that arrive across multiple chunks.\n */\nexport class StdinBuffer extends EventEmitter<StdinBufferEventMap> {\n\tprivate buffer: string = \"\";\n\tprivate timeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate readonly timeoutMs: number;\n\tprivate pasteMode: boolean = false;\n\tprivate pasteBuffer: string = \"\";\n\n\tconstructor(options: StdinBufferOptions = {}) {\n\t\tsuper();\n\t\tthis.timeoutMs = options.timeout ?? 10;\n\t}\n\n\tpublic process(data: string | Buffer): void {\n\t\t// Clear any pending timeout\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = null;\n\t\t}\n\n\t\t// Handle high-byte conversion (for compatibility with parseKeypress)\n\t\t// If buffer has single byte > 127, convert to ESC + (byte - 128)\n\t\tlet str: string;\n\t\tif (Buffer.isBuffer(data)) {\n\t\t\tif (data.length === 1 && data[0]! > 127) {\n\t\t\t\tconst byte = data[0]! - 128;\n\t\t\t\tstr = `\\x1b${String.fromCharCode(byte)}`;\n\t\t\t} else {\n\t\t\t\tstr = data.toString();\n\t\t\t}\n\t\t} else {\n\t\t\tstr = data;\n\t\t}\n\n\t\tif (str.length === 0 && this.buffer.length === 0) {\n\t\t\tthis.emit(\"data\", \"\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.buffer += str;\n\n\t\tif (this.pasteMode) {\n\t\t\tthis.pasteBuffer += this.buffer;\n\t\t\tthis.buffer = \"\";\n\n\t\t\tconst endIndex = this.pasteBuffer.indexOf(BRACKETED_PASTE_END);\n\t\t\tif (endIndex !== -1) {\n\t\t\t\tconst pastedContent = this.pasteBuffer.slice(0, endIndex);\n\t\t\t\tconst remaining = this.pasteBuffer.slice(endIndex + BRACKETED_PASTE_END.length);\n\n\t\t\t\tthis.pasteMode = false;\n\t\t\t\tthis.pasteBuffer = \"\";\n\n\t\t\t\tthis.emit(\"paste\", pastedContent);\n\n\t\t\t\tif (remaining.length > 0) {\n\t\t\t\t\tthis.process(remaining);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = this.buffer.indexOf(BRACKETED_PASTE_START);\n\t\tif (startIndex !== -1) {\n\t\t\tif (startIndex > 0) {\n\t\t\t\tconst beforePaste = this.buffer.slice(0, startIndex);\n\t\t\t\tconst result = extractCompleteSequences(beforePaste);\n\t\t\t\tfor (const sequence of result.sequences) {\n\t\t\t\t\tthis.emit(\"data\", sequence);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.buffer = this.buffer.slice(startIndex + BRACKETED_PASTE_START.length);\n\t\t\tthis.pasteMode = true;\n\t\t\tthis.pasteBuffer = this.buffer;\n\t\t\tthis.buffer = \"\";\n\n\t\t\tconst endIndex = this.pasteBuffer.indexOf(BRACKETED_PASTE_END);\n\t\t\tif (endIndex !== -1) {\n\t\t\t\tconst pastedContent = this.pasteBuffer.slice(0, endIndex);\n\t\t\t\tconst remaining = this.pasteBuffer.slice(endIndex + BRACKETED_PASTE_END.length);\n\n\t\t\t\tthis.pasteMode = false;\n\t\t\t\tthis.pasteBuffer = \"\";\n\n\t\t\t\tthis.emit(\"paste\", pastedContent);\n\n\t\t\t\tif (remaining.length > 0) {\n\t\t\t\t\tthis.process(remaining);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = extractCompleteSequences(this.buffer);\n\t\tthis.buffer = result.remainder;\n\n\t\tfor (const sequence of result.sequences) {\n\t\t\tthis.emit(\"data\", sequence);\n\t\t}\n\n\t\tif (this.buffer.length > 0) {\n\t\t\tthis.timeout = setTimeout(() => {\n\t\t\t\tconst flushed = this.flush();\n\n\t\t\t\tfor (const sequence of flushed) {\n\t\t\t\t\tthis.emit(\"data\", sequence);\n\t\t\t\t}\n\t\t\t}, this.timeoutMs);\n\t\t}\n\t}\n\n\tflush(): string[] {\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = null;\n\t\t}\n\n\t\tif (this.buffer.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// Keep incomplete escape prefixes buffered so split CSI/mouse/focus\n\t\t// sequences do not get emitted as literal text on timeout.\n\t\t// A lone ESC is still flushed so an actual Escape keypress is not lost.\n\t\tif (this.buffer.length > 1 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === \"incomplete\") {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst sequences = [this.buffer];\n\t\tthis.buffer = \"\";\n\t\treturn sequences;\n\t}\n\n\tclear(): void {\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = null;\n\t\t}\n\t\tthis.buffer = \"\";\n\t\tthis.pasteMode = false;\n\t\tthis.pasteBuffer = \"\";\n\t}\n\n\tgetBuffer(): string {\n\t\treturn this.buffer;\n\t}\n\n\tdestroy(): void {\n\t\tthis.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"stdin-buffer.js","sourceRoot":"","sources":["../src/stdin-buffer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * StdinBuffer buffers input and emits complete sequences.\n *\n * This is necessary because stdin data events can arrive in partial chunks,\n * especially for escape sequences like mouse events. Without buffering,\n * partial sequences can be misinterpreted as regular keypresses.\n *\n * For example, the mouse SGR sequence `\\x1b[<35;20;5m` might arrive as:\n * - Event 1: `\\x1b`\n * - Event 2: `[<35`\n * - Event 3: `;20;5m`\n *\n * The buffer accumulates these until a complete sequence is detected.\n * Call the `process()` method to feed input data.\n *\n * Based on code from OpenTUI (https://github.com/anomalyco/opentui)\n * MIT License - Copyright (c) 2025 opentui\n */\n\nimport { EventEmitter } from \"events\";\n\nconst ESC = \"\\x1b\";\nconst BRACKETED_PASTE_START = \"\\x1b[200~\";\nconst BRACKETED_PASTE_END = \"\\x1b[201~\";\n\n/**\n * Check if a string is a complete escape sequence or needs more data\n */\nfunction isCompleteSequence(data: string): \"complete\" | \"incomplete\" | \"not-escape\" {\n\tif (!data.startsWith(ESC)) {\n\t\treturn \"not-escape\";\n\t}\n\n\tif (data.length === 1) {\n\t\treturn \"incomplete\";\n\t}\n\n\tconst afterEsc = data.slice(1);\n\n\t// CSI sequences: ESC [\n\tif (afterEsc.startsWith(\"[\")) {\n\t\t// Check for old-style mouse sequence: ESC[M + 3 bytes\n\t\tif (afterEsc.startsWith(\"[M\")) {\n\t\t\t// Old-style mouse needs ESC[M + 3 bytes = 6 total\n\t\t\treturn data.length >= 6 ? \"complete\" : \"incomplete\";\n\t\t}\n\t\treturn isCompleteCsiSequence(data);\n\t}\n\n\t// OSC sequences: ESC ]\n\tif (afterEsc.startsWith(\"]\")) {\n\t\treturn isCompleteOscSequence(data);\n\t}\n\n\t// DCS sequences: ESC P ... ESC \\ (includes XTVersion responses)\n\tif (afterEsc.startsWith(\"P\")) {\n\t\treturn isCompleteDcsSequence(data);\n\t}\n\n\t// APC sequences: ESC _ ... ESC \\ (includes Kitty graphics responses)\n\tif (afterEsc.startsWith(\"_\")) {\n\t\treturn isCompleteApcSequence(data);\n\t}\n\n\t// SS3 sequences: ESC O\n\tif (afterEsc.startsWith(\"O\")) {\n\t\t// ESC O followed by a single character\n\t\treturn afterEsc.length >= 2 ? \"complete\" : \"incomplete\";\n\t}\n\n\t// Meta key sequences: ESC followed by a single character\n\tif (afterEsc.length === 1) {\n\t\treturn \"complete\";\n\t}\n\n\t// Unknown escape sequence - treat as complete\n\treturn \"complete\";\n}\n\n/**\n * Check if CSI sequence is complete\n * CSI sequences: ESC [ ... followed by a final byte (0x40-0x7E)\n */\nfunction isCompleteCsiSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}[`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// Need at least ESC [ and one more character\n\tif (data.length < 3) {\n\t\treturn \"incomplete\";\n\t}\n\n\tconst payload = data.slice(2);\n\n\t// CSI sequences end with a byte in the range 0x40-0x7E (@-~)\n\t// This includes all letters and several special characters\n\tconst lastChar = payload[payload.length - 1];\n\tconst lastCharCode = lastChar.charCodeAt(0);\n\n\tif (lastCharCode >= 0x40 && lastCharCode <= 0x7e) {\n\t\t// Special handling for SGR mouse sequences\n\t\t// Format: ESC[<B;X;Ym or ESC[<B;X;YM\n\t\tif (payload.startsWith(\"<\")) {\n\t\t\t// Must have format: <digits;digits;digits[Mm]\n\t\t\tconst mouseMatch = /^<\\d+;\\d+;\\d+[Mm]$/.test(payload);\n\t\t\tif (mouseMatch) {\n\t\t\t\treturn \"complete\";\n\t\t\t}\n\t\t\t// If it ends with M or m but doesn't match the pattern, still incomplete\n\t\t\tif (lastChar === \"M\" || lastChar === \"m\") {\n\t\t\t\t// Check if we have the right structure\n\t\t\t\tconst parts = payload.slice(1, -1).split(\";\");\n\t\t\t\tif (parts.length === 3 && parts.every((p) => /^\\d+$/.test(p))) {\n\t\t\t\t\treturn \"complete\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn \"incomplete\";\n\t\t}\n\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Check if OSC sequence is complete\n * OSC sequences: ESC ] ... ST (where ST is ESC \\ or BEL)\n */\nfunction isCompleteOscSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}]`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// OSC sequences end with ST (ESC \\) or BEL (\\x07)\n\tif (data.endsWith(`${ESC}\\\\`) || data.endsWith(\"\\x07\")) {\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Check if DCS (Device Control String) sequence is complete\n * DCS sequences: ESC P ... ST (where ST is ESC \\)\n * Used for XTVersion responses like ESC P >| ... ESC \\\n */\nfunction isCompleteDcsSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}P`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// DCS sequences end with ST (ESC \\)\n\tif (data.endsWith(`${ESC}\\\\`)) {\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Check if APC (Application Program Command) sequence is complete\n * APC sequences: ESC _ ... ST (where ST is ESC \\)\n * Used for Kitty graphics responses like ESC _ G ... ESC \\\n */\nfunction isCompleteApcSequence(data: string): \"complete\" | \"incomplete\" {\n\tif (!data.startsWith(`${ESC}_`)) {\n\t\treturn \"complete\";\n\t}\n\n\t// APC sequences end with ST (ESC \\)\n\tif (data.endsWith(`${ESC}\\\\`)) {\n\t\treturn \"complete\";\n\t}\n\n\treturn \"incomplete\";\n}\n\n/**\n * Split accumulated buffer into complete sequences\n */\nfunction extractCompleteSequences(buffer: string): { sequences: string[]; remainder: string } {\n\tconst sequences: string[] = [];\n\tlet pos = 0;\n\n\twhile (pos < buffer.length) {\n\t\tconst remaining = buffer.slice(pos);\n\n\t\t// Try to extract a sequence starting at this position\n\t\tif (remaining.startsWith(ESC)) {\n\t\t\t// Find the end of this escape sequence\n\t\t\tlet seqEnd = 1;\n\t\t\twhile (seqEnd <= remaining.length) {\n\t\t\t\tconst candidate = remaining.slice(0, seqEnd);\n\t\t\t\tconst status = isCompleteSequence(candidate);\n\n\t\t\t\tif (status === \"complete\") {\n\t\t\t\t\tsequences.push(candidate);\n\t\t\t\t\tpos += seqEnd;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status === \"incomplete\") {\n\t\t\t\t\tseqEnd++;\n\t\t\t\t} else {\n\t\t\t\t\t// Should not happen when starting with ESC\n\t\t\t\t\tsequences.push(candidate);\n\t\t\t\t\tpos += seqEnd;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (seqEnd > remaining.length) {\n\t\t\t\treturn { sequences, remainder: remaining };\n\t\t\t}\n\t\t} else {\n\t\t\t// Not an escape sequence - take a single character\n\t\t\tsequences.push(remaining[0]!);\n\t\t\tpos++;\n\t\t}\n\t}\n\n\treturn { sequences, remainder: \"\" };\n}\n\nexport type StdinBufferOptions = {\n\t/**\n\t * Maximum time to wait for sequence completion (default: 10ms)\n\t * After this time, the buffer is flushed even if incomplete\n\t */\n\ttimeout?: number;\n\t/**\n\t * Maximum time to retain an incomplete escape prefix after the normal\n\t * sequence timeout has fired (default: 1000ms).\n\t */\n\tstaleTimeout?: number;\n};\n\nexport type StdinBufferEventMap = {\n\tdata: [string];\n\tpaste: [string];\n};\n\n/**\n * Buffers stdin input and emits complete sequences via the 'data' event.\n * Handles partial escape sequences that arrive across multiple chunks.\n */\nexport class StdinBuffer extends EventEmitter<StdinBufferEventMap> {\n\tprivate buffer: string = \"\";\n\tprivate timeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate staleTimeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate readonly timeoutMs: number;\n\tprivate readonly staleTimeoutMs: number;\n\tprivate pasteMode: boolean = false;\n\tprivate pasteBuffer: string = \"\";\n\n\tconstructor(options: StdinBufferOptions = {}) {\n\t\tsuper();\n\t\tthis.timeoutMs = options.timeout ?? 10;\n\t\tthis.staleTimeoutMs = options.staleTimeout ?? 1000;\n\t}\n\n\tpublic process(data: string | Buffer): void {\n\t\t// Clear any pending timeout\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = null;\n\t\t}\n\t\tif (this.staleTimeout) {\n\t\t\tclearTimeout(this.staleTimeout);\n\t\t\tthis.staleTimeout = null;\n\t\t}\n\n\t\t// Handle high-byte conversion (for compatibility with parseKeypress)\n\t\t// If buffer has single byte > 127, convert to ESC + (byte - 128)\n\t\tlet str: string;\n\t\tif (Buffer.isBuffer(data)) {\n\t\t\tif (data.length === 1 && data[0]! > 127) {\n\t\t\t\tconst byte = data[0]! - 128;\n\t\t\t\tstr = `\\x1b${String.fromCharCode(byte)}`;\n\t\t\t} else {\n\t\t\t\tstr = data.toString();\n\t\t\t}\n\t\t} else {\n\t\t\tstr = data;\n\t\t}\n\n\t\tif (str.length === 0 && this.buffer.length === 0) {\n\t\t\tthis.emit(\"data\", \"\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.buffer += str;\n\n\t\tif (this.pasteMode) {\n\t\t\tthis.pasteBuffer += this.buffer;\n\t\t\tthis.buffer = \"\";\n\n\t\t\tconst endIndex = this.pasteBuffer.indexOf(BRACKETED_PASTE_END);\n\t\t\tif (endIndex !== -1) {\n\t\t\t\tconst pastedContent = this.pasteBuffer.slice(0, endIndex);\n\t\t\t\tconst remaining = this.pasteBuffer.slice(endIndex + BRACKETED_PASTE_END.length);\n\n\t\t\t\tthis.pasteMode = false;\n\t\t\t\tthis.pasteBuffer = \"\";\n\n\t\t\t\tthis.emit(\"paste\", pastedContent);\n\n\t\t\t\tif (remaining.length > 0) {\n\t\t\t\t\tthis.process(remaining);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = this.buffer.indexOf(BRACKETED_PASTE_START);\n\t\tif (startIndex !== -1) {\n\t\t\tif (startIndex > 0) {\n\t\t\t\tconst beforePaste = this.buffer.slice(0, startIndex);\n\t\t\t\tconst result = extractCompleteSequences(beforePaste);\n\t\t\t\tfor (const sequence of result.sequences) {\n\t\t\t\t\tthis.emit(\"data\", sequence);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.buffer = this.buffer.slice(startIndex + BRACKETED_PASTE_START.length);\n\t\t\tthis.pasteMode = true;\n\t\t\tthis.pasteBuffer = this.buffer;\n\t\t\tthis.buffer = \"\";\n\n\t\t\tconst endIndex = this.pasteBuffer.indexOf(BRACKETED_PASTE_END);\n\t\t\tif (endIndex !== -1) {\n\t\t\t\tconst pastedContent = this.pasteBuffer.slice(0, endIndex);\n\t\t\t\tconst remaining = this.pasteBuffer.slice(endIndex + BRACKETED_PASTE_END.length);\n\n\t\t\t\tthis.pasteMode = false;\n\t\t\t\tthis.pasteBuffer = \"\";\n\n\t\t\t\tthis.emit(\"paste\", pastedContent);\n\n\t\t\t\tif (remaining.length > 0) {\n\t\t\t\t\tthis.process(remaining);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = extractCompleteSequences(this.buffer);\n\t\tthis.buffer = result.remainder;\n\n\t\tfor (const sequence of result.sequences) {\n\t\t\tthis.emit(\"data\", sequence);\n\t\t}\n\n\t\tif (this.buffer.length > 0) {\n\t\t\tthis.timeout = setTimeout(() => {\n\t\t\t\tconst flushed = this.flush();\n\n\t\t\t\tfor (const sequence of flushed) {\n\t\t\t\t\tthis.emit(\"data\", sequence);\n\t\t\t\t}\n\t\t\t}, this.timeoutMs);\n\t\t}\n\t}\n\n\tflush(): string[] {\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = null;\n\t\t}\n\n\t\tif (this.buffer.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// Keep incomplete escape prefixes buffered so split CSI/mouse/focus\n\t\t// sequences do not get emitted as literal text on timeout.\n\t\t// A lone ESC is still flushed so an actual Escape keypress is not lost.\n\t\tif (this.buffer.length > 1 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === \"incomplete\") {\n\t\t\tif (!this.staleTimeout) {\n\t\t\t\tthis.staleTimeout = setTimeout(() => {\n\t\t\t\t\tthis.staleTimeout = null;\n\t\t\t\t\tif (this.buffer.length > 0 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === \"incomplete\") {\n\t\t\t\t\t\tconst stale = this.buffer;\n\t\t\t\t\t\tthis.buffer = \"\";\n\t\t\t\t\t\tthis.emit(\"data\", stale);\n\t\t\t\t\t}\n\t\t\t\t}, this.staleTimeoutMs);\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tconst sequences = [this.buffer];\n\t\tthis.buffer = \"\";\n\t\treturn sequences;\n\t}\n\n\tclear(): void {\n\t\tif (this.timeout) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = null;\n\t\t}\n\t\tif (this.staleTimeout) {\n\t\t\tclearTimeout(this.staleTimeout);\n\t\t\tthis.staleTimeout = null;\n\t\t}\n\t\tthis.buffer = \"\";\n\t\tthis.pasteMode = false;\n\t\tthis.pasteBuffer = \"\";\n\t}\n\n\tgetBuffer(): string {\n\t\treturn this.buffer;\n\t}\n\n\tdestroy(): void {\n\t\tthis.clear();\n\t}\n}\n"]}
@@ -3,6 +3,11 @@
3
3
  "version": "2.77.0",
4
4
  "description": "Terminal User Interface library (vendored from pi-mono)",
5
5
  "type": "module",
6
+ "gsd": {
7
+ "linkable": true,
8
+ "scope": "@gsd",
9
+ "name": "pi-tui"
10
+ },
6
11
  "main": "./dist/index.js",
7
12
  "types": "./dist/index.d.ts",
8
13
  "exports": {
@@ -46,11 +46,26 @@ describe("CombinedAutocompleteProvider — slash commands", () => {
46
46
  assert.equal(result!.items[0]?.description, "Select model");
47
47
  });
48
48
 
49
- it("does not trigger slash commands mid-line", () => {
50
- const provider = makeProvider(sampleCommands);
51
- // "/" not at position 0 in the line — should not match slash commands
52
- const result = provider.getSuggestions(["hello /se"], 0, 9);
53
- assert.equal(result, null);
49
+ it("does not offer slash command suggestions mid-line", () => {
50
+ const sentinelCommands: SlashCommand[] = [
51
+ { name: "codexmidlinecommand", description: "Sentinel slash command" },
52
+ ];
53
+ const provider = makeProvider(sentinelCommands);
54
+ const line = "hello /codexmid";
55
+ const result = provider.getSuggestions([line], 0, line.length);
56
+
57
+ if (result === null) {
58
+ return;
59
+ }
60
+
61
+ assert.ok(
62
+ result.items.every((item) => item.value !== "codexmidlinecommand"),
63
+ "mid-line slash-like text should not return slash command completions",
64
+ );
65
+ assert.ok(
66
+ result.items.every((item) => item.description !== "Sentinel slash command"),
67
+ "mid-line slash-like text should not return slash command metadata",
68
+ );
54
69
  });
55
70
 
56
71
  it("triggers slash commands after leading whitespace", () => {
@@ -40,4 +40,31 @@ describe("StdinBuffer", () => {
40
40
  assert.deepEqual(received, ["\x1b[I", "\x1b[<35;20;5m"]);
41
41
  assert.equal(buffer.getBuffer(), "");
42
42
  });
43
+
44
+ it("flushes a stale incomplete escape prefix after the stale timeout", async () => {
45
+ // Timers must exceed Windows setTimeout resolution (~15.6ms) so the
46
+ // sequence timeout + stale timeout both fire within the delay window.
47
+ const buffer = new StdinBuffer({ timeout: 20, staleTimeout: 40 });
48
+ const received: string[] = [];
49
+ buffer.on("data", (sequence) => received.push(sequence));
50
+
51
+ buffer.process("\x1b[");
52
+ await delay(150);
53
+
54
+ assert.deepEqual(received, ["\x1b["]);
55
+ assert.equal(buffer.getBuffer(), "");
56
+ });
57
+
58
+ it("still allows an incomplete escape prefix to complete before the stale timeout", async () => {
59
+ const buffer = new StdinBuffer({ timeout: 5, staleTimeout: 30 });
60
+ const received: string[] = [];
61
+ buffer.on("data", (sequence) => received.push(sequence));
62
+
63
+ buffer.process("\x1b[");
64
+ await delay(10);
65
+ buffer.process("I");
66
+
67
+ assert.deepEqual(received, ["\x1b[I"]);
68
+ assert.equal(buffer.getBuffer(), "");
69
+ });
43
70
  });
@@ -229,6 +229,11 @@ export type StdinBufferOptions = {
229
229
  * After this time, the buffer is flushed even if incomplete
230
230
  */
231
231
  timeout?: number;
232
+ /**
233
+ * Maximum time to retain an incomplete escape prefix after the normal
234
+ * sequence timeout has fired (default: 1000ms).
235
+ */
236
+ staleTimeout?: number;
232
237
  };
233
238
 
234
239
  export type StdinBufferEventMap = {
@@ -243,13 +248,16 @@ export type StdinBufferEventMap = {
243
248
  export class StdinBuffer extends EventEmitter<StdinBufferEventMap> {
244
249
  private buffer: string = "";
245
250
  private timeout: ReturnType<typeof setTimeout> | null = null;
251
+ private staleTimeout: ReturnType<typeof setTimeout> | null = null;
246
252
  private readonly timeoutMs: number;
253
+ private readonly staleTimeoutMs: number;
247
254
  private pasteMode: boolean = false;
248
255
  private pasteBuffer: string = "";
249
256
 
250
257
  constructor(options: StdinBufferOptions = {}) {
251
258
  super();
252
259
  this.timeoutMs = options.timeout ?? 10;
260
+ this.staleTimeoutMs = options.staleTimeout ?? 1000;
253
261
  }
254
262
 
255
263
  public process(data: string | Buffer): void {
@@ -258,6 +266,10 @@ export class StdinBuffer extends EventEmitter<StdinBufferEventMap> {
258
266
  clearTimeout(this.timeout);
259
267
  this.timeout = null;
260
268
  }
269
+ if (this.staleTimeout) {
270
+ clearTimeout(this.staleTimeout);
271
+ this.staleTimeout = null;
272
+ }
261
273
 
262
274
  // Handle high-byte conversion (for compatibility with parseKeypress)
263
275
  // If buffer has single byte > 127, convert to ESC + (byte - 128)
@@ -365,6 +377,16 @@ export class StdinBuffer extends EventEmitter<StdinBufferEventMap> {
365
377
  // sequences do not get emitted as literal text on timeout.
366
378
  // A lone ESC is still flushed so an actual Escape keypress is not lost.
367
379
  if (this.buffer.length > 1 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === "incomplete") {
380
+ if (!this.staleTimeout) {
381
+ this.staleTimeout = setTimeout(() => {
382
+ this.staleTimeout = null;
383
+ if (this.buffer.length > 0 && this.buffer.startsWith(ESC) && isCompleteSequence(this.buffer) === "incomplete") {
384
+ const stale = this.buffer;
385
+ this.buffer = "";
386
+ this.emit("data", stale);
387
+ }
388
+ }, this.staleTimeoutMs);
389
+ }
368
390
  return [];
369
391
  }
370
392
 
@@ -378,6 +400,10 @@ export class StdinBuffer extends EventEmitter<StdinBufferEventMap> {
378
400
  clearTimeout(this.timeout);
379
401
  this.timeout = null;
380
402
  }
403
+ if (this.staleTimeout) {
404
+ clearTimeout(this.staleTimeout);
405
+ this.staleTimeout = null;
406
+ }
381
407
  this.buffer = "";
382
408
  this.pasteMode = false;
383
409
  this.pasteBuffer = "";