@code-yeongyu/senpi 2026.9.15 → 2026.9.16

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 (227) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  3. package/dist/core/extensions/builtin/config-reload/index.js +25 -8
  4. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  5. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +4 -5
  6. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
  7. package/dist/core/extensions/builtin/config-reload/watch-engine.js +14 -18
  8. package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
  9. package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
  10. package/dist/core/extensions/builtin/config-reload/watch-event-source.js +32 -9
  11. package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
  12. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts +23 -0
  13. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts.map +1 -0
  14. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js +48 -0
  15. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js.map +1 -0
  16. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts +13 -0
  17. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts.map +1 -0
  18. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js +24 -0
  19. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js.map +1 -0
  20. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts +1 -0
  21. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js +7 -1
  23. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
  24. package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts +2 -0
  25. package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js +11 -9
  27. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
  28. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts +18 -0
  29. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts.map +1 -0
  30. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js +61 -0
  31. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js.map +1 -0
  32. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts +4 -1
  33. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +1 -44
  35. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  36. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts +22 -0
  37. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js +1 -1
  39. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
  40. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js +2 -13
  42. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js.map +1 -1
  43. package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts +3 -0
  44. package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts.map +1 -0
  45. package/dist/core/extensions/builtin/terminal/monitor-file-digest.js +25 -0
  46. package/dist/core/extensions/builtin/terminal/monitor-file-digest.js.map +1 -0
  47. package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts +9 -0
  48. package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/terminal/monitor-file-watch.js +33 -0
  50. package/dist/core/extensions/builtin/terminal/monitor-file-watch.js.map +1 -0
  51. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts +6 -0
  52. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts.map +1 -0
  53. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js +22 -0
  54. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js.map +1 -0
  55. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  56. package/dist/core/extensions/builtin/terminal/monitor-registry.js +14 -35
  57. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  58. package/dist/core/extensions/kernel-tools-context.d.ts +13 -0
  59. package/dist/core/extensions/kernel-tools-context.d.ts.map +1 -0
  60. package/dist/core/extensions/kernel-tools-context.js +3 -0
  61. package/dist/core/extensions/kernel-tools-context.js.map +1 -0
  62. package/dist/core/extensions/runner.d.ts +19 -0
  63. package/dist/core/extensions/runner.d.ts.map +1 -1
  64. package/dist/core/extensions/runner.js +103 -1
  65. package/dist/core/extensions/runner.js.map +1 -1
  66. package/dist/core/extensions/types.d.ts +21 -0
  67. package/dist/core/extensions/types.d.ts.map +1 -1
  68. package/dist/core/extensions/types.js.map +1 -1
  69. package/dist/core/resource-loader.d.ts.map +1 -1
  70. package/dist/core/resource-loader.js +9 -17
  71. package/dist/core/resource-loader.js.map +1 -1
  72. package/dist/core/session-manager.d.ts +3 -0
  73. package/dist/core/session-manager.d.ts.map +1 -1
  74. package/dist/core/session-manager.js +14 -0
  75. package/dist/core/session-manager.js.map +1 -1
  76. package/dist/core/settings-manager.d.ts +23 -0
  77. package/dist/core/settings-manager.d.ts.map +1 -1
  78. package/dist/core/settings-manager.js +41 -0
  79. package/dist/core/settings-manager.js.map +1 -1
  80. package/dist/core/tools/index.d.ts +1 -1
  81. package/dist/core/tools/index.d.ts.map +1 -1
  82. package/dist/core/tools/index.js +4 -3
  83. package/dist/core/tools/index.js.map +1 -1
  84. package/dist/core/tools/read.d.ts +3 -1
  85. package/dist/core/tools/read.d.ts.map +1 -1
  86. package/dist/core/tools/read.js +16 -2
  87. package/dist/core/tools/read.js.map +1 -1
  88. package/dist/index.d.ts +1 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +1 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.js +3 -3
  93. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  94. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  95. package/dist/modes/rpc/host-watchdog.js +5 -24
  96. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  97. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  98. package/dist/modes/rpc/rpc-mode.js +3 -8
  99. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  100. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  101. package/dist/modes/rpc/session-command-router.js +3 -0
  102. package/dist/modes/rpc/session-command-router.js.map +1 -1
  103. package/dist/modes/rpc/session-worker-client.d.ts +3 -0
  104. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  105. package/dist/modes/rpc/session-worker-client.js +17 -6
  106. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  107. package/dist/modes/rpc/shutdown.d.ts +3 -0
  108. package/dist/modes/rpc/shutdown.d.ts.map +1 -0
  109. package/dist/modes/rpc/shutdown.js +17 -0
  110. package/dist/modes/rpc/shutdown.js.map +1 -0
  111. package/docs/extensions.md +3 -0
  112. package/docs/settings.md +12 -0
  113. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +36 -0
  114. package/node_modules/@code-yeongyu/senpi-codemode/README.md +24 -0
  115. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  116. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +7 -1
  117. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/kernel-tools-protocol.ts +85 -0
  118. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +6 -0
  119. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +30 -11
  120. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +11 -0
  121. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +10 -0
  122. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +46 -0
  123. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +1 -1
  124. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +58 -10
  125. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +12 -0
  126. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.d.ts +13 -0
  127. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.js +7 -0
  128. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.d.ts +10 -0
  129. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.js +12 -0
  130. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.js +22 -0
  131. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.ts +26 -0
  132. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-host.ts +134 -0
  133. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-naming.js +28 -0
  134. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.d.ts +5 -0
  135. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.js +255 -0
  136. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-pump.js +105 -0
  137. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.d.ts +27 -0
  138. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.js +127 -0
  139. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-schema.js +69 -0
  140. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-types.ts +42 -0
  141. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +2 -0
  142. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +26 -3
  143. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +20 -8
  144. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +6 -1
  145. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +9 -7
  146. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/workpool.js +37 -0
  147. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/kernel-tools-unavailable.ts +5 -0
  148. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +13 -0
  149. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +57 -3
  150. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +13 -2
  151. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/workpool.rb +38 -0
  152. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +13 -0
  153. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +9 -1
  154. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +4 -2
  155. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +8 -1
  156. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +36 -71
  157. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image-resize.ts +52 -0
  158. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +37 -72
  159. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +78 -0
  160. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +30 -5
  161. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +49 -30
  162. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +35 -0
  163. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/tool-result-marshal.ts +23 -0
  164. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
  165. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  166. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +51 -12
  167. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  168. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +3 -0
  169. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -1
  170. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +18 -3
  171. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -1
  172. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts +4 -0
  173. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts.map +1 -0
  174. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js +268 -0
  175. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js.map +1 -0
  176. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts +18 -0
  177. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts.map +1 -0
  178. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js +69 -0
  179. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js.map +1 -0
  180. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts +27 -0
  181. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map +1 -0
  182. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js +118 -0
  183. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map +1 -0
  184. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts +21 -0
  185. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts.map +1 -0
  186. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js +24 -0
  187. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js.map +1 -0
  188. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts +12 -0
  189. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts.map +1 -0
  190. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js +92 -0
  191. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js.map +1 -0
  192. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts +47 -0
  193. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts.map +1 -0
  194. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js +8 -0
  195. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js.map +1 -0
  196. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts +52 -0
  197. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts.map +1 -0
  198. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js +155 -0
  199. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js.map +1 -0
  200. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +2 -0
  201. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  202. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +2 -0
  203. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  204. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  205. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  206. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  207. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  208. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  209. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  211. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  212. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  213. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  214. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  215. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  216. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts +15 -0
  217. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts.map +1 -0
  218. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js +15 -0
  219. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js.map +1 -0
  220. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  221. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
  222. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  223. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  224. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  225. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  226. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  227. package/package.json +7 -7
