@bastani/atomic 0.9.2 → 0.9.3-alpha.1

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 (452) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/intercom/package.json +1 -1
  5. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  6. package/dist/builtin/mcp/direct-tools.ts +4 -2
  7. package/dist/builtin/mcp/package.json +1 -1
  8. package/dist/builtin/mcp/proxy-call.ts +3 -1
  9. package/dist/builtin/mcp/utils.ts +18 -7
  10. package/dist/builtin/subagents/CHANGELOG.md +11 -0
  11. package/dist/builtin/subagents/README.md +6 -6
  12. package/dist/builtin/subagents/agents/code-simplifier.md +7 -6
  13. package/dist/builtin/subagents/agents/codebase-analyzer.md +5 -4
  14. package/dist/builtin/subagents/agents/codebase-locator.md +3 -3
  15. package/dist/builtin/subagents/agents/codebase-online-researcher.md +10 -10
  16. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +4 -4
  17. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +3 -3
  18. package/dist/builtin/subagents/agents/codebase-research-locator.md +4 -4
  19. package/dist/builtin/subagents/agents/debugger.md +5 -5
  20. package/dist/builtin/subagents/agents/worker.md +56 -0
  21. package/dist/builtin/subagents/package.json +1 -1
  22. package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
  23. package/dist/builtin/subagents/src/agents/agent-loaders.ts +3 -5
  24. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +3 -3
  25. package/dist/builtin/subagents/src/extension/schemas.ts +2 -2
  26. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -3
  27. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  28. package/dist/builtin/subagents/src/runs/shared/nested-render.ts +2 -2
  29. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -1
  30. package/dist/builtin/subagents/src/shared/types-depth.ts +5 -5
  31. package/dist/builtin/subagents/src/shared/types-runtime.ts +2 -1
  32. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  33. package/dist/builtin/web-access/package.json +1 -1
  34. package/dist/builtin/workflows/CHANGELOG.md +13 -0
  35. package/dist/builtin/workflows/README.md +2 -2
  36. package/dist/builtin/workflows/builtin/goal-artifacts.ts +11 -6
  37. package/dist/builtin/workflows/builtin/goal-ledger.ts +33 -1
  38. package/dist/builtin/workflows/builtin/goal-prompts.ts +23 -28
  39. package/dist/builtin/workflows/builtin/goal-reducer.ts +2 -2
  40. package/dist/builtin/workflows/builtin/goal-reports.ts +2 -5
  41. package/dist/builtin/workflows/builtin/goal-review.ts +1 -1
  42. package/dist/builtin/workflows/builtin/goal-runner.ts +10 -17
  43. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +3 -3
  44. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +1 -3
  45. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +1 -1
  46. package/dist/builtin/workflows/builtin/ralph-core.ts +7 -17
  47. package/dist/builtin/workflows/builtin/ralph-runner.ts +11 -18
  48. package/dist/builtin/workflows/builtin/shared-prompts.ts +1 -1
  49. package/dist/builtin/workflows/package.json +1 -1
  50. package/dist/builtin/workflows/src/extension/config-loader.ts +35 -15
  51. package/dist/builtin/workflows/src/extension/discovery.ts +20 -8
  52. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +1 -2
  53. package/dist/builtin/workflows/src/extension/wiring.ts +1 -1
  54. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +11 -10
  55. package/dist/cli/args.d.ts.map +1 -1
  56. package/dist/cli/args.js +9 -9
  57. package/dist/cli/args.js.map +1 -1
  58. package/dist/config-self-update.d.ts.map +1 -1
  59. package/dist/config-self-update.js +3 -4
  60. package/dist/config-self-update.js.map +1 -1
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +4 -5
  63. package/dist/config.js.map +1 -1
  64. package/dist/core/agent-session-bash.d.ts +1 -0
  65. package/dist/core/agent-session-bash.d.ts.map +1 -1
  66. package/dist/core/agent-session-bash.js +1 -0
  67. package/dist/core/agent-session-bash.js.map +1 -1
  68. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  69. package/dist/core/agent-session-tool-registry.js +23 -0
  70. package/dist/core/agent-session-tool-registry.js.map +1 -1
  71. package/dist/core/bash-executor.d.ts +2 -0
  72. package/dist/core/bash-executor.d.ts.map +1 -1
  73. package/dist/core/bash-executor.js +1 -0
  74. package/dist/core/bash-executor.js.map +1 -1
  75. package/dist/core/compaction/compaction.d.ts +29 -0
  76. package/dist/core/compaction/compaction.d.ts.map +1 -1
  77. package/dist/core/compaction/compaction.js +36 -1
  78. package/dist/core/compaction/compaction.js.map +1 -1
  79. package/dist/core/compaction/context-compaction-metrics.d.ts +14 -2
  80. package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -1
  81. package/dist/core/compaction/context-compaction-metrics.js +50 -1
  82. package/dist/core/compaction/context-compaction-metrics.js.map +1 -1
  83. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  84. package/dist/core/compaction/context-compaction-prompt.js +2 -0
  85. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  86. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  87. package/dist/core/compaction/context-compaction-runner.js +1 -1
  88. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  89. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  90. package/dist/core/compaction/context-deletion-application.js +5 -5
  91. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  92. package/dist/core/compaction/context-deletion-targets.d.ts +2 -0
  93. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  94. package/dist/core/compaction/context-deletion-targets.js +23 -3
  95. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  96. package/dist/core/compaction/context-deletion-tool-definitions.d.ts +6 -0
  97. package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -1
  98. package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -1
  99. package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -1
  100. package/dist/core/compaction/context-deletion-tools.js +18 -10
  101. package/dist/core/compaction/context-deletion-tools.js.map +1 -1
  102. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  103. package/dist/core/compaction/context-transcript-analysis.js +2 -4
  104. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  105. package/dist/core/copilot-gemini-tool-arguments.d.ts.map +1 -1
  106. package/dist/core/copilot-gemini-tool-arguments.js +2 -60
  107. package/dist/core/copilot-gemini-tool-arguments.js.map +1 -1
  108. package/dist/core/extensions/context-types.d.ts +2 -0
  109. package/dist/core/extensions/context-types.d.ts.map +1 -1
  110. package/dist/core/extensions/context-types.js.map +1 -1
  111. package/dist/core/extensions/index.d.ts +2 -2
  112. package/dist/core/extensions/index.d.ts.map +1 -1
  113. package/dist/core/extensions/index.js +1 -1
  114. package/dist/core/extensions/index.js.map +1 -1
  115. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  116. package/dist/core/extensions/loader-virtual-modules.js +11 -3
  117. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  118. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  119. package/dist/core/extensions/runner-context.js +11 -0
  120. package/dist/core/extensions/runner-context.js.map +1 -1
  121. package/dist/core/extensions/tool-events.d.ts +13 -13
  122. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  123. package/dist/core/extensions/tool-events.js +3 -3
  124. package/dist/core/extensions/tool-events.js.map +1 -1
  125. package/dist/core/extensions/types.d.ts +1 -1
  126. package/dist/core/extensions/types.d.ts.map +1 -1
  127. package/dist/core/extensions/types.js +1 -1
  128. package/dist/core/extensions/types.js.map +1 -1
  129. package/dist/core/flattened-tool-arguments.d.ts +18 -0
  130. package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
  131. package/dist/core/flattened-tool-arguments.js +104 -0
  132. package/dist/core/flattened-tool-arguments.js.map +1 -1
  133. package/dist/core/sdk-exports.d.ts +1 -1
  134. package/dist/core/sdk-exports.d.ts.map +1 -1
  135. package/dist/core/sdk-exports.js +1 -1
  136. package/dist/core/sdk-exports.js.map +1 -1
  137. package/dist/core/sdk-types.d.ts +2 -2
  138. package/dist/core/sdk-types.d.ts.map +1 -1
  139. package/dist/core/sdk-types.js.map +1 -1
  140. package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
  141. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  142. package/dist/core/settings-manager-basic-accessors.js +18 -0
  143. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  144. package/dist/core/settings-manager-resource-accessors.d.ts +4 -0
  145. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  146. package/dist/core/settings-manager-resource-accessors.js +15 -0
  147. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  148. package/dist/core/settings-types.d.ts +11 -0
  149. package/dist/core/settings-types.d.ts.map +1 -1
  150. package/dist/core/settings-types.js.map +1 -1
  151. package/dist/core/system-prompt.d.ts +1 -1
  152. package/dist/core/system-prompt.d.ts.map +1 -1
  153. package/dist/core/system-prompt.js +3 -2
  154. package/dist/core/system-prompt.js.map +1 -1
  155. package/dist/core/tools/artifact-protocol.d.ts +11 -0
  156. package/dist/core/tools/artifact-protocol.d.ts.map +1 -0
  157. package/dist/core/tools/artifact-protocol.js +76 -0
  158. package/dist/core/tools/artifact-protocol.js.map +1 -0
  159. package/dist/core/tools/artifacts.d.ts +18 -0
  160. package/dist/core/tools/artifacts.d.ts.map +1 -0
  161. package/dist/core/tools/artifacts.js +90 -0
  162. package/dist/core/tools/artifacts.js.map +1 -0
  163. package/dist/core/tools/bash-async-jobs.d.ts +20 -0
  164. package/dist/core/tools/bash-async-jobs.d.ts.map +1 -0
  165. package/dist/core/tools/bash-async-jobs.js +59 -0
  166. package/dist/core/tools/bash-async-jobs.js.map +1 -0
  167. package/dist/core/tools/bash-async-output.d.ts +10 -0
  168. package/dist/core/tools/bash-async-output.d.ts.map +1 -0
  169. package/dist/core/tools/bash-async-output.js +80 -0
  170. package/dist/core/tools/bash-async-output.js.map +1 -0
  171. package/dist/core/tools/bash-interceptor.d.ts +10 -0
  172. package/dist/core/tools/bash-interceptor.d.ts.map +1 -0
  173. package/dist/core/tools/bash-interceptor.js +39 -0
  174. package/dist/core/tools/bash-interceptor.js.map +1 -0
  175. package/dist/core/tools/bash-leading-cd.d.ts +7 -0
  176. package/dist/core/tools/bash-leading-cd.d.ts.map +1 -0
  177. package/dist/core/tools/bash-leading-cd.js +59 -0
  178. package/dist/core/tools/bash-leading-cd.js.map +1 -0
  179. package/dist/core/tools/bash-pty-native.d.ts +14 -0
  180. package/dist/core/tools/bash-pty-native.d.ts.map +1 -0
  181. package/dist/core/tools/bash-pty-native.js +71 -0
  182. package/dist/core/tools/bash-pty-native.js.map +1 -0
  183. package/dist/core/tools/bash.d.ts +28 -17
  184. package/dist/core/tools/bash.d.ts.map +1 -1
  185. package/dist/core/tools/bash.js +152 -35
  186. package/dist/core/tools/bash.js.map +1 -1
  187. package/dist/core/tools/block-resolver.d.ts +16 -0
  188. package/dist/core/tools/block-resolver.d.ts.map +1 -0
  189. package/dist/core/tools/block-resolver.js +74 -0
  190. package/dist/core/tools/block-resolver.js.map +1 -0
  191. package/dist/core/tools/conflict-registry.d.ts +16 -0
  192. package/dist/core/tools/conflict-registry.d.ts.map +1 -0
  193. package/dist/core/tools/conflict-registry.js +44 -0
  194. package/dist/core/tools/conflict-registry.js.map +1 -0
  195. package/dist/core/tools/directory-tree.d.ts +13 -0
  196. package/dist/core/tools/directory-tree.d.ts.map +1 -0
  197. package/dist/core/tools/directory-tree.js +81 -0
  198. package/dist/core/tools/directory-tree.js.map +1 -0
  199. package/dist/core/tools/edit.d.ts +4 -29
  200. package/dist/core/tools/edit.d.ts.map +1 -1
  201. package/dist/core/tools/edit.js +136 -228
  202. package/dist/core/tools/edit.js.map +1 -1
  203. package/dist/core/tools/fetch-url.d.ts +74 -0
  204. package/dist/core/tools/fetch-url.d.ts.map +1 -0
  205. package/dist/core/tools/fetch-url.js +518 -0
  206. package/dist/core/tools/fetch-url.js.map +1 -0
  207. package/dist/core/tools/find.d.ts +27 -9
  208. package/dist/core/tools/find.d.ts.map +1 -1
  209. package/dist/core/tools/find.js +400 -176
  210. package/dist/core/tools/find.js.map +1 -1
  211. package/dist/core/tools/glob-path-utils.d.ts +8 -0
  212. package/dist/core/tools/glob-path-utils.d.ts.map +1 -0
  213. package/dist/core/tools/glob-path-utils.js +26 -0
  214. package/dist/core/tools/glob-path-utils.js.map +1 -0
  215. package/dist/core/tools/grep.d.ts +12 -0
  216. package/dist/core/tools/grep.d.ts.map +1 -1
  217. package/dist/core/tools/grep.js +141 -17
  218. package/dist/core/tools/grep.js.map +1 -1
  219. package/dist/core/tools/hashline-engine/apply.d.ts +11 -0
  220. package/dist/core/tools/hashline-engine/apply.d.ts.map +1 -0
  221. package/dist/core/tools/hashline-engine/apply.js +752 -0
  222. package/dist/core/tools/hashline-engine/apply.js.map +1 -0
  223. package/dist/core/tools/hashline-engine/block.d.ts +40 -0
  224. package/dist/core/tools/hashline-engine/block.d.ts.map +1 -0
  225. package/dist/core/tools/hashline-engine/block.js +117 -0
  226. package/dist/core/tools/hashline-engine/block.js.map +1 -0
  227. package/dist/core/tools/hashline-engine/diff-preview.d.ts +15 -0
  228. package/dist/core/tools/hashline-engine/diff-preview.d.ts.map +1 -0
  229. package/dist/core/tools/hashline-engine/diff-preview.js +98 -0
  230. package/dist/core/tools/hashline-engine/diff-preview.js.map +1 -0
  231. package/dist/core/tools/hashline-engine/format.d.ts +71 -0
  232. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -0
  233. package/dist/core/tools/hashline-engine/format.js +178 -0
  234. package/dist/core/tools/hashline-engine/format.js.map +1 -0
  235. package/dist/core/tools/hashline-engine/fs.d.ts +81 -0
  236. package/dist/core/tools/hashline-engine/fs.d.ts.map +1 -0
  237. package/dist/core/tools/hashline-engine/fs.js +143 -0
  238. package/dist/core/tools/hashline-engine/fs.js.map +1 -0
  239. package/dist/core/tools/hashline-engine/index.d.ts +18 -0
  240. package/dist/core/tools/hashline-engine/index.d.ts.map +1 -0
  241. package/dist/core/tools/hashline-engine/index.js +20 -0
  242. package/dist/core/tools/hashline-engine/index.js.map +1 -0
  243. package/dist/core/tools/hashline-engine/input.d.ts +101 -0
  244. package/dist/core/tools/hashline-engine/input.d.ts.map +1 -0
  245. package/dist/core/tools/hashline-engine/input.js +398 -0
  246. package/dist/core/tools/hashline-engine/input.js.map +1 -0
  247. package/dist/core/tools/hashline-engine/messages.d.ts +99 -0
  248. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -0
  249. package/dist/core/tools/hashline-engine/messages.js +144 -0
  250. package/dist/core/tools/hashline-engine/messages.js.map +1 -0
  251. package/dist/core/tools/hashline-engine/mismatch.d.ts +45 -0
  252. package/dist/core/tools/hashline-engine/mismatch.d.ts.map +1 -0
  253. package/dist/core/tools/hashline-engine/mismatch.js +90 -0
  254. package/dist/core/tools/hashline-engine/mismatch.js.map +1 -0
  255. package/dist/core/tools/hashline-engine/normalize.d.ts +21 -0
  256. package/dist/core/tools/hashline-engine/normalize.d.ts.map +1 -0
  257. package/dist/core/tools/hashline-engine/normalize.js +33 -0
  258. package/dist/core/tools/hashline-engine/normalize.js.map +1 -0
  259. package/dist/core/tools/hashline-engine/parser.d.ts +24 -0
  260. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -0
  261. package/dist/core/tools/hashline-engine/parser.js +381 -0
  262. package/dist/core/tools/hashline-engine/parser.js.map +1 -0
  263. package/dist/core/tools/hashline-engine/patcher.d.ts +118 -0
  264. package/dist/core/tools/hashline-engine/patcher.d.ts.map +1 -0
  265. package/dist/core/tools/hashline-engine/patcher.js +341 -0
  266. package/dist/core/tools/hashline-engine/patcher.js.map +1 -0
  267. package/dist/core/tools/hashline-engine/prefixes.d.ts +43 -0
  268. package/dist/core/tools/hashline-engine/prefixes.d.ts.map +1 -0
  269. package/dist/core/tools/hashline-engine/prefixes.js +135 -0
  270. package/dist/core/tools/hashline-engine/prefixes.js.map +1 -0
  271. package/dist/core/tools/hashline-engine/recovery.d.ts +41 -0
  272. package/dist/core/tools/hashline-engine/recovery.d.ts.map +1 -0
  273. package/dist/core/tools/hashline-engine/recovery.js +168 -0
  274. package/dist/core/tools/hashline-engine/recovery.js.map +1 -0
  275. package/dist/core/tools/hashline-engine/snapshots.d.ts +65 -0
  276. package/dist/core/tools/hashline-engine/snapshots.d.ts.map +1 -0
  277. package/dist/core/tools/hashline-engine/snapshots.js +108 -0
  278. package/dist/core/tools/hashline-engine/snapshots.js.map +1 -0
  279. package/dist/core/tools/hashline-engine/stream.d.ts +3 -0
  280. package/dist/core/tools/hashline-engine/stream.d.ts.map +1 -0
  281. package/dist/core/tools/hashline-engine/stream.js +111 -0
  282. package/dist/core/tools/hashline-engine/stream.js.map +1 -0
  283. package/dist/core/tools/hashline-engine/tokenizer.d.ts +69 -0
  284. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -0
  285. package/dist/core/tools/hashline-engine/tokenizer.js +430 -0
  286. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -0
  287. package/dist/core/tools/hashline-engine/types.d.ts +166 -0
  288. package/dist/core/tools/hashline-engine/types.d.ts.map +1 -0
  289. package/dist/core/tools/hashline-engine/types.js +9 -0
  290. package/dist/core/tools/hashline-engine/types.js.map +1 -0
  291. package/dist/core/tools/hashline.d.ts +29 -0
  292. package/dist/core/tools/hashline.d.ts.map +1 -0
  293. package/dist/core/tools/hashline.js +110 -0
  294. package/dist/core/tools/hashline.js.map +1 -0
  295. package/dist/core/tools/index.d.ts +6 -4
  296. package/dist/core/tools/index.d.ts.map +1 -1
  297. package/dist/core/tools/index.js +52 -35
  298. package/dist/core/tools/index.js.map +1 -1
  299. package/dist/core/tools/notebook.d.ts +38 -0
  300. package/dist/core/tools/notebook.d.ts.map +1 -0
  301. package/dist/core/tools/notebook.js +125 -0
  302. package/dist/core/tools/notebook.js.map +1 -0
  303. package/dist/core/tools/read-document-extract.d.ts +9 -0
  304. package/dist/core/tools/read-document-extract.d.ts.map +1 -0
  305. package/dist/core/tools/read-document-extract.js +212 -0
  306. package/dist/core/tools/read-document-extract.js.map +1 -0
  307. package/dist/core/tools/read-selectors.d.ts +24 -0
  308. package/dist/core/tools/read-selectors.d.ts.map +1 -0
  309. package/dist/core/tools/read-selectors.js +277 -0
  310. package/dist/core/tools/read-selectors.js.map +1 -0
  311. package/dist/core/tools/read-url.d.ts +37 -0
  312. package/dist/core/tools/read-url.d.ts.map +1 -0
  313. package/dist/core/tools/read-url.js +39 -0
  314. package/dist/core/tools/read-url.js.map +1 -0
  315. package/dist/core/tools/read.d.ts +11 -11
  316. package/dist/core/tools/read.d.ts.map +1 -1
  317. package/dist/core/tools/read.js +224 -94
  318. package/dist/core/tools/read.js.map +1 -1
  319. package/dist/core/tools/resource-selectors.d.ts +44 -0
  320. package/dist/core/tools/resource-selectors.d.ts.map +1 -0
  321. package/dist/core/tools/resource-selectors.js +808 -0
  322. package/dist/core/tools/resource-selectors.js.map +1 -0
  323. package/dist/core/tools/search-details.d.ts +26 -0
  324. package/dist/core/tools/search-details.d.ts.map +1 -0
  325. package/dist/core/tools/search-details.js +24 -0
  326. package/dist/core/tools/search-details.js.map +1 -0
  327. package/dist/core/tools/search-line-ranges.d.ts +11 -0
  328. package/dist/core/tools/search-line-ranges.d.ts.map +1 -0
  329. package/dist/core/tools/search-line-ranges.js +65 -0
  330. package/dist/core/tools/search-line-ranges.js.map +1 -0
  331. package/dist/core/tools/search-native.d.ts +97 -0
  332. package/dist/core/tools/search-native.d.ts.map +1 -0
  333. package/dist/core/tools/search-native.js +27 -0
  334. package/dist/core/tools/search-native.js.map +1 -0
  335. package/dist/core/tools/search.d.ts +24 -0
  336. package/dist/core/tools/search.d.ts.map +1 -0
  337. package/dist/core/tools/search.js +573 -0
  338. package/dist/core/tools/search.js.map +1 -0
  339. package/dist/core/tools/truncate.d.ts +4 -4
  340. package/dist/core/tools/truncate.d.ts.map +1 -1
  341. package/dist/core/tools/truncate.js +3 -3
  342. package/dist/core/tools/truncate.js.map +1 -1
  343. package/dist/core/tools/url-ip-guards.d.ts +4 -0
  344. package/dist/core/tools/url-ip-guards.d.ts.map +1 -0
  345. package/dist/core/tools/url-ip-guards.js +126 -0
  346. package/dist/core/tools/url-ip-guards.js.map +1 -0
  347. package/dist/core/tools/write.d.ts +12 -2
  348. package/dist/core/tools/write.d.ts.map +1 -1
  349. package/dist/core/tools/write.js +166 -14
  350. package/dist/core/tools/write.js.map +1 -1
  351. package/dist/core/trust-manager.d.ts.map +1 -1
  352. package/dist/core/trust-manager.js +2 -3
  353. package/dist/core/trust-manager.js.map +1 -1
  354. package/dist/index-extensions.d.ts +2 -2
  355. package/dist/index-extensions.d.ts.map +1 -1
  356. package/dist/index-extensions.js +1 -1
  357. package/dist/index-extensions.js.map +1 -1
  358. package/dist/index.d.ts +3 -3
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +3 -3
  361. package/dist/index.js.map +1 -1
  362. package/dist/modes/interactive/components/custom-editor.d.ts +1 -0
  363. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/custom-editor.js +9 -2
  365. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  366. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  367. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  368. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  369. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  371. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  372. package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
  373. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  375. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/tree-selector-content.js +0 -5
  377. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  378. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  379. package/dist/modes/interactive/interactive-auth-login.js +1 -0
  380. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  381. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  382. package/dist/modes/interactive/interactive-autocomplete.js +80 -2
  383. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  384. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  385. package/dist/modes/interactive/interactive-hotkeys-debug.js +3 -0
  386. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  387. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  388. package/dist/modes/interactive/interactive-input-handling.js +51 -0
  389. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  390. package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
  391. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  392. package/dist/modes/interactive/interactive-mode-base.js +5 -0
  393. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  394. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  395. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  396. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  397. package/dist/modes/interactive/interactive-mode-surface.d.ts +12 -0
  398. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  399. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  400. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  401. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  402. package/dist/modes/interactive/interactive-mode.js +1 -0
  403. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  404. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  405. package/dist/modes/interactive/interactive-model-routing.js +4 -1
  406. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  407. package/dist/modes/interactive/interactive-onboarding.d.ts +11 -0
  408. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -0
  409. package/dist/modes/interactive/interactive-onboarding.js +220 -0
  410. package/dist/modes/interactive/interactive-onboarding.js.map +1 -0
  411. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  412. package/dist/modes/interactive/interactive-selectors.js +4 -0
  413. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  414. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  415. package/dist/modes/interactive/interactive-session-routing.js +6 -0
  416. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  417. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  418. package/dist/modes/interactive/interactive-slash-commands.js +9 -4
  419. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  420. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  421. package/dist/modes/interactive/interactive-startup.js +28 -0
  422. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  423. package/dist/utils/child-process.d.ts.map +1 -1
  424. package/dist/utils/child-process.js +21 -1
  425. package/dist/utils/child-process.js.map +1 -1
  426. package/dist/utils/markit.d.ts +8 -0
  427. package/dist/utils/markit.d.ts.map +1 -0
  428. package/dist/utils/markit.js +53 -0
  429. package/dist/utils/markit.js.map +1 -0
  430. package/dist/utils/paths.d.ts +2 -1
  431. package/dist/utils/paths.d.ts.map +1 -1
  432. package/dist/utils/paths.js +14 -1
  433. package/dist/utils/paths.js.map +1 -1
  434. package/docs/compaction.md +16 -1
  435. package/docs/containerization.md +1 -1
  436. package/docs/docs.json +1 -0
  437. package/docs/extensions.md +25 -36
  438. package/docs/quickstart.md +11 -6
  439. package/docs/sdk.md +5 -5
  440. package/docs/settings.md +7 -0
  441. package/docs/subagents.md +3 -2
  442. package/docs/tools.md +49 -0
  443. package/docs/usage.md +3 -3
  444. package/docs/workflows.md +7 -5
  445. package/examples/extensions/subagent/README.md +5 -5
  446. package/examples/extensions/subagent/agents/planner.md +1 -1
  447. package/examples/extensions/subagent/agents/reviewer.md +1 -1
  448. package/examples/extensions/subagent/agents/scout.md +2 -2
  449. package/examples/extensions/subagent/display.ts +3 -3
  450. package/examples/sdk/05-tools.ts +3 -3
  451. package/examples/sdk/README.md +1 -1
  452. package/package.json +3 -2
