@abot-ai/runtime 1.7.0 → 1.8.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 (532) hide show
  1. package/README.md +216 -222
  2. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
  3. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  4. package/dist/src/capabilities/tool-types.d.ts +4 -0
  5. package/dist/src/cli/abot.js +2 -0
  6. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  7. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  8. package/dist/src/computer-access/collection-consent.js +47 -0
  9. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  10. package/dist/src/computer-access/command-output-capture.js +134 -68
  11. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  12. package/dist/src/computer-access/command-output-protection.js +59 -0
  13. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  14. package/dist/src/computer-access/companion/command-output.js +23 -6
  15. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  16. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  17. package/dist/src/computer-access/companion/native-session.js +6 -2
  18. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  19. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  20. package/dist/src/computer-access/companion/observation-process.js +51 -25
  21. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  22. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  23. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  24. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  25. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  26. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  27. package/dist/src/computer-access/handlers.d.ts +2 -1
  28. package/dist/src/computer-access/handlers.js +79 -11
  29. package/dist/src/computer-access/host-observation.d.ts +3 -3
  30. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  31. package/dist/src/computer-access/native-observation-connection.js +78 -0
  32. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  33. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  34. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  35. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  36. package/dist/src/computer-access/observation-source.d.ts +6 -0
  37. package/dist/src/computer-access/observation-source.js +10 -0
  38. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  39. package/dist/src/computer-access/security/desktop-result.js +146 -0
  40. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  41. package/dist/src/computer-access/security/observed-error.js +10 -0
  42. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  43. package/dist/src/computer-access/security/secret-text.js +111 -0
  44. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  45. package/dist/src/computer-access/security/system-results.js +53 -0
  46. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  47. package/dist/src/computer-access/system-result-protection.js +1 -0
  48. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  49. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  50. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  51. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  52. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  53. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  54. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  55. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  56. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  57. package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
  58. package/dist/src/model-gateway/protocol/message-contract.js +1 -1
  59. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  60. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  61. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  62. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  63. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  64. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  65. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  66. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  67. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  68. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  69. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  70. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  71. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  72. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  73. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  74. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  75. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  76. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  77. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  78. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  79. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  80. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  81. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  82. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  83. package/dist/src/model-gateway/server/chat-handler.js +5 -7
  84. package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
  85. package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
  86. package/dist/src/model-gateway/server.js +5 -1
  87. package/dist/src/plugin-contract/index.d.ts +1 -0
  88. package/dist/src/plugin-contract/index.js +1 -0
  89. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  90. package/dist/src/plugin-contract/manifest.js +1 -0
  91. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  92. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  93. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  94. package/dist/src/plugin-sdk/computer-access.js +1 -0
  95. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  96. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  97. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  98. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  99. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  100. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  101. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  102. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  103. package/dist/src/plugin-sdk/files.js +4 -0
  104. package/dist/src/plugin-sdk/index.d.ts +1 -0
  105. package/dist/src/plugin-sdk/index.js +1 -0
  106. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  107. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  108. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  109. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  110. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  111. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  112. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  113. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  114. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  115. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
  116. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
  117. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
  118. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  119. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  120. package/dist/src/runtime/capabilities/tool-availability.js +6 -0
  121. package/dist/src/runtime/context/capability-brief.d.ts +2 -2
  122. package/dist/src/runtime/context/capability-brief.js +3 -3
  123. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
  124. package/dist/src/runtime/context/capability-descriptions.js +57 -20
  125. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  126. package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
  127. package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
  128. package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
  129. package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
  130. package/dist/src/runtime/long-term-memory/projection.js +1 -1
  131. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
  132. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
  133. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
  134. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
  135. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
  136. package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
  137. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
  138. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
  139. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
  140. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  141. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
  142. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
  143. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
  144. package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
  145. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
  146. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
  147. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  148. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  149. package/dist/src/runtime/passive-learning/service.js +2 -3
  150. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  151. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  152. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  153. package/dist/src/runtime/plugins/installation/package.js +2 -0
  154. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  155. package/dist/src/runtime/plugins/loader.js +24 -14
  156. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  157. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  158. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  159. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  160. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  161. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  162. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  163. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  164. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  165. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  166. package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
  167. package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
  168. package/dist/src/runtime/request/prepared-execution.js +3 -0
  169. package/dist/src/runtime/request/root-contract.d.ts +2 -0
  170. package/dist/src/runtime/request/root-execution-kernel.js +1 -0
  171. package/dist/src/runtime/request/runner.js +9 -3
  172. package/dist/src/runtime/request/supervisor-root-execution.js +6 -0
  173. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  174. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  175. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
  176. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
  177. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
  178. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
  179. package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
  180. package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
  181. package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
  182. package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
  183. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
  184. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
  185. package/dist/src/runtime/steps/execution-agent/format.js +4 -3
  186. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
  187. package/dist/src/runtime/steps/execution-agent/input.js +22 -1
  188. package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
  189. package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
  190. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  191. package/dist/src/runtime/steps/execution-agent/prompt.js +7 -8
  192. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  193. package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
  194. package/dist/src/runtime/steps/execution-agent/run.js +4 -1
  195. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +3 -5
  196. package/dist/src/runtime/steps/execution-agent/state-context.js +5 -51
  197. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  198. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  199. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  200. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  201. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
  202. package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
  203. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  204. package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
  205. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
  206. package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
  207. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
  208. package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
  209. package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
  210. package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
  211. package/dist/src/sessions/durable-session-commit.js +3 -3
  212. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  213. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  214. package/dist/src/sessions/session-store.js +3 -3
  215. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  216. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  217. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  218. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  219. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  220. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  221. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  222. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  223. package/dist/src/shared/windows-job-object.d.ts +2 -0
  224. package/dist/src/shared/windows-job-object.js +66 -0
  225. package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
  226. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  227. package/dist/src/web-ui/app/app-state.js +0 -7
  228. package/dist/src/web-ui/app/app.js +54 -156
  229. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  230. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  231. package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
  232. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  233. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  234. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  235. package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
  236. package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
  237. package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
  238. package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
  239. package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
  240. package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
  241. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  242. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  243. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  244. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  245. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  246. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  247. package/dist/src/web-ui/app/components/operations-summary.js +2 -1
  248. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  249. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  250. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  251. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  252. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  253. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  254. package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
  255. package/dist/src/web-ui/app/components/passive-learning/home.js +11 -3
  256. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  257. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  258. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  259. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  260. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  261. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  262. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  263. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  264. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  265. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  266. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  267. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  268. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  269. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  270. package/dist/src/web-ui/app/components/schedules/details.js +3 -2
  271. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  272. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  273. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  274. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  275. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
  276. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  277. package/dist/src/web-ui/app/components/spark-chat/settings.js +8 -4
  278. package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
  279. package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
  280. package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
  281. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  282. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  283. package/dist/src/web-ui/app/components/system-host/rendering.js +6 -3
  284. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
  285. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  286. package/dist/src/web-ui/app/computer-access-feature.js +13 -1
  287. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  288. package/dist/src/web-ui/app/configuration-feature.js +11 -1
  289. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  290. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  291. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  292. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  293. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  294. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  295. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  296. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  297. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  298. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  299. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  300. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  301. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  302. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  303. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  304. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  305. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  306. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  307. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  308. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  309. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  310. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  311. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  312. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  313. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  314. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  315. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  316. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  317. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  318. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  319. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  320. package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
  321. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  322. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  323. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  324. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  325. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  326. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  327. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  328. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  329. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  330. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  331. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  332. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  333. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  334. package/dist/src/web-ui/app/dashboard-feature.js +12 -2
  335. package/dist/src/web-ui/app/lib/reasoning-controls.js +40 -0
  336. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  337. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  338. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  339. package/dist/src/web-ui/app/passive-learning-feature.js +18 -5
  340. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  341. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  342. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  343. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  344. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  345. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  346. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  347. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  348. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  349. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  350. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  351. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  352. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  353. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  354. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  355. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  356. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  357. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  358. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  359. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  360. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  361. package/dist/src/web-ui/app/styles/95-home-widgets.css +109 -0
  362. package/dist/src/web-ui/app/styles.css +3 -0
  363. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  364. package/dist/src/web-ui/client-state/contracts.js +13 -0
  365. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  366. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  367. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  368. package/dist/src/web-ui/client-state/preferences.js +84 -0
  369. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  370. package/dist/src/web-ui/client-state/queue.js +43 -0
  371. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  372. package/dist/src/web-ui/client-state/routes.js +58 -0
  373. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  374. package/dist/src/web-ui/client-state/store.js +88 -0
  375. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  376. package/dist/src/web-ui/local-runtime/http.js +11 -2
  377. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  378. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  379. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  380. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  381. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  382. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  383. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  384. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  385. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  386. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  387. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  388. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  389. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  390. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  391. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  392. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  393. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  394. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  395. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  396. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  397. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  398. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  399. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  400. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  401. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  402. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  403. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  404. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  405. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  406. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  407. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  408. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  409. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  410. package/dist/src/web-ui/server-readiness.js +36 -0
  411. package/dist/src/web-ui/server.d.ts +2 -0
  412. package/dist/src/web-ui/server.js +23 -1
  413. package/dist/src/web-ui/system-host-service.js +13 -2
  414. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  415. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  416. package/docs/installation.md +44 -5
  417. package/docs/plugins.md +174 -28
  418. package/docs/tool-execution-result-evidence-contract.md +57 -0
  419. package/docs/windows-companion-store.md +5 -0
  420. package/package.json +4 -2
  421. package/plugins/capability-brief/plugin.json +5 -1
  422. package/plugins/code-outline/README.md +20 -0
  423. package/plugins/code-outline/plugin.json +2 -1
  424. package/plugins/code-outline/source/index.ts +16 -20
  425. package/plugins/code-outline/source/read-failure.ts +40 -0
  426. package/plugins/code-outline/src/index.cjs +614 -29
  427. package/plugins/document-reader/README.md +33 -0
  428. package/plugins/document-reader/plugin.json +2 -1
  429. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  430. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  431. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  432. package/plugins/document-reader/source/pdf-process.ts +207 -0
  433. package/plugins/document-reader/source/pdf-result.ts +79 -0
  434. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  435. package/plugins/document-reader/source/pdf.ts +4 -1
  436. package/plugins/document-reader/source/read-failure.ts +37 -0
  437. package/plugins/document-reader/source/reader.ts +3 -19
  438. package/plugins/document-reader/src/index.cjs +995 -211
  439. package/plugins/exec/README.md +19 -0
  440. package/plugins/exec/plugin.json +4 -3
  441. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  442. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  443. package/plugins/exec/source/filesystem-observer.ts +8 -79
  444. package/plugins/exec/source/output-files.ts +12 -6
  445. package/plugins/exec/source/paths.ts +3 -1
  446. package/plugins/exec/source/process-manager.ts +8 -24
  447. package/plugins/exec/source/shell-platform.ts +19 -3
  448. package/plugins/exec/source/shell-process.ts +55 -0
  449. package/plugins/exec/source/windows-job-source.ts +1 -0
  450. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  451. package/plugins/exec/src/index.cjs +252 -96
  452. package/plugins/filesystem/README.md +65 -0
  453. package/plugins/filesystem/plugin.json +7 -3
  454. package/plugins/filesystem/source/atomic-write.ts +2 -0
  455. package/plugins/filesystem/source/bounded-io.ts +80 -306
  456. package/plugins/filesystem/source/directory-sample.ts +2 -0
  457. package/plugins/filesystem/source/errors.ts +14 -0
  458. package/plugins/filesystem/source/file-observation.ts +151 -0
  459. package/plugins/filesystem/source/file-version.ts +41 -0
  460. package/plugins/filesystem/source/index.ts +6 -0
  461. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  462. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  463. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  464. package/plugins/filesystem/source/windows/operations.ts +197 -0
  465. package/plugins/filesystem/source/windows/process.ts +214 -0
  466. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  467. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  468. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  469. package/plugins/filesystem/source/windows/source.ts +42 -0
  470. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  471. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  472. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  473. package/plugins/filesystem/src/index.cjs +1208 -322
  474. package/plugins/json-inspector/README.md +18 -0
  475. package/plugins/json-inspector/plugin.json +2 -1
  476. package/plugins/json-inspector/source/index.ts +16 -19
  477. package/plugins/json-inspector/source/read-failure.ts +42 -0
  478. package/plugins/json-inspector/src/index.cjs +612 -27
  479. package/plugins/local-search/README.md +29 -0
  480. package/plugins/local-search/plugin.json +2 -1
  481. package/plugins/local-search/source/errors.ts +2 -0
  482. package/plugins/local-search/source/paths.ts +3 -0
  483. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  484. package/plugins/local-search/source/ripgrep.ts +3 -3
  485. package/plugins/local-search/source/windows-authority.ts +99 -0
  486. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  487. package/plugins/local-search/source/windows-search-process.ts +91 -0
  488. package/plugins/local-search/source/windows-search-script.ts +52 -0
  489. package/plugins/local-search/src/index.cjs +595 -26
  490. package/plugins/memory/plugin.json +5 -1
  491. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  492. package/plugins/memory/source/lock-owner-file.ts +71 -0
  493. package/plugins/memory/source/lock-path-observation.ts +26 -0
  494. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  495. package/plugins/memory/source/store-lock.ts +12 -7
  496. package/plugins/memory/source/store.ts +3 -2
  497. package/plugins/memory/src/index.cjs +174 -25
  498. package/plugins/project-orientation/README.md +23 -0
  499. package/plugins/project-orientation/plugin.json +2 -1
  500. package/plugins/project-orientation/source/index.ts +12 -9
  501. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  502. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  503. package/plugins/project-orientation/source/tree.ts +6 -0
  504. package/plugins/project-orientation/src/index.cjs +647 -31
  505. package/plugins/system/README.md +51 -15
  506. package/plugins/system/plugin.json +6 -2
  507. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  508. package/plugins/system/source/command-working-directory.ts +47 -0
  509. package/plugins/system/source/computer/handlers.ts +13 -9
  510. package/plugins/system/source/computer/observation-result.ts +10 -5
  511. package/plugins/system/source/computer/request-computers.ts +10 -3
  512. package/plugins/system/source/computer/request-modules.ts +3 -6
  513. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  514. package/plugins/system/source/host-dispatch.ts +18 -2
  515. package/plugins/system/source/index.ts +5 -3
  516. package/plugins/system/source/local-command-output-retention.ts +16 -0
  517. package/plugins/system/source/local-command-output.ts +16 -8
  518. package/plugins/system/source/request-system-modules.ts +12 -2
  519. package/plugins/system/source/request-target-snapshot.ts +2 -1
  520. package/plugins/system/source/security/desktop-result.ts +177 -0
  521. package/plugins/system/source/security/observed-error.ts +10 -0
  522. package/plugins/system/source/security/secret-text.ts +118 -0
  523. package/plugins/system/source/security/system-results.ts +62 -0
  524. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  525. package/plugins/system/src/index.cjs +837 -151
  526. package/plugins/system-probe/plugin.json +9 -3
  527. package/plugins/system-probe/source/disk-path.ts +8 -0
  528. package/plugins/system-probe/source/index.ts +10 -5
  529. package/plugins/system-probe/source/machine-load.ts +33 -0
  530. package/plugins/system-probe/source/metrics.ts +6 -8
  531. package/plugins/system-probe/src/index.cjs +49 -16
  532. package/plugins/web/plugin.json +5 -1