@@ -1,4 +1,5 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { cursorAgentEnvironment } from "./environment.js";
2
3
  import { defaultCursorAgentExecutableDeps, resolveCursorAgentExecutable, } from "./executable.js";
3
4
  import { buildCursorCliArgs } from "./spawn-args.js";
4
5
  import { CursorCliStreamParser } from "./stream-parser.js";
@@ -68,18 +69,6 @@ class AsyncEventQueue {
68
69
  waiter.reject(error);
69
70
  }
70
71
  }
71
- function explicitEnvironment(accountHome) {
72
- const env = {
73
- HOME: accountHome,
74
- AGENT_CLI_CREDENTIAL_STORE: "file",
75
- };
76
- for (const name of ["PATH", "TERM", "LANG", "LC_ALL", "FORCE_COLOR"]) {
77
- const value = process.env[name];
78
- if (value !== undefined)
79
- env[name] = value;
80
- }
81
- return env;
82
- }
83
72
  function killProcessGroup(child, signal) {
84
73
  const pid = child.pid;
85
74
  if (pid === undefined)
@@ -114,7 +103,7 @@ export function spawnCursorCli(input) {
114
103
  const child = spawn(executable, buildCursorCliArgs(input), {
115
104
  cwd: input.cwd,
116
105
  detached: true,
117
- env: explicitEnvironment(input.accountHome),
106
+ env: cursorAgentEnvironment(input.accountHome),
118
107
  stdio: ["ignore", "pipe", "pipe"],
119
108
  windowsHide: true,
120
109
  });
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcessByStdio, spawn } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport {\n\ttype CursorAgentExecutableDeps,\n\tdefaultCursorAgentExecutableDeps,\n\tresolveCursorAgentExecutable,\n} from \"./executable.ts\";\nimport { buildCursorCliArgs, type CursorCliArgsInput } from \"./spawn-args.ts\";\nimport { type CursorCliStreamEvent, CursorCliStreamParser } from \"./stream-parser.ts\";\n\n// The prompt rides as ONE argv element, so Linux MAX_ARG_STRLEN (131072 bytes\n// per single argv string) is the binding constraint on every platform; the\n// ~467 KB darwin probe ceiling is not portable.\nexport const MAX_CURSOR_CLI_PROMPT_BYTES = 130_000;\nexport const CURSOR_CLI_ABORT_GRACE_MS = 5_000;\nconst MAX_STDERR_BYTES = 64 * 1024;\n\nexport class CursorCliPromptTooLargeError extends Error {\n\treadonly kind = \"context_overflow\";\n\treadonly limitBytes: number;\n\treadonly actualBytes: number;\n\n\tconstructor(actualBytes: number, limitBytes = MAX_CURSOR_CLI_PROMPT_BYTES) {\n\t\tsuper(`Cursor CLI prompt is ${actualBytes} bytes; the limit is ${limitBytes} bytes`);\n\t\tthis.name = \"CursorCliPromptTooLargeError\";\n\t\tthis.actualBytes = actualBytes;\n\t\tthis.limitBytes = limitBytes;\n\t}\n}\n\nexport class CursorCliAbortError extends Error {\n\treadonly type = \"aborted\";\n\treadonly kind = \"aborted\";\n\n\tconstructor() {\n\t\tsuper(\"Cursor CLI invocation aborted\");\n\t\tthis.name = \"CursorCliAbortError\";\n\t}\n}\n\nexport type CursorCliTransportEvent = CursorCliStreamEvent | CursorCliAbortError;\n\nexport type CursorCliTransportCompletedOutcome = {\n\treadonly type: \"completed\";\n\treadonly exitCode: number | null;\n\treadonly signal: NodeJS.Signals | null;\n\treadonly stderr: string;\n};\n\nexport type CursorCliTransportAbortedOutcome = {\n\treadonly type: \"aborted\";\n\treadonly error: CursorCliAbortError;\n};\n\nexport type CursorCliTransportOutcome = CursorCliTransportCompletedOutcome | CursorCliTransportAbortedOutcome;\n\nexport type CursorCliTransportInput = CursorCliArgsInput & {\n\treadonly accountHome: string;\n\treadonly cwd: string;\n\treadonly signal?: AbortSignal;\n\treadonly executableDeps?: CursorAgentExecutableDeps;\n};\n\nexport type CursorCliTransportHandle = {\n\treadonly pid: number;\n\treadonly events: AsyncIterable<CursorCliTransportEvent>;\n\treadonly completed: Promise<CursorCliTransportOutcome>;\n\tabort(): void;\n};\n\ntype QueueWaiter<T> = {\n\tresolve(result: IteratorResult<T>): void;\n\treject(error: unknown): void;\n};\n\nclass AsyncEventQueue<T> implements AsyncIterableIterator<T> {\n\tprivate readonly values: T[] = [];\n\tprivate readonly waiters: QueueWaiter<T>[] = [];\n\tprivate ended = false;\n\tprivate failure: unknown;\n\n\t[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n\t\treturn this;\n\t}\n\n\tnext(): Promise<IteratorResult<T>> {\n\t\tconst value = this.values.shift();\n\t\tif (value !== undefined) return Promise.resolve({ done: false, value });\n\t\tif (this.failure !== undefined) return Promise.reject(this.failure);\n\t\tif (this.ended) return Promise.resolve({ done: true, value: undefined });\n\t\treturn new Promise((resolve, reject) => this.waiters.push({ resolve, reject }));\n\t}\n\n\tpush(value: T): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tconst waiter = this.waiters.shift();\n\t\tif (waiter) waiter.resolve({ done: false, value });\n\t\telse this.values.push(value);\n\t}\n\n\tclose(): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tthis.ended = true;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter.resolve({ done: true, value: undefined });\n\t}\n\n\tfail(error: unknown): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tthis.failure = error;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter.reject(error);\n\t}\n}\n\nfunction explicitEnvironment(accountHome: string): NodeJS.ProcessEnv {\n\tconst env: NodeJS.ProcessEnv = {\n\t\tHOME: accountHome,\n\t\tAGENT_CLI_CREDENTIAL_STORE: \"file\",\n\t};\n\tfor (const name of [\"PATH\", \"TERM\", \"LANG\", \"LC_ALL\", \"FORCE_COLOR\"] as const) {\n\t\tconst value = process.env[name];\n\t\tif (value !== undefined) env[name] = value;\n\t}\n\treturn env;\n}\n\nfunction killProcessGroup(child: ChildProcessByStdio<null, Readable, Readable>, signal: NodeJS.Signals): void {\n\tconst pid = child.pid;\n\tif (pid === undefined) return;\n\ttry {\n\t\tif (process.platform === \"win32\") child.kill(signal);\n\t\telse process.kill(-pid, signal);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ESRCH\") throw error;\n\t}\n}\n\nfunction appendBoundedStderr(current: Uint8Array, chunk: Uint8Array): Uint8Array {\n\tif (chunk.byteLength >= MAX_STDERR_BYTES) return chunk.subarray(chunk.byteLength - MAX_STDERR_BYTES);\n\tconst combined = Buffer.concat([current, chunk]);\n\treturn combined.byteLength <= MAX_STDERR_BYTES\n\t\t? combined\n\t\t: combined.subarray(combined.byteLength - MAX_STDERR_BYTES);\n}\n\n/** Spawn one cursor-agent print-mode invocation with strict environment and process-group ownership. */\nexport function spawnCursorCli(input: CursorCliTransportInput): CursorCliTransportHandle {\n\tconst promptBytes = Buffer.byteLength(input.prompt, \"utf8\");\n\tif (promptBytes > MAX_CURSOR_CLI_PROMPT_BYTES) throw new CursorCliPromptTooLargeError(promptBytes);\n\tif (input.signal?.aborted) throw new CursorCliAbortError();\n\n\tconst executable = resolveCursorAgentExecutable(input.executableDeps ?? defaultCursorAgentExecutableDeps());\n\tconst child = spawn(executable, buildCursorCliArgs(input), {\n\t\tcwd: input.cwd,\n\t\tdetached: true,\n\t\tenv: explicitEnvironment(input.accountHome),\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\twindowsHide: true,\n\t});\n\tif (child.pid === undefined) {\n\t\tchild.kill(\"SIGKILL\");\n\t\tthrow new Error(\"cursor-agent spawned without a process id\");\n\t}\n\n\tconst pid = child.pid;\n\tconst parser = new CursorCliStreamParser();\n\tconst events = new AsyncEventQueue<CursorCliTransportEvent>();\n\tlet stderr: Uint8Array = Buffer.alloc(0);\n\tlet abortRequested = false;\n\tlet abortTimer: NodeJS.Timeout | undefined;\n\tlet removeAbortListener = (): void => {};\n\tlet resolveCompleted: (outcome: CursorCliTransportOutcome) => void = () => {};\n\tlet rejectCompleted: (error: unknown) => void = () => {};\n\tconst completed = new Promise<CursorCliTransportOutcome>((resolve, reject) => {\n\t\tresolveCompleted = resolve;\n\t\trejectCompleted = reject;\n\t});\n\n\tconst abort = (): void => {\n\t\tif (abortRequested || child.exitCode !== null || child.signalCode !== null) return;\n\t\tabortRequested = true;\n\t\ttry {\n\t\t\tkillProcessGroup(child, \"SIGTERM\");\n\t\t} catch (error) {\n\t\t\tevents.fail(error);\n\t\t\trejectCompleted(error);\n\t\t\treturn;\n\t\t}\n\t\tabortTimer = setTimeout(() => {\n\t\t\ttry {\n\t\t\t\tkillProcessGroup(child, \"SIGKILL\");\n\t\t\t} catch (error) {\n\t\t\t\tevents.fail(error);\n\t\t\t\trejectCompleted(error);\n\t\t\t}\n\t\t}, CURSOR_CLI_ABORT_GRACE_MS);\n\t};\n\n\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\tfor (const event of parser.push(chunk)) events.push(event);\n\t});\n\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\tstderr = appendBoundedStderr(stderr, chunk);\n\t});\n\tchild.once(\"error\", (error) => {\n\t\tif (abortTimer) clearTimeout(abortTimer);\n\t\tremoveAbortListener();\n\t\tevents.fail(error);\n\t\trejectCompleted(error);\n\t});\n\tchild.once(\"close\", (exitCode, signal) => {\n\t\tif (abortTimer) clearTimeout(abortTimer);\n\t\tremoveAbortListener();\n\t\tif (abortRequested) {\n\t\t\tconst error = new CursorCliAbortError();\n\t\t\tevents.push(error);\n\t\t\tevents.close();\n\t\t\tresolveCompleted({ type: \"aborted\", error });\n\t\t\treturn;\n\t\t}\n\t\tfor (const event of parser.finish()) events.push(event);\n\t\tevents.close();\n\t\tresolveCompleted({ type: \"completed\", exitCode, signal, stderr: Buffer.from(stderr).toString(\"utf8\") });\n\t});\n\n\tif (input.signal) {\n\t\tinput.signal.addEventListener(\"abort\", abort, { once: true });\n\t\tremoveAbortListener = () => input.signal?.removeEventListener(\"abort\", abort);\n\t}\n\n\treturn { pid, events, completed, abort };\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcessByStdio, spawn } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport { cursorAgentEnvironment } from \"./environment.ts\";\nimport {\n\ttype CursorAgentExecutableDeps,\n\tdefaultCursorAgentExecutableDeps,\n\tresolveCursorAgentExecutable,\n} from \"./executable.ts\";\nimport { buildCursorCliArgs, type CursorCliArgsInput } from \"./spawn-args.ts\";\nimport { type CursorCliStreamEvent, CursorCliStreamParser } from \"./stream-parser.ts\";\n\n// The prompt rides as ONE argv element, so Linux MAX_ARG_STRLEN (131072 bytes\n// per single argv string) is the binding constraint on every platform; the\n// ~467 KB darwin probe ceiling is not portable.\nexport const MAX_CURSOR_CLI_PROMPT_BYTES = 130_000;\nexport const CURSOR_CLI_ABORT_GRACE_MS = 5_000;\nconst MAX_STDERR_BYTES = 64 * 1024;\n\nexport class CursorCliPromptTooLargeError extends Error {\n\treadonly kind = \"context_overflow\";\n\treadonly limitBytes: number;\n\treadonly actualBytes: number;\n\n\tconstructor(actualBytes: number, limitBytes = MAX_CURSOR_CLI_PROMPT_BYTES) {\n\t\tsuper(`Cursor CLI prompt is ${actualBytes} bytes; the limit is ${limitBytes} bytes`);\n\t\tthis.name = \"CursorCliPromptTooLargeError\";\n\t\tthis.actualBytes = actualBytes;\n\t\tthis.limitBytes = limitBytes;\n\t}\n}\n\nexport class CursorCliAbortError extends Error {\n\treadonly type = \"aborted\";\n\treadonly kind = \"aborted\";\n\n\tconstructor() {\n\t\tsuper(\"Cursor CLI invocation aborted\");\n\t\tthis.name = \"CursorCliAbortError\";\n\t}\n}\n\nexport type CursorCliTransportEvent = CursorCliStreamEvent | CursorCliAbortError;\n\nexport type CursorCliTransportCompletedOutcome = {\n\treadonly type: \"completed\";\n\treadonly exitCode: number | null;\n\treadonly signal: NodeJS.Signals | null;\n\treadonly stderr: string;\n};\n\nexport type CursorCliTransportAbortedOutcome = {\n\treadonly type: \"aborted\";\n\treadonly error: CursorCliAbortError;\n};\n\nexport type CursorCliTransportOutcome = CursorCliTransportCompletedOutcome | CursorCliTransportAbortedOutcome;\n\nexport type CursorCliTransportInput = CursorCliArgsInput & {\n\treadonly accountHome: string;\n\treadonly cwd: string;\n\treadonly signal?: AbortSignal;\n\treadonly executableDeps?: CursorAgentExecutableDeps;\n};\n\nexport type CursorCliTransportHandle = {\n\treadonly pid: number;\n\treadonly events: AsyncIterable<CursorCliTransportEvent>;\n\treadonly completed: Promise<CursorCliTransportOutcome>;\n\tabort(): void;\n};\n\ntype QueueWaiter<T> = {\n\tresolve(result: IteratorResult<T>): void;\n\treject(error: unknown): void;\n};\n\nclass AsyncEventQueue<T> implements AsyncIterableIterator<T> {\n\tprivate readonly values: T[] = [];\n\tprivate readonly waiters: QueueWaiter<T>[] = [];\n\tprivate ended = false;\n\tprivate failure: unknown;\n\n\t[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n\t\treturn this;\n\t}\n\n\tnext(): Promise<IteratorResult<T>> {\n\t\tconst value = this.values.shift();\n\t\tif (value !== undefined) return Promise.resolve({ done: false, value });\n\t\tif (this.failure !== undefined) return Promise.reject(this.failure);\n\t\tif (this.ended) return Promise.resolve({ done: true, value: undefined });\n\t\treturn new Promise((resolve, reject) => this.waiters.push({ resolve, reject }));\n\t}\n\n\tpush(value: T): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tconst waiter = this.waiters.shift();\n\t\tif (waiter) waiter.resolve({ done: false, value });\n\t\telse this.values.push(value);\n\t}\n\n\tclose(): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tthis.ended = true;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter.resolve({ done: true, value: undefined });\n\t}\n\n\tfail(error: unknown): void {\n\t\tif (this.ended || this.failure !== undefined) return;\n\t\tthis.failure = error;\n\t\tfor (const waiter of this.waiters.splice(0)) waiter.reject(error);\n\t}\n}\n\nfunction killProcessGroup(child: ChildProcessByStdio<null, Readable, Readable>, signal: NodeJS.Signals): void {\n\tconst pid = child.pid;\n\tif (pid === undefined) return;\n\ttry {\n\t\tif (process.platform === \"win32\") child.kill(signal);\n\t\telse process.kill(-pid, signal);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ESRCH\") throw error;\n\t}\n}\n\nfunction appendBoundedStderr(current: Uint8Array, chunk: Uint8Array): Uint8Array {\n\tif (chunk.byteLength >= MAX_STDERR_BYTES) return chunk.subarray(chunk.byteLength - MAX_STDERR_BYTES);\n\tconst combined = Buffer.concat([current, chunk]);\n\treturn combined.byteLength <= MAX_STDERR_BYTES\n\t\t? combined\n\t\t: combined.subarray(combined.byteLength - MAX_STDERR_BYTES);\n}\n\n/** Spawn one cursor-agent print-mode invocation with strict environment and process-group ownership. */\nexport function spawnCursorCli(input: CursorCliTransportInput): CursorCliTransportHandle {\n\tconst promptBytes = Buffer.byteLength(input.prompt, \"utf8\");\n\tif (promptBytes > MAX_CURSOR_CLI_PROMPT_BYTES) throw new CursorCliPromptTooLargeError(promptBytes);\n\tif (input.signal?.aborted) throw new CursorCliAbortError();\n\n\tconst executable = resolveCursorAgentExecutable(input.executableDeps ?? defaultCursorAgentExecutableDeps());\n\tconst child = spawn(executable, buildCursorCliArgs(input), {\n\t\tcwd: input.cwd,\n\t\tdetached: true,\n\t\tenv: cursorAgentEnvironment(input.accountHome),\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\twindowsHide: true,\n\t});\n\tif (child.pid === undefined) {\n\t\tchild.kill(\"SIGKILL\");\n\t\tthrow new Error(\"cursor-agent spawned without a process id\");\n\t}\n\n\tconst pid = child.pid;\n\tconst parser = new CursorCliStreamParser();\n\tconst events = new AsyncEventQueue<CursorCliTransportEvent>();\n\tlet stderr: Uint8Array = Buffer.alloc(0);\n\tlet abortRequested = false;\n\tlet abortTimer: NodeJS.Timeout | undefined;\n\tlet removeAbortListener = (): void => {};\n\tlet resolveCompleted: (outcome: CursorCliTransportOutcome) => void = () => {};\n\tlet rejectCompleted: (error: unknown) => void = () => {};\n\tconst completed = new Promise<CursorCliTransportOutcome>((resolve, reject) => {\n\t\tresolveCompleted = resolve;\n\t\trejectCompleted = reject;\n\t});\n\n\tconst abort = (): void => {\n\t\tif (abortRequested || child.exitCode !== null || child.signalCode !== null) return;\n\t\tabortRequested = true;\n\t\ttry {\n\t\t\tkillProcessGroup(child, \"SIGTERM\");\n\t\t} catch (error) {\n\t\t\tevents.fail(error);\n\t\t\trejectCompleted(error);\n\t\t\treturn;\n\t\t}\n\t\tabortTimer = setTimeout(() => {\n\t\t\ttry {\n\t\t\t\tkillProcessGroup(child, \"SIGKILL\");\n\t\t\t} catch (error) {\n\t\t\t\tevents.fail(error);\n\t\t\t\trejectCompleted(error);\n\t\t\t}\n\t\t}, CURSOR_CLI_ABORT_GRACE_MS);\n\t};\n\n\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\tfor (const event of parser.push(chunk)) events.push(event);\n\t});\n\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\tstderr = appendBoundedStderr(stderr, chunk);\n\t});\n\tchild.once(\"error\", (error) => {\n\t\tif (abortTimer) clearTimeout(abortTimer);\n\t\tremoveAbortListener();\n\t\tevents.fail(error);\n\t\trejectCompleted(error);\n\t});\n\tchild.once(\"close\", (exitCode, signal) => {\n\t\tif (abortTimer) clearTimeout(abortTimer);\n\t\tremoveAbortListener();\n\t\tif (abortRequested) {\n\t\t\tconst error = new CursorCliAbortError();\n\t\t\tevents.push(error);\n\t\t\tevents.close();\n\t\t\tresolveCompleted({ type: \"aborted\", error });\n\t\t\treturn;\n\t\t}\n\t\tfor (const event of parser.finish()) events.push(event);\n\t\tevents.close();\n\t\tresolveCompleted({ type: \"completed\", exitCode, signal, stderr: Buffer.from(stderr).toString(\"utf8\") });\n\t});\n\n\tif (input.signal) {\n\t\tinput.signal.addEventListener(\"abort\", abort, { once: true });\n\t\tremoveAbortListener = () => input.signal?.removeEventListener(\"abort\", abort);\n\t}\n\n\treturn { pid, events, completed, abort };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { FileHandle } from "node:fs/promises";
2
+ export declare function digestFileHandle(handle: FileHandle, signal?: AbortSignal): Promise<string>;
3
+ //# sourceMappingURL=monitor-file-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-file-digest.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-file-digest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBhG"}
@@ -0,0 +1,25 @@
1
+ import { createHash } from "node:crypto";
2
+ // Identity digest over first/middle/last 64 KiB samples plus size: cheap enough to run per
3
+ // poll tick on large files while still catching content replacements that preserve mtime.
4
+ export async function digestFileHandle(handle, signal) {
5
+ const SAMPLE_SIZE = 64 * 1024;
6
+ if (signal?.aborted)
7
+ throw new Error("file monitor registration cancelled");
8
+ const metadata = await handle.stat();
9
+ const hash = createHash("sha256");
10
+ const first = Buffer.alloc(Math.min(SAMPLE_SIZE, metadata.size));
11
+ if (first.length > 0) {
12
+ await handle.read(first, 0, first.length, 0);
13
+ hash.update(first);
14
+ }
15
+ if (metadata.size > SAMPLE_SIZE) {
16
+ const middle = Buffer.alloc(SAMPLE_SIZE);
17
+ await handle.read(middle, 0, middle.length, Math.floor((metadata.size - middle.length) / 2));
18
+ hash.update(middle);
19
+ const last = Buffer.alloc(SAMPLE_SIZE);
20
+ await handle.read(last, 0, last.length, metadata.size - last.length);
21
+ hash.update(last);
22
+ }
23
+ return `${metadata.size}:${hash.digest("hex")}`;
24
+ }
25
+ //# sourceMappingURL=monitor-file-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-file-digest.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-file-digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,2FAA2F;AAC3F,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB,EAAE,MAAoB;IAC9E,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC;IAC9B,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACjD,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { FileHandle } from \"node:fs/promises\";\n\n// Identity digest over first/middle/last 64 KiB samples plus size: cheap enough to run per\n// poll tick on large files while still catching content replacements that preserve mtime.\nexport async function digestFileHandle(handle: FileHandle, signal?: AbortSignal): Promise<string> {\n\tconst SAMPLE_SIZE = 64 * 1024;\n\tif (signal?.aborted) throw new Error(\"file monitor registration cancelled\");\n\tconst metadata = await handle.stat();\n\tconst hash = createHash(\"sha256\");\n\tconst first = Buffer.alloc(Math.min(SAMPLE_SIZE, metadata.size));\n\tif (first.length > 0) {\n\t\tawait handle.read(first, 0, first.length, 0);\n\t\thash.update(first);\n\t}\n\tif (metadata.size > SAMPLE_SIZE) {\n\t\tconst middle = Buffer.alloc(SAMPLE_SIZE);\n\t\tawait handle.read(middle, 0, middle.length, Math.floor((metadata.size - middle.length) / 2));\n\t\thash.update(middle);\n\t\tconst last = Buffer.alloc(SAMPLE_SIZE);\n\t\tawait handle.read(last, 0, last.length, metadata.size - last.length);\n\t\thash.update(last);\n\t}\n\treturn `${metadata.size}:${hash.digest(\"hex\")}`;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export declare const FILE_MONITOR_POLL_MS = 250;
2
+ export declare class FileWatchLoop {
3
+ #private;
4
+ constructor(check: () => void);
5
+ pause(): void;
6
+ resume(): void;
7
+ stop(): void;
8
+ }
9
+ //# sourceMappingURL=monitor-file-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-file-watch.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-file-watch.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,qBAAa,aAAa;;IAKzB,YAAY,KAAK,EAAE,MAAM,IAAI,EAG5B;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,MAAM,IAAI,IAAI,CAIb;IAED,IAAI,IAAI,IAAI,CAGX;CAKD"}
@@ -0,0 +1,33 @@
1
+ // fs.watch misses events under rename-heavy writers, so file monitors poll. A paused watch
2
+ // clears its timer entirely (zero wakeups, zero stat/digest work) and resume() runs one
3
+ // immediate check, so a change made during the pause is still detected and fired.
4
+ export const FILE_MONITOR_POLL_MS = 250;
5
+ export class FileWatchLoop {
6
+ #check;
7
+ #timer;
8
+ #stopped = false;
9
+ constructor(check) {
10
+ this.#check = check;
11
+ this.#start();
12
+ }
13
+ pause() {
14
+ if (this.#timer === undefined)
15
+ return;
16
+ clearInterval(this.#timer);
17
+ this.#timer = undefined;
18
+ }
19
+ resume() {
20
+ if (this.#stopped || this.#timer !== undefined)
21
+ return;
22
+ this.#start();
23
+ this.#check();
24
+ }
25
+ stop() {
26
+ this.#stopped = true;
27
+ this.pause();
28
+ }
29
+ #start() {
30
+ this.#timer = setInterval(this.#check, FILE_MONITOR_POLL_MS);
31
+ }
32
+ }
33
+ //# sourceMappingURL=monitor-file-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-file-watch.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-file-watch.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,wFAAwF;AACxF,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAa;IAC5B,MAAM,CAA6C;IACnD,QAAQ,GAAG,KAAK,CAAC;IAEjB,YAAY,KAAiB;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACtC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,MAAM;QACL,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,IAAI;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAED,MAAM;QACL,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC9D,CAAC;CACD","sourcesContent":["// fs.watch misses events under rename-heavy writers, so file monitors poll. A paused watch\n// clears its timer entirely (zero wakeups, zero stat/digest work) and resume() runs one\n// immediate check, so a change made during the pause is still detected and fired.\nexport const FILE_MONITOR_POLL_MS = 250;\n\nexport class FileWatchLoop {\n\treadonly #check: () => void;\n\t#timer: ReturnType<typeof setInterval> | undefined;\n\t#stopped = false;\n\n\tconstructor(check: () => void) {\n\t\tthis.#check = check;\n\t\tthis.#start();\n\t}\n\n\tpause(): void {\n\t\tif (this.#timer === undefined) return;\n\t\tclearInterval(this.#timer);\n\t\tthis.#timer = undefined;\n\t}\n\n\tresume(): void {\n\t\tif (this.#stopped || this.#timer !== undefined) return;\n\t\tthis.#start();\n\t\tthis.#check();\n\t}\n\n\tstop(): void {\n\t\tthis.#stopped = true;\n\t\tthis.pause();\n\t}\n\n\t#start(): void {\n\t\tthis.#timer = setInterval(this.#check, FILE_MONITOR_POLL_MS);\n\t}\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const MONITOR_LINE_BUFFER_MAX_CHARS = 65536;
2
+ export declare class MonitorLineBuffer {
3
+ #private;
4
+ append(chunk: string): string[];
5
+ }
6
+ //# sourceMappingURL=monitor-line-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-line-buffer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-line-buffer.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,qBAAa,iBAAiB;;IAG7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAa9B;CACD"}
@@ -0,0 +1,22 @@
1
+ // A newline-less stream must not grow the retained tail without bound; an over-cap line is
2
+ // truncated to its last MONITOR_LINE_BUFFER_MAX_CHARS characters.
3
+ export const MONITOR_LINE_BUFFER_MAX_CHARS = 65_536;
4
+ export class MonitorLineBuffer {
5
+ #tail = "";
6
+ append(chunk) {
7
+ let remaining = this.#tail + chunk;
8
+ const lines = [];
9
+ for (;;) {
10
+ const newline = remaining.indexOf("\n");
11
+ if (newline < 0)
12
+ break;
13
+ const rawLine = remaining.slice(0, newline);
14
+ remaining = remaining.slice(newline + 1);
15
+ lines.push(rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine);
16
+ }
17
+ this.#tail =
18
+ remaining.length > MONITOR_LINE_BUFFER_MAX_CHARS ? remaining.slice(-MONITOR_LINE_BUFFER_MAX_CHARS) : remaining;
19
+ return lines;
20
+ }
21
+ }
22
+ //# sourceMappingURL=monitor-line-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor-line-buffer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-line-buffer.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,kEAAkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAEpD,MAAM,OAAO,iBAAiB;IAC7B,KAAK,GAAG,EAAE,CAAC;IAEX,MAAM,CAAC,KAAa;QACnB,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,SAAS,CAAC;YACT,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM;YACvB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,KAAK;YACT,SAAS,CAAC,MAAM,GAAG,6BAA6B,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,OAAO,KAAK,CAAC;IACd,CAAC;CACD","sourcesContent":["// A newline-less stream must not grow the retained tail without bound; an over-cap line is\n// truncated to its last MONITOR_LINE_BUFFER_MAX_CHARS characters.\nexport const MONITOR_LINE_BUFFER_MAX_CHARS = 65_536;\n\nexport class MonitorLineBuffer {\n\t#tail = \"\";\n\n\tappend(chunk: string): string[] {\n\t\tlet remaining = this.#tail + chunk;\n\t\tconst lines: string[] = [];\n\t\tfor (;;) {\n\t\t\tconst newline = remaining.indexOf(\"\\n\");\n\t\t\tif (newline < 0) break;\n\t\t\tconst rawLine = remaining.slice(0, newline);\n\t\t\tremaining = remaining.slice(newline + 1);\n\t\t\tlines.push(rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine);\n\t\t}\n\t\tthis.#tail =\n\t\t\tremaining.length > MONITOR_LINE_BUFFER_MAX_CHARS ? remaining.slice(-MONITOR_LINE_BUFFER_MAX_CHARS) : remaining;\n\t\treturn lines;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor-registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/terminal/monitor-registry.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
- import { createHash, randomBytes } from "node:crypto";
1
+ import { randomBytes } from "node:crypto";
2
2
  import { watch } from "node:fs";
3
3
  import { access, lstat, open, stat } from "node:fs/promises";
4
4
  import { basename, dirname, join, resolve } from "node:path";
5
5
  import { canonicalWatchPath, probeDirectoryOpenable } from "../../../../utils/fs-watch.js";
6
6
  import { realpathWithoutOpen } from "../../../../utils/paths.js";
7
+ import { digestFileHandle } from "./monitor-file-digest.js";
8
+ import { FileWatchLoop } from "./monitor-file-watch.js";
9
+ import { MonitorLineBuffer } from "./monitor-line-buffer.js";
7
10
  import { DEFAULT_DURABLE_MONITOR_FIRE_BUDGET, FIRE_BUDGET_AUTO_MUTE_SUMMARY, FIRE_BUDGET_WINDOW_MS } from "./shared.js";
8
11
  import { describeExit } from "./tools/spawn.js";
9
12
  const MONITOR_ID_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
@@ -237,7 +240,7 @@ export class MonitorRegistry {
237
240
  event: options.event,
238
241
  watcher,
239
242
  release: release ?? (() => { }),
240
- poll: setInterval(() => void this.#checkFile(id), 250),
243
+ watch: new FileWatchLoop(() => void this.#checkFile(id)),
241
244
  paused: false,
242
245
  settled: false,
243
246
  present: initial !== null,
@@ -300,7 +303,7 @@ export class MonitorRegistry {
300
303
  if (record.settled)
301
304
  return;
302
305
  record.settled = true;
303
- clearInterval(record.poll);
306
+ record.watch.stop();
304
307
  clearTimeout(record.deadline);
305
308
  record.watcher.close();
306
309
  record.release();
@@ -318,7 +321,7 @@ export class MonitorRegistry {
318
321
  }
319
322
  async #checkFile(id) {
320
323
  const record = this.#files.get(id);
321
- if (!record || record.settled)
324
+ if (!record || record.settled || record.paused)
322
325
  return;
323
326
  if (record.checking) {
324
327
  record.dirty = true;
@@ -442,7 +445,7 @@ export class MonitorRegistry {
442
445
  expiresAt: options.expiresAt,
443
446
  runtime: options.runtime,
444
447
  filter: options.filter,
445
- lineBuffer: "",
448
+ lineBuffer: new MonitorLineBuffer(),
446
449
  mutedDropped: 0,
447
450
  paused: false,
448
451
  settled: false,
@@ -468,6 +471,8 @@ export class MonitorRegistry {
468
471
  if (!record || record.paused)
469
472
  continue;
470
473
  record.paused = true;
474
+ if ("watch" in record)
475
+ record.watch.pause();
471
476
  paused.push(record.id);
472
477
  }
473
478
  if (paused.length > 0)
@@ -492,8 +497,8 @@ export class MonitorRegistry {
492
497
  if ("fireWindow" in record && record.fireWindow !== undefined)
493
498
  record.fireWindow.count = 0;
494
499
  resumed.push({ id: record.id, mutedDropped });
495
- if ("pendingChange" in record && record.pendingChange)
496
- void this.#checkFile(record.id);
500
+ if ("watch" in record)
501
+ record.watch.resume();
497
502
  }
498
503
  if (resumed.length > 0)
499
504
  this.#notifyChange();
@@ -568,25 +573,7 @@ export class MonitorRegistry {
568
573
  return Promise.race([guarded, abort]);
569
574
  }
570
575
  async #digestHandle(handle, signal) {
571
- const SAMPLE_SIZE = 64 * 1024;
572
- if (signal?.aborted)
573
- throw new Error("file monitor registration cancelled");
574
- const metadata = await handle.stat();
575
- const hash = createHash("sha256");
576
- const first = Buffer.alloc(Math.min(SAMPLE_SIZE, metadata.size));
577
- if (first.length > 0) {
578
- await handle.read(first, 0, first.length, 0);
579
- hash.update(first);
580
- }
581
- if (metadata.size > SAMPLE_SIZE) {
582
- const middle = Buffer.alloc(SAMPLE_SIZE);
583
- await handle.read(middle, 0, middle.length, Math.floor((metadata.size - middle.length) / 2));
584
- hash.update(middle);
585
- const last = Buffer.alloc(SAMPLE_SIZE);
586
- await handle.read(last, 0, last.length, metadata.size - last.length);
587
- hash.update(last);
588
- }
589
- return `${metadata.size}:${hash.digest("hex")}`;
576
+ return digestFileHandle(handle, signal);
590
577
  }
591
578
  #notifyChange() {
592
579
  this.#onChange?.(this.snapshot());
@@ -594,14 +581,7 @@ export class MonitorRegistry {
594
581
  #consume(record, chunk) {
595
582
  if (record.settled || chunk.length === 0)
596
583
  return;
597
- let remaining = record.lineBuffer + chunk;
598
- for (;;) {
599
- const newline = remaining.indexOf("\n");
600
- if (newline < 0)
601
- break;
602
- const rawLine = remaining.slice(0, newline);
603
- remaining = remaining.slice(newline + 1);
604
- const line = rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine;
584
+ for (const line of record.lineBuffer.append(chunk)) {
605
585
  const matchesFilter = !record.filter || record.filter.test(line);
606
586
  if (!matchesFilter)
607
587
  continue;
@@ -627,7 +607,6 @@ export class MonitorRegistry {
627
607
  }
628
608
  }
629
609
  }
630
- record.lineBuffer = remaining;
631
610
  }
632
611
  #settle(record) {
633
612
  if (record.settled)