@@ -0,0 +1,69 @@
1
+ import type { Anchor, Cursor, ParsedRange } from "./types.js";
2
+ export declare function splitHashlineLines(text: string): string[];
3
+ export declare function cloneCursor(cursor: Cursor): Cursor;
4
+ /** Parse a bare line-number anchor. Throws on malformed input. */
5
+ export declare function parseLid(raw: string, lineNum: number): Anchor;
6
+ export type BlockTarget = {
7
+ kind: "replace";
8
+ range: ParsedRange;
9
+ } | {
10
+ kind: "block";
11
+ anchor: Anchor;
12
+ } | {
13
+ kind: "delete";
14
+ range: ParsedRange;
15
+ } | {
16
+ kind: "delete_block";
17
+ anchor: Anchor;
18
+ } | {
19
+ kind: "insert_before";
20
+ anchor: Anchor;
21
+ } | {
22
+ kind: "insert_after";
23
+ anchor: Anchor;
24
+ } | {
25
+ kind: "insert_after_block";
26
+ anchor: Anchor;
27
+ } | {
28
+ kind: "bof";
29
+ } | {
30
+ kind: "eof";
31
+ };
32
+ interface TokenBase {
33
+ lineNum: number;
34
+ }
35
+ export type Token = (TokenBase & {
36
+ kind: "blank";
37
+ }) | (TokenBase & {
38
+ kind: "envelope-begin";
39
+ }) | (TokenBase & {
40
+ kind: "envelope-end";
41
+ }) | (TokenBase & {
42
+ kind: "abort";
43
+ }) | (TokenBase & {
44
+ kind: "header";
45
+ path: string;
46
+ fileHash?: string;
47
+ }) | (TokenBase & {
48
+ kind: "op-block";
49
+ target: BlockTarget;
50
+ }) | (TokenBase & {
51
+ kind: "payload-literal";
52
+ text: string;
53
+ }) | (TokenBase & {
54
+ kind: "raw";
55
+ text: string;
56
+ });
57
+ export declare class Tokenizer {
58
+ #private;
59
+ feed(chunk: string): Token[];
60
+ end(): Token[];
61
+ reset(): void;
62
+ tokenizeAll(text: string): Token[];
63
+ tokenize(line: string, lineNum?: number): Token;
64
+ isOp(line: string): boolean;
65
+ isHeader(line: string): boolean;
66
+ isEnvelopeMarker(line: string): boolean;
67
+ }
68
+ export type { ParsedRange } from "./types.js";
69
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/hashline-engine/tokenizer.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8D9D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBzD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAoBD,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW7D;AAsDD,MAAM,MAAM,WAAW,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAgKnB,UAAU,SAAS;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,KAAK,GACd,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAC/B,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GACxC,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,GACtC,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAC/B,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACjE,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,GACvD,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA6B/C,qBAAa,SAAS;;IAKrB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAK3B;IAED,GAAG,IAAI,KAAK,EAAE,CASb;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAKjC;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,KAAK,CAEzC;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1B;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9B;IAED,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMtC;CAgBD;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// @generated vendored verbatim from oh-my-pi packages/hashline @ 15b5c1397fc -- DO NOT EDIT.\n// Parity source for the Atomic hashline edit engine (issue #1483); adapted only for Atomic's Node runtime (relative imports, Bun->Node host calls, erasable constructor syntax).\n/**\n * Stateful, line-oriented classifier for hashline diff text.\n *\n * Format shape:\n * ```\n * [path/to/file.ts#1A2B]\n * replace 5..7:\n * +literal new line\n * ```\n */\nimport {\n\tdescribeAnchorExamples,\n\tHL_BLOCK_KEYWORD,\n\tHL_DELETE_KEYWORD,\n\tHL_FILE_HASH_LENGTH,\n\tHL_FILE_HASH_SEP,\n\tHL_FILE_PREFIX,\n\tHL_FILE_SUFFIX,\n\tHL_HEADER_COLON,\n\tHL_INSERT_AFTER,\n\tHL_INSERT_BEFORE,\n\tHL_INSERT_HEAD,\n\tHL_INSERT_KEYWORD,\n\tHL_INSERT_TAIL,\n\tHL_PAYLOAD_REPLACE,\n\tHL_REPLACE_KEYWORD,\n} from \"./format.js\";\nimport { ABORT_MARKER, BEGIN_PATCH_MARKER, END_PATCH_MARKER } from \"./messages.js\";\nimport type { Anchor, Cursor, ParsedRange } from \"./types.js\";\n\nconst CHAR_LINE_FEED = 10;\nconst CHAR_CARRIAGE_RETURN = 13;\nconst CHAR_ZERO = 48;\nconst CHAR_NINE = 57;\nconst CHAR_HASH = 35;\nconst CHAR_TAB = 9;\nconst CHAR_SPACE = 32;\nconst CHAR_DOT = 46;\nconst CHAR_HYPHEN = 45;\nconst CHAR_ELLIPSIS = 0x2026;\n\nconst CHAR_UPPER_A = 65;\nconst CHAR_UPPER_F = 70;\nconst CHAR_LOWER_A = 97;\nconst CHAR_LOWER_F = 102;\nconst CHAR_PAYLOAD_REPLACE = HL_PAYLOAD_REPLACE.charCodeAt(0);\nconst CHAR_COLON = HL_HEADER_COLON.charCodeAt(0);\nconst FILE_PREFIX_LENGTH = HL_FILE_PREFIX.length;\nconst FILE_SUFFIX_LENGTH = HL_FILE_SUFFIX.length;\n\nfunction isDigitCode(code: number): boolean {\n\treturn code >= CHAR_ZERO && code <= CHAR_NINE;\n}\n\nfunction isNonZeroDigitCode(code: number): boolean {\n\treturn code > CHAR_ZERO && code <= CHAR_NINE;\n}\n\nfunction isHexDigitCode(code: number): boolean {\n\treturn (\n\t\tisDigitCode(code) ||\n\t\t(code >= CHAR_UPPER_A && code <= CHAR_UPPER_F) ||\n\t\t(code >= CHAR_LOWER_A && code <= CHAR_LOWER_F)\n\t);\n}\n\nfunction isWhitespaceCode(code: number): boolean {\n\treturn code === CHAR_SPACE || (code >= CHAR_TAB && code <= CHAR_CARRIAGE_RETURN);\n}\n\nfunction skipWhitespace(line: string, index: number, end = line.length): number {\n\twhile (index < end && isWhitespaceCode(line.charCodeAt(index))) index++;\n\treturn index;\n}\n\nfunction trimEndIndex(line: string): number {\n\tlet end = line.length;\n\twhile (end > 0 && isWhitespaceCode(line.charCodeAt(end - 1))) end--;\n\treturn end;\n}\n\nfunction isEmptyLine(line: string): boolean {\n\treturn line.length === 0;\n}\n\nfunction markerLineEquals(line: string, marker: string): boolean {\n\tconst end = trimEndIndex(line);\n\treturn end === marker.length && line.startsWith(marker);\n}\n\nexport function splitHashlineLines(text: string): string[] {\n\tif (text.length === 0) return [\"\"];\n\tconst lines: string[] = [];\n\tlet start = 0;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tif (text.charCodeAt(index) !== CHAR_LINE_FEED) continue;\n\t\tlet end = index;\n\t\tif (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN) end--;\n\t\tlines.push(text.slice(start, end));\n\t\tstart = index + 1;\n\t}\n\tif (start < text.length) {\n\t\tlet end = text.length;\n\t\tif (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN) end--;\n\t\tlines.push(text.slice(start, end));\n\t}\n\treturn lines;\n}\n\nexport function cloneCursor(cursor: Cursor): Cursor {\n\tif (cursor.kind === \"before_anchor\") return { kind: \"before_anchor\", anchor: { ...cursor.anchor } };\n\tif (cursor.kind === \"after_anchor\") return { kind: \"after_anchor\", anchor: { ...cursor.anchor } };\n\treturn cursor;\n}\n\ninterface NumberScan {\n\tline: number;\n\tnextIndex: number;\n}\n\nfunction scanLineNumber(line: string, index: number, end: number): NumberScan | null {\n\tif (index >= end || !isNonZeroDigitCode(line.charCodeAt(index))) return null;\n\tlet lineNumber = 0;\n\tlet nextIndex = index;\n\twhile (nextIndex < end) {\n\t\tconst code = line.charCodeAt(nextIndex);\n\t\tif (!isDigitCode(code)) break;\n\t\tlineNumber = lineNumber * 10 + (code - CHAR_ZERO);\n\t\tnextIndex++;\n\t}\n\treturn { line: lineNumber, nextIndex };\n}\n\n/** Parse a bare line-number anchor. Throws on malformed input. */\nexport function parseLid(raw: string, lineNum: number): Anchor {\n\tconst end = trimEndIndex(raw);\n\tconst numberStart = skipWhitespace(raw, 0, end);\n\tconst number = scanLineNumber(raw, numberStart, end);\n\tif (number === null || skipWhitespace(raw, number.nextIndex, end) !== end) {\n\t\tthrow new Error(\n\t\t\t`line ${lineNum}: expected a line number such as ${describeAnchorExamples(\"119\")}; ` +\n\t\t\t\t`got ${JSON.stringify(raw)}. Use ${HL_FILE_PREFIX}PATH${HL_FILE_HASH_SEP}hash${HL_FILE_SUFFIX} from your latest read for file-version binding.`,\n\t\t);\n\t}\n\treturn { line: number.line };\n}\n\ninterface RangeScan {\n\trange: ParsedRange;\n\tnextIndex: number;\n}\n\nfunction scanRangeSeparator(line: string, index: number, end: number): number | null {\n\tlet cursor = index;\n\tlet consumedSeparator = false;\n\twhile (cursor < end) {\n\t\tconst code = line.charCodeAt(cursor);\n\t\tif (isWhitespaceCode(code)) {\n\t\t\tcursor++;\n\t\t\tconsumedSeparator = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === CHAR_HYPHEN || code === CHAR_ELLIPSIS) {\n\t\t\tcursor++;\n\t\t\tconsumedSeparator = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === CHAR_DOT && cursor + 1 < end && line.charCodeAt(cursor + 1) === CHAR_DOT) {\n\t\t\tcursor += 2;\n\t\t\tconsumedSeparator = true;\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\tif (!consumedSeparator) return null;\n\tif (cursor >= end || !isNonZeroDigitCode(line.charCodeAt(cursor))) return null;\n\treturn cursor;\n}\n\nfunction scanHeaderRange(line: string, index = 0, end = trimEndIndex(line), allowSingle = false): RangeScan | null {\n\tconst numberStart = skipWhitespace(line, index, end);\n\tconst start = scanLineNumber(line, numberStart, end);\n\tif (start === null) return null;\n\tconst afterFirst = scanRangeSeparator(line, start.nextIndex, end);\n\tif (afterFirst === null) {\n\t\tif (!allowSingle) return null;\n\t\treturn {\n\t\t\trange: { start: { line: start.line }, end: { line: start.line } },\n\t\t\tnextIndex: skipWhitespace(line, start.nextIndex, end),\n\t\t};\n\t}\n\tconst endNumber = scanLineNumber(line, afterFirst, end);\n\tif (endNumber === null) return null;\n\treturn {\n\t\trange: { start: { line: start.line }, end: { line: endNumber.line } },\n\t\tnextIndex: skipWhitespace(line, endNumber.nextIndex, end),\n\t};\n}\n\nexport type BlockTarget =\n\t| { kind: \"replace\"; range: ParsedRange }\n\t| { kind: \"block\"; anchor: Anchor }\n\t| { kind: \"delete\"; range: ParsedRange }\n\t| { kind: \"delete_block\"; anchor: Anchor }\n\t| { kind: \"insert_before\"; anchor: Anchor }\n\t| { kind: \"insert_after\"; anchor: Anchor }\n\t| { kind: \"insert_after_block\"; anchor: Anchor }\n\t| { kind: \"bof\" }\n\t| { kind: \"eof\" };\n\ninterface TargetScan {\n\ttarget: BlockTarget;\n\tnextIndex: number;\n}\n\nfunction scanKeyword(line: string, index: number, end: number, keyword: string): number | null {\n\tif (!line.startsWith(keyword, index)) return null;\n\tconst next = index + keyword.length;\n\tif (next < end) {\n\t\tconst code = line.charCodeAt(next);\n\t\tif (!isWhitespaceCode(code) && code !== CHAR_COLON) return null;\n\t}\n\treturn next;\n}\n\nfunction consumeOptionalColon(line: string, index: number, end: number): number {\n\tconst cursor = skipWhitespace(line, index, end);\n\treturn cursor < end && line.charCodeAt(cursor) === CHAR_COLON ? skipWhitespace(line, cursor + 1, end) : cursor;\n}\n\nfunction scanInsertTarget(line: string, index: number, end: number): TargetScan | null {\n\tconst cursor = skipWhitespace(line, index, end);\n\tconst beforeEnd = scanKeyword(line, cursor, end, HL_INSERT_BEFORE);\n\tif (beforeEnd !== null) {\n\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, beforeEnd, end), end);\n\t\tif (anchor === null) return null;\n\t\tconst nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);\n\t\treturn { target: { kind: \"insert_before\", anchor: { line: anchor.line } }, nextIndex };\n\t}\n\tconst afterEnd = scanKeyword(line, cursor, end, HL_INSERT_AFTER);\n\tif (afterEnd !== null) {\n\t\t// `insert after block N:` — resolve N to a tree-sitter block range at\n\t\t// apply time and insert after its last line. Try the `block` sub-keyword\n\t\t// before falling back to a literal `insert after N:` anchor.\n\t\tconst blockEnd = scanKeyword(line, skipWhitespace(line, afterEnd, end), end, HL_BLOCK_KEYWORD);\n\t\tif (blockEnd !== null) {\n\t\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);\n\t\t\tif (anchor === null) return null;\n\t\t\tconst nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);\n\t\t\treturn { target: { kind: \"insert_after_block\", anchor: { line: anchor.line } }, nextIndex };\n\t\t}\n\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, afterEnd, end), end);\n\t\tif (anchor === null) return null;\n\t\tconst nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);\n\t\treturn { target: { kind: \"insert_after\", anchor: { line: anchor.line } }, nextIndex };\n\t}\n\tconst headEnd = scanKeyword(line, cursor, end, HL_INSERT_HEAD);\n\tif (headEnd !== null) return { target: { kind: \"bof\" }, nextIndex: consumeOptionalColon(line, headEnd, end) };\n\tconst tailEnd = scanKeyword(line, cursor, end, HL_INSERT_TAIL);\n\tif (tailEnd !== null) return { target: { kind: \"eof\" }, nextIndex: consumeOptionalColon(line, tailEnd, end) };\n\treturn null;\n}\n\nfunction scanHunkAnchor(line: string, start: number, end: number): TargetScan | null {\n\tconst cursor = skipWhitespace(line, start, end);\n\tconst replaceEnd = scanKeyword(line, cursor, end, HL_REPLACE_KEYWORD);\n\tif (replaceEnd !== null) {\n\t\t// `replace block N:` — resolve N to a tree-sitter block range at apply\n\t\t// time. Try the `block` sub-keyword before falling back to a literal\n\t\t// `replace N..M:` range.\n\t\tconst blockEnd = scanKeyword(line, skipWhitespace(line, replaceEnd, end), end, HL_BLOCK_KEYWORD);\n\t\tif (blockEnd !== null) {\n\t\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);\n\t\t\tif (anchor === null) return null;\n\t\t\treturn {\n\t\t\t\ttarget: { kind: \"block\", anchor: { line: anchor.line } },\n\t\t\t\tnextIndex: consumeOptionalColon(line, anchor.nextIndex, end),\n\t\t\t};\n\t\t}\n\t\tconst range = scanHeaderRange(line, replaceEnd, end, true);\n\t\tif (range === null) return null;\n\t\treturn {\n\t\t\ttarget: { kind: \"replace\", range: range.range },\n\t\t\tnextIndex: consumeOptionalColon(line, range.nextIndex, end),\n\t\t};\n\t}\n\tconst deleteEnd = scanKeyword(line, cursor, end, HL_DELETE_KEYWORD);\n\tif (deleteEnd !== null) {\n\t\t// `delete block N` — resolve N to a tree-sitter block range at apply\n\t\t// time and delete its whole span. Like `delete N..M`, it takes no body\n\t\t// and no trailing colon.\n\t\tconst blockEnd = scanKeyword(line, skipWhitespace(line, deleteEnd, end), end, HL_BLOCK_KEYWORD);\n\t\tif (blockEnd !== null) {\n\t\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);\n\t\t\tif (anchor === null) return null;\n\t\t\tconst next = skipWhitespace(line, anchor.nextIndex, end);\n\t\t\tif (next < end && line.charCodeAt(next) === CHAR_COLON) return null;\n\t\t\treturn { target: { kind: \"delete_block\", anchor: { line: anchor.line } }, nextIndex: next };\n\t\t}\n\t\tconst range = scanHeaderRange(line, deleteEnd, end, true);\n\t\tif (range === null) return null;\n\t\tconst next = skipWhitespace(line, range.nextIndex, end);\n\t\tif (next < end && line.charCodeAt(next) === CHAR_COLON) return null;\n\t\treturn { target: { kind: \"delete\", range: range.range }, nextIndex: next };\n\t}\n\tconst insertEnd = scanKeyword(line, cursor, end, HL_INSERT_KEYWORD);\n\tif (insertEnd !== null) return scanInsertTarget(line, insertEnd, end);\n\treturn null;\n}\n\ninterface ParsedHunkHeader {\n\ttarget: BlockTarget;\n}\n\nfunction tryParseHunkHeader(line: string): ParsedHunkHeader | null {\n\tconst end = trimEndIndex(line);\n\tconst start = skipWhitespace(line, 0, end);\n\tif (start >= end) return null;\n\tconst scan = scanHunkAnchor(line, start, end);\n\tif (scan === null) return null;\n\tif (scan.nextIndex !== end) return null;\n\treturn { target: scan.target };\n}\n\nfunction tryParseHeader(line: string): { path: string; fileHash?: string } | null {\n\tif (!line.startsWith(HL_FILE_PREFIX)) return null;\n\tconst end = trimEndIndex(line);\n\tif (FILE_PREFIX_LENGTH + FILE_SUFFIX_LENGTH >= end) return null;\n\tif (!line.endsWith(HL_FILE_SUFFIX, end)) return null;\n\tconst bodyEnd = end - FILE_SUFFIX_LENGTH;\n\tif (FILE_PREFIX_LENGTH >= bodyEnd) return null;\n\n\t// The snapshot tag, when present, is the trailing `#XXXX` block inside the\n\t// bracketed header. We detect it from the suffix so the path may\n\t// legitimately contain whitespace (e.g. `OneDrive - Company/file.ts`).\n\tlet pathEnd = bodyEnd;\n\tlet fileHash: string | undefined;\n\tconst trailingHashStart = bodyEnd - HL_FILE_HASH_LENGTH - 1;\n\tif (trailingHashStart >= FILE_PREFIX_LENGTH && line.charCodeAt(trailingHashStart) === CHAR_HASH) {\n\t\tlet allHex = true;\n\t\tfor (let probe = trailingHashStart + 1; probe < bodyEnd; probe++) {\n\t\t\tif (!isHexDigitCode(line.charCodeAt(probe))) {\n\t\t\t\tallHex = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (allHex) {\n\t\t\tpathEnd = trailingHashStart;\n\t\t\tfileHash = line.slice(trailingHashStart + 1, bodyEnd).toUpperCase();\n\t\t}\n\t}\n\n\t// The hashline header grammar uses `#` as the path/tag separator and\n\t// does not allow `#` inside filenames. Anything `#` left in the path\n\t// body — short tags (`#1A2`), non-hex tags (`#1A2G`), over-long tags\n\t// (`#1A2B5`), stale-tag copy-paste (`#1A2B copied from read`), or\n\t// line-suffixed tags (`#1A2B:42`) — means the header is malformed.\n\t// Surface the focused diagnostic instead of silently mis-routing the\n\t// edit or reporting a missing tag downstream.\n\tfor (let i = FILE_PREFIX_LENGTH; i < pathEnd; i++) {\n\t\tif (line.charCodeAt(i) === CHAR_HASH) return null;\n\t}\n\n\tif (pathEnd === FILE_PREFIX_LENGTH) return null;\n\tconst path = line.slice(FILE_PREFIX_LENGTH, pathEnd);\n\treturn fileHash !== undefined ? { path, fileHash } : { path };\n}\n\ninterface TokenBase {\n\tlineNum: number;\n}\n\nexport type Token =\n\t| (TokenBase & { kind: \"blank\" })\n\t| (TokenBase & { kind: \"envelope-begin\" })\n\t| (TokenBase & { kind: \"envelope-end\" })\n\t| (TokenBase & { kind: \"abort\" })\n\t| (TokenBase & { kind: \"header\"; path: string; fileHash?: string })\n\t| (TokenBase & { kind: \"op-block\"; target: BlockTarget })\n\t| (TokenBase & { kind: \"payload-literal\"; text: string })\n\t| (TokenBase & { kind: \"raw\"; text: string });\n\nfunction classifyLine(line: string, lineNum: number): Token {\n\tif (isEmptyLine(line)) return { kind: \"blank\", lineNum };\n\tif (markerLineEquals(line, BEGIN_PATCH_MARKER)) return { kind: \"envelope-begin\", lineNum };\n\tif (markerLineEquals(line, END_PATCH_MARKER)) return { kind: \"envelope-end\", lineNum };\n\tif (markerLineEquals(line, ABORT_MARKER)) return { kind: \"abort\", lineNum };\n\tconst firstCode = line.charCodeAt(0);\n\tif (line.startsWith(HL_FILE_PREFIX)) {\n\t\tconst header = tryParseHeader(line);\n\t\tif (header !== null) {\n\t\t\treturn header.fileHash !== undefined\n\t\t\t\t? { kind: \"header\", lineNum, path: header.path, fileHash: header.fileHash }\n\t\t\t\t: { kind: \"header\", lineNum, path: header.path };\n\t\t}\n\t}\n\tconst lead = skipWhitespace(line, 0);\n\tconst isHunkLead =\n\t\tline.startsWith(HL_REPLACE_KEYWORD, lead) ||\n\t\tline.startsWith(HL_DELETE_KEYWORD, lead) ||\n\t\tline.startsWith(HL_INSERT_KEYWORD, lead);\n\tif (isHunkLead) {\n\t\tconst hunk = tryParseHunkHeader(line);\n\t\tif (hunk !== null) return { kind: \"op-block\", lineNum, target: hunk.target };\n\t}\n\tif (firstCode === CHAR_PAYLOAD_REPLACE) return { kind: \"payload-literal\", lineNum, text: line.slice(1) };\n\treturn { kind: \"raw\", lineNum, text: line };\n}\n\nexport class Tokenizer {\n\t#buffer = \"\";\n\t#nextLineNum = 1;\n\t#closed = false;\n\n\tfeed(chunk: string): Token[] {\n\t\tif (this.#closed) throw new Error(\"Tokenizer is closed; call reset() before reusing.\");\n\t\tif (chunk.length === 0) return [];\n\t\tthis.#buffer = this.#buffer ? this.#buffer + chunk : chunk;\n\t\treturn this.#drainCompleteLines();\n\t}\n\n\tend(): Token[] {\n\t\tif (this.#closed) return [];\n\t\tthis.#closed = true;\n\t\tconst buf = this.#buffer;\n\t\tthis.#buffer = \"\";\n\t\tif (buf.length === 0) return [];\n\t\tlet stop = buf.length;\n\t\tif (buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN) stop--;\n\t\treturn [classifyLine(buf.slice(0, stop), this.#nextLineNum++)];\n\t}\n\n\treset(): void {\n\t\tthis.#buffer = \"\";\n\t\tthis.#nextLineNum = 1;\n\t\tthis.#closed = false;\n\t}\n\n\ttokenizeAll(text: string): Token[] {\n\t\tthis.reset();\n\t\tconst first = this.feed(text);\n\t\tconst last = this.end();\n\t\treturn last.length === 0 ? first : first.concat(last);\n\t}\n\n\ttokenize(line: string, lineNum = 0): Token {\n\t\treturn classifyLine(line, lineNum);\n\t}\n\n\tisOp(line: string): boolean {\n\t\treturn tryParseHunkHeader(line) !== null;\n\t}\n\n\tisHeader(line: string): boolean {\n\t\treturn tryParseHeader(line) !== null;\n\t}\n\n\tisEnvelopeMarker(line: string): boolean {\n\t\treturn (\n\t\t\tmarkerLineEquals(line, BEGIN_PATCH_MARKER) ||\n\t\t\tmarkerLineEquals(line, END_PATCH_MARKER) ||\n\t\t\tmarkerLineEquals(line, ABORT_MARKER)\n\t\t);\n\t}\n\n\t#drainCompleteLines(): Token[] {\n\t\tconst tokens: Token[] = [];\n\t\tconst buf = this.#buffer;\n\t\tlet start = 0;\n\t\tfor (let index = 0; index < buf.length; index++) {\n\t\t\tif (buf.charCodeAt(index) !== CHAR_LINE_FEED) continue;\n\t\t\tlet stop = index;\n\t\t\tif (stop > start && buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN) stop--;\n\t\t\ttokens.push(classifyLine(buf.slice(start, stop), this.#nextLineNum++));\n\t\t\tstart = index + 1;\n\t\t}\n\t\tthis.#buffer = start < buf.length ? buf.slice(start) : \"\";\n\t\treturn tokens;\n\t}\n}\n\nexport type { ParsedRange } from \"./types.js\";\n"]}
@@ -0,0 +1,430 @@
1
+ // @generated vendored verbatim from oh-my-pi packages/hashline @ 15b5c1397fc -- DO NOT EDIT.
2
+ // Parity source for the Atomic hashline edit engine (issue #1483); adapted only for Atomic's Node runtime (relative imports, Bun->Node host calls, erasable constructor syntax).
3
+ /**
4
+ * Stateful, line-oriented classifier for hashline diff text.
5
+ *
6
+ * Format shape:
7
+ * ```
8
+ * [path/to/file.ts#1A2B]
9
+ * replace 5..7:
10
+ * +literal new line
11
+ * ```
12
+ */
13
+ import { describeAnchorExamples, HL_BLOCK_KEYWORD, HL_DELETE_KEYWORD, HL_FILE_HASH_LENGTH, HL_FILE_HASH_SEP, HL_FILE_PREFIX, HL_FILE_SUFFIX, HL_HEADER_COLON, HL_INSERT_AFTER, HL_INSERT_BEFORE, HL_INSERT_HEAD, HL_INSERT_KEYWORD, HL_INSERT_TAIL, HL_PAYLOAD_REPLACE, HL_REPLACE_KEYWORD, } from "./format.js";
14
+ import { ABORT_MARKER, BEGIN_PATCH_MARKER, END_PATCH_MARKER } from "./messages.js";
15
+ const CHAR_LINE_FEED = 10;
16
+ const CHAR_CARRIAGE_RETURN = 13;
17
+ const CHAR_ZERO = 48;
18
+ const CHAR_NINE = 57;
19
+ const CHAR_HASH = 35;
20
+ const CHAR_TAB = 9;
21
+ const CHAR_SPACE = 32;
22
+ const CHAR_DOT = 46;
23
+ const CHAR_HYPHEN = 45;
24
+ const CHAR_ELLIPSIS = 0x2026;
25
+ const CHAR_UPPER_A = 65;
26
+ const CHAR_UPPER_F = 70;
27
+ const CHAR_LOWER_A = 97;
28
+ const CHAR_LOWER_F = 102;
29
+ const CHAR_PAYLOAD_REPLACE = HL_PAYLOAD_REPLACE.charCodeAt(0);
30
+ const CHAR_COLON = HL_HEADER_COLON.charCodeAt(0);
31
+ const FILE_PREFIX_LENGTH = HL_FILE_PREFIX.length;
32
+ const FILE_SUFFIX_LENGTH = HL_FILE_SUFFIX.length;
33
+ function isDigitCode(code) {
34
+ return code >= CHAR_ZERO && code <= CHAR_NINE;
35
+ }
36
+ function isNonZeroDigitCode(code) {
37
+ return code > CHAR_ZERO && code <= CHAR_NINE;
38
+ }
39
+ function isHexDigitCode(code) {
40
+ return (isDigitCode(code) ||
41
+ (code >= CHAR_UPPER_A && code <= CHAR_UPPER_F) ||
42
+ (code >= CHAR_LOWER_A && code <= CHAR_LOWER_F));
43
+ }
44
+ function isWhitespaceCode(code) {
45
+ return code === CHAR_SPACE || (code >= CHAR_TAB && code <= CHAR_CARRIAGE_RETURN);
46
+ }
47
+ function skipWhitespace(line, index, end = line.length) {
48
+ while (index < end && isWhitespaceCode(line.charCodeAt(index)))
49
+ index++;
50
+ return index;
51
+ }
52
+ function trimEndIndex(line) {
53
+ let end = line.length;
54
+ while (end > 0 && isWhitespaceCode(line.charCodeAt(end - 1)))
55
+ end--;
56
+ return end;
57
+ }
58
+ function isEmptyLine(line) {
59
+ return line.length === 0;
60
+ }
61
+ function markerLineEquals(line, marker) {
62
+ const end = trimEndIndex(line);
63
+ return end === marker.length && line.startsWith(marker);
64
+ }
65
+ export function splitHashlineLines(text) {
66
+ if (text.length === 0)
67
+ return [""];
68
+ const lines = [];
69
+ let start = 0;
70
+ for (let index = 0; index < text.length; index++) {
71
+ if (text.charCodeAt(index) !== CHAR_LINE_FEED)
72
+ continue;
73
+ let end = index;
74
+ if (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN)
75
+ end--;
76
+ lines.push(text.slice(start, end));
77
+ start = index + 1;
78
+ }
79
+ if (start < text.length) {
80
+ let end = text.length;
81
+ if (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN)
82
+ end--;
83
+ lines.push(text.slice(start, end));
84
+ }
85
+ return lines;
86
+ }
87
+ export function cloneCursor(cursor) {
88
+ if (cursor.kind === "before_anchor")
89
+ return { kind: "before_anchor", anchor: { ...cursor.anchor } };
90
+ if (cursor.kind === "after_anchor")
91
+ return { kind: "after_anchor", anchor: { ...cursor.anchor } };
92
+ return cursor;
93
+ }
94
+ function scanLineNumber(line, index, end) {
95
+ if (index >= end || !isNonZeroDigitCode(line.charCodeAt(index)))
96
+ return null;
97
+ let lineNumber = 0;
98
+ let nextIndex = index;
99
+ while (nextIndex < end) {
100
+ const code = line.charCodeAt(nextIndex);
101
+ if (!isDigitCode(code))
102
+ break;
103
+ lineNumber = lineNumber * 10 + (code - CHAR_ZERO);
104
+ nextIndex++;
105
+ }
106
+ return { line: lineNumber, nextIndex };
107
+ }
108
+ /** Parse a bare line-number anchor. Throws on malformed input. */
109
+ export function parseLid(raw, lineNum) {
110
+ const end = trimEndIndex(raw);
111
+ const numberStart = skipWhitespace(raw, 0, end);
112
+ const number = scanLineNumber(raw, numberStart, end);
113
+ if (number === null || skipWhitespace(raw, number.nextIndex, end) !== end) {
114
+ throw new Error(`line ${lineNum}: expected a line number such as ${describeAnchorExamples("119")}; ` +
115
+ `got ${JSON.stringify(raw)}. Use ${HL_FILE_PREFIX}PATH${HL_FILE_HASH_SEP}hash${HL_FILE_SUFFIX} from your latest read for file-version binding.`);
116
+ }
117
+ return { line: number.line };
118
+ }
119
+ function scanRangeSeparator(line, index, end) {
120
+ let cursor = index;
121
+ let consumedSeparator = false;
122
+ while (cursor < end) {
123
+ const code = line.charCodeAt(cursor);
124
+ if (isWhitespaceCode(code)) {
125
+ cursor++;
126
+ consumedSeparator = true;
127
+ continue;
128
+ }
129
+ if (code === CHAR_HYPHEN || code === CHAR_ELLIPSIS) {
130
+ cursor++;
131
+ consumedSeparator = true;
132
+ continue;
133
+ }
134
+ if (code === CHAR_DOT && cursor + 1 < end && line.charCodeAt(cursor + 1) === CHAR_DOT) {
135
+ cursor += 2;
136
+ consumedSeparator = true;
137
+ continue;
138
+ }
139
+ break;
140
+ }
141
+ if (!consumedSeparator)
142
+ return null;
143
+ if (cursor >= end || !isNonZeroDigitCode(line.charCodeAt(cursor)))
144
+ return null;
145
+ return cursor;
146
+ }
147
+ function scanHeaderRange(line, index = 0, end = trimEndIndex(line), allowSingle = false) {
148
+ const numberStart = skipWhitespace(line, index, end);
149
+ const start = scanLineNumber(line, numberStart, end);
150
+ if (start === null)
151
+ return null;
152
+ const afterFirst = scanRangeSeparator(line, start.nextIndex, end);
153
+ if (afterFirst === null) {
154
+ if (!allowSingle)
155
+ return null;
156
+ return {
157
+ range: { start: { line: start.line }, end: { line: start.line } },
158
+ nextIndex: skipWhitespace(line, start.nextIndex, end),
159
+ };
160
+ }
161
+ const endNumber = scanLineNumber(line, afterFirst, end);
162
+ if (endNumber === null)
163
+ return null;
164
+ return {
165
+ range: { start: { line: start.line }, end: { line: endNumber.line } },
166
+ nextIndex: skipWhitespace(line, endNumber.nextIndex, end),
167
+ };
168
+ }
169
+ function scanKeyword(line, index, end, keyword) {
170
+ if (!line.startsWith(keyword, index))
171
+ return null;
172
+ const next = index + keyword.length;
173
+ if (next < end) {
174
+ const code = line.charCodeAt(next);
175
+ if (!isWhitespaceCode(code) && code !== CHAR_COLON)
176
+ return null;
177
+ }
178
+ return next;
179
+ }
180
+ function consumeOptionalColon(line, index, end) {
181
+ const cursor = skipWhitespace(line, index, end);
182
+ return cursor < end && line.charCodeAt(cursor) === CHAR_COLON ? skipWhitespace(line, cursor + 1, end) : cursor;
183
+ }
184
+ function scanInsertTarget(line, index, end) {
185
+ const cursor = skipWhitespace(line, index, end);
186
+ const beforeEnd = scanKeyword(line, cursor, end, HL_INSERT_BEFORE);
187
+ if (beforeEnd !== null) {
188
+ const anchor = scanLineNumber(line, skipWhitespace(line, beforeEnd, end), end);
189
+ if (anchor === null)
190
+ return null;
191
+ const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);
192
+ return { target: { kind: "insert_before", anchor: { line: anchor.line } }, nextIndex };
193
+ }
194
+ const afterEnd = scanKeyword(line, cursor, end, HL_INSERT_AFTER);
195
+ if (afterEnd !== null) {
196
+ // `insert after block N:` — resolve N to a tree-sitter block range at
197
+ // apply time and insert after its last line. Try the `block` sub-keyword
198
+ // before falling back to a literal `insert after N:` anchor.
199
+ const blockEnd = scanKeyword(line, skipWhitespace(line, afterEnd, end), end, HL_BLOCK_KEYWORD);
200
+ if (blockEnd !== null) {
201
+ const anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);
202
+ if (anchor === null)
203
+ return null;
204
+ const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);
205
+ return { target: { kind: "insert_after_block", anchor: { line: anchor.line } }, nextIndex };
206
+ }
207
+ const anchor = scanLineNumber(line, skipWhitespace(line, afterEnd, end), end);
208
+ if (anchor === null)
209
+ return null;
210
+ const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);
211
+ return { target: { kind: "insert_after", anchor: { line: anchor.line } }, nextIndex };
212
+ }
213
+ const headEnd = scanKeyword(line, cursor, end, HL_INSERT_HEAD);
214
+ if (headEnd !== null)
215
+ return { target: { kind: "bof" }, nextIndex: consumeOptionalColon(line, headEnd, end) };
216
+ const tailEnd = scanKeyword(line, cursor, end, HL_INSERT_TAIL);
217
+ if (tailEnd !== null)
218
+ return { target: { kind: "eof" }, nextIndex: consumeOptionalColon(line, tailEnd, end) };
219
+ return null;
220
+ }
221
+ function scanHunkAnchor(line, start, end) {
222
+ const cursor = skipWhitespace(line, start, end);
223
+ const replaceEnd = scanKeyword(line, cursor, end, HL_REPLACE_KEYWORD);
224
+ if (replaceEnd !== null) {
225
+ // `replace block N:` — resolve N to a tree-sitter block range at apply
226
+ // time. Try the `block` sub-keyword before falling back to a literal
227
+ // `replace N..M:` range.
228
+ const blockEnd = scanKeyword(line, skipWhitespace(line, replaceEnd, end), end, HL_BLOCK_KEYWORD);
229
+ if (blockEnd !== null) {
230
+ const anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);
231
+ if (anchor === null)
232
+ return null;
233
+ return {
234
+ target: { kind: "block", anchor: { line: anchor.line } },
235
+ nextIndex: consumeOptionalColon(line, anchor.nextIndex, end),
236
+ };
237
+ }
238
+ const range = scanHeaderRange(line, replaceEnd, end, true);
239
+ if (range === null)
240
+ return null;
241
+ return {
242
+ target: { kind: "replace", range: range.range },
243
+ nextIndex: consumeOptionalColon(line, range.nextIndex, end),
244
+ };
245
+ }
246
+ const deleteEnd = scanKeyword(line, cursor, end, HL_DELETE_KEYWORD);
247
+ if (deleteEnd !== null) {
248
+ // `delete block N` — resolve N to a tree-sitter block range at apply
249
+ // time and delete its whole span. Like `delete N..M`, it takes no body
250
+ // and no trailing colon.
251
+ const blockEnd = scanKeyword(line, skipWhitespace(line, deleteEnd, end), end, HL_BLOCK_KEYWORD);
252
+ if (blockEnd !== null) {
253
+ const anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);
254
+ if (anchor === null)
255
+ return null;
256
+ const next = skipWhitespace(line, anchor.nextIndex, end);
257
+ if (next < end && line.charCodeAt(next) === CHAR_COLON)
258
+ return null;
259
+ return { target: { kind: "delete_block", anchor: { line: anchor.line } }, nextIndex: next };
260
+ }
261
+ const range = scanHeaderRange(line, deleteEnd, end, true);
262
+ if (range === null)
263
+ return null;
264
+ const next = skipWhitespace(line, range.nextIndex, end);
265
+ if (next < end && line.charCodeAt(next) === CHAR_COLON)
266
+ return null;
267
+ return { target: { kind: "delete", range: range.range }, nextIndex: next };
268
+ }
269
+ const insertEnd = scanKeyword(line, cursor, end, HL_INSERT_KEYWORD);
270
+ if (insertEnd !== null)
271
+ return scanInsertTarget(line, insertEnd, end);
272
+ return null;
273
+ }
274
+ function tryParseHunkHeader(line) {
275
+ const end = trimEndIndex(line);
276
+ const start = skipWhitespace(line, 0, end);
277
+ if (start >= end)
278
+ return null;
279
+ const scan = scanHunkAnchor(line, start, end);
280
+ if (scan === null)
281
+ return null;
282
+ if (scan.nextIndex !== end)
283
+ return null;
284
+ return { target: scan.target };
285
+ }
286
+ function tryParseHeader(line) {
287
+ if (!line.startsWith(HL_FILE_PREFIX))
288
+ return null;
289
+ const end = trimEndIndex(line);
290
+ if (FILE_PREFIX_LENGTH + FILE_SUFFIX_LENGTH >= end)
291
+ return null;
292
+ if (!line.endsWith(HL_FILE_SUFFIX, end))
293
+ return null;
294
+ const bodyEnd = end - FILE_SUFFIX_LENGTH;
295
+ if (FILE_PREFIX_LENGTH >= bodyEnd)
296
+ return null;
297
+ // The snapshot tag, when present, is the trailing `#XXXX` block inside the
298
+ // bracketed header. We detect it from the suffix so the path may
299
+ // legitimately contain whitespace (e.g. `OneDrive - Company/file.ts`).
300
+ let pathEnd = bodyEnd;
301
+ let fileHash;
302
+ const trailingHashStart = bodyEnd - HL_FILE_HASH_LENGTH - 1;
303
+ if (trailingHashStart >= FILE_PREFIX_LENGTH && line.charCodeAt(trailingHashStart) === CHAR_HASH) {
304
+ let allHex = true;
305
+ for (let probe = trailingHashStart + 1; probe < bodyEnd; probe++) {
306
+ if (!isHexDigitCode(line.charCodeAt(probe))) {
307
+ allHex = false;
308
+ break;
309
+ }
310
+ }
311
+ if (allHex) {
312
+ pathEnd = trailingHashStart;
313
+ fileHash = line.slice(trailingHashStart + 1, bodyEnd).toUpperCase();
314
+ }
315
+ }
316
+ // The hashline header grammar uses `#` as the path/tag separator and
317
+ // does not allow `#` inside filenames. Anything `#` left in the path
318
+ // body — short tags (`#1A2`), non-hex tags (`#1A2G`), over-long tags
319
+ // (`#1A2B5`), stale-tag copy-paste (`#1A2B copied from read`), or
320
+ // line-suffixed tags (`#1A2B:42`) — means the header is malformed.
321
+ // Surface the focused diagnostic instead of silently mis-routing the
322
+ // edit or reporting a missing tag downstream.
323
+ for (let i = FILE_PREFIX_LENGTH; i < pathEnd; i++) {
324
+ if (line.charCodeAt(i) === CHAR_HASH)
325
+ return null;
326
+ }
327
+ if (pathEnd === FILE_PREFIX_LENGTH)
328
+ return null;
329
+ const path = line.slice(FILE_PREFIX_LENGTH, pathEnd);
330
+ return fileHash !== undefined ? { path, fileHash } : { path };
331
+ }
332
+ function classifyLine(line, lineNum) {
333
+ if (isEmptyLine(line))
334
+ return { kind: "blank", lineNum };
335
+ if (markerLineEquals(line, BEGIN_PATCH_MARKER))
336
+ return { kind: "envelope-begin", lineNum };
337
+ if (markerLineEquals(line, END_PATCH_MARKER))
338
+ return { kind: "envelope-end", lineNum };
339
+ if (markerLineEquals(line, ABORT_MARKER))
340
+ return { kind: "abort", lineNum };
341
+ const firstCode = line.charCodeAt(0);
342
+ if (line.startsWith(HL_FILE_PREFIX)) {
343
+ const header = tryParseHeader(line);
344
+ if (header !== null) {
345
+ return header.fileHash !== undefined
346
+ ? { kind: "header", lineNum, path: header.path, fileHash: header.fileHash }
347
+ : { kind: "header", lineNum, path: header.path };
348
+ }
349
+ }
350
+ const lead = skipWhitespace(line, 0);
351
+ const isHunkLead = line.startsWith(HL_REPLACE_KEYWORD, lead) ||
352
+ line.startsWith(HL_DELETE_KEYWORD, lead) ||
353
+ line.startsWith(HL_INSERT_KEYWORD, lead);
354
+ if (isHunkLead) {
355
+ const hunk = tryParseHunkHeader(line);
356
+ if (hunk !== null)
357
+ return { kind: "op-block", lineNum, target: hunk.target };
358
+ }
359
+ if (firstCode === CHAR_PAYLOAD_REPLACE)
360
+ return { kind: "payload-literal", lineNum, text: line.slice(1) };
361
+ return { kind: "raw", lineNum, text: line };
362
+ }
363
+ export class Tokenizer {
364
+ #buffer = "";
365
+ #nextLineNum = 1;
366
+ #closed = false;
367
+ feed(chunk) {
368
+ if (this.#closed)
369
+ throw new Error("Tokenizer is closed; call reset() before reusing.");
370
+ if (chunk.length === 0)
371
+ return [];
372
+ this.#buffer = this.#buffer ? this.#buffer + chunk : chunk;
373
+ return this.#drainCompleteLines();
374
+ }
375
+ end() {
376
+ if (this.#closed)
377
+ return [];
378
+ this.#closed = true;
379
+ const buf = this.#buffer;
380
+ this.#buffer = "";
381
+ if (buf.length === 0)
382
+ return [];
383
+ let stop = buf.length;
384
+ if (buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN)
385
+ stop--;
386
+ return [classifyLine(buf.slice(0, stop), this.#nextLineNum++)];
387
+ }
388
+ reset() {
389
+ this.#buffer = "";
390
+ this.#nextLineNum = 1;
391
+ this.#closed = false;
392
+ }
393
+ tokenizeAll(text) {
394
+ this.reset();
395
+ const first = this.feed(text);
396
+ const last = this.end();
397
+ return last.length === 0 ? first : first.concat(last);
398
+ }
399
+ tokenize(line, lineNum = 0) {
400
+ return classifyLine(line, lineNum);
401
+ }
402
+ isOp(line) {
403
+ return tryParseHunkHeader(line) !== null;
404
+ }
405
+ isHeader(line) {
406
+ return tryParseHeader(line) !== null;
407
+ }
408
+ isEnvelopeMarker(line) {
409
+ return (markerLineEquals(line, BEGIN_PATCH_MARKER) ||
410
+ markerLineEquals(line, END_PATCH_MARKER) ||
411
+ markerLineEquals(line, ABORT_MARKER));
412
+ }
413
+ #drainCompleteLines() {
414
+ const tokens = [];
415
+ const buf = this.#buffer;
416
+ let start = 0;
417
+ for (let index = 0; index < buf.length; index++) {
418
+ if (buf.charCodeAt(index) !== CHAR_LINE_FEED)
419
+ continue;
420
+ let stop = index;
421
+ if (stop > start && buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN)
422
+ stop--;
423
+ tokens.push(classifyLine(buf.slice(start, stop), this.#nextLineNum++));
424
+ start = index + 1;
425
+ }
426
+ this.#buffer = start < buf.length ? buf.slice(start) : "";
427
+ return tokens;
428
+ }
429
+ }
430
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../../src/core/tools/hashline-engine/tokenizer.ts"],"names":[],"mappings":"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","sourcesContent":["// @generated vendored verbatim from oh-my-pi packages/hashline @ 15b5c1397fc -- DO NOT EDIT.\n// Parity source for the Atomic hashline edit engine (issue #1483); adapted only for Atomic's Node runtime (relative imports, Bun->Node host calls, erasable constructor syntax).\n/**\n * Stateful, line-oriented classifier for hashline diff text.\n *\n * Format shape:\n * ```\n * [path/to/file.ts#1A2B]\n * replace 5..7:\n * +literal new line\n * ```\n */\nimport {\n\tdescribeAnchorExamples,\n\tHL_BLOCK_KEYWORD,\n\tHL_DELETE_KEYWORD,\n\tHL_FILE_HASH_LENGTH,\n\tHL_FILE_HASH_SEP,\n\tHL_FILE_PREFIX,\n\tHL_FILE_SUFFIX,\n\tHL_HEADER_COLON,\n\tHL_INSERT_AFTER,\n\tHL_INSERT_BEFORE,\n\tHL_INSERT_HEAD,\n\tHL_INSERT_KEYWORD,\n\tHL_INSERT_TAIL,\n\tHL_PAYLOAD_REPLACE,\n\tHL_REPLACE_KEYWORD,\n} from \"./format.js\";\nimport { ABORT_MARKER, BEGIN_PATCH_MARKER, END_PATCH_MARKER } from \"./messages.js\";\nimport type { Anchor, Cursor, ParsedRange } from \"./types.js\";\n\nconst CHAR_LINE_FEED = 10;\nconst CHAR_CARRIAGE_RETURN = 13;\nconst CHAR_ZERO = 48;\nconst CHAR_NINE = 57;\nconst CHAR_HASH = 35;\nconst CHAR_TAB = 9;\nconst CHAR_SPACE = 32;\nconst CHAR_DOT = 46;\nconst CHAR_HYPHEN = 45;\nconst CHAR_ELLIPSIS = 0x2026;\n\nconst CHAR_UPPER_A = 65;\nconst CHAR_UPPER_F = 70;\nconst CHAR_LOWER_A = 97;\nconst CHAR_LOWER_F = 102;\nconst CHAR_PAYLOAD_REPLACE = HL_PAYLOAD_REPLACE.charCodeAt(0);\nconst CHAR_COLON = HL_HEADER_COLON.charCodeAt(0);\nconst FILE_PREFIX_LENGTH = HL_FILE_PREFIX.length;\nconst FILE_SUFFIX_LENGTH = HL_FILE_SUFFIX.length;\n\nfunction isDigitCode(code: number): boolean {\n\treturn code >= CHAR_ZERO && code <= CHAR_NINE;\n}\n\nfunction isNonZeroDigitCode(code: number): boolean {\n\treturn code > CHAR_ZERO && code <= CHAR_NINE;\n}\n\nfunction isHexDigitCode(code: number): boolean {\n\treturn (\n\t\tisDigitCode(code) ||\n\t\t(code >= CHAR_UPPER_A && code <= CHAR_UPPER_F) ||\n\t\t(code >= CHAR_LOWER_A && code <= CHAR_LOWER_F)\n\t);\n}\n\nfunction isWhitespaceCode(code: number): boolean {\n\treturn code === CHAR_SPACE || (code >= CHAR_TAB && code <= CHAR_CARRIAGE_RETURN);\n}\n\nfunction skipWhitespace(line: string, index: number, end = line.length): number {\n\twhile (index < end && isWhitespaceCode(line.charCodeAt(index))) index++;\n\treturn index;\n}\n\nfunction trimEndIndex(line: string): number {\n\tlet end = line.length;\n\twhile (end > 0 && isWhitespaceCode(line.charCodeAt(end - 1))) end--;\n\treturn end;\n}\n\nfunction isEmptyLine(line: string): boolean {\n\treturn line.length === 0;\n}\n\nfunction markerLineEquals(line: string, marker: string): boolean {\n\tconst end = trimEndIndex(line);\n\treturn end === marker.length && line.startsWith(marker);\n}\n\nexport function splitHashlineLines(text: string): string[] {\n\tif (text.length === 0) return [\"\"];\n\tconst lines: string[] = [];\n\tlet start = 0;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tif (text.charCodeAt(index) !== CHAR_LINE_FEED) continue;\n\t\tlet end = index;\n\t\tif (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN) end--;\n\t\tlines.push(text.slice(start, end));\n\t\tstart = index + 1;\n\t}\n\tif (start < text.length) {\n\t\tlet end = text.length;\n\t\tif (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN) end--;\n\t\tlines.push(text.slice(start, end));\n\t}\n\treturn lines;\n}\n\nexport function cloneCursor(cursor: Cursor): Cursor {\n\tif (cursor.kind === \"before_anchor\") return { kind: \"before_anchor\", anchor: { ...cursor.anchor } };\n\tif (cursor.kind === \"after_anchor\") return { kind: \"after_anchor\", anchor: { ...cursor.anchor } };\n\treturn cursor;\n}\n\ninterface NumberScan {\n\tline: number;\n\tnextIndex: number;\n}\n\nfunction scanLineNumber(line: string, index: number, end: number): NumberScan | null {\n\tif (index >= end || !isNonZeroDigitCode(line.charCodeAt(index))) return null;\n\tlet lineNumber = 0;\n\tlet nextIndex = index;\n\twhile (nextIndex < end) {\n\t\tconst code = line.charCodeAt(nextIndex);\n\t\tif (!isDigitCode(code)) break;\n\t\tlineNumber = lineNumber * 10 + (code - CHAR_ZERO);\n\t\tnextIndex++;\n\t}\n\treturn { line: lineNumber, nextIndex };\n}\n\n/** Parse a bare line-number anchor. Throws on malformed input. */\nexport function parseLid(raw: string, lineNum: number): Anchor {\n\tconst end = trimEndIndex(raw);\n\tconst numberStart = skipWhitespace(raw, 0, end);\n\tconst number = scanLineNumber(raw, numberStart, end);\n\tif (number === null || skipWhitespace(raw, number.nextIndex, end) !== end) {\n\t\tthrow new Error(\n\t\t\t`line ${lineNum}: expected a line number such as ${describeAnchorExamples(\"119\")}; ` +\n\t\t\t\t`got ${JSON.stringify(raw)}. Use ${HL_FILE_PREFIX}PATH${HL_FILE_HASH_SEP}hash${HL_FILE_SUFFIX} from your latest read for file-version binding.`,\n\t\t);\n\t}\n\treturn { line: number.line };\n}\n\ninterface RangeScan {\n\trange: ParsedRange;\n\tnextIndex: number;\n}\n\nfunction scanRangeSeparator(line: string, index: number, end: number): number | null {\n\tlet cursor = index;\n\tlet consumedSeparator = false;\n\twhile (cursor < end) {\n\t\tconst code = line.charCodeAt(cursor);\n\t\tif (isWhitespaceCode(code)) {\n\t\t\tcursor++;\n\t\t\tconsumedSeparator = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === CHAR_HYPHEN || code === CHAR_ELLIPSIS) {\n\t\t\tcursor++;\n\t\t\tconsumedSeparator = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === CHAR_DOT && cursor + 1 < end && line.charCodeAt(cursor + 1) === CHAR_DOT) {\n\t\t\tcursor += 2;\n\t\t\tconsumedSeparator = true;\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\tif (!consumedSeparator) return null;\n\tif (cursor >= end || !isNonZeroDigitCode(line.charCodeAt(cursor))) return null;\n\treturn cursor;\n}\n\nfunction scanHeaderRange(line: string, index = 0, end = trimEndIndex(line), allowSingle = false): RangeScan | null {\n\tconst numberStart = skipWhitespace(line, index, end);\n\tconst start = scanLineNumber(line, numberStart, end);\n\tif (start === null) return null;\n\tconst afterFirst = scanRangeSeparator(line, start.nextIndex, end);\n\tif (afterFirst === null) {\n\t\tif (!allowSingle) return null;\n\t\treturn {\n\t\t\trange: { start: { line: start.line }, end: { line: start.line } },\n\t\t\tnextIndex: skipWhitespace(line, start.nextIndex, end),\n\t\t};\n\t}\n\tconst endNumber = scanLineNumber(line, afterFirst, end);\n\tif (endNumber === null) return null;\n\treturn {\n\t\trange: { start: { line: start.line }, end: { line: endNumber.line } },\n\t\tnextIndex: skipWhitespace(line, endNumber.nextIndex, end),\n\t};\n}\n\nexport type BlockTarget =\n\t| { kind: \"replace\"; range: ParsedRange }\n\t| { kind: \"block\"; anchor: Anchor }\n\t| { kind: \"delete\"; range: ParsedRange }\n\t| { kind: \"delete_block\"; anchor: Anchor }\n\t| { kind: \"insert_before\"; anchor: Anchor }\n\t| { kind: \"insert_after\"; anchor: Anchor }\n\t| { kind: \"insert_after_block\"; anchor: Anchor }\n\t| { kind: \"bof\" }\n\t| { kind: \"eof\" };\n\ninterface TargetScan {\n\ttarget: BlockTarget;\n\tnextIndex: number;\n}\n\nfunction scanKeyword(line: string, index: number, end: number, keyword: string): number | null {\n\tif (!line.startsWith(keyword, index)) return null;\n\tconst next = index + keyword.length;\n\tif (next < end) {\n\t\tconst code = line.charCodeAt(next);\n\t\tif (!isWhitespaceCode(code) && code !== CHAR_COLON) return null;\n\t}\n\treturn next;\n}\n\nfunction consumeOptionalColon(line: string, index: number, end: number): number {\n\tconst cursor = skipWhitespace(line, index, end);\n\treturn cursor < end && line.charCodeAt(cursor) === CHAR_COLON ? skipWhitespace(line, cursor + 1, end) : cursor;\n}\n\nfunction scanInsertTarget(line: string, index: number, end: number): TargetScan | null {\n\tconst cursor = skipWhitespace(line, index, end);\n\tconst beforeEnd = scanKeyword(line, cursor, end, HL_INSERT_BEFORE);\n\tif (beforeEnd !== null) {\n\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, beforeEnd, end), end);\n\t\tif (anchor === null) return null;\n\t\tconst nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);\n\t\treturn { target: { kind: \"insert_before\", anchor: { line: anchor.line } }, nextIndex };\n\t}\n\tconst afterEnd = scanKeyword(line, cursor, end, HL_INSERT_AFTER);\n\tif (afterEnd !== null) {\n\t\t// `insert after block N:` — resolve N to a tree-sitter block range at\n\t\t// apply time and insert after its last line. Try the `block` sub-keyword\n\t\t// before falling back to a literal `insert after N:` anchor.\n\t\tconst blockEnd = scanKeyword(line, skipWhitespace(line, afterEnd, end), end, HL_BLOCK_KEYWORD);\n\t\tif (blockEnd !== null) {\n\t\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);\n\t\t\tif (anchor === null) return null;\n\t\t\tconst nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);\n\t\t\treturn { target: { kind: \"insert_after_block\", anchor: { line: anchor.line } }, nextIndex };\n\t\t}\n\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, afterEnd, end), end);\n\t\tif (anchor === null) return null;\n\t\tconst nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);\n\t\treturn { target: { kind: \"insert_after\", anchor: { line: anchor.line } }, nextIndex };\n\t}\n\tconst headEnd = scanKeyword(line, cursor, end, HL_INSERT_HEAD);\n\tif (headEnd !== null) return { target: { kind: \"bof\" }, nextIndex: consumeOptionalColon(line, headEnd, end) };\n\tconst tailEnd = scanKeyword(line, cursor, end, HL_INSERT_TAIL);\n\tif (tailEnd !== null) return { target: { kind: \"eof\" }, nextIndex: consumeOptionalColon(line, tailEnd, end) };\n\treturn null;\n}\n\nfunction scanHunkAnchor(line: string, start: number, end: number): TargetScan | null {\n\tconst cursor = skipWhitespace(line, start, end);\n\tconst replaceEnd = scanKeyword(line, cursor, end, HL_REPLACE_KEYWORD);\n\tif (replaceEnd !== null) {\n\t\t// `replace block N:` — resolve N to a tree-sitter block range at apply\n\t\t// time. Try the `block` sub-keyword before falling back to a literal\n\t\t// `replace N..M:` range.\n\t\tconst blockEnd = scanKeyword(line, skipWhitespace(line, replaceEnd, end), end, HL_BLOCK_KEYWORD);\n\t\tif (blockEnd !== null) {\n\t\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);\n\t\t\tif (anchor === null) return null;\n\t\t\treturn {\n\t\t\t\ttarget: { kind: \"block\", anchor: { line: anchor.line } },\n\t\t\t\tnextIndex: consumeOptionalColon(line, anchor.nextIndex, end),\n\t\t\t};\n\t\t}\n\t\tconst range = scanHeaderRange(line, replaceEnd, end, true);\n\t\tif (range === null) return null;\n\t\treturn {\n\t\t\ttarget: { kind: \"replace\", range: range.range },\n\t\t\tnextIndex: consumeOptionalColon(line, range.nextIndex, end),\n\t\t};\n\t}\n\tconst deleteEnd = scanKeyword(line, cursor, end, HL_DELETE_KEYWORD);\n\tif (deleteEnd !== null) {\n\t\t// `delete block N` — resolve N to a tree-sitter block range at apply\n\t\t// time and delete its whole span. Like `delete N..M`, it takes no body\n\t\t// and no trailing colon.\n\t\tconst blockEnd = scanKeyword(line, skipWhitespace(line, deleteEnd, end), end, HL_BLOCK_KEYWORD);\n\t\tif (blockEnd !== null) {\n\t\t\tconst anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);\n\t\t\tif (anchor === null) return null;\n\t\t\tconst next = skipWhitespace(line, anchor.nextIndex, end);\n\t\t\tif (next < end && line.charCodeAt(next) === CHAR_COLON) return null;\n\t\t\treturn { target: { kind: \"delete_block\", anchor: { line: anchor.line } }, nextIndex: next };\n\t\t}\n\t\tconst range = scanHeaderRange(line, deleteEnd, end, true);\n\t\tif (range === null) return null;\n\t\tconst next = skipWhitespace(line, range.nextIndex, end);\n\t\tif (next < end && line.charCodeAt(next) === CHAR_COLON) return null;\n\t\treturn { target: { kind: \"delete\", range: range.range }, nextIndex: next };\n\t}\n\tconst insertEnd = scanKeyword(line, cursor, end, HL_INSERT_KEYWORD);\n\tif (insertEnd !== null) return scanInsertTarget(line, insertEnd, end);\n\treturn null;\n}\n\ninterface ParsedHunkHeader {\n\ttarget: BlockTarget;\n}\n\nfunction tryParseHunkHeader(line: string): ParsedHunkHeader | null {\n\tconst end = trimEndIndex(line);\n\tconst start = skipWhitespace(line, 0, end);\n\tif (start >= end) return null;\n\tconst scan = scanHunkAnchor(line, start, end);\n\tif (scan === null) return null;\n\tif (scan.nextIndex !== end) return null;\n\treturn { target: scan.target };\n}\n\nfunction tryParseHeader(line: string): { path: string; fileHash?: string } | null {\n\tif (!line.startsWith(HL_FILE_PREFIX)) return null;\n\tconst end = trimEndIndex(line);\n\tif (FILE_PREFIX_LENGTH + FILE_SUFFIX_LENGTH >= end) return null;\n\tif (!line.endsWith(HL_FILE_SUFFIX, end)) return null;\n\tconst bodyEnd = end - FILE_SUFFIX_LENGTH;\n\tif (FILE_PREFIX_LENGTH >= bodyEnd) return null;\n\n\t// The snapshot tag, when present, is the trailing `#XXXX` block inside the\n\t// bracketed header. We detect it from the suffix so the path may\n\t// legitimately contain whitespace (e.g. `OneDrive - Company/file.ts`).\n\tlet pathEnd = bodyEnd;\n\tlet fileHash: string | undefined;\n\tconst trailingHashStart = bodyEnd - HL_FILE_HASH_LENGTH - 1;\n\tif (trailingHashStart >= FILE_PREFIX_LENGTH && line.charCodeAt(trailingHashStart) === CHAR_HASH) {\n\t\tlet allHex = true;\n\t\tfor (let probe = trailingHashStart + 1; probe < bodyEnd; probe++) {\n\t\t\tif (!isHexDigitCode(line.charCodeAt(probe))) {\n\t\t\t\tallHex = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (allHex) {\n\t\t\tpathEnd = trailingHashStart;\n\t\t\tfileHash = line.slice(trailingHashStart + 1, bodyEnd).toUpperCase();\n\t\t}\n\t}\n\n\t// The hashline header grammar uses `#` as the path/tag separator and\n\t// does not allow `#` inside filenames. Anything `#` left in the path\n\t// body — short tags (`#1A2`), non-hex tags (`#1A2G`), over-long tags\n\t// (`#1A2B5`), stale-tag copy-paste (`#1A2B copied from read`), or\n\t// line-suffixed tags (`#1A2B:42`) — means the header is malformed.\n\t// Surface the focused diagnostic instead of silently mis-routing the\n\t// edit or reporting a missing tag downstream.\n\tfor (let i = FILE_PREFIX_LENGTH; i < pathEnd; i++) {\n\t\tif (line.charCodeAt(i) === CHAR_HASH) return null;\n\t}\n\n\tif (pathEnd === FILE_PREFIX_LENGTH) return null;\n\tconst path = line.slice(FILE_PREFIX_LENGTH, pathEnd);\n\treturn fileHash !== undefined ? { path, fileHash } : { path };\n}\n\ninterface TokenBase {\n\tlineNum: number;\n}\n\nexport type Token =\n\t| (TokenBase & { kind: \"blank\" })\n\t| (TokenBase & { kind: \"envelope-begin\" })\n\t| (TokenBase & { kind: \"envelope-end\" })\n\t| (TokenBase & { kind: \"abort\" })\n\t| (TokenBase & { kind: \"header\"; path: string; fileHash?: string })\n\t| (TokenBase & { kind: \"op-block\"; target: BlockTarget })\n\t| (TokenBase & { kind: \"payload-literal\"; text: string })\n\t| (TokenBase & { kind: \"raw\"; text: string });\n\nfunction classifyLine(line: string, lineNum: number): Token {\n\tif (isEmptyLine(line)) return { kind: \"blank\", lineNum };\n\tif (markerLineEquals(line, BEGIN_PATCH_MARKER)) return { kind: \"envelope-begin\", lineNum };\n\tif (markerLineEquals(line, END_PATCH_MARKER)) return { kind: \"envelope-end\", lineNum };\n\tif (markerLineEquals(line, ABORT_MARKER)) return { kind: \"abort\", lineNum };\n\tconst firstCode = line.charCodeAt(0);\n\tif (line.startsWith(HL_FILE_PREFIX)) {\n\t\tconst header = tryParseHeader(line);\n\t\tif (header !== null) {\n\t\t\treturn header.fileHash !== undefined\n\t\t\t\t? { kind: \"header\", lineNum, path: header.path, fileHash: header.fileHash }\n\t\t\t\t: { kind: \"header\", lineNum, path: header.path };\n\t\t}\n\t}\n\tconst lead = skipWhitespace(line, 0);\n\tconst isHunkLead =\n\t\tline.startsWith(HL_REPLACE_KEYWORD, lead) ||\n\t\tline.startsWith(HL_DELETE_KEYWORD, lead) ||\n\t\tline.startsWith(HL_INSERT_KEYWORD, lead);\n\tif (isHunkLead) {\n\t\tconst hunk = tryParseHunkHeader(line);\n\t\tif (hunk !== null) return { kind: \"op-block\", lineNum, target: hunk.target };\n\t}\n\tif (firstCode === CHAR_PAYLOAD_REPLACE) return { kind: \"payload-literal\", lineNum, text: line.slice(1) };\n\treturn { kind: \"raw\", lineNum, text: line };\n}\n\nexport class Tokenizer {\n\t#buffer = \"\";\n\t#nextLineNum = 1;\n\t#closed = false;\n\n\tfeed(chunk: string): Token[] {\n\t\tif (this.#closed) throw new Error(\"Tokenizer is closed; call reset() before reusing.\");\n\t\tif (chunk.length === 0) return [];\n\t\tthis.#buffer = this.#buffer ? this.#buffer + chunk : chunk;\n\t\treturn this.#drainCompleteLines();\n\t}\n\n\tend(): Token[] {\n\t\tif (this.#closed) return [];\n\t\tthis.#closed = true;\n\t\tconst buf = this.#buffer;\n\t\tthis.#buffer = \"\";\n\t\tif (buf.length === 0) return [];\n\t\tlet stop = buf.length;\n\t\tif (buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN) stop--;\n\t\treturn [classifyLine(buf.slice(0, stop), this.#nextLineNum++)];\n\t}\n\n\treset(): void {\n\t\tthis.#buffer = \"\";\n\t\tthis.#nextLineNum = 1;\n\t\tthis.#closed = false;\n\t}\n\n\ttokenizeAll(text: string): Token[] {\n\t\tthis.reset();\n\t\tconst first = this.feed(text);\n\t\tconst last = this.end();\n\t\treturn last.length === 0 ? first : first.concat(last);\n\t}\n\n\ttokenize(line: string, lineNum = 0): Token {\n\t\treturn classifyLine(line, lineNum);\n\t}\n\n\tisOp(line: string): boolean {\n\t\treturn tryParseHunkHeader(line) !== null;\n\t}\n\n\tisHeader(line: string): boolean {\n\t\treturn tryParseHeader(line) !== null;\n\t}\n\n\tisEnvelopeMarker(line: string): boolean {\n\t\treturn (\n\t\t\tmarkerLineEquals(line, BEGIN_PATCH_MARKER) ||\n\t\t\tmarkerLineEquals(line, END_PATCH_MARKER) ||\n\t\t\tmarkerLineEquals(line, ABORT_MARKER)\n\t\t);\n\t}\n\n\t#drainCompleteLines(): Token[] {\n\t\tconst tokens: Token[] = [];\n\t\tconst buf = this.#buffer;\n\t\tlet start = 0;\n\t\tfor (let index = 0; index < buf.length; index++) {\n\t\t\tif (buf.charCodeAt(index) !== CHAR_LINE_FEED) continue;\n\t\t\tlet stop = index;\n\t\t\tif (stop > start && buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN) stop--;\n\t\t\ttokens.push(classifyLine(buf.slice(start, stop), this.#nextLineNum++));\n\t\t\tstart = index + 1;\n\t\t}\n\t\tthis.#buffer = start < buf.length ? buf.slice(start) : \"\";\n\t\treturn tokens;\n\t}\n}\n\nexport type { ParsedRange } from \"./types.js\";\n"]}