@abot-ai/runtime 1.7.0 → 1.8.0

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 (443) hide show
  1. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  2. package/dist/src/cli/abot.js +2 -0
  3. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  4. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  5. package/dist/src/computer-access/collection-consent.js +47 -0
  6. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  7. package/dist/src/computer-access/command-output-capture.js +134 -68
  8. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  9. package/dist/src/computer-access/command-output-protection.js +59 -0
  10. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  11. package/dist/src/computer-access/companion/command-output.js +23 -6
  12. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  13. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  14. package/dist/src/computer-access/companion/native-session.js +6 -2
  15. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  16. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  17. package/dist/src/computer-access/companion/observation-process.js +51 -25
  18. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  19. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  20. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  21. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  22. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  23. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  24. package/dist/src/computer-access/handlers.d.ts +2 -1
  25. package/dist/src/computer-access/handlers.js +79 -11
  26. package/dist/src/computer-access/host-observation.d.ts +3 -3
  27. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  28. package/dist/src/computer-access/native-observation-connection.js +78 -0
  29. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  30. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  31. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  32. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  33. package/dist/src/computer-access/observation-source.d.ts +6 -0
  34. package/dist/src/computer-access/observation-source.js +10 -0
  35. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  36. package/dist/src/computer-access/security/desktop-result.js +146 -0
  37. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  38. package/dist/src/computer-access/security/observed-error.js +10 -0
  39. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  40. package/dist/src/computer-access/security/secret-text.js +111 -0
  41. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  42. package/dist/src/computer-access/security/system-results.js +53 -0
  43. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  44. package/dist/src/computer-access/system-result-protection.js +1 -0
  45. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  46. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  47. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  48. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  49. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  50. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  51. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  52. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  53. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  54. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  55. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  56. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  57. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  58. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  59. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  60. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  61. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  62. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  63. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  64. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  65. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  66. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  67. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  68. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  69. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  70. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  71. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  72. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  73. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  74. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  75. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  76. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  77. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  78. package/dist/src/model-gateway/server.js +5 -1
  79. package/dist/src/plugin-contract/index.d.ts +1 -0
  80. package/dist/src/plugin-contract/index.js +1 -0
  81. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  82. package/dist/src/plugin-contract/manifest.js +1 -0
  83. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  84. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  85. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  86. package/dist/src/plugin-sdk/computer-access.js +1 -0
  87. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  88. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  89. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  90. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  91. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  92. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  93. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  94. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  95. package/dist/src/plugin-sdk/files.js +4 -0
  96. package/dist/src/plugin-sdk/index.d.ts +1 -0
  97. package/dist/src/plugin-sdk/index.js +1 -0
  98. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  99. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  100. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  101. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  102. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  103. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  104. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  105. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  106. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  107. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  108. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  109. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  110. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  111. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  112. package/dist/src/runtime/passive-learning/service.js +2 -3
  113. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  114. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  115. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  116. package/dist/src/runtime/plugins/installation/package.js +2 -0
  117. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  118. package/dist/src/runtime/plugins/loader.js +24 -14
  119. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  120. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  121. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  122. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  123. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  124. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  125. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  126. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  127. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  128. package/dist/src/runtime/request/prepared-execution.js +3 -0
  129. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  130. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  131. package/dist/src/runtime/steps/execution-agent/format.js +2 -3
  132. package/dist/src/runtime/steps/execution-agent/input.js +1 -1
  133. package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
  134. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  135. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  136. package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
  137. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  138. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  139. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  140. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  141. package/dist/src/sessions/durable-session-commit.js +3 -3
  142. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  143. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  144. package/dist/src/sessions/session-store.js +3 -3
  145. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  146. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  147. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  148. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  149. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  150. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  151. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  152. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  153. package/dist/src/shared/windows-job-object.d.ts +2 -0
  154. package/dist/src/shared/windows-job-object.js +66 -0
  155. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  156. package/dist/src/web-ui/app/app-state.js +0 -7
  157. package/dist/src/web-ui/app/app.js +53 -156
  158. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  159. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  160. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  161. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  162. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  163. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  164. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  165. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  166. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  167. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  168. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  169. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  170. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  171. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  172. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  173. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  174. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  175. package/dist/src/web-ui/app/components/passive-learning/home.js +7 -2
  176. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  177. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  178. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  179. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  180. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  181. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  182. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  183. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  184. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  185. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  186. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  187. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  188. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  189. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  190. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  191. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  192. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  193. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  194. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  195. package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
  196. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  197. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  198. package/dist/src/web-ui/app/components/system-host/rendering.js +3 -0
  199. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  200. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  201. package/dist/src/web-ui/app/configuration-feature.js +9 -1
  202. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  203. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  204. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  205. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  206. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  207. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  208. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  209. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  210. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  211. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  212. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  213. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  214. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  215. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  216. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  217. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  218. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  219. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  220. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  221. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  222. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  223. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  224. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  225. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  226. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  227. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  228. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  229. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  230. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  231. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  232. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  233. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  234. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  235. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  236. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  237. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  238. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  239. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  240. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  241. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  242. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  243. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  244. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  245. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  246. package/dist/src/web-ui/app/dashboard-feature.js +3 -2
  247. package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
  248. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  249. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  250. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  251. package/dist/src/web-ui/app/passive-learning-feature.js +16 -3
  252. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  253. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  254. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  255. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  256. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  257. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  258. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  259. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  260. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  261. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  262. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  263. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  264. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  265. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  266. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  267. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  268. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  269. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  270. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  271. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  272. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  273. package/dist/src/web-ui/app/styles.css +2 -0
  274. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  275. package/dist/src/web-ui/client-state/contracts.js +13 -0
  276. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  277. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  278. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  279. package/dist/src/web-ui/client-state/preferences.js +84 -0
  280. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  281. package/dist/src/web-ui/client-state/queue.js +43 -0
  282. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  283. package/dist/src/web-ui/client-state/routes.js +58 -0
  284. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  285. package/dist/src/web-ui/client-state/store.js +88 -0
  286. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  287. package/dist/src/web-ui/local-runtime/http.js +11 -2
  288. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  289. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  290. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  291. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  292. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  293. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  294. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  295. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  296. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  297. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  298. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  299. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  300. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  301. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  302. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  303. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  304. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  305. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  306. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  307. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  308. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  309. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  310. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  311. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  312. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  313. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  314. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  315. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  316. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  317. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  318. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  319. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  320. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  321. package/dist/src/web-ui/server-readiness.js +36 -0
  322. package/dist/src/web-ui/server.d.ts +2 -0
  323. package/dist/src/web-ui/server.js +23 -1
  324. package/dist/src/web-ui/system-host-service.js +13 -2
  325. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  326. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  327. package/docs/installation.md +44 -5
  328. package/docs/plugins.md +145 -4
  329. package/docs/tool-execution-result-evidence-contract.md +57 -0
  330. package/docs/windows-companion-store.md +5 -0
  331. package/package.json +4 -2
  332. package/plugins/capability-brief/plugin.json +4 -0
  333. package/plugins/code-outline/README.md +20 -0
  334. package/plugins/code-outline/plugin.json +1 -0
  335. package/plugins/code-outline/source/index.ts +16 -20
  336. package/plugins/code-outline/source/read-failure.ts +40 -0
  337. package/plugins/code-outline/src/index.cjs +614 -29
  338. package/plugins/document-reader/README.md +33 -0
  339. package/plugins/document-reader/plugin.json +1 -0
  340. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  341. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  342. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  343. package/plugins/document-reader/source/pdf-process.ts +207 -0
  344. package/plugins/document-reader/source/pdf-result.ts +79 -0
  345. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  346. package/plugins/document-reader/source/pdf.ts +4 -1
  347. package/plugins/document-reader/source/read-failure.ts +37 -0
  348. package/plugins/document-reader/source/reader.ts +3 -19
  349. package/plugins/document-reader/src/index.cjs +995 -211
  350. package/plugins/exec/README.md +19 -0
  351. package/plugins/exec/plugin.json +4 -3
  352. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  353. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  354. package/plugins/exec/source/filesystem-observer.ts +8 -79
  355. package/plugins/exec/source/output-files.ts +12 -6
  356. package/plugins/exec/source/paths.ts +3 -1
  357. package/plugins/exec/source/process-manager.ts +8 -24
  358. package/plugins/exec/source/shell-platform.ts +19 -3
  359. package/plugins/exec/source/shell-process.ts +55 -0
  360. package/plugins/exec/source/windows-job-source.ts +1 -0
  361. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  362. package/plugins/exec/src/index.cjs +252 -96
  363. package/plugins/filesystem/README.md +65 -0
  364. package/plugins/filesystem/plugin.json +6 -2
  365. package/plugins/filesystem/source/atomic-write.ts +2 -0
  366. package/plugins/filesystem/source/bounded-io.ts +80 -306
  367. package/plugins/filesystem/source/directory-sample.ts +2 -0
  368. package/plugins/filesystem/source/errors.ts +14 -0
  369. package/plugins/filesystem/source/file-observation.ts +151 -0
  370. package/plugins/filesystem/source/file-version.ts +41 -0
  371. package/plugins/filesystem/source/index.ts +6 -0
  372. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  373. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  374. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  375. package/plugins/filesystem/source/windows/operations.ts +197 -0
  376. package/plugins/filesystem/source/windows/process.ts +214 -0
  377. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  378. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  379. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  380. package/plugins/filesystem/source/windows/source.ts +42 -0
  381. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  382. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  383. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  384. package/plugins/filesystem/src/index.cjs +1208 -322
  385. package/plugins/json-inspector/README.md +18 -0
  386. package/plugins/json-inspector/plugin.json +1 -0
  387. package/plugins/json-inspector/source/index.ts +16 -19
  388. package/plugins/json-inspector/source/read-failure.ts +42 -0
  389. package/plugins/json-inspector/src/index.cjs +612 -27
  390. package/plugins/local-search/README.md +29 -0
  391. package/plugins/local-search/plugin.json +1 -0
  392. package/plugins/local-search/source/errors.ts +2 -0
  393. package/plugins/local-search/source/paths.ts +3 -0
  394. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  395. package/plugins/local-search/source/ripgrep.ts +3 -3
  396. package/plugins/local-search/source/windows-authority.ts +99 -0
  397. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  398. package/plugins/local-search/source/windows-search-process.ts +91 -0
  399. package/plugins/local-search/source/windows-search-script.ts +52 -0
  400. package/plugins/local-search/src/index.cjs +595 -26
  401. package/plugins/memory/plugin.json +4 -0
  402. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  403. package/plugins/memory/source/lock-owner-file.ts +71 -0
  404. package/plugins/memory/source/lock-path-observation.ts +26 -0
  405. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  406. package/plugins/memory/source/store-lock.ts +12 -7
  407. package/plugins/memory/source/store.ts +3 -2
  408. package/plugins/memory/src/index.cjs +174 -25
  409. package/plugins/project-orientation/README.md +23 -0
  410. package/plugins/project-orientation/plugin.json +1 -0
  411. package/plugins/project-orientation/source/index.ts +12 -9
  412. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  413. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  414. package/plugins/project-orientation/source/tree.ts +6 -0
  415. package/plugins/project-orientation/src/index.cjs +647 -31
  416. package/plugins/system/README.md +51 -15
  417. package/plugins/system/plugin.json +5 -1
  418. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  419. package/plugins/system/source/command-working-directory.ts +47 -0
  420. package/plugins/system/source/computer/handlers.ts +13 -9
  421. package/plugins/system/source/computer/observation-result.ts +10 -5
  422. package/plugins/system/source/computer/request-computers.ts +10 -3
  423. package/plugins/system/source/computer/request-modules.ts +3 -6
  424. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  425. package/plugins/system/source/host-dispatch.ts +18 -2
  426. package/plugins/system/source/index.ts +5 -3
  427. package/plugins/system/source/local-command-output-retention.ts +16 -0
  428. package/plugins/system/source/local-command-output.ts +16 -8
  429. package/plugins/system/source/request-system-modules.ts +12 -2
  430. package/plugins/system/source/request-target-snapshot.ts +2 -1
  431. package/plugins/system/source/security/desktop-result.ts +177 -0
  432. package/plugins/system/source/security/observed-error.ts +10 -0
  433. package/plugins/system/source/security/secret-text.ts +118 -0
  434. package/plugins/system/source/security/system-results.ts +62 -0
  435. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  436. package/plugins/system/src/index.cjs +837 -151
  437. package/plugins/system-probe/plugin.json +8 -2
  438. package/plugins/system-probe/source/disk-path.ts +8 -0
  439. package/plugins/system-probe/source/index.ts +10 -5
  440. package/plugins/system-probe/source/machine-load.ts +33 -0
  441. package/plugins/system-probe/source/metrics.ts +6 -8
  442. package/plugins/system-probe/src/index.cjs +49 -16
  443. package/plugins/web/plugin.json +4 -0
