@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.
- package/README.md +216 -222
- package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
- package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
- package/dist/src/capabilities/tool-types.d.ts +4 -0
- package/dist/src/cli/abot.js +2 -0
- package/dist/src/cli/host-companion-bundle.mjs +751 -333
- package/dist/src/computer-access/collection-consent.d.ts +9 -0
- package/dist/src/computer-access/collection-consent.js +47 -0
- package/dist/src/computer-access/command-output-capture.d.ts +17 -6
- package/dist/src/computer-access/command-output-capture.js +134 -68
- package/dist/src/computer-access/command-output-protection.d.ts +17 -0
- package/dist/src/computer-access/command-output-protection.js +59 -0
- package/dist/src/computer-access/companion/command-output.d.ts +1 -0
- package/dist/src/computer-access/companion/command-output.js +23 -6
- package/dist/src/computer-access/companion/install-link-macos.js +2 -1
- package/dist/src/computer-access/companion/native-notifications.js +3 -2
- package/dist/src/computer-access/companion/native-session.js +6 -2
- package/dist/src/computer-access/companion/observation-filter.js +2 -26
- package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
- package/dist/src/computer-access/companion/observation-process.js +51 -25
- package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
- package/dist/src/computer-access/companion/observation-redaction.js +2 -111
- package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
- package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
- package/dist/src/computer-access/computer/companion-sessions.js +7 -6
- package/dist/src/computer-access/computer/unix-native-process.js +23 -11
- package/dist/src/computer-access/handlers.d.ts +2 -1
- package/dist/src/computer-access/handlers.js +79 -11
- package/dist/src/computer-access/host-observation.d.ts +3 -3
- package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
- package/dist/src/computer-access/native-observation-connection.js +78 -0
- package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
- package/dist/src/computer-access/native-observation-ownership.js +55 -0
- package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
- package/dist/src/computer-access/native-observation-shutdown.js +58 -0
- package/dist/src/computer-access/observation-source.d.ts +6 -0
- package/dist/src/computer-access/observation-source.js +10 -0
- package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
- package/dist/src/computer-access/security/desktop-result.js +146 -0
- package/dist/src/computer-access/security/observed-error.d.ts +2 -0
- package/dist/src/computer-access/security/observed-error.js +10 -0
- package/dist/src/computer-access/security/secret-text.d.ts +7 -0
- package/dist/src/computer-access/security/secret-text.js +111 -0
- package/dist/src/computer-access/security/system-results.d.ts +2 -0
- package/dist/src/computer-access/security/system-results.js +53 -0
- package/dist/src/computer-access/system-result-protection.d.ts +11 -0
- package/dist/src/computer-access/system-result-protection.js +1 -0
- package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
- package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
- package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
- package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
- package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
- package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
- package/dist/src/model-gateway/observability/provider-trace.js +30 -8
- package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
- package/dist/src/model-gateway/protocol/message-contract.js +1 -1
- package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
- package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
- package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
- package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
- package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
- package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
- package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
- package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
- package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
- package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
- package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
- package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
- package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
- package/dist/src/model-gateway/providers/openai/payload.js +6 -23
- package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
- package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
- package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
- package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
- package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
- package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
- package/dist/src/model-gateway/providers/openai/stream.js +13 -41
- package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
- package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
- package/dist/src/model-gateway/server/chat-handler.js +5 -7
- package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
- package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
- package/dist/src/model-gateway/server.js +5 -1
- package/dist/src/plugin-contract/index.d.ts +1 -0
- package/dist/src/plugin-contract/index.js +1 -0
- package/dist/src/plugin-contract/manifest.d.ts +2 -0
- package/dist/src/plugin-contract/manifest.js +1 -0
- package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
- package/dist/src/plugin-contract/platform-compatibility.js +3 -0
- package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
- package/dist/src/plugin-sdk/computer-access.js +1 -0
- package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
- package/dist/src/plugin-sdk/files-windows/process.js +93 -0
- package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
- package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
- package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
- package/dist/src/plugin-sdk/files-windows/read.js +56 -0
- package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
- package/dist/src/plugin-sdk/files-windows/result.js +67 -0
- package/dist/src/plugin-sdk/files.js +4 -0
- package/dist/src/plugin-sdk/index.d.ts +1 -0
- package/dist/src/plugin-sdk/index.js +1 -0
- package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
- package/dist/src/plugin-sdk/mutation-result.js +11 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
- package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
- package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
- package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
- package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
- package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
- package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
- package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
- package/dist/src/runtime/capabilities/tool-availability.js +6 -0
- package/dist/src/runtime/context/capability-brief.d.ts +2 -2
- package/dist/src/runtime/context/capability-brief.js +3 -3
- package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
- package/dist/src/runtime/context/capability-descriptions.js +57 -20
- package/dist/src/runtime/local-host/windows-private-access.js +2 -0
- package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
- package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
- package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
- package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
- package/dist/src/runtime/long-term-memory/projection.js +1 -1
- package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
- package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
- package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
- package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
- package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
- package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
- package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
- package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
- package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
- package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
- package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
- package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
- package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
- package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
- package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
- package/dist/src/runtime/passive-learning/collection-source.js +7 -0
- package/dist/src/runtime/passive-learning/service.js +2 -3
- package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
- package/dist/src/runtime/passive-learning/status-projection.js +9 -0
- package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
- package/dist/src/runtime/plugins/installation/package.js +2 -0
- package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
- package/dist/src/runtime/plugins/loader.js +24 -14
- package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
- package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
- package/dist/src/runtime/plugins/manifest-projection.js +3 -0
- package/dist/src/runtime/plugins/manifest-validator.js +9 -1
- package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
- package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
- package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
- package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
- package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
- package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
- package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
- package/dist/src/runtime/request/prepared-execution.js +3 -0
- package/dist/src/runtime/request/root-contract.d.ts +2 -0
- package/dist/src/runtime/request/root-execution-kernel.js +1 -0
- package/dist/src/runtime/request/runner.js +9 -3
- package/dist/src/runtime/request/supervisor-root-execution.js +6 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
- package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
- package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
- package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
- package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
- package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
- package/dist/src/runtime/steps/execution-agent/format.js +4 -3
- package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
- package/dist/src/runtime/steps/execution-agent/input.js +22 -1
- package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
- package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
- package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/execution-agent/prompt.js +7 -8
- package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
- package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
- package/dist/src/runtime/steps/execution-agent/run.js +4 -1
- package/dist/src/runtime/steps/execution-agent/state-context.d.ts +3 -5
- package/dist/src/runtime/steps/execution-agent/state-context.js +5 -51
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
- package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
- package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
- package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
- package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
- package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
- package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
- package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
- package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
- package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
- package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
- package/dist/src/sessions/durable-session-commit.js +3 -3
- package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
- package/dist/src/sessions/prepared-session-replacement.js +46 -0
- package/dist/src/sessions/session-store.js +3 -3
- package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
- package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
- package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/authority-script.js +94 -0
- package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
- package/dist/src/shared/windows-file-io/native-script.js +120 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
- package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
- package/dist/src/shared/windows-job-object.d.ts +2 -0
- package/dist/src/shared/windows-job-object.js +66 -0
- package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
- package/dist/src/web-ui/app/app-bootstrap.js +14 -1
- package/dist/src/web-ui/app/app-state.js +0 -7
- package/dist/src/web-ui/app/app.js +54 -156
- package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
- package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
- package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
- package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
- package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
- package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
- package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
- package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
- package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
- package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
- package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
- package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
- package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
- package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
- package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
- package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
- package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
- package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
- package/dist/src/web-ui/app/components/operations-summary.js +2 -1
- package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
- package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
- package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
- package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
- package/dist/src/web-ui/app/components/passive-learning/home.js +11 -3
- package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
- package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
- package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
- package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
- package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
- package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
- package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
- package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
- package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
- package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
- package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
- package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
- package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
- package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
- package/dist/src/web-ui/app/components/schedules/details.js +3 -2
- package/dist/src/web-ui/app/components/schedules/form.js +10 -8
- package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
- package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
- package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
- package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
- package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
- package/dist/src/web-ui/app/components/spark-chat/settings.js +8 -4
- package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
- package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
- package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
- package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
- package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
- package/dist/src/web-ui/app/components/system-host/rendering.js +6 -3
- package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
- package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
- package/dist/src/web-ui/app/computer-access-feature.js +13 -1
- package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
- package/dist/src/web-ui/app/configuration-feature.js +11 -1
- package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
- package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
- package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
- package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
- package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
- package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
- package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
- package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
- package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
- package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
- package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
- package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
- package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
- package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
- package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
- package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
- package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
- package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
- package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
- package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
- package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
- package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
- package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
- package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
- package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
- package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
- package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
- package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
- package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
- package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
- package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
- package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
- package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
- package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
- package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
- package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
- package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
- package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
- package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
- package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
- package/dist/src/web-ui/app/dashboard-feature.js +12 -2
- package/dist/src/web-ui/app/lib/reasoning-controls.js +40 -0
- package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
- package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
- package/dist/src/web-ui/app/passive-learning-feature.js +18 -5
- package/dist/src/web-ui/app/schedules-feature.js +5 -3
- package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
- package/dist/src/web-ui/app/services/client-preferences.js +25 -16
- package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
- package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
- package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
- package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
- package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
- package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
- package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
- package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
- package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
- package/dist/src/web-ui/app/services/workspace-state.js +27 -0
- package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
- package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
- package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
- package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
- package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
- package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
- package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
- package/dist/src/web-ui/app/styles/95-home-widgets.css +109 -0
- package/dist/src/web-ui/app/styles.css +3 -0
- package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
- package/dist/src/web-ui/client-state/contracts.js +13 -0
- package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
- package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
- package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
- package/dist/src/web-ui/client-state/preferences.js +84 -0
- package/dist/src/web-ui/client-state/queue.d.ts +3 -0
- package/dist/src/web-ui/client-state/queue.js +43 -0
- package/dist/src/web-ui/client-state/routes.d.ts +7 -0
- package/dist/src/web-ui/client-state/routes.js +58 -0
- package/dist/src/web-ui/client-state/store.d.ts +14 -0
- package/dist/src/web-ui/client-state/store.js +88 -0
- package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
- package/dist/src/web-ui/local-runtime/http.js +11 -2
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
- package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
- package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
- package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
- package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
- package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
- package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
- package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
- package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
- package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
- package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
- package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
- package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
- package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
- package/dist/src/web-ui/local-runtime-backend.js +14 -0
- package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
- package/dist/src/web-ui/plugin-management-catalog.js +3 -1
- package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
- package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
- package/dist/src/web-ui/server-readiness.d.ts +3 -0
- package/dist/src/web-ui/server-readiness.js +36 -0
- package/dist/src/web-ui/server.d.ts +2 -0
- package/dist/src/web-ui/server.js +23 -1
- package/dist/src/web-ui/system-host-service.js +13 -2
- package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
- package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
- package/docs/installation.md +44 -5
- package/docs/plugins.md +174 -28
- package/docs/tool-execution-result-evidence-contract.md +57 -0
- package/docs/windows-companion-store.md +5 -0
- package/package.json +4 -2
- package/plugins/capability-brief/plugin.json +5 -1
- package/plugins/code-outline/README.md +20 -0
- package/plugins/code-outline/plugin.json +2 -1
- package/plugins/code-outline/source/index.ts +16 -20
- package/plugins/code-outline/source/read-failure.ts +40 -0
- package/plugins/code-outline/src/index.cjs +614 -29
- package/plugins/document-reader/README.md +33 -0
- package/plugins/document-reader/plugin.json +2 -1
- package/plugins/document-reader/source/pdf-contract.ts +57 -0
- package/plugins/document-reader/source/pdf-parser.ts +139 -0
- package/plugins/document-reader/source/pdf-process-main.ts +56 -0
- package/plugins/document-reader/source/pdf-process.ts +207 -0
- package/plugins/document-reader/source/pdf-result.ts +79 -0
- package/plugins/document-reader/source/pdf-worker.ts +39 -303
- package/plugins/document-reader/source/pdf.ts +4 -1
- package/plugins/document-reader/source/read-failure.ts +37 -0
- package/plugins/document-reader/source/reader.ts +3 -19
- package/plugins/document-reader/src/index.cjs +995 -211
- package/plugins/exec/README.md +19 -0
- package/plugins/exec/plugin.json +4 -3
- package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
- package/plugins/exec/source/filesystem-file-observer.ts +98 -0
- package/plugins/exec/source/filesystem-observer.ts +8 -79
- package/plugins/exec/source/output-files.ts +12 -6
- package/plugins/exec/source/paths.ts +3 -1
- package/plugins/exec/source/process-manager.ts +8 -24
- package/plugins/exec/source/shell-platform.ts +19 -3
- package/plugins/exec/source/shell-process.ts +55 -0
- package/plugins/exec/source/windows-job-source.ts +1 -0
- package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
- package/plugins/exec/src/index.cjs +252 -96
- package/plugins/filesystem/README.md +65 -0
- package/plugins/filesystem/plugin.json +7 -3
- package/plugins/filesystem/source/atomic-write.ts +2 -0
- package/plugins/filesystem/source/bounded-io.ts +80 -306
- package/plugins/filesystem/source/directory-sample.ts +2 -0
- package/plugins/filesystem/source/errors.ts +14 -0
- package/plugins/filesystem/source/file-observation.ts +151 -0
- package/plugins/filesystem/source/file-version.ts +41 -0
- package/plugins/filesystem/source/index.ts +6 -0
- package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
- package/plugins/filesystem/source/windows/authority-script.ts +1 -0
- package/plugins/filesystem/source/windows/native-script.ts +1 -0
- package/plugins/filesystem/source/windows/operations.ts +197 -0
- package/plugins/filesystem/source/windows/process.ts +214 -0
- package/plugins/filesystem/source/windows/publication-script.ts +29 -0
- package/plugins/filesystem/source/windows/read-script.ts +63 -0
- package/plugins/filesystem/source/windows/request-availability.ts +67 -0
- package/plugins/filesystem/source/windows/source.ts +42 -0
- package/plugins/filesystem/source/windows/storage-script.ts +11 -0
- package/plugins/filesystem/source/windows/streams-script.ts +24 -0
- package/plugins/filesystem/source/windows/write-script.ts +86 -0
- package/plugins/filesystem/src/index.cjs +1208 -322
- package/plugins/json-inspector/README.md +18 -0
- package/plugins/json-inspector/plugin.json +2 -1
- package/plugins/json-inspector/source/index.ts +16 -19
- package/plugins/json-inspector/source/read-failure.ts +42 -0
- package/plugins/json-inspector/src/index.cjs +612 -27
- package/plugins/local-search/README.md +29 -0
- package/plugins/local-search/plugin.json +2 -1
- package/plugins/local-search/source/errors.ts +2 -0
- package/plugins/local-search/source/paths.ts +3 -0
- package/plugins/local-search/source/ripgrep-process.ts +31 -5
- package/plugins/local-search/source/ripgrep.ts +3 -3
- package/plugins/local-search/source/windows-authority.ts +99 -0
- package/plugins/local-search/source/windows-search-lease.ts +49 -0
- package/plugins/local-search/source/windows-search-process.ts +91 -0
- package/plugins/local-search/source/windows-search-script.ts +52 -0
- package/plugins/local-search/src/index.cjs +595 -26
- package/plugins/memory/plugin.json +5 -1
- package/plugins/memory/source/lock-directory-claim.ts +56 -0
- package/plugins/memory/source/lock-owner-file.ts +71 -0
- package/plugins/memory/source/lock-path-observation.ts +26 -0
- package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
- package/plugins/memory/source/store-lock.ts +12 -7
- package/plugins/memory/source/store.ts +3 -2
- package/plugins/memory/src/index.cjs +174 -25
- package/plugins/project-orientation/README.md +23 -0
- package/plugins/project-orientation/plugin.json +2 -1
- package/plugins/project-orientation/source/index.ts +12 -9
- package/plugins/project-orientation/source/inspection-failure.ts +70 -0
- package/plugins/project-orientation/source/manifest-summary.ts +9 -2
- package/plugins/project-orientation/source/tree.ts +6 -0
- package/plugins/project-orientation/src/index.cjs +647 -31
- package/plugins/system/README.md +51 -15
- package/plugins/system/plugin.json +6 -2
- package/plugins/system/skills/system_actions/SKILL.md +1 -1
- package/plugins/system/source/command-working-directory.ts +47 -0
- package/plugins/system/source/computer/handlers.ts +13 -9
- package/plugins/system/source/computer/observation-result.ts +10 -5
- package/plugins/system/source/computer/request-computers.ts +10 -3
- package/plugins/system/source/computer/request-modules.ts +3 -6
- package/plugins/system/source/computer/runtime-platform.ts +18 -0
- package/plugins/system/source/host-dispatch.ts +18 -2
- package/plugins/system/source/index.ts +5 -3
- package/plugins/system/source/local-command-output-retention.ts +16 -0
- package/plugins/system/source/local-command-output.ts +16 -8
- package/plugins/system/source/request-system-modules.ts +12 -2
- package/plugins/system/source/request-target-snapshot.ts +2 -1
- package/plugins/system/source/security/desktop-result.ts +177 -0
- package/plugins/system/source/security/observed-error.ts +10 -0
- package/plugins/system/source/security/secret-text.ts +118 -0
- package/plugins/system/source/security/system-results.ts +62 -0
- package/plugins/system/source/security/windows-output-directory.ts +82 -0
- package/plugins/system/src/index.cjs +837 -151
- package/plugins/system-probe/plugin.json +9 -3
- package/plugins/system-probe/source/disk-path.ts +8 -0
- package/plugins/system-probe/source/index.ts +10 -5
- package/plugins/system-probe/source/machine-load.ts +33 -0
- package/plugins/system-probe/source/metrics.ts +6 -8
- package/plugins/system-probe/src/index.cjs +49 -16
- 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": "
|
|
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
|
+
}
|