@@ -0,0 +1,33 @@
1
+ # Document Reader
2
+
3
+ Reads bounded text from PDF, DOCX, XLSX, PPTX, TXT, CSV, MD, JSON and RTF files
4
+ on Linux, macOS and native Windows. Sources are request attachments or files
5
+ inside the configured agent work directory and workspace. Request-specific
6
+ path restrictions and attachment identities retain their existing meaning.
7
+
8
+ The shared limits remain 10 MiB per input file, 40,000 characters per requested
9
+ window, and the existing archive expansion and PDF worker resource limits.
10
+ Results describe pagination and omitted text. The reader does not execute
11
+ document macros or modify the source.
12
+
13
+ ## Windows requirements
14
+
15
+ The SDK reads through built-in Windows PowerShell and its C# helper. No
16
+ Companion, WSL, Docker, elevation or execution-policy bypass is needed.
17
+ A blocked reader returns `document_safe_read_unavailable` and instructs the
18
+ model not to retry or bypass the restriction. Request cancellation stops the
19
+ read and extraction. PDF and Office parsing use the same packaged libraries
20
+ as the other platforms; no Office installation or OCR is required.
21
+
22
+ PDF parsing runs in a separate Node process on Windows to keep native parser
23
+ faults out of the Runtime. Linux/macOS retain their worker-thread boundary.
24
+ Both use the same parser, page/text limits and 30-second deadline. Windows
25
+ passes documents through pipes, without temporary document files, and waits
26
+ for process exit on cancellation. The V8 old-generation limit is 128 MiB,
27
+ young-generation at most 16 MiB (4 MiB semi-spaces), and stack 4 MiB. These
28
+ are JavaScript engine limits, not a cap on native allocations. Explicit Node CLI flags enforce the heap and stack limits; operator-provided
29
+ Node configuration remains inherited.
30
+
31
+ If Windows cannot start or stop the PDF process, the tool returns
32
+ `document_pdf_process_unavailable` and asks the model not to retry or bypass
33
+ the restriction.
@@ -2,8 +2,9 @@
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "document-reader",
4
4
  "version": "0.1.0",