@@ -6,6 +6,14 @@ var __defProp = Object.defineProperty;
6
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __esm = (fn, res, err) => function __init() {
10
+ if (err) throw err[0];
11
+ try {
12
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
13
+ } catch (e) {
14
+ throw err = [e], e;
15
+ }
16
+ };
9
17
  var __export = (target, all) => {
10
18
  for (var name in all)
11
19
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -20,6 +28,556 @@ var __copyProps = (to, from, except, desc) => {
20
28
  };
21
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
30
 
31
+ // src/shared/windows-file-io/native-script.ts
32
+ var WINDOWS_FILESYSTEM_NATIVE;
33
+ var init_native_script = __esm({
34
+ "src/shared/windows-file-io/native-script.ts"() {
35
+ "use strict";
36
+ WINDOWS_FILESYSTEM_NATIVE = String.raw`
37
+ using System;
38
+ using System.IO;
39
+ using System.Text;
40
+ using System.Linq;
41
+ using System.Collections.Generic;
42
+ using System.ComponentModel;
43
+ using System.Runtime.InteropServices;
44
+ using System.Security.AccessControl;
45
+ using System.Security.Principal;
46
+ using System.Web.Script.Serialization;
47
+ using Microsoft.Win32.SafeHandles;
48
+
49
+ public sealed class FsFault : Exception {
50
+ public readonly string Code;
51
+ public FsFault(string code) : base(code) { Code = code; }
52
+ }
53
+ public static partial class AbotFilesystem {
54
+ [StructLayout(LayoutKind.Sequential)] struct UnicodeString { public ushort Length, MaximumLength; public IntPtr Buffer; }
55
+ [StructLayout(LayoutKind.Sequential)] struct ObjectAttributes {
56
+ public int Length; public IntPtr Root, Name; public uint Attributes; public IntPtr Security, Qos;
57
+ }
58
+ [StructLayout(LayoutKind.Sequential)] struct IoStatus { public IntPtr Status, Information; }
59
+ [StructLayout(LayoutKind.Sequential)] struct BasicInfo {
60
+ public long Created, Accessed, Modified, Changed; public uint Attributes;
61
+ }
62
+ [StructLayout(LayoutKind.Sequential)] struct FileInfo {
63
+ public uint Attributes; public System.Runtime.InteropServices.ComTypes.FILETIME Created, Accessed, Modified;
64
+ public uint Volume, SizeHigh, SizeLow, Links, IndexHigh, IndexLow;
65
+ }
66
+ [DllImport("ntdll.dll")] static extern int NtCreateFile(out SafeFileHandle file, uint access,
67
+ ref ObjectAttributes attributes, out IoStatus status, IntPtr allocation, uint fileAttributes,
68
+ uint share, uint disposition, uint options, IntPtr ea, uint eaLength);
69
+ [DllImport("ntdll.dll")] static extern uint RtlNtStatusToDosError(int status);
70
+ [DllImport("ntdll.dll")] static extern int NtSetInformationFile(SafeFileHandle file,
71
+ out IoStatus status, IntPtr info, uint length, int kind);
72
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool GetFileInformationByHandle(SafeFileHandle file, out FileInfo info);
73
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool GetFileInformationByHandleEx(SafeFileHandle file, int kind, IntPtr data, uint length);
74
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool SetFileInformationByHandle(SafeFileHandle file, int kind, ref BasicInfo info, uint length);
75
+ [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern uint GetFinalPathNameByHandle(SafeFileHandle file, StringBuilder name, uint length, uint flags);
76
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool SetFilePointerEx(SafeFileHandle file, long position, out long result, uint method);
77
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool ReadFile(SafeFileHandle file, byte[] bytes, uint count, out uint read, IntPtr overlapped);
78
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool WriteFile(SafeFileHandle file, byte[] bytes, uint count, out uint written, IntPtr overlapped);
79
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool FlushFileBuffers(SafeFileHandle file);
80
+ [DllImport("advapi32.dll")] static extern uint GetSecurityInfo(SafeFileHandle file, int kind, uint information,
81
+ out IntPtr owner, out IntPtr group, out IntPtr dacl, out IntPtr sacl, out IntPtr descriptor);
82
+ [DllImport("advapi32.dll")] static extern uint SetSecurityInfo(SafeFileHandle file, int kind, uint information,
83
+ IntPtr owner, IntPtr group, IntPtr dacl, IntPtr sacl);
84
+ [DllImport("advapi32.dll", SetLastError=true)] static extern bool GetSecurityDescriptorControl(IntPtr descriptor, out ushort control, out uint revision);
85
+ [DllImport("kernel32.dll")] static extern IntPtr LocalFree(IntPtr value);
86
+
87
+ static void Check(bool success) { if (!success) NativeFailure((uint)Marshal.GetLastWin32Error()); }
88
+ static bool IsNotDirectoryError(uint code) { return code == 267; } // ERROR_DIRECTORY
89
+ static void NativeFailure(uint code) {
90
+ if (IsNotDirectoryError(code)) throw new FsFault("not_a_directory");
91
+ if (code == 2 || code == 3) throw new FsFault("file_not_found");
92
+ if (code == 80 || code == 183) throw new FsFault("filesystem_target_changed");
93
+ if (code == 5 || code == 32 || code == 33) throw new FsFault("filesystem_access_denied");
94
+ throw new FsFault("filesystem_native_operation_failed");
95
+ }
96
+ static void CheckNt(int status) { if (status < 0) NativeFailure(RtlNtStatusToDosError(status)); }
97
+ static SafeFileHandle OpenHandle(SafeFileHandle root, string name, bool directory,
98
+ uint disposition, uint access, uint share, byte[] securityDescriptor = null, bool deleteOnClose = false) {
99
+ IntPtr text = Marshal.StringToHGlobalUni(name), unicodePointer = IntPtr.Zero, securityPointer = IntPtr.Zero;
100
+ try {
101
+ int length = Encoding.Unicode.GetByteCount(name);
102
+ if (length > 65532) throw new FsFault("filesystem_invalid_path");
103
+ UnicodeString unicode = new UnicodeString { Length=(ushort)length, MaximumLength=(ushort)(length+2), Buffer=text };
104
+ unicodePointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(UnicodeString)));
105
+ Marshal.StructureToPtr(unicode, unicodePointer, false);
106
+ if (securityDescriptor != null) {
107
+ securityPointer = Marshal.AllocHGlobal(securityDescriptor.Length);
108
+ Marshal.Copy(securityDescriptor, 0, securityPointer, securityDescriptor.Length);
109
+ }
110
+ ObjectAttributes attributes = new ObjectAttributes {
111
+ Length=Marshal.SizeOf(typeof(ObjectAttributes)), Root=root == null ? IntPtr.Zero : root.DangerousGetHandle(),
112
+ Name=unicodePointer, Attributes=0x40, Security=securityPointer
113
+ };
114
+ SafeFileHandle file;
115
+ IoStatus status;
116
+ int result = NtCreateFile(out file, access | 0x100000, ref attributes, out status,
117
+ IntPtr.Zero, 0x80, share, disposition, 0x200020u | (directory ? 1u : 0x40u) | (deleteOnClose ? 0x1000u : 0u), IntPtr.Zero, 0);
118
+ if (result < 0) { if (file != null) file.Dispose(); CheckNt(result); }
119
+ try {
120
+ FileInfo info; Check(GetFileInformationByHandle(file, out info));
121
+ if ((info.Attributes & 0x400) != 0) throw new FsFault("filesystem_path_changed");
122
+ if (((info.Attributes & 0x10) != 0) != directory) throw new FsFault("filesystem_path_changed");
123
+ return file;
124
+ } catch { file.Dispose(); throw; }
125
+ } finally {
126
+ if (securityPointer != IntPtr.Zero) Marshal.FreeHGlobal(securityPointer);
127
+ if (unicodePointer != IntPtr.Zero) Marshal.FreeHGlobal(unicodePointer);
128
+ Marshal.FreeHGlobal(text);
129
+ }
130
+ }
131
+ static BasicInfo Basic(SafeFileHandle file) {
132
+ IntPtr buffer = Marshal.AllocHGlobal(40);
133
+ try { Check(GetFileInformationByHandleEx(file, 0, buffer, 40)); return (BasicInfo)Marshal.PtrToStructure(buffer, typeof(BasicInfo)); }
134
+ finally { Marshal.FreeHGlobal(buffer); }
135
+ }
136
+ static Dictionary<string,object> Record(params object[] pairs) {
137
+ var result = new Dictionary<string,object>();
138
+ for (int i=0;i<pairs.Length;i+=2) result.Add((string)pairs[i], pairs[i+1]);
139
+ return result;
140
+ }
141
+ static string Text(Dictionary<string,object> request, string key) {
142
+ object value;
143
+ if (!request.TryGetValue(key, out value) || !(value is string)) throw new FsFault("filesystem_invalid_request");
144
+ return (string)value;
145
+ }
146
+ static int Limit(Dictionary<string,object> request, string key, int maximum) {
147
+ object value;
148
+ if (!request.TryGetValue(key, out value) || !(value is int)) throw new FsFault("filesystem_invalid_request");
149
+ int number = (int)value;
150
+ if (number < 0 || number > maximum) throw new FsFault("filesystem_invalid_request");
151
+ return number;
152
+ }
153
+ }
154
+ `;
155
+ }
156
+ });
157
+
158
+ // src/shared/windows-file-io/authority-script.ts
159
+ var WINDOWS_FILESYSTEM_AUTHORITY;
160
+ var init_authority_script = __esm({
161
+ "src/shared/windows-file-io/authority-script.ts"() {
162
+ "use strict";
163
+ WINDOWS_FILESYSTEM_AUTHORITY = String.raw`
164
+ public static partial class AbotFilesystem {
165
+ static string NativePath(string path) {
166
+ string full = Path.GetFullPath(path);
167
+ if (full.StartsWith(@"\\?\") || full.StartsWith(@"\\.\")) throw new FsFault("filesystem_invalid_path");
168
+ if (full.StartsWith(@"\\")) return @"\??\UNC\" + full.Substring(2);
169
+ if (full.Length < 3 || full[1] != ':' || full[2] != '\\') throw new FsFault("filesystem_invalid_path");
170
+ return @"\??\" + full;
171
+ }
172
+ static string FinalPath(SafeFileHandle handle) {
173
+ var value = new StringBuilder(32768);
174
+ uint length = GetFinalPathNameByHandle(handle, value, (uint)value.Capacity, 0);
175
+ Check(length != 0);
176
+ if (length >= value.Capacity) throw new FsFault("filesystem_invalid_path");
177
+ string path = value.ToString();
178
+ if (path.StartsWith(@"\\?\UNC\")) return @"\\" + path.Substring(8);
179
+ if (path.StartsWith(@"\\?\")) return path.Substring(4);
180
+ throw new FsFault("filesystem_path_changed");
181
+ }
182
+ static SafeFileHandle OpenRoot(Dictionary<string,object> request) {
183
+ string path = Path.GetFullPath(Text(request, "rootPath"));
184
+ SafeFileHandle root = OpenHandle(null, NativePath(path), true, 1, 0x80000000, 7);
185
+ try {
186
+ if (!String.Equals(FinalPath(root).TrimEnd('\\'), path.TrimEnd('\\'), StringComparison.OrdinalIgnoreCase))
187
+ throw new FsFault("filesystem_path_changed");
188
+ var expected = request["rootIdentity"] as Dictionary<string,object>;
189
+ if (expected == null || !MatchesIdentity(Identity(root), expected)) throw new FsFault("filesystem_path_changed");
190
+ return root;
191
+ } catch { root.Dispose(); throw; }
192
+ }
193
+ static string[] Components(Dictionary<string,object> request) {
194
+ string relative = Text(request, "relativePath");
195
+ if (relative == "") return new string[0];
196
+ string[] parts = relative.Split('/');
197
+ foreach (string part in parts) ValidateComponent(part);
198
+ return parts;
199
+ }
200
+ static void ValidateComponent(string name) {
201
+ if (name.Length == 0 || name == "." || name == "..") throw new FsFault("filesystem_invalid_path");
202
+ if (name.EndsWith(".") || name.EndsWith(" ")) throw new FsFault("filesystem_invalid_path");
203
+ foreach (char c in name) {
204
+ if (c < 32 || "\\/:*?\"<>|".IndexOf(c) >= 0) throw new FsFault("filesystem_invalid_path");
205
+ }
206
+ string stem = name.Split('.')[0].ToUpperInvariant();
207
+ if (stem == "CON" || stem == "PRN" || stem == "AUX" || stem == "NUL" ||
208
+ stem == "CONIN$" || stem == "CONOUT$") throw new FsFault("filesystem_invalid_path");
209
+ if (stem.Length == 4 && (stem.StartsWith("COM") || stem.StartsWith("LPT")) &&
210
+ "123456789\u00b9\u00b2\u00b3".IndexOf(stem[3]) >= 0) throw new FsFault("filesystem_invalid_path");
211
+ }
212
+ sealed class DirectoryChain : IDisposable {
213
+ public readonly SafeFileHandle Root;
214
+ readonly List<SafeFileHandle> children = new List<SafeFileHandle>();
215
+ public SafeFileHandle Current { get { return children.Count == 0 ? Root : children[children.Count-1]; } }
216
+ public DirectoryChain(Dictionary<string,object> request) { Root = OpenRoot(request); }
217
+ public void Walk(string[] parts, int count, bool create) {
218
+ for (int i=0;i<count;i++) children.Add(OpenHandle(Current, parts[i], true, create ? 3u : 1u, 0x80000000, 7));
219
+ }
220
+ public void Dispose() { for (int i=children.Count-1;i>=0;i--) children[i].Dispose(); Root.Dispose(); }
221
+ }
222
+ static ulong FileId(FileInfo info) {
223
+ ulong id=((ulong)info.IndexHigh << 32) | info.IndexLow;
224
+ if (id == 0) throw new FsFault("filesystem_safe_io_unsupported");
225
+ return id;
226
+ }
227
+ static Dictionary<string,object> Identity(SafeFileHandle file) {
228
+ FileInfo info; Check(GetFileInformationByHandle(file, out info));
229
+ BasicInfo basic = Basic(file);
230
+ return Record("device", info.Volume.ToString(), "inode", FileId(info).ToString(),
231
+ "birthtimeNs", ((basic.Created - 116444736000000000L) * 100L).ToString());
232
+ }
233
+ static bool MatchesIdentity(Dictionary<string,object> left, Dictionary<string,object> right) {
234
+ foreach (string key in new [] {"device", "inode", "birthtimeNs"}) {
235
+ if (!right.ContainsKey(key) || !Object.Equals(left[key], right[key])) return false;
236
+ }
237
+ return true;
238
+ }
239
+ static Dictionary<string,object> Metadata(SafeFileHandle file) {
240
+ FileInfo info; Check(GetFileInformationByHandle(file, out info));
241
+ BasicInfo basic = Basic(file);
242
+ ulong size = ((ulong)info.SizeHigh << 32) | info.SizeLow;
243
+ if (size > 9007199254740991UL) throw new FsFault("file_too_large");
244
+ return Record("device", info.Volume.ToString(), "inode", FileId(info).ToString(),
245
+ "size", (long)size, "mode", (basic.Attributes & 1) != 0 ? 292 : 438,
246
+ "modifiedNs", ((basic.Modified - 116444736000000000L) * 100L).ToString(),
247
+ "changedNs", ((basic.Changed - 116444736000000000L) * 100L).ToString());
248
+ }
249
+ static bool SameMetadata(Dictionary<string,object> left, Dictionary<string,object> right) {
250
+ foreach (string key in new [] {"device", "inode", "size", "mode", "modifiedNs", "changedNs"}) {
251
+ if (!right.ContainsKey(key) || Convert.ToString(left[key]) != Convert.ToString(right[key])) return false;
252
+ }
253
+ return true;
254
+ }
255
+ }
256
+ `;
257
+ }
258
+ });
259
+
260
+ // src/shared/windows-file-io/read-bytes-script.ts
261
+ var WINDOWS_FILE_READ_BYTES;
262
+ var init_read_bytes_script = __esm({
263
+ "src/shared/windows-file-io/read-bytes-script.ts"() {
264
+ "use strict";
265
+ WINDOWS_FILE_READ_BYTES = String.raw`
266
+ public static partial class AbotFilesystem {
267
+ static byte[] ReadBytes(SafeFileHandle file, long position, int length) {
268
+ long actual; Check(SetFilePointerEx(file, position, out actual, 0));
269
+ if (actual != position) throw new FsFault("filesystem_read_incomplete");
270
+ var bytes = new byte[length];
271
+ int offset = 0;
272
+ while (offset < length) {
273
+ var chunk = new byte[Math.Min(65536, length-offset)];
274
+ uint read; Check(ReadFile(file, chunk, (uint)chunk.Length, out read, IntPtr.Zero));
275
+ if (read == 0 || read > chunk.Length) throw new FsFault("filesystem_read_incomplete");
276
+ Buffer.BlockCopy(chunk, 0, bytes, offset, (int)read);
277
+ offset += (int)read;
278
+ }
279
+ return bytes;
280
+ }
281
+ }
282
+ `;
283
+ }
284
+ });
285
+
286
+ // src/plugin-sdk/files-windows/read-script.ts
287
+ var BOUNDED_READ, WINDOWS_BOUNDED_READ_SOURCE;
288
+ var init_read_script = __esm({
289
+ "src/plugin-sdk/files-windows/read-script.ts"() {
290
+ "use strict";
291
+ init_native_script();
292
+ init_authority_script();
293
+ init_read_bytes_script();
294
+ BOUNDED_READ = String.raw`
295
+ public static partial class AbotFilesystem {
296
+ static object ReadBounded(Dictionary<string,object> request) {
297
+ long maximum;
298
+ if (!Int64.TryParse(Text(request, "maxBytes"), out maximum) || maximum < 0 ||
299
+ maximum > 9007199254740991L) throw new FsFault("filesystem_invalid_request");
300
+ string[] parts=Components(request);
301
+ if (parts.Length == 0) return Record("ok", false, "reason", "not_regular_file");
302
+ using (var chain=new DirectoryChain(request)) {
303
+ chain.Walk(parts, parts.Length-1, false);
304
+ using (var file=OpenHandle(chain.Current, parts[parts.Length-1], false, 1, 0x80000000, 1)) {
305
+ var expected=request["targetIdentity"] as Dictionary<string,object>;
306
+ if (expected == null || !MatchesIdentity(Identity(file), expected))
307
+ return Record("ok", false, "reason", "changed_during_read");
308
+ var before=Metadata(file);
309
+ long size=Convert.ToInt64(before["size"]);
310
+ // Both the byte array and the base64 JSON response must fit .NET strings.
311
+ if (size > maximum || size > (Int32.MaxValue-4096L)/4*3)
312
+ return Record("ok", false, "reason", "too_large", "byteCount", size);
313
+ var bytes=ReadBytes(file, 0, (int)size);
314
+ if (!SameMetadata(before, Metadata(file)))
315
+ return Record("ok", false, "reason", "changed_during_read");
316
+ return Record("ok", true, "bytes", Convert.ToBase64String(bytes), "byteCount", size);
317
+ }
318
+ }
319
+ }
320
+ public static string Run(string input) {
321
+ var json=new JavaScriptSerializer { MaxJsonLength=Int32.MaxValue };
322
+ try { return json.Serialize(ReadBounded(json.Deserialize<Dictionary<string,object>>(input))); }
323
+ catch (FsFault error) { return json.Serialize(Record("ok", false, "code", error.Code)); }
324
+ catch { return json.Serialize(Record("ok", false, "code", "filesystem_native_operation_failed")); }
325
+ }
326
+ }
327
+ `;
328
+ WINDOWS_BOUNDED_READ_SOURCE = [
329
+ WINDOWS_FILESYSTEM_NATIVE,
330
+ WINDOWS_FILESYSTEM_AUTHORITY,
331
+ WINDOWS_FILE_READ_BYTES,
332
+ BOUNDED_READ
333
+ ].join("\n");
334
+ }
335
+ });
336
+
337
+ // src/plugin-sdk/files-windows/result.ts
338
+ function windowsReadError(code) {
339
+ const error = new Error(
340
+ "The Windows safe file read failed (" + code + "). No fallback read was attempted."
341
+ );
342
+ return Object.assign(error, { code });
343
+ }
344
+ function windowsReadAbortError() {
345
+ const error = new Error("The file read was cancelled.");
346
+ error.name = "AbortError";
347
+ return error;
348
+ }
349
+ function hasByteCount(value) {
350
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
351
+ }
352
+ function decodeNativeFailure(code) {
353
+ switch (code) {
354
+ case "filesystem_windows_policy_blocked":
355
+ case "filesystem_windows_helper_unavailable":
356
+ case "filesystem_safe_io_unsupported":
357
+ return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
358
+ case "filesystem_path_changed":
359
+ case "filesystem_target_changed":
360
+ case "filesystem_read_changed":
361
+ case "filesystem_read_incomplete":
362
+ return Object.freeze({ ok: false, reason: "changed_during_read" });
363
+ case "file_too_large":
364
+ return Object.freeze({ ok: false, reason: "too_large" });
365
+ case "file_not_found":
366
+ throw windowsReadError("ENOENT");
367
+ case "filesystem_access_denied":
368
+ throw windowsReadError("EACCES");
369
+ default:
370
+ throw windowsReadError("EIO");
371
+ }
372
+ }
373
+ function decodeWindowsReadResult(raw, maxBytes) {
374
+ let value;
375
+ try {
376
+ value = JSON.parse(raw);
377
+ } catch {
378
+ throw windowsReadError("EIO");
379
+ }
380
+ if (value?.ok === false && typeof value.code === "string")
381
+ return decodeNativeFailure(value.code);
382
+ if (value?.ok === false && FAILURE_REASONS.has(value.reason)) {
383
+ if (value.byteCount !== void 0 && !hasByteCount(value.byteCount))
384
+ throw windowsReadError("EIO");
385
+ return Object.freeze({
386
+ ok: false,
387
+ reason: value.reason,
388
+ ...value.byteCount !== void 0 ? { byteCount: value.byteCount } : {}
389
+ });
390
+ }
391
+ if (value?.ok !== true || !hasByteCount(value.byteCount))
392
+ throw windowsReadError("EIO");
393
+ if (value.byteCount > maxBytes || typeof value.bytes !== "string")
394
+ throw windowsReadError("EIO");
395
+ if (value.bytes.length !== 4 * Math.ceil(value.byteCount / 3))
396
+ throw windowsReadError("EIO");
397
+ const bytes = Buffer.from(value.bytes, "base64");
398
+ if (bytes.length !== value.byteCount || bytes.toString("base64") !== value.bytes)
399
+ throw windowsReadError("EIO");
400
+ return Object.freeze({ ok: true, bytes, byteCount: value.byteCount });
401
+ }
402
+ var FAILURE_REASONS;
403
+ var init_result = __esm({
404
+ "src/plugin-sdk/files-windows/result.ts"() {
405
+ "use strict";
406
+ FAILURE_REASONS = /* @__PURE__ */ new Set([
407
+ "not_regular_file",
408
+ "too_large",
409
+ "changed_during_read",
410
+ "outside_root",
411
+ "safe_open_unsupported"
412
+ ]);
413
+ }
414
+ });
415
+
416
+ // src/plugin-sdk/files-windows/process.ts
417
+ async function runWindowsBoundedRead(request, maxBytes, signal, spawnProcess = import_node_child_process.spawn) {
418
+ if (signal?.aborted) throw windowsReadAbortError();
419
+ const input = JSON.stringify({
420
+ source: WINDOWS_BOUNDED_READ_SOURCE,
421
+ request: JSON.stringify(request)
422
+ });
423
+ if (Buffer.byteLength(input) > 2 * 1024 * 1024)
424
+ throw windowsReadError("EINVAL");
425
+ const outputLimit = 4 * Math.ceil(Math.min(maxBytes, 2147483647) / 3) + 4096;
426
+ const executable = (0, import_node_path.join)(
427
+ process.env.SystemRoot ?? "C:\\Windows",
428
+ "System32",
429
+ "WindowsPowerShell",
430
+ "v1.0",
431
+ "powershell.exe"
432
+ );
433
+ return new Promise((resolve, reject) => {
434
+ const child = spawnProcess(
435
+ executable,
436
+ ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", BOOTSTRAP],
437
+ { windowsHide: true, stdio: ["pipe", "pipe", "pipe"] }
438
+ );
439
+ const chunks = [];
440
+ let byteCount = 0;
441
+ let failure;
442
+ let unavailable = false;
443
+ const stop = (error) => {
444
+ failure ??= error;
445
+ child.kill("SIGKILL");
446
+ };
447
+ const abort = () => stop(windowsReadAbortError());
448
+ const timer = setTimeout(() => stop(windowsReadError("ETIMEDOUT")), 15e3);
449
+ timer.unref();
450
+ signal?.addEventListener("abort", abort, { once: true });
451
+ child.stdout.on("data", (chunk) => {
452
+ if (failure) return;
453
+ byteCount += chunk.length;
454
+ if (byteCount > outputLimit) {
455
+ stop(windowsReadError("EOVERFLOW"));
456
+ return;
457
+ }
458
+ chunks.push(chunk);
459
+ });
460
+ child.stderr.resume();
461
+ child.stdin.on("error", () => {
462
+ if (child.pid === void 0) return;
463
+ stop(windowsReadError("EIO"));
464
+ });
465
+ child.once("error", () => {
466
+ if (child.pid === void 0) {
467
+ unavailable = true;
468
+ return;
469
+ }
470
+ stop(windowsReadError("EIO"));
471
+ });
472
+ child.once("close", (code) => {
473
+ clearTimeout(timer);
474
+ signal?.removeEventListener("abort", abort);
475
+ if (failure) {
476
+ reject(failure);
477
+ return;
478
+ }
479
+ if (unavailable) {
480
+ resolve(UNAVAILABLE);
481
+ return;
482
+ }
483
+ if (code !== 0) {
484
+ reject(windowsReadError("EIO"));
485
+ return;
486
+ }
487
+ resolve(Buffer.concat(chunks).toString("utf8"));
488
+ });
489
+ if (signal?.aborted) {
490
+ abort();
491
+ return;
492
+ }
493
+ child.stdin.end(input, "utf8");
494
+ });
495
+ }
496
+ var import_node_child_process, import_node_path, BOOTSTRAP, UNAVAILABLE;
497
+ var init_process = __esm({
498
+ "src/plugin-sdk/files-windows/process.ts"() {
499
+ "use strict";
500
+ import_node_child_process = require("node:child_process");
501
+ import_node_path = require("node:path");
502
+ init_read_script();
503
+ init_result();
504
+ BOOTSTRAP = [
505
+ "$ErrorActionPreference='Stop'",
506
+ `if ($ExecutionContext.SessionState.LanguageMode -ne 'FullLanguage') { Write-Output '{"ok":false,"code":"filesystem_windows_policy_blocked"}'; exit 0 }`,
507
+ "$env:PSModulePath=[IO.Path]::Combine($PSHOME,'Modules')",
508
+ "[Console]::InputEncoding=[Text.UTF8Encoding]::new($false)",
509
+ "[Console]::OutputEncoding=[Text.UTF8Encoding]::new($false)",
510
+ "$started=$false",
511
+ "try {",
512
+ "$envelope=[Console]::In.ReadToEnd() | ConvertFrom-Json",
513
+ "Add-Type -ReferencedAssemblies @('System.Web.Extensions') -TypeDefinition $envelope.source",
514
+ "$started=$true",
515
+ "[Console]::Write([AbotFilesystem]::Run($envelope.request))",
516
+ `} catch { if ($started) { [Console]::Write('{"ok":false,"code":"filesystem_native_operation_failed"}') } else { [Console]::Write('{"ok":false,"code":"filesystem_windows_helper_unavailable"}') } }`
517
+ ].join(";");
518
+ UNAVAILABLE = '{"ok":false,"code":"filesystem_windows_helper_unavailable"}';
519
+ }
520
+ });
521
+
522
+ // src/plugin-sdk/files-windows/read.ts
523
+ var read_exports = {};
524
+ __export(read_exports, {
525
+ readWindowsBoundedRegularFile: () => readWindowsBoundedRegularFile
526
+ });
527
+ function isOutsideRoot(rootRelative) {
528
+ if (import_node_path2.win32.isAbsolute(rootRelative)) return true;
529
+ if (rootRelative === "..") return true;
530
+ return rootRelative.startsWith("..\\");
531
+ }
532
+ function identity(stats) {
533
+ return {
534
+ device: String(stats.dev),
535
+ inode: String(stats.ino),
536
+ birthtimeNs: String(stats.birthtimeNs)
537
+ };
538
+ }
539
+ async function readWindowsBoundedRegularFile(absolutePath, options) {
540
+ const relativePath = import_node_path2.win32.relative(options.rootPath, absolutePath);
541
+ if (isOutsideRoot(relativePath)) return Object.freeze({ ok: false, reason: "outside_root" });
542
+ if (relativePath === "") return Object.freeze({ ok: false, reason: "not_regular_file" });
543
+ let root;
544
+ try {
545
+ const canonicalRoot = await (0, import_promises.realpath)(options.rootPath);
546
+ root = await (0, import_promises.open)(canonicalRoot, "r");
547
+ const rootStats = await root.stat({ bigint: true });
548
+ if (!rootStats.isDirectory() || rootStats.ino <= 0n)
549
+ return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
550
+ const targetPath = import_node_path2.win32.resolve(canonicalRoot, relativePath);
551
+ const target = await (0, import_promises.lstat)(targetPath, { bigint: true });
552
+ if (!target.isFile()) return Object.freeze({ ok: false, reason: "not_regular_file" });
553
+ const canonicalTarget = await (0, import_promises.realpath)(targetPath);
554
+ if (isOutsideRoot(import_node_path2.win32.relative(canonicalRoot, canonicalTarget)))
555
+ return Object.freeze({ ok: false, reason: "outside_root" });
556
+ if (options.signal?.aborted) throw windowsReadAbortError();
557
+ const raw = await runWindowsBoundedRead({
558
+ rootPath: canonicalRoot,
559
+ relativePath: relativePath.split(import_node_path2.win32.sep).join("/"),
560
+ rootIdentity: identity(rootStats),
561
+ targetIdentity: identity(target),
562
+ maxBytes: String(options.maxBytes)
563
+ }, options.maxBytes, options.signal);
564
+ if (options.signal?.aborted) throw windowsReadAbortError();
565
+ return decodeWindowsReadResult(raw, options.maxBytes);
566
+ } finally {
567
+ await root?.close();
568
+ }
569
+ }
570
+ var import_promises, import_node_path2;
571
+ var init_read = __esm({
572
+ "src/plugin-sdk/files-windows/read.ts"() {
573
+ "use strict";
574
+ import_promises = require("node:fs/promises");
575
+ import_node_path2 = require("node:path");
576
+ init_process();
577
+ init_result();
578
+ }
579
+ });
580
+
23
581
  // plugins/json-inspector/source/index.ts
24
582
  var index_exports = {};
25
583
  __export(index_exports, {
@@ -60,8 +618,8 @@ function sanitizeJsonText(value) {
60
618
 
61
619
  // src/plugin-sdk/files.ts
62
620
  var import_node_fs = require("node:fs");
63
- var import_promises = require("node:fs/promises");
64
- var import_node_path = require("node:path");
621
+ var import_promises2 = require("node:fs/promises");
622
+ var import_node_path3 = require("node:path");
65
623
  function throwIfAborted(signal) {
66
624
  if (!signal?.aborted) return;
67
625
  const error = new Error("The file read was cancelled.");
@@ -88,12 +646,16 @@ async function readBoundedRegularFile(absolutePath, options) {
88
646
  throw new RangeError("maxBytes must be a non-negative safe integer");
89
647
  }
90
648
  throwIfAborted(options.signal);
649
+ if (process.platform === "win32") {
650
+ const { readWindowsBoundedRegularFile: readWindowsBoundedRegularFile2 } = await Promise.resolve().then(() => (init_read(), read_exports));
651
+ return readWindowsBoundedRegularFile2(absolutePath, options);
652
+ }
91
653
  if (typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
92
654
  return Object.freeze({ ok: false, reason: "safe_open_unsupported" });
93
655
  }
94
656
  let handle;
95
657
  try {
96
- handle = await (0, import_promises.open)(
658
+ handle = await (0, import_promises2.open)(
97
659
  absolutePath,
98
660
  import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_NOFOLLOW
99
661
  );
@@ -102,14 +664,14 @@ async function readBoundedRegularFile(absolutePath, options) {
102
664
  return Object.freeze({ ok: false, reason: "not_regular_file" });
103
665
  }
104
666
  const [canonicalRoot, canonicalTarget] = await Promise.all([
105
- (0, import_promises.realpath)(options.rootPath),
106
- (0, import_promises.realpath)(absolutePath)
667
+ (0, import_promises2.realpath)(options.rootPath),
668
+ (0, import_promises2.realpath)(absolutePath)
107
669
  ]);
108
- const rootRelative = (0, import_node_path.relative)(canonicalRoot, canonicalTarget);
109
- if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path.sep}`) || rootRelative.startsWith(import_node_path.sep)) {
670
+ const rootRelative = (0, import_node_path3.relative)(canonicalRoot, canonicalTarget);
671
+ if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path3.sep}`) || rootRelative.startsWith(import_node_path3.sep)) {
110
672
  return Object.freeze({ ok: false, reason: "outside_root" });
111
673
  }
112
- const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
674
+ const pathIdentity = await (0, import_promises2.stat)(canonicalTarget, { bigint: true });
113
675
  if (pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino || !pathIdentity.isFile()) {
114
676
  return Object.freeze({ ok: false, reason: "changed_during_read" });
115
677
  }
@@ -461,6 +1023,37 @@ function parseJsonErrorPosition(error, source) {
461
1023
  });
462
1024
  }
463
1025
 
1026
+ // plugins/json-inspector/source/read-failure.ts
1027
+ function jsonReadFailure(file, maxBytes) {
1028
+ switch (file.reason) {
1029
+ case "not_regular_file":
1030
+ return failureResult({
1031
+ errorCode: "json_target_not_file",
1032
+ message: "The requested JSON target is not a regular file."
1033
+ });
1034
+ case "too_large":
1035
+ return failureResult({
1036
+ errorCode: "json_file_too_large",
1037
+ message: "The requested file exceeds the " + maxBytes + "-byte JSON inspection limit."
1038
+ });
1039
+ case "outside_root":
1040
+ return failureResult({
1041
+ errorCode: "json_outside_root",
1042
+ message: "The requested file resolves outside its authorized root. Do not retry this target or bypass the path restriction."
1043
+ });
1044
+ case "safe_open_unsupported":
1045
+ return failureResult({
1046
+ errorCode: "json_safe_read_unavailable",
1047
+ message: "Safe file reading is unavailable on this system. On Windows, computer policy may block the required PowerShell/C# helper. Do not retry or bypass this restriction with another tool; ask the user to check the system requirements or contact their administrator."
1048
+ });
1049
+ case "changed_during_read":
1050
+ return failureResult({
1051
+ errorCode: "json_file_changed",
1052
+ message: "The requested JSON file changed while it was read."
1053
+ });
1054
+ }
1055
+ }
1056
+
464
1057
  // plugins/json-inspector/source/index.ts
465
1058
  var MAX_FILE_BYTES = 2 * 1024 * 1024;
466
1059
  var MAX_DEPTH = 6;
@@ -487,26 +1080,10 @@ var index_default = defineRuntimePlugin((context) => {
487
1080
  });
488
1081
  const file = await readBoundedRegularFile(target.absolutePath, {
489
1082
  maxBytes: MAX_FILE_BYTES,
490
- rootPath: target.rootPath
1083
+ rootPath: target.rootPath,
1084
+ signal: executionContext?.abortSignal
491
1085
  });
492
- if (!file.ok && file.reason === "not_regular_file") {
493
- return failureResult({
494
- errorCode: "json_target_not_file",
495
- message: "The requested JSON target is not a regular file."
496
- });
497
- }
498
- if (!file.ok && file.reason === "too_large") {
499
- return failureResult({
500
- errorCode: "json_file_too_large",
501
- message: `The requested file exceeds the ${MAX_FILE_BYTES}-byte JSON inspection limit.`
502
- });
503
- }
504
- if (!file.ok) {
505
- return failureResult({
506
- errorCode: "json_file_changed",
507
- message: "The requested JSON file changed while it was read."
508
- });
509
- }
1086
+ if (!file.ok) return jsonReadFailure(file, MAX_FILE_BYTES);
510
1087
  let source;
511
1088
  try {
512
1089
  source = new import_node_util.TextDecoder("utf-8", { fatal: true }).decode(
@@ -581,6 +1158,14 @@ var index_default = defineRuntimePlugin((context) => {
581
1158
  }
582
1159
  });
583
1160
  } catch (error) {
1161
+ const readWasAborted = executionContext?.abortSignal?.aborted && error instanceof Error && error.name === "AbortError";
1162
+ if (readWasAborted) {
1163
+ return failureResult({
1164
+ errorCode: "json_inspection_cancelled",
1165
+ message: "JSON inspection was cancelled.",
1166
+ interruption: "aborted"
1167
+ });
1168
+ }
584
1169
  return failureFromError(error, {
585
1170
  fallbackCode: "json_inspection_failed",
586
1171
  fallbackMessage: "JSON inspection failed.",