@gajae-code/coding-agent 0.17.2 → 0.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/CHANGELOG.md +267 -0
  2. package/dist/types/cli/daemon-cli.d.ts +3 -1
  3. package/dist/types/cli/github-release.d.ts +17 -0
  4. package/dist/types/cli/public-command-entry.d.ts +56 -0
  5. package/dist/types/cli/public-command-errors.d.ts +126 -0
  6. package/dist/types/cli/public-command-evidence.d.ts +99 -0
  7. package/dist/types/cli/public-command-help.d.ts +65 -0
  8. package/dist/types/cli/public-command-registry.d.ts +69 -0
  9. package/dist/types/cli/session-picker.d.ts +1 -1
  10. package/dist/types/cli/setup-cli.d.ts +1 -0
  11. package/dist/types/cli/skills-cli.d.ts +5 -0
  12. package/dist/types/cli.d.ts +3 -0
  13. package/dist/types/commands/daemon.d.ts +4 -50
  14. package/dist/types/commands/sdk.d.ts +20 -37
  15. package/dist/types/commands/setup.d.ts +3 -0
  16. package/dist/types/commands/skills.d.ts +9 -0
  17. package/dist/types/config/autorouting-tier-map.d.ts +1049 -3
  18. package/dist/types/config/file-lock.d.ts +13 -3
  19. package/dist/types/config/model-profile-activation.d.ts +45 -1
  20. package/dist/types/config/model-registry.d.ts +14 -3
  21. package/dist/types/config/model-resolver.d.ts +1 -1
  22. package/dist/types/config/settings-schema.d.ts +11 -0
  23. package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
  24. package/dist/types/daemon/operator-contract.d.ts +5 -1
  25. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  26. package/dist/types/exec/bash-executor.d.ts +2 -0
  27. package/dist/types/extensibility/extensions/types.d.ts +12 -0
  28. package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
  29. package/dist/types/extensibility/gjc-plugins/runtime-adapters.d.ts +11 -2
  30. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  31. package/dist/types/extensibility/shared-events.d.ts +3 -1
  32. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  33. package/dist/types/gjc-runtime/state-writer.d.ts +14 -1
  34. package/dist/types/harness-control-plane/control-endpoint.d.ts +4 -1
  35. package/dist/types/harness-control-plane/finalize.d.ts +14 -3
  36. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  37. package/dist/types/internal-urls/index.d.ts +1 -0
  38. package/dist/types/internal-urls/parse.d.ts +9 -1
  39. package/dist/types/main.d.ts +23 -1
  40. package/dist/types/modes/acp/acp-agent.d.ts +55 -1
  41. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  42. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  43. package/dist/types/modes/components/session-selector.d.ts +5 -2
  44. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  45. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  46. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  47. package/dist/types/modes/interactive-mode.d.ts +1 -1
  48. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  49. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  50. package/dist/types/modes/types.d.ts +2 -2
  51. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  52. package/dist/types/runtime-mcp/loader.d.ts +2 -0
  53. package/dist/types/runtime-mcp/manager.d.ts +69 -6
  54. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  55. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  56. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  57. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  58. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  59. package/dist/types/sdk/broker/broker.d.ts +17 -4
  60. package/dist/types/sdk/broker/ensure.d.ts +3 -0
  61. package/dist/types/sdk/broker/identity.d.ts +5 -1
  62. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  63. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  64. package/dist/types/sdk/broker/managed-task-dag.d.ts +1335 -0
  65. package/dist/types/sdk/broker/managed-task-verification.d.ts +37 -0
  66. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  67. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  68. package/dist/types/sdk/broker/spawn-authority.d.ts +12 -0
  69. package/dist/types/sdk/broker/startup-failure.d.ts +4 -0
  70. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  71. package/dist/types/sdk/bus/index.d.ts +19 -0
  72. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +7 -1
  73. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  74. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  75. package/dist/types/sdk/cli/rows.d.ts +19 -1
  76. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  77. package/dist/types/sdk/client/client.d.ts +2 -0
  78. package/dist/types/sdk/guides/cli.d.ts +3 -4
  79. package/dist/types/sdk/guides/verify.d.ts +2 -0
  80. package/dist/types/sdk/host/host.d.ts +9 -0
  81. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  82. package/dist/types/sdk/host/types.d.ts +10 -0
  83. package/dist/types/sdk/index.d.ts +1 -0
  84. package/dist/types/sdk/prompt-deadline-flush.d.ts +85 -0
  85. package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
  86. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  87. package/dist/types/sdk/router/session-router.d.ts +2 -0
  88. package/dist/types/sdk/session.d.ts +3 -3
  89. package/dist/types/sdk/startup-capability.d.ts +2 -0
  90. package/dist/types/sdk/transport/relay.d.ts +1 -0
  91. package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
  92. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  93. package/dist/types/session/agent-session.d.ts +175 -23
  94. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  95. package/dist/types/session/fold-coordinator.d.ts +17 -3
  96. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  97. package/dist/types/session/session-manager.d.ts +64 -1
  98. package/dist/types/session/session-work-lease.d.ts +14 -0
  99. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  100. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  101. package/dist/types/task/types.d.ts +2 -0
  102. package/dist/types/tools/bash-interactive.d.ts +1 -0
  103. package/dist/types/tools/bash.d.ts +37 -11
  104. package/dist/types/tools/fetch.d.ts +10 -1
  105. package/dist/types/tools/job.d.ts +1 -1
  106. package/dist/types/tools/steer-fold.d.ts +31 -0
  107. package/dist/types/tools/subagent.d.ts +8 -1
  108. package/dist/types/utils/git.d.ts +28 -2
  109. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  110. package/dist/types/utils/mupdf.d.ts +4 -0
  111. package/dist/types/utils/session-title-generation.d.ts +6 -0
  112. package/dist/types/utils/title-generator.d.ts +11 -2
  113. package/dist/types/web/scrapers/types.d.ts +3 -0
  114. package/package.json +18 -10
  115. package/scripts/build-binary.ts +9 -3
  116. package/scripts/compile-args.ts +0 -9
  117. package/scripts/embed-mupdf.ts +52 -0
  118. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  119. package/scripts/vendor-markit.ts +196 -0
  120. package/src/async/job-manager.ts +22 -1
  121. package/src/cli/daemon-cli.ts +53 -18
  122. package/src/cli/github-release.ts +87 -5
  123. package/src/cli/mcp-cli.ts +38 -4
  124. package/src/cli/public-command-entry.ts +450 -0
  125. package/src/cli/public-command-errors.ts +581 -0
  126. package/src/cli/public-command-evidence.ts +717 -0
  127. package/src/cli/public-command-help.ts +360 -0
  128. package/src/cli/public-command-registry.ts +541 -0
  129. package/src/cli/session-picker.ts +2 -1
  130. package/src/cli/setup-cli.ts +10 -1
  131. package/src/cli/skills-cli.ts +46 -2
  132. package/src/cli/stats-cli.ts +11 -1
  133. package/src/cli.ts +61 -1
  134. package/src/commands/daemon.ts +65 -69
  135. package/src/commands/sdk.ts +175 -117
  136. package/src/commands/setup.ts +2 -0
  137. package/src/commands/skills.ts +11 -0
  138. package/src/config/autorouting-tier-map.ts +543 -3
  139. package/src/config/file-lock.ts +206 -65
  140. package/src/config/model-discovery-manager.ts +4 -4
  141. package/src/config/model-profile-activation.ts +417 -66
  142. package/src/config/model-registry.ts +254 -36
  143. package/src/config/model-resolver.ts +6 -1
  144. package/src/config/settings-schema.ts +26 -2
  145. package/src/coordinator-mcp/policy.ts +10 -5
  146. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  147. package/src/coordinator-mcp/question-state.ts +179 -9
  148. package/src/coordinator-mcp/server.ts +521 -87
  149. package/src/coordinator-mcp/session-reaper.ts +6 -4
  150. package/src/crash/record-loader.ts +6 -2
  151. package/src/daemon/operator-contract.ts +26 -12
  152. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  153. package/src/eval/js/context-manager.ts +8 -8
  154. package/src/eval/js/worker-core.ts +9 -4
  155. package/src/eval/js/worker-protocol.ts +2 -0
  156. package/src/exec/bash-executor.ts +3 -0
  157. package/src/extensibility/extensions/runner.ts +52 -4
  158. package/src/extensibility/extensions/types.ts +10 -0
  159. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  160. package/src/extensibility/gjc-plugins/runtime-adapters.ts +46 -8
  161. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  162. package/src/extensibility/shared-events.ts +3 -1
  163. package/src/gjc-runtime/session-state-lock.ts +165 -24
  164. package/src/gjc-runtime/state-writer.ts +317 -6
  165. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  166. package/src/harness-control-plane/control-endpoint.ts +24 -6
  167. package/src/harness-control-plane/finalize.ts +312 -25
  168. package/src/harness-control-plane/owner.ts +323 -89
  169. package/src/internal-urls/docs-index.generated.ts +23 -20
  170. package/src/internal-urls/embedded-protocol.ts +83 -0
  171. package/src/internal-urls/index.ts +1 -0
  172. package/src/internal-urls/parse.ts +21 -1
  173. package/src/internal-urls/router.ts +4 -2
  174. package/src/main.ts +192 -74
  175. package/src/modes/acp/acp-agent.ts +973 -56
  176. package/src/modes/acp/startup-provenance.ts +59 -0
  177. package/src/modes/components/custom-provider-wizard.ts +308 -7
  178. package/src/modes/components/gjc-bundle-settings.ts +21 -1
  179. package/src/modes/components/oauth-selector.ts +9 -0
  180. package/src/modes/components/session-selector.ts +47 -4
  181. package/src/modes/components/tool-status-header.ts +72 -6
  182. package/src/modes/components/user-message-selector.ts +57 -15
  183. package/src/modes/controllers/command-controller.ts +58 -32
  184. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  185. package/src/modes/controllers/input-controller.ts +4 -0
  186. package/src/modes/controllers/runtime-mcp-command-controller.ts +1 -1
  187. package/src/modes/controllers/selector-controller.ts +161 -15
  188. package/src/modes/interactive-mode.ts +21 -7
  189. package/src/modes/runtime-init.ts +1 -0
  190. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  191. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  192. package/src/modes/types.ts +2 -2
  193. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  194. package/src/prompts/system/title-system.md +1 -1
  195. package/src/prompts/tools/bash.md +1 -1
  196. package/src/prompts/tools/job.md +1 -1
  197. package/src/prompts/tools/read.md +2 -0
  198. package/src/runtime/network-prewarm-service.test.ts +36 -1
  199. package/src/runtime/network-prewarm-service.ts +28 -3
  200. package/src/runtime/process-lifecycle.ts +22 -11
  201. package/src/runtime-mcp/config.ts +16 -1
  202. package/src/runtime-mcp/loader.ts +6 -3
  203. package/src/runtime-mcp/manager.ts +845 -109
  204. package/src/runtime-mcp/pool.test.ts +31 -0
  205. package/src/runtime-mcp/pool.ts +304 -28
  206. package/src/runtime-mcp/redaction.ts +42 -0
  207. package/src/runtime-mcp/startup-policy.ts +7 -0
  208. package/src/runtime-mcp/tool-bridge.ts +71 -0
  209. package/src/runtime-mcp/transports/http.ts +108 -25
  210. package/src/sdk/acp/adapter.ts +27 -8
  211. package/src/sdk/broker/broker.ts +1431 -198
  212. package/src/sdk/broker/ensure.ts +21 -3
  213. package/src/sdk/broker/identity.ts +22 -1
  214. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  215. package/src/sdk/broker/lifecycle.ts +690 -141
  216. package/src/sdk/broker/managed-task-dag.ts +1927 -0
  217. package/src/sdk/broker/managed-task-verification.ts +642 -0
  218. package/src/sdk/broker/runtime.ts +1 -1
  219. package/src/sdk/broker/session-index.ts +97 -4
  220. package/src/sdk/broker/spawn-authority.ts +175 -14
  221. package/src/sdk/broker/startup-failure.ts +80 -1
  222. package/src/sdk/broker/stderr-drainer.ts +59 -0
  223. package/src/sdk/broker/transport.ts +1 -0
  224. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  225. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  226. package/src/sdk/bus/index.ts +707 -81
  227. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  228. package/src/sdk/bus/telegram-daemon-contract.ts +7 -1
  229. package/src/sdk/bus/telegram-daemon.ts +10 -3
  230. package/src/sdk/cli/master-cli.ts +47 -36
  231. package/src/sdk/cli/rows.ts +30 -7
  232. package/src/sdk/cli/session-cli.ts +705 -184
  233. package/src/sdk/client/client.ts +18 -0
  234. package/src/sdk/guides/catalog.ts +2 -2
  235. package/src/sdk/guides/cli.ts +20 -62
  236. package/src/sdk/guides/verify.ts +14 -0
  237. package/src/sdk/host/host.ts +49 -5
  238. package/src/sdk/host/session-runtime.test.ts +184 -2
  239. package/src/sdk/host/session-runtime.ts +322 -101
  240. package/src/sdk/host/types.ts +12 -1
  241. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  242. package/src/sdk/host/websocket-transport.ts +40 -6
  243. package/src/sdk/index.ts +11 -0
  244. package/src/sdk/lifecycle/service.ts +2 -0
  245. package/src/sdk/prompt-deadline-flush.ts +356 -0
  246. package/src/sdk/prompt-deadline-manager.ts +133 -1
  247. package/src/sdk/prompt-tool-boundary.ts +121 -0
  248. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  249. package/src/sdk/router/session-router.ts +9 -1
  250. package/src/sdk/session.ts +763 -116
  251. package/src/sdk/startup-capability.ts +1 -1
  252. package/src/sdk/transport/relay.ts +71 -6
  253. package/src/sdk/transport/serve-cli.ts +397 -42
  254. package/src/sdk/transport/socket.ts +12 -11
  255. package/src/sdk/transport/stdio.ts +7 -3
  256. package/src/session/agent-session.ts +2472 -407
  257. package/src/session/fallback-chain-controller.ts +6 -7
  258. package/src/session/fold-coordinator.ts +24 -5
  259. package/src/session/internal/managed-session-scope.ts +68 -18
  260. package/src/session/internal/managed-session-storage.ts +334 -12
  261. package/src/session/session-manager.ts +382 -44
  262. package/src/session/session-work-lease.ts +34 -0
  263. package/src/setup/model-onboarding-guidance.ts +1 -1
  264. package/src/setup/provider-onboarding.ts +397 -24
  265. package/src/setup/provider-presets.json +2 -1
  266. package/src/slash-commands/builtin-registry.ts +259 -15
  267. package/src/task/executor.ts +46 -17
  268. package/src/task/index.ts +14 -2
  269. package/src/task/types.ts +2 -0
  270. package/src/tools/bash-interactive.ts +2 -0
  271. package/src/tools/bash.ts +118 -78
  272. package/src/tools/fetch.ts +140 -25
  273. package/src/tools/job.ts +151 -25
  274. package/src/tools/output-meta.ts +15 -2
  275. package/src/tools/path-utils.ts +27 -3
  276. package/src/tools/read.ts +3 -3
  277. package/src/tools/steer-fold.ts +107 -0
  278. package/src/tools/subagent-render.ts +24 -1
  279. package/src/tools/subagent.ts +27 -1
  280. package/src/tools/tool-catalog.generated.ts +29 -2
  281. package/src/tools/tool-errors.ts +4 -0
  282. package/src/utils/git.ts +53 -3
  283. package/src/utils/markit.ts +55 -41
  284. package/src/utils/mupdf-assets.d.ts +4 -0
  285. package/src/utils/mupdf-embedded.ts +4 -0
  286. package/src/utils/mupdf.ts +136 -0
  287. package/src/utils/session-title-generation.ts +29 -0
  288. package/src/utils/title-generator.ts +46 -2
  289. package/src/web/scrapers/types.ts +24 -3
  290. package/vendor/markit-ai/LICENSE +21 -0
  291. package/vendor/markit-ai/MANIFEST.json +412 -0
  292. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  293. package/vendor/markit-ai/dist/commands/config.js +139 -0
  294. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  295. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  296. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  297. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  298. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  299. package/vendor/markit-ai/dist/commands/init.js +29 -0
  300. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  301. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  302. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  303. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  304. package/vendor/markit-ai/dist/config.d.ts +26 -0
  305. package/vendor/markit-ai/dist/config.js +42 -0
  306. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  307. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  308. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  309. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  310. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  311. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  312. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  313. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  314. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  315. package/vendor/markit-ai/dist/converters/github.js +148 -0
  316. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  317. package/vendor/markit-ai/dist/converters/html.js +30 -0
  318. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  319. package/vendor/markit-ai/dist/converters/image.js +124 -0
  320. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  321. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  322. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  323. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  324. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  325. package/vendor/markit-ai/dist/converters/json.js +21 -0
  326. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  327. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  328. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  329. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  330. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  331. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  332. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  333. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  334. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  335. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  336. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  337. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  338. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  339. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  340. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  341. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  342. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  343. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  344. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  345. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  346. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  347. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  348. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  349. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  350. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  351. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  352. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  353. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  354. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  355. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  356. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  357. package/vendor/markit-ai/dist/index.d.ts +30 -0
  358. package/vendor/markit-ai/dist/index.js +26 -0
  359. package/vendor/markit-ai/dist/main.d.ts +2 -0
  360. package/vendor/markit-ai/dist/main.js +191 -0
  361. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  362. package/vendor/markit-ai/dist/markit.js +267 -0
  363. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  364. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  365. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  366. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  367. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  368. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  369. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  370. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  371. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  372. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  373. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  374. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  375. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  376. package/vendor/markit-ai/dist/providers/index.js +56 -0
  377. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  378. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  379. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  380. package/vendor/markit-ai/dist/providers/types.js +1 -0
  381. package/vendor/markit-ai/dist/types.d.ts +36 -0
  382. package/vendor/markit-ai/dist/types.js +1 -0
  383. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  384. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  385. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  386. package/vendor/markit-ai/dist/utils/output.js +31 -0
  387. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  388. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  389. package/vendor/markit-ai/package.json +74 -0
  390. package/vendor/markit-ai.patch +49 -0