5
- "description": "Extract bounded text from PDF, Office and supported text documents. Use file readers for source code.",
5
+ "description": "Read text from PDF, Office, and supported text documents.",
6
6
  "extensions": {
7
+ "ai.abot.compatibility": { "version": 1, "runtimePlatforms": ["linux", "darwin", "win32"] },
7
8
  "ai.abot.runtime": {
8
9
  "version": 1,
9
10
  "entrypoint": "./src/index.cjs",
@@ -0,0 +1,57 @@
1
+ import {
2
+ MAX_PDF_PAGES,
3
+ MAX_RETAINED_TEXT_CHARS,
4
+ PDF_EXTRACTION_TIMEOUT_MS,
5
+ PDF_MAX_OLD_GENERATION_MB,
6
+ PDF_MAX_STACK_MB,
7
+ PDF_MAX_YOUNG_GENERATION_MB,
8
+ PDF_PAGE_BATCH_SIZE,
9
+ } from "./constants.js";
10
+
11
+ export type PdfExtractionLimits = Readonly<{
12
+ maxPages: number;
13
+ pageBatchSize: number;
14
+ maxRetainedCharacters: number;
15
+ timeoutMs: number;
16
+ maxOldGenerationSizeMb: number;
17
+ maxYoungGenerationSizeMb: number;
18
+ stackSizeMb: number;
19
+ }>;
20
+
21
+ export const PDF_EXTRACTION_LIMITS: PdfExtractionLimits = Object.freeze({
22
+ maxPages: MAX_PDF_PAGES,
23
+ pageBatchSize: PDF_PAGE_BATCH_SIZE,
24
+ maxRetainedCharacters: MAX_RETAINED_TEXT_CHARS,
25
+ timeoutMs: PDF_EXTRACTION_TIMEOUT_MS,
26
+ maxOldGenerationSizeMb: PDF_MAX_OLD_GENERATION_MB,
27
+ maxYoungGenerationSizeMb: PDF_MAX_YOUNG_GENERATION_MB,
28
+ stackSizeMb: PDF_MAX_STACK_MB,
29
+ });
30
+
31
+ type PdfWorkerSuccess = Readonly<{
32
+ kind: "success";
33
+ text: string;
34
+ totalCharacters: number;
35
+ returnedCharacters: number;
36
+ totalPages: number;
37
+ processedPages: number;
38
+ }>;
39
+
40
+ type PdfWorkerFailure = Readonly<{
41
+ kind: "failure";
42
+ code?: string;
43
+ message: string;
44
+ }>;
45
+
46
+ export type PdfWorkerMessage = PdfWorkerSuccess | PdfWorkerFailure;
47
+
48
+ export type PdfParserInput = Readonly<{
49
+ bytes: ArrayBuffer | Uint8Array;
50
+ pdfParseEntrypoint: string;
51
+ limits: Readonly<{
52
+ maxPages: number;
53
+ pageBatchSize: number;
54
+ maxRetainedCharacters: number;
55
+ maxErrorMessageCharacters: number;
56
+ }>;
57
+ }>;
@@ -0,0 +1,139 @@
1
+ import type { PdfParserInput, PdfWorkerMessage } from "./pdf-contract.js";
2
+
3
+ // Serialized into the isolated parser. Keep runtime dependencies inside this function.
4
+ export async function runPdfParser(
5
+ data: PdfParserInput,
6
+ publish: (message: PdfWorkerMessage) => void,
7
+ ): Promise<void> {
8
+ const fail = (code: string, message: string): never => {
9
+ const error = new Error(message) as Error & { code: string };
10
+ error.code = code;
11
+ throw error;
12
+ };
13
+
14
+ const boundedMessage = (value: unknown): string => {
15
+ const message = value instanceof Error ? value.message : String(value);
16
+ return message.slice(0, data.limits.maxErrorMessageCharacters);
17
+ };
18
+
19
+ let parser:
20
+ | InstanceType<(typeof import("pdf-parse"))["PDFParse"]>
21
+ | undefined;
22
+ try {
23
+ const { PDFParse } = require(
24
+ data.pdfParseEntrypoint,
25
+ ) as typeof import("pdf-parse");
26
+ parser = new PDFParse({
27
+ data: new Uint8Array(data.bytes),
28
+ isEvalSupported: false,
29
+ stopAtErrors: true,
30
+ });
31
+ const info = await parser.getInfo();
32
+ const totalPages = info.total;
33
+ if (!Number.isSafeInteger(totalPages) || totalPages < 0) {
34
+ fail("document_content_invalid", "The PDF page index is invalid.");
35
+ }
36
+ if (totalPages > data.limits.maxPages) {
37
+ fail(
38
+ "document_pdf_page_limit",
39
+ `The PDF exceeds the ${data.limits.maxPages}-page parsing limit.`,
40
+ );
41
+ }
42
+
43
+ const retainedParts: string[] = [];
44
+ let retainedCharacters = 0;
45
+ let totalCharacters = 0;
46
+ let processedPages = 0;
47
+ let hasContent = false;
48
+
49
+ const append = (rawValue: string): void => {
50
+ const value = rawValue.replaceAll("\u0000", "").trim();
51
+ if (value.length === 0) return;
52
+ const separator = hasContent ? "\n\n" : "";
53
+ hasContent = true;
54
+ const nextTotal = totalCharacters + separator.length + value.length;
55
+ if (!Number.isSafeInteger(nextTotal)) {
56
+ fail(
57
+ "document_pdf_resource_limit",
58
+ "The PDF text exceeds the supported character range.",
59
+ );
60
+ }
61
+ totalCharacters = nextTotal;
62
+ let remaining = data.limits.maxRetainedCharacters - retainedCharacters;
63
+ if (remaining <= 0) return;
64
+ if (separator.length > 0) {
65
+ const retainedSeparator = separator.slice(0, remaining);
66
+ retainedParts.push(retainedSeparator);
67
+ retainedCharacters += retainedSeparator.length;
68
+ remaining -= retainedSeparator.length;
69
+ }
70
+ if (remaining > 0) {
71
+ const retainedValue = value.slice(0, remaining);
72
+ retainedParts.push(retainedValue);
73
+ retainedCharacters += retainedValue.length;
74
+ }
75
+ };
76
+
77
+ for (
78
+ let firstPage = 1;
79
+ firstPage <= totalPages;
80
+ firstPage += data.limits.pageBatchSize
81
+ ) {
82
+ const pageNumbers = Array.from(
83
+ {
84
+ length: Math.min(
85
+ data.limits.pageBatchSize,
86
+ totalPages - firstPage + 1,
87
+ ),
88
+ },
89
+ (_, index) => firstPage + index,
90
+ );
91
+ const batch = await parser.getText({
92
+ partial: pageNumbers,
93
+ pageJoiner: "",
94
+ });
95
+ if (!Array.isArray(batch.pages)) {
96
+ fail(
97
+ "document_content_invalid",
98
+ "The PDF page set could not be extracted.",
99
+ );
100
+ }
101
+ for (const page of batch.pages) {
102
+ if (typeof page?.text !== "string") {
103
+ fail("document_content_invalid", "The PDF page text is invalid.");
104
+ }
105
+ processedPages += 1;
106
+ append(page.text);
107
+ }
108
+ }
109
+ if (processedPages !== totalPages) {
110
+ fail(
111
+ "document_content_invalid",
112
+ "The PDF page set could not be extracted completely.",
113
+ );
114
+ }
115
+ publish({
116
+ kind: "success",
117
+ text: retainedParts.join(""),
118
+ totalCharacters,
119
+ returnedCharacters: retainedCharacters,
120
+ totalPages,
121
+ processedPages,
122
+ } satisfies Extract<PdfWorkerMessage, { kind: "success" }>);
123
+ } catch (error) {
124
+ const candidateCode =
125
+ error instanceof Error &&
126
+ typeof (error as Error & { code?: unknown }).code === "string"
127
+ ? (error as Error & { code: string }).code
128
+ : undefined;
129
+ publish({
130
+ kind: "failure",
131
+ ...(candidateCode ? { code: candidateCode } : {}),
132
+ message: boundedMessage(error),
133
+ } satisfies Extract<PdfWorkerMessage, { kind: "failure" }>);
134
+ } finally {
135
+ if (parser) {
136
+ await parser.destroy().catch(() => undefined);
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,56 @@
1
+ import type { PdfParserInput, PdfWorkerMessage } from "./pdf-contract.js";
2
+ import type { runPdfParser } from "./pdf-parser.js";
3
+
4
+ export const PDF_PROCESS_HEADER_MAX_BYTES = 64 * 1024;
5
+
6
+ // Serialized into a fresh Node process; no imports from the host are evaluated there.
7
+ export async function pdfProcessMain(
8
+ parse: typeof runPdfParser,
9
+ maxInputBytes: number,
10
+ maxHeaderBytes: number,
11
+ maxHeapBytes: number,
12
+ ): Promise<void> {
13
+ // Parser diagnostics are not part of the result protocol or user-visible evidence.
14
+ console.log = console.warn = console.error = () => undefined;
15
+ try {
16
+ const { heap_size_limit } = require("node:v8").getHeapStatistics();
17
+ if (heap_size_limit > maxHeapBytes) {
18
+ const failure: PdfWorkerMessage = {
19
+ kind: "failure",
20
+ code: "document_pdf_resource_limit",
21
+ message: "PDF extraction could not establish its memory limit.",
22
+ };
23
+ process.stdout.end(JSON.stringify(failure), () => process.exit(0));
24
+ return;
25
+ }
26
+ const chunks: Buffer[] = [];
27
+ let size = 0;
28
+ for await (const chunk of process.stdin) {
29
+ size += chunk.length;
30
+ if (size > maxInputBytes + maxHeaderBytes + 1) {
31
+ throw new Error("PDF process input exceeds its limit.");
32
+ }
33
+ chunks.push(chunk);
34
+ }
35
+ const input = Buffer.concat(chunks, size);
36
+ const separator = input.indexOf(10);
37
+ if (separator < 0) throw new Error("Missing PDF process header.");
38
+ if (separator > maxHeaderBytes)
39
+ throw new Error("PDF process header is too large.");
40
+ const bytes = input.subarray(separator + 1);
41
+ if (bytes.length > maxInputBytes)
42
+ throw new Error("PDF process input is too large.");
43
+ const header = JSON.parse(
44
+ input.subarray(0, separator).toString("utf8"),
45
+ ) as Omit<PdfParserInput, "bytes">;
46
+ let result: PdfWorkerMessage | undefined;
47
+ await parse({ ...header, bytes }, (message) => {
48
+ result = message;
49
+ });
50
+ if (!result) throw new Error("PDF parser returned no result.");
51
+ process.stdout.end(JSON.stringify(result), () => process.exit(0));
52
+ } catch {
53
+ // The parent reports a bounded failure; document bytes and native diagnostics stay private.
54
+ process.exit(1);
55
+ }
56
+ }
@@ -0,0 +1,207 @@
1
+ import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process";
2
+ import {
3
+ MAX_DOCUMENT_BYTES,
4
+ MAX_PDF_ERROR_MESSAGE_CHARS,
5
+ } from "./constants.js";
6
+ import { DocumentReaderError } from "./errors.js";
7
+ import {
8
+ PDF_EXTRACTION_LIMITS,
9
+ type PdfExtractionLimits,
10
+ } from "./pdf-contract.js";
11
+ import { runPdfParser } from "./pdf-parser.js";
12
+ import {
13
+ PDF_PROCESS_HEADER_MAX_BYTES,
14
+ pdfProcessMain,
15
+ } from "./pdf-process-main.js";
16
+ import { documentFromPdfMessage } from "./pdf-result.js";
17
+ import type { ExtractedDocument } from "./types.js";
18
+
19
+ function pdfSemiSpaceLimitMb(youngGenerationMb: number): number {
20
+ // V8 rounds semi-spaces up to a power of two. Choose a lower power so its
21
+ // three-space young generation stays within the declared memory budget.
22
+ const maximum = Math.floor(youngGenerationMb / 3);
23
+ let size = 1;
24
+ while (size * 2 <= maximum) size *= 2;
25
+ return size;
26
+ }
27
+
28
+ function pdfProcessArguments(limits: PdfExtractionLimits): string[] {
29
+ return [
30
+ "--input-type=commonjs",
31
+ "--max-old-space-size=" + limits.maxOldGenerationSizeMb,
32
+ // V8's young generation uses three semi-spaces; keep it within the existing bound.
33
+ "--max-semi-space-size=" +
34
+ pdfSemiSpaceLimitMb(limits.maxYoungGenerationSizeMb),
35
+ "--stack-size=" + Math.floor(limits.stackSizeMb * 1024),
36
+ "--eval",
37
+ "(" +
38
+ pdfProcessMain.toString() +
39
+ ")(" +
40
+ runPdfParser.toString() +
41
+ ", " +
42
+ MAX_DOCUMENT_BYTES +
43
+ ", " +
44
+ PDF_PROCESS_HEADER_MAX_BYTES +
45
+ ", " +
46
+ (limits.maxOldGenerationSizeMb + limits.maxYoungGenerationSizeMb) *
47
+ 1024 *
48
+ 1024 +
49
+ ")",
50
+ ];
51
+ }
52
+
53
+ export function createPdfExtractionProcess(
54
+ bytes: Uint8Array,
55
+ pdfParseEntrypoint: string,
56
+ limits: PdfExtractionLimits,
57
+ ): ChildProcessWithoutNullStreams {
58
+ const header = Buffer.from(
59
+ JSON.stringify({
60
+ pdfParseEntrypoint,
61
+ limits: {
62
+ maxPages: limits.maxPages,
63
+ pageBatchSize: limits.pageBatchSize,
64
+ maxRetainedCharacters: limits.maxRetainedCharacters,
65
+ maxErrorMessageCharacters: MAX_PDF_ERROR_MESSAGE_CHARS,
66
+ },
67
+ }) + "\n",
68
+ );
69
+ if (header.length > PDF_PROCESS_HEADER_MAX_BYTES) {
70
+ throw new Error("PDF process header exceeds its limit.");
71
+ }
72
+ const child = spawn(process.execPath, pdfProcessArguments(limits), {
73
+ windowsHide: true,
74
+ stdio: ["pipe", "pipe", "pipe"],
75
+ });
76
+ child.stdin.write(header);
77
+ child.stdin.end(Buffer.from(bytes));
78
+ return child;
79
+ }
80
+
81
+ function pdfCancellationError(): DocumentReaderError {
82
+ return new DocumentReaderError(
83
+ "document_read_cancelled",
84
+ "Document reading was cancelled.",
85
+ );
86
+ }
87
+
88
+ function pdfResourceError(message: string): DocumentReaderError {
89
+ return new DocumentReaderError("document_pdf_resource_limit", message);
90
+ }
91
+
92
+ function didPdfProcessExitCleanly(
93
+ code: number | null,
94
+ signal: NodeJS.Signals | null,
95
+ ): boolean {
96
+ if (signal !== null) return false;
97
+ return code === 0;
98
+ }
99
+
100
+ export async function extractPdfInProcess(
101
+ bytes: Uint8Array,
102
+ params: Readonly<{
103
+ pdfParseEntrypoint: string;
104
+ signal?: AbortSignal;
105
+ limits?: PdfExtractionLimits;
106
+ }>,
107
+ ): Promise<ExtractedDocument> {
108
+ if (params.signal?.aborted) throw pdfCancellationError();
109
+ if (bytes.byteLength > MAX_DOCUMENT_BYTES) {
110
+ throw new DocumentReaderError(
111
+ "document_file_too_large",
112
+ "The PDF exceeds the input size limit.",
113
+ );
114
+ }
115
+ const limits = params.limits ?? PDF_EXTRACTION_LIMITS;
116
+ const child = createPdfExtractionProcess(
117
+ bytes,
118
+ params.pdfParseEntrypoint,
119
+ limits,
120
+ );
121
+ // A JSON string can use six bytes per UTF-16 code unit, plus fixed metadata.
122
+ const maxResultBytes = limits.maxRetainedCharacters * 6 + 4096;
123
+ return new Promise<ExtractedDocument>((resolve, reject) => {
124
+ const chunks: Buffer[] = [];
125
+ let resultBytes = 0;
126
+ let failure: Error | undefined;
127
+ const stopPdfProcess = (error: Error): void => {
128
+ if (failure) return;
129
+ failure = error;
130
+ chunks.length = 0;
131
+ child.stdin.destroy();
132
+ child.kill("SIGKILL");
133
+ };
134
+ const onAbort = (): void => stopPdfProcess(pdfCancellationError());
135
+ const timeout = setTimeout(
136
+ () =>
137
+ stopPdfProcess(
138
+ pdfResourceError(
139
+ "PDF extraction exceeded the " +
140
+ limits.timeoutMs +
141
+ "-millisecond time limit.",
142
+ ),
143
+ ),
144
+ limits.timeoutMs,
145
+ );
146
+ timeout.unref();
147
+ child.stdout.on("data", (chunk: Buffer) => {
148
+ if (failure) return;
149
+ resultBytes += chunk.length;
150
+ if (resultBytes > maxResultBytes) {
151
+ stopPdfProcess(
152
+ pdfResourceError("PDF extraction exceeded its result size limit."),
153
+ );
154
+ return;
155
+ }
156
+ chunks.push(chunk);
157
+ });
158
+ child.stderr.resume();
159
+ child.stdin.on("error", () =>
160
+ stopPdfProcess(
161
+ new Error("PDF extraction process could not receive its input."),
162
+ ),
163
+ );
164
+ child.stdout.on("error", () =>
165
+ stopPdfProcess(
166
+ new Error("PDF extraction process could not return its result."),
167
+ ),
168
+ );
169
+ child.stderr.on("error", () =>
170
+ stopPdfProcess(new Error("PDF extraction process stream failed.")),
171
+ );
172
+ child.on("error", () =>
173
+ stopPdfProcess(
174
+ new DocumentReaderError(
175
+ "document_pdf_process_unavailable",
176
+ "The PDF extraction process could not be started or stopped. Do not retry or bypass this restriction with another tool; ask the user to check system requirements or contact their administrator.",
177
+ ),
178
+ ),
179
+ );
180
+ child.once("close", (code, signal) => {
181
+ clearTimeout(timeout);
182
+ params.signal?.removeEventListener("abort", onAbort);
183
+ if (failure) {
184
+ reject(failure);
185
+ return;
186
+ }
187
+ if (!didPdfProcessExitCleanly(code, signal)) {
188
+ reject(new Error("PDF extraction process stopped unexpectedly."));
189
+ return;
190
+ }
191
+ try {
192
+ const message: unknown = JSON.parse(
193
+ Buffer.concat(chunks, resultBytes).toString("utf8"),
194
+ );
195
+ resolve(documentFromPdfMessage(message, limits));
196
+ } catch (error) {
197
+ if (error instanceof SyntaxError) {
198
+ reject(new Error("PDF extraction process returned invalid data."));
199
+ return;
200
+ }
201
+ reject(error);
202
+ }
203
+ });
204
+ params.signal?.addEventListener("abort", onAbort, { once: true });
205
+ if (params.signal?.aborted) onAbort();
206
+ });
207
+ }
@@ -0,0 +1,79 @@
1
+ import { MAX_PDF_ERROR_MESSAGE_CHARS } from "./constants.js";
2
+ import { DocumentReaderError } from "./errors.js";
3
+ import type { PdfExtractionLimits, PdfWorkerMessage } from "./pdf-contract.js";
4
+ import type { ExtractedDocument } from "./types.js";
5
+
6
+ const CONTROLLED_PDF_ERROR_CODES = new Set([
7
+ "document_content_invalid",
8
+ "document_pdf_page_limit",
9
+ "document_pdf_resource_limit",
10
+ ]);
11
+
12
+ function isSafeNonNegativeInteger(value: unknown): value is number {
13
+ return Number.isSafeInteger(value) && typeof value === "number" && value >= 0;
14
+ }
15
+
16
+ function isPdfWorkerMessage(value: unknown): value is PdfWorkerMessage {
17
+ if (!value || typeof value !== "object") return false;
18
+ const candidate = value as Partial<PdfWorkerMessage>;
19
+ if (candidate.kind === "failure") {
20
+ return (
21
+ typeof candidate.message === "string" &&
22
+ candidate.message.length <= MAX_PDF_ERROR_MESSAGE_CHARS &&
23
+ (candidate.code === undefined || typeof candidate.code === "string")
24
+ );
25
+ }
26
+ return (
27
+ candidate.kind === "success" &&
28
+ typeof candidate.text === "string" &&
29
+ isSafeNonNegativeInteger(candidate.totalCharacters) &&
30
+ isSafeNonNegativeInteger(candidate.returnedCharacters) &&
31
+ isSafeNonNegativeInteger(candidate.totalPages) &&
32
+ isSafeNonNegativeInteger(candidate.processedPages)
33
+ );
34
+ }
35
+
36
+ function isBoundedPdfSuccess(
37
+ message: Extract<PdfWorkerMessage, { kind: "success" }>,
38
+ limits: PdfExtractionLimits,
39
+ ): boolean {
40
+ if (message.text.length !== message.returnedCharacters) return false;
41
+ if (message.returnedCharacters > limits.maxRetainedCharacters) return false;
42
+ if (message.returnedCharacters > message.totalCharacters) return false;
43
+ if (message.totalPages > limits.maxPages) return false;
44
+ return message.processedPages === message.totalPages;
45
+ }
46
+
47
+ export function documentFromPdfMessage(
48
+ message: unknown,
49
+ limits: PdfExtractionLimits,
50
+ ): ExtractedDocument {
51
+ if (!isPdfWorkerMessage(message)) {
52
+ throw new Error("PDF extraction worker returned invalid data.");
53
+ }
54
+ if (message.kind === "failure") {
55
+ if (message.code && CONTROLLED_PDF_ERROR_CODES.has(message.code)) {
56
+ throw new DocumentReaderError(message.code, message.message);
57
+ }
58
+ throw new Error(message.message);
59
+ }
60
+ if (!isBoundedPdfSuccess(message, limits)) {
61
+ throw new Error("PDF extraction worker exceeded its contract.");
62
+ }
63
+ return Object.freeze({
64
+ text: message.text,
65
+ textBounds: Object.freeze({
66
+ truncated: message.totalCharacters > message.returnedCharacters,
67
+ totalCharacters: message.totalCharacters,
68
+ returnedCharacters: message.returnedCharacters,
69
+ omittedCharacters: message.totalCharacters - message.returnedCharacters,
70
+ maxCharacters: limits.maxRetainedCharacters,
71
+ }),
72
+ format: Object.freeze({
73
+ kind: "pdf",
74
+ totalPages: message.totalPages,
75
+ processedPages: message.processedPages,
76
+ maxPages: limits.maxPages,
77
+ }),
78
+ });
79
+ }