@@ -0,0 +1,391 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import JSZip from "jszip";
4
+ const EXTENSIONS = [".pages", ".key", ".numbers"];
5
+ const SF = "http://developer.apple.com/namespaces/sf";
6
+ const SFA = "http://developer.apple.com/namespaces/sfa";
7
+ const KEY = "http://developer.apple.com/namespaces/keynote2";
8
+ /**
9
+ * Converts Apple iWork files (Pages, Keynote, Numbers) to markdown.
10
+ *
11
+ * All three formats are ZIP archives containing an XML file:
12
+ * - Pages: index.xml (sf:p paragraphs with named styles)
13
+ * - Keynote: index.apxl (key:slide elements with sf:p text)
14
+ * - Numbers: index.xml (sf:t text cells + sf:n number cells)
15
+ */
16
+ export class IWorkConverter {
17
+ name = "iwork";
18
+ accepts(streamInfo) {
19
+ if (streamInfo.extension && EXTENSIONS.includes(streamInfo.extension)) {
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+ async convert(input, streamInfo) {
25
+ const zip = await JSZip.loadAsync(input);
26
+ const ext = streamInfo.extension;
27
+ if (ext === ".pages")
28
+ return this.convertPages(zip, streamInfo);
29
+ if (ext === ".key")
30
+ return this.convertKeynote(zip, streamInfo);
31
+ if (ext === ".numbers")
32
+ return this.convertNumbers(zip);
33
+ throw new Error(`Unsupported iWork format: ${ext}`);
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Pages
37
+ // ---------------------------------------------------------------------------
38
+ async convertPages(zip, streamInfo) {
39
+ const xml = await this.readIndex(zip, "index.xml");
40
+ const root = parseXml(xml);
41
+ const imageDir = streamInfo.imageDir;
42
+ if (imageDir)
43
+ mkdirSync(imageDir, { recursive: true });
44
+ let imageCount = 0;
45
+ const lines = [];
46
+ let title;
47
+ for (const p of iterAll(root, SF, "p")) {
48
+ const text = collectText(p).trim();
49
+ if (!text)
50
+ continue;
51
+ const style = p.getAttribute("sf:style") || "";
52
+ const prefix = paragraphPrefix(style);
53
+ if (!title && text.length > 0)
54
+ title = text;
55
+ lines.push(`${prefix}${text}`);
56
+ }
57
+ // Extract images
58
+ for (const name of Object.keys(zip.files)) {
59
+ if (!name.match(/\.(png|jpg|jpeg|gif|webp|tiff|bmp)$/i))
60
+ continue;
61
+ if (name.startsWith("QuickLook/"))
62
+ continue;
63
+ imageCount++;
64
+ const imgName = name.split("/").pop() || `image_${imageCount}`;
65
+ if (imageDir) {
66
+ const file = zip.file(name);
67
+ if (file) {
68
+ const buf = await file.async("nodebuffer");
69
+ const filepath = join(imageDir, imgName);
70
+ writeFileSync(filepath, buf);
71
+ lines.push(`![${imgName}](${filepath})`);
72
+ }
73
+ }
74
+ else {
75
+ lines.push(`<!-- image: ${imgName} -->`);
76
+ }
77
+ }
78
+ return { markdown: lines.join("\n\n"), title };
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Keynote
82
+ // ---------------------------------------------------------------------------
83
+ async convertKeynote(zip, streamInfo) {
84
+ const xml = await this.readIndex(zip, "index.apxl");
85
+ const root = parseXml(xml);
86
+ const imageDir = streamInfo.imageDir;
87
+ if (imageDir)
88
+ mkdirSync(imageDir, { recursive: true });
89
+ const sections = [];
90
+ let title;
91
+ const slides = [...iterAll(root, KEY, "slide")];
92
+ for (let i = 0; i < slides.length; i++) {
93
+ const slide = slides[i];
94
+ const slideLines = [`<!-- Slide ${i + 1} -->`];
95
+ const paragraphs = [...iterAll(slide, SF, "p")];
96
+ let isTitle = true;
97
+ for (const p of paragraphs) {
98
+ const text = collectText(p).trim();
99
+ if (!text)
100
+ continue;
101
+ if (isTitle) {
102
+ slideLines.push(`# ${text}`);
103
+ if (!title)
104
+ title = text;
105
+ isTitle = false;
106
+ }
107
+ else {
108
+ slideLines.push(text);
109
+ }
110
+ }
111
+ sections.push(slideLines.join("\n"));
112
+ }
113
+ // Extract media images
114
+ let imageCount = 0;
115
+ for (const name of Object.keys(zip.files)) {
116
+ if (!name.match(/\.(png|jpg|jpeg|gif|webp|tiff|bmp)$/i))
117
+ continue;
118
+ if (name.startsWith("QuickLook/"))
119
+ continue;
120
+ imageCount++;
121
+ const imgName = name.split("/").pop() || `image_${imageCount}`;
122
+ if (imageDir) {
123
+ const file = zip.file(name);
124
+ if (file) {
125
+ const buf = await file.async("nodebuffer");
126
+ const filepath = join(imageDir, imgName);
127
+ writeFileSync(filepath, buf);
128
+ sections.push(`![${imgName}](${filepath})`);
129
+ }
130
+ }
131
+ else {
132
+ sections.push(`<!-- image: ${imgName} -->`);
133
+ }
134
+ }
135
+ return { markdown: sections.join("\n\n"), title };
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Numbers
139
+ // ---------------------------------------------------------------------------
140
+ async convertNumbers(zip) {
141
+ const xml = await this.readIndex(zip, "index.xml");
142
+ const root = parseXml(xml);
143
+ // Find grid elements (tables)
144
+ const grids = [...iterAll(root, SF, "grid")];
145
+ if (grids.length === 0) {
146
+ // Fallback: extract all text and number cells
147
+ return this.convertNumbersFallback(root);
148
+ }
149
+ const sections = [];
150
+ for (const grid of grids) {
151
+ const rows = this.extractGrid(grid);
152
+ if (rows.length === 0)
153
+ continue;
154
+ const maxCols = Math.max(...rows.map((r) => r.length));
155
+ for (const row of rows) {
156
+ while (row.length < maxCols)
157
+ row.push("");
158
+ }
159
+ const [header, ...body] = rows;
160
+ const lines = [];
161
+ lines.push(`| ${header.join(" | ")} |`);
162
+ lines.push(`| ${header.map(() => "---").join(" | ")} |`);
163
+ for (const row of body) {
164
+ lines.push(`| ${row.join(" | ")} |`);
165
+ }
166
+ sections.push(lines.join("\n"));
167
+ }
168
+ return { markdown: sections.join("\n\n") };
169
+ }
170
+ extractGrid(grid) {
171
+ const datasource = findFirst(grid, SF, "datasource");
172
+ if (!datasource)
173
+ return [];
174
+ const rows = [];
175
+ let currentRow = [];
176
+ let colCount = 0;
177
+ let totalCells = 0;
178
+ const allValues = [];
179
+ // Get column count from grid attributes (raw attribute names)
180
+ const numCols = Number.parseInt(grid.getAttribute("sf:numcols") || "0", 10);
181
+ for (const child of datasource.children) {
182
+ const tag = child.tagName;
183
+ let value = "";
184
+ if (tag === `${SF}:t`) {
185
+ // Text cell
186
+ const ct = findFirst(child, SF, "ct");
187
+ value = ct?.getAttribute("sfa:s") || collectText(child).trim();
188
+ }
189
+ else if (tag === `${SF}:n`) {
190
+ // Number cell
191
+ value = child.getAttribute("sf:v") || "";
192
+ }
193
+ else if (tag === `${SF}:b`) {
194
+ // Boolean cell
195
+ value = child.getAttribute("sf:v") === "1" ? "TRUE" : "FALSE";
196
+ }
197
+ else if (tag === `${SF}:d`) {
198
+ // Date cell
199
+ value = child.getAttribute("sf:v") || "";
200
+ }
201
+ else if (tag === `${SF}:du`) {
202
+ // Duration cell
203
+ value = child.getAttribute("sf:v") || "";
204
+ }
205
+ else if (tag === `${SF}:e`) {
206
+ // Empty cell
207
+ value = "";
208
+ }
209
+ else {
210
+ continue;
211
+ }
212
+ currentRow.push(value);
213
+ allValues.push(value);
214
+ colCount++;
215
+ totalCells++;
216
+ if (numCols > 0 && colCount >= numCols) {
217
+ rows.push(currentRow);
218
+ currentRow = [];
219
+ colCount = 0;
220
+ }
221
+ }
222
+ if (currentRow.length > 0)
223
+ rows.push(currentRow);
224
+ // If the grid used default dimensions and produced only one row,
225
+ // the data probably doesn't fill the full grid width. Fall back to
226
+ // treating the cells as a 2-column key/value list or single column.
227
+ if (rows.length <= 1 && totalCells > 0 && totalCells < numCols) {
228
+ // Re-layout: try 2 columns if even, otherwise single column
229
+ const cols = totalCells % 2 === 0 ? 2 : 1;
230
+ const relaid = [];
231
+ for (let i = 0; i < allValues.length; i += cols) {
232
+ relaid.push(allValues.slice(i, i + cols));
233
+ }
234
+ return relaid;
235
+ }
236
+ return rows;
237
+ }
238
+ convertNumbersFallback(root) {
239
+ const values = [];
240
+ for (const t of iterAll(root, SF, "t")) {
241
+ const ct = findFirst(t, SF, "ct");
242
+ const val = ct?.getAttribute("sfa:s") || "";
243
+ if (val)
244
+ values.push(val);
245
+ }
246
+ for (const n of iterAll(root, SF, "n")) {
247
+ const val = n.getAttribute("sf:v") || "";
248
+ if (val)
249
+ values.push(val);
250
+ }
251
+ return { markdown: values.join("\n") };
252
+ }
253
+ // ---------------------------------------------------------------------------
254
+ // Helpers
255
+ // ---------------------------------------------------------------------------
256
+ async readIndex(zip, filename) {
257
+ const file = zip.file(filename);
258
+ if (!file) {
259
+ throw new Error(`Invalid iWork file: missing ${filename}`);
260
+ }
261
+ return file.async("string");
262
+ }
263
+ }
264
+ /**
265
+ * Minimal XML parser that preserves namespace prefixes in tag names
266
+ * and extracts text content and attributes.
267
+ */
268
+ function parseXml(xml) {
269
+ // Use a simple recursive descent approach
270
+ const root = createElement("root");
271
+ const stack = [root];
272
+ // Match tags and text
273
+ const tagRe = /<(\/?)([a-zA-Z0-9_:.-]+)((?:\s+[a-zA-Z0-9_:.-]+\s*=\s*"[^"]*")*)\s*(\/?)>/g;
274
+ let lastIndex = 0;
275
+ let match = tagRe.exec(xml);
276
+ while (match !== null) {
277
+ const [fullMatch, isClose, tagName, attrs, isSelfClose] = match;
278
+ const textBefore = xml.slice(lastIndex, match.index);
279
+ lastIndex = match.index + fullMatch.length;
280
+ // Add text to current element
281
+ if (textBefore.trim()) {
282
+ const current = stack[stack.length - 1];
283
+ if (current.children.length > 0) {
284
+ current.children[current.children.length - 1].tail += textBefore.trim();
285
+ }
286
+ else {
287
+ current.text += textBefore.trim();
288
+ }
289
+ }
290
+ if (isClose) {
291
+ // Closing tag
292
+ stack.pop();
293
+ }
294
+ else {
295
+ // Opening tag
296
+ const el = createElement(expandTag(tagName, xml));
297
+ parseAttributes(attrs, el);
298
+ stack[stack.length - 1].children.push(el);
299
+ if (!isSelfClose) {
300
+ stack.push(el);
301
+ }
302
+ }
303
+ match = tagRe.exec(xml);
304
+ }
305
+ return root;
306
+ }
307
+ function createElement(tagName) {
308
+ return {
309
+ tagName,
310
+ children: [],
311
+ text: "",
312
+ tail: "",
313
+ attributes: {},
314
+ getAttribute(name) {
315
+ return this.attributes[name] ?? null;
316
+ },
317
+ };
318
+ }
319
+ function parseAttributes(attrStr, el) {
320
+ const attrRe = /([a-zA-Z0-9_:.-]+)\s*=\s*"([^"]*)"/g;
321
+ let m = attrRe.exec(attrStr);
322
+ while (m !== null) {
323
+ el.attributes[m[1]] = m[2];
324
+ m = attrRe.exec(attrStr);
325
+ }
326
+ }
327
+ /**
328
+ * Expand namespace prefix in tag name to full URI.
329
+ * e.g. "sf:p" with xmlns:sf="..." → "{uri}p"
330
+ * For simplicity, we use the known Apple namespaces.
331
+ */
332
+ function expandTag(tag, _xml) {
333
+ const nsMap = {
334
+ sf: SF,
335
+ sfa: SFA,
336
+ sl: "http://developer.apple.com/namespaces/sl",
337
+ key: KEY,
338
+ };
339
+ const colon = tag.indexOf(":");
340
+ if (colon === -1)
341
+ return tag;
342
+ const prefix = tag.slice(0, colon);
343
+ const local = tag.slice(colon + 1);
344
+ const uri = nsMap[prefix];
345
+ return uri ? `${uri}:${local}` : tag;
346
+ }
347
+ function collectText(el) {
348
+ let result = el.text;
349
+ for (const child of el.children) {
350
+ result += collectText(child);
351
+ result += child.tail;
352
+ }
353
+ return result;
354
+ }
355
+ function* iterAll(el, ns, localName) {
356
+ const fullTag = `${ns}:${localName}`;
357
+ if (el.tagName === fullTag)
358
+ yield el;
359
+ for (const child of el.children) {
360
+ yield* iterAll(child, ns, localName);
361
+ }
362
+ }
363
+ function findFirst(el, ns, localName) {
364
+ for (const found of iterAll(el, ns, localName)) {
365
+ return found;
366
+ }
367
+ return null;
368
+ }
369
+ /**
370
+ * Map iWork paragraph style names to markdown heading prefixes.
371
+ */
372
+ function paragraphPrefix(style) {
373
+ if (!style)
374
+ return "";
375
+ const lower = style.toLowerCase();
376
+ if (lower.includes("title"))
377
+ return "# ";
378
+ if (lower.includes("subtitle"))
379
+ return "## ";
380
+ if (lower.includes("heading-1") || lower.includes("heading 1"))
381
+ return "## ";
382
+ if (lower.includes("heading-2") || lower.includes("heading 2"))
383
+ return "### ";
384
+ if (lower.includes("heading-3") || lower.includes("heading 3"))
385
+ return "#### ";
386
+ if (lower.includes("heading-4") || lower.includes("heading 4"))
387
+ return "##### ";
388
+ if (lower.includes("caption"))
389
+ return "*";
390
+ return "";
391
+ }
@@ -0,0 +1,6 @@
1
+ import type { ConversionResult, Converter, StreamInfo } from "../types.js";
2
+ export declare class JsonConverter implements Converter {
3
+ name: string;
4
+ accepts(streamInfo: StreamInfo): boolean;
5
+ convert(input: Buffer, _streamInfo: StreamInfo): Promise<ConversionResult>;
6
+ }
@@ -0,0 +1,21 @@
1
+ const EXTENSIONS = [".json"];
2
+ const MIMETYPES = ["application/json"];
3
+ export class JsonConverter {
4
+ name = "json";
5
+ accepts(streamInfo) {
6
+ if (streamInfo.extension && EXTENSIONS.includes(streamInfo.extension)) {
7
+ return true;
8
+ }
9
+ if (streamInfo.mimetype &&
10
+ MIMETYPES.some((m) => streamInfo.mimetype?.startsWith(m))) {
11
+ return true;
12
+ }
13
+ return false;
14
+ }
15
+ async convert(input, _streamInfo) {
16
+ const text = new TextDecoder("utf-8").decode(input);
17
+ const parsed = JSON.parse(text);
18
+ const pretty = JSON.stringify(parsed, null, 2);
19
+ return { markdown: `\`\`\`json\n${pretty}\n\`\`\`` };
20
+ }
21
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Multi-column layout detection and text box reordering.
3
+ *
4
+ * Many PDFs (legal documents, datasheets, academic papers) use two-column
5
+ * layouts. Without column detection, text boxes are ordered by Y position
6
+ * only, interleaving left and right column content.
7
+ *
8
+ * Algorithm:
9
+ * 1. Collect left edges of all text boxes on the page
10
+ * 2. Find the largest horizontal gap between consecutive left edges
11
+ * 3. If gap > MIN_GAP_RATIO of the text width and both sides have
12
+ * enough boxes → multi-column detected
13
+ * 4. Assign each text box to a column based on its center X
14
+ * 5. Return columns in reading order (left-to-right, top-to-bottom)
15
+ *
16
+ * This only detects the column structure. The caller is responsible for
17
+ * processing each column's text boxes independently (table detection,
18
+ * rendering, etc.).
19
+ */
20
+ import type { TextBox } from "./types.js";
21
+ export interface ColumnLayout {
22
+ /** Number of columns detected (1 = single column, 2+ = multi-column). */
23
+ columnCount: number;
24
+ /** Text boxes grouped by column, in reading order (left to right). */
25
+ columns: TextBox[][];
26
+ /** X positions of column boundaries (between columns). */
27
+ boundaries: number[];
28
+ }
29
+ /**
30
+ * Detect column layout and return text boxes grouped by column.
31
+ *
32
+ * For single-column pages, returns all boxes in one group.
33
+ * For multi-column pages, returns boxes split by column in reading order.
34
+ */
35
+ export declare function detectColumns(textBoxes: TextBox[]): ColumnLayout;
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Multi-column layout detection and text box reordering.
3
+ *
4
+ * Many PDFs (legal documents, datasheets, academic papers) use two-column
5
+ * layouts. Without column detection, text boxes are ordered by Y position
6
+ * only, interleaving left and right column content.
7
+ *
8
+ * Algorithm:
9
+ * 1. Collect left edges of all text boxes on the page
10
+ * 2. Find the largest horizontal gap between consecutive left edges
11
+ * 3. If gap > MIN_GAP_RATIO of the text width and both sides have
12
+ * enough boxes → multi-column detected
13
+ * 4. Assign each text box to a column based on its center X
14
+ * 5. Return columns in reading order (left-to-right, top-to-bottom)
15
+ *
16
+ * This only detects the column structure. The caller is responsible for
17
+ * processing each column's text boxes independently (table detection,
18
+ * rendering, etc.).
19
+ */
20
+ /**
21
+ * Minimum gap as a fraction of the total text width to consider a column
22
+ * boundary. A two-column layout typically has ~50% gap; we use a lower
23
+ * threshold to catch asymmetric columns.
24
+ */
25
+ const MIN_GAP_RATIO = 0.15;
26
+ /** Minimum number of text boxes on each side of the gap. */
27
+ const MIN_BOXES_PER_COLUMN = 4;
28
+ /** Minimum gap in absolute points to avoid splitting on small whitespace. */
29
+ const MIN_GAP_PTS = 40;
30
+ /**
31
+ * Detect column layout and return text boxes grouped by column.
32
+ *
33
+ * For single-column pages, returns all boxes in one group.
34
+ * For multi-column pages, returns boxes split by column in reading order.
35
+ */
36
+ export function detectColumns(textBoxes) {
37
+ if (textBoxes.length < MIN_BOXES_PER_COLUMN * 2) {
38
+ return { columnCount: 1, columns: [textBoxes], boundaries: [] };
39
+ }
40
+ // Collect unique left edges (rounded to avoid float noise)
41
+ const lefts = [
42
+ ...new Set(textBoxes.map((tb) => Math.round(tb.bounds.left))),
43
+ ].sort((a, b) => a - b);
44
+ if (lefts.length < 2) {
45
+ return { columnCount: 1, columns: [textBoxes], boundaries: [] };
46
+ }
47
+ const textXMin = lefts[0];
48
+ const textXMax = Math.max(...textBoxes.map((tb) => Math.round(tb.bounds.right)));
49
+ const textWidth = textXMax - textXMin;
50
+ if (textWidth <= 0) {
51
+ return { columnCount: 1, columns: [textBoxes], boundaries: [] };
52
+ }
53
+ // Find the largest gap between consecutive left-edge positions
54
+ let maxGap = 0;
55
+ let gapLeft = 0;
56
+ let gapRight = 0;
57
+ for (let i = 1; i < lefts.length; i++) {
58
+ const gap = lefts[i] - lefts[i - 1];
59
+ if (gap > maxGap) {
60
+ maxGap = gap;
61
+ gapLeft = lefts[i - 1];
62
+ gapRight = lefts[i];
63
+ }
64
+ }
65
+ const gapRatio = maxGap / textWidth;
66
+ if (gapRatio < MIN_GAP_RATIO || maxGap < MIN_GAP_PTS) {
67
+ return { columnCount: 1, columns: [textBoxes], boundaries: [] };
68
+ }
69
+ // Split point is the midpoint of the gap
70
+ const splitX = (gapLeft + gapRight) / 2;
71
+ // Assign boxes to columns based on center X
72
+ const leftCol = [];
73
+ const rightCol = [];
74
+ for (const tb of textBoxes) {
75
+ const cx = (tb.bounds.left + tb.bounds.right) / 2;
76
+ if (cx < splitX) {
77
+ leftCol.push(tb);
78
+ }
79
+ else {
80
+ rightCol.push(tb);
81
+ }
82
+ }
83
+ // Validate both columns have enough content
84
+ if (leftCol.length < MIN_BOXES_PER_COLUMN ||
85
+ rightCol.length < MIN_BOXES_PER_COLUMN) {
86
+ return { columnCount: 1, columns: [textBoxes], boundaries: [] };
87
+ }
88
+ return {
89
+ columnCount: 2,
90
+ columns: [leftCol, rightCol],
91
+ boundaries: [splitX],
92
+ };
93
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * PDF content extraction using mupdf.
3
+ *
4
+ * Extracts text boxes (with position, font size, bold) and vector line
5
+ * segments (table borders) from each page. Uses mupdf's native WASM
6
+ * engine for fast parsing, and reads raw content streams for vector graphics.
7
+ *
8
+ * Coordinate system: PDF native (origin = bottom-left, Y increases upward).
9
+ */
10
+ import type { ImageRegion, PageContent } from "./types.js";
11
+ /**
12
+ * Render an image region from a PDF page as a PNG buffer.
13
+ * Uses mupdf's DrawDevice to render just the cropped area at 2x resolution.
14
+ */
15
+ export declare function renderImageRegion(input: Uint8Array, region: ImageRegion): Uint8Array;
16
+ /**
17
+ * Extract text boxes and vector segments from all pages of a PDF buffer.
18
+ */
19
+ export declare function extractPages(input: Uint8Array): Promise<PageContent[]>;