@roj-ai/sdk 0.1.36 → 0.2.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/dist/bootstrap.d.ts +420 -26
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +55 -24
- package/dist/bootstrap.js.map +1 -1
- package/dist/bun-platform/fs.d.ts.map +1 -1
- package/dist/bun-platform/fs.js +1 -0
- package/dist/bun-platform/fs.js.map +1 -1
- package/dist/bun-platform/index.d.ts +4 -1
- package/dist/bun-platform/index.d.ts.map +1 -1
- package/dist/bun-platform/index.js +7 -1
- package/dist/bun-platform/index.js.map +1 -1
- package/dist/bun-platform/server-lifecycle.d.ts +30 -0
- package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
- package/dist/bun-platform/server-lifecycle.js +182 -0
- package/dist/bun-platform/server-lifecycle.js.map +1 -0
- package/dist/bun-platform/shell.d.ts +33 -0
- package/dist/bun-platform/shell.d.ts.map +1 -0
- package/dist/bun-platform/shell.js +322 -0
- package/dist/bun-platform/shell.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agents/agent.d.ts +42 -7
- package/dist/core/agents/agent.d.ts.map +1 -1
- package/dist/core/agents/agent.js +202 -87
- package/dist/core/agents/agent.js.map +1 -1
- package/dist/core/agents/config.d.ts +8 -1
- package/dist/core/agents/config.d.ts.map +1 -1
- package/dist/core/agents/config.js +5 -1
- package/dist/core/agents/config.js.map +1 -1
- package/dist/core/agents/retry.d.ts +1 -1
- package/dist/core/agents/retry.d.ts.map +1 -1
- package/dist/core/agents/retry.js +14 -16
- package/dist/core/agents/retry.js.map +1 -1
- package/dist/core/agents/state.d.ts +3 -1
- package/dist/core/agents/state.d.ts.map +1 -1
- package/dist/core/agents/state.js +1 -1
- package/dist/core/agents/state.js.map +1 -1
- package/dist/core/context/state.d.ts +3 -3
- package/dist/core/context/state.js +2 -2
- package/dist/core/events/base-event-store.d.ts.map +1 -1
- package/dist/core/events/base-event-store.js +22 -14
- package/dist/core/events/base-event-store.js.map +1 -1
- package/dist/core/events/file.d.ts +39 -1
- package/dist/core/events/file.d.ts.map +1 -1
- package/dist/core/events/file.js +159 -20
- package/dist/core/events/file.js.map +1 -1
- package/dist/core/events/types.d.ts +1 -1
- package/dist/core/file-store/containment.d.ts +19 -0
- package/dist/core/file-store/containment.d.ts.map +1 -0
- package/dist/core/file-store/containment.js +62 -0
- package/dist/core/file-store/containment.js.map +1 -0
- package/dist/core/file-store/file-store.d.ts +22 -2
- package/dist/core/file-store/file-store.d.ts.map +1 -1
- package/dist/core/file-store/file-store.js +88 -20
- package/dist/core/file-store/file-store.js.map +1 -1
- package/dist/core/file-store/types.d.ts +13 -1
- package/dist/core/file-store/types.d.ts.map +1 -1
- package/dist/core/image/image-processor.d.ts.map +1 -1
- package/dist/core/image/image-processor.js +3 -1
- package/dist/core/image/image-processor.js.map +1 -1
- package/dist/core/image/types.d.ts +2 -0
- package/dist/core/image/types.d.ts.map +1 -1
- package/dist/core/image/vips-resizer.d.ts.map +1 -1
- package/dist/core/image/vips-resizer.js +81 -33
- package/dist/core/image/vips-resizer.js.map +1 -1
- package/dist/core/llm/anthropic.d.ts +0 -1
- package/dist/core/llm/anthropic.d.ts.map +1 -1
- package/dist/core/llm/anthropic.js +58 -72
- package/dist/core/llm/anthropic.js.map +1 -1
- package/dist/core/llm/logger.d.ts +14 -2
- package/dist/core/llm/logger.d.ts.map +1 -1
- package/dist/core/llm/logger.js +161 -36
- package/dist/core/llm/logger.js.map +1 -1
- package/dist/core/llm/openrouter.d.ts +0 -1
- package/dist/core/llm/openrouter.d.ts.map +1 -1
- package/dist/core/llm/openrouter.js +53 -66
- package/dist/core/llm/openrouter.js.map +1 -1
- package/dist/core/llm/provider-request.d.ts +10 -0
- package/dist/core/llm/provider-request.d.ts.map +1 -0
- package/dist/core/llm/provider-request.js +41 -0
- package/dist/core/llm/provider-request.js.map +1 -0
- package/dist/core/llm/provider.d.ts +11 -0
- package/dist/core/llm/provider.d.ts.map +1 -1
- package/dist/core/llm/provider.js +26 -0
- package/dist/core/llm/provider.js.map +1 -1
- package/dist/core/llm/state.d.ts +2 -2
- package/dist/core/llm/state.js +4 -4
- package/dist/core/plugins/plugin-builder.d.ts +57 -3
- package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
- package/dist/core/plugins/plugin-builder.js +68 -14
- package/dist/core/plugins/plugin-builder.js.map +1 -1
- package/dist/core/preset/preset-builder.d.ts +3 -2
- package/dist/core/preset/preset-builder.d.ts.map +1 -1
- package/dist/core/preset/preset-builder.js +7 -16
- package/dist/core/preset/preset-builder.js.map +1 -1
- package/dist/core/sessions/context.d.ts +23 -5
- package/dist/core/sessions/context.d.ts.map +1 -1
- package/dist/core/sessions/runtime-activity.d.ts +33 -0
- package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
- package/dist/core/sessions/runtime-activity.js +55 -0
- package/dist/core/sessions/runtime-activity.js.map +1 -0
- package/dist/core/sessions/schema.d.ts +23 -2
- package/dist/core/sessions/schema.d.ts.map +1 -1
- package/dist/core/sessions/schema.js +24 -3
- package/dist/core/sessions/schema.js.map +1 -1
- package/dist/core/sessions/session-manager.d.ts +83 -6
- package/dist/core/sessions/session-manager.d.ts.map +1 -1
- package/dist/core/sessions/session-manager.js +517 -118
- package/dist/core/sessions/session-manager.js.map +1 -1
- package/dist/core/sessions/session-store.d.ts +18 -0
- package/dist/core/sessions/session-store.d.ts.map +1 -1
- package/dist/core/sessions/session-store.js +33 -0
- package/dist/core/sessions/session-store.js.map +1 -1
- package/dist/core/sessions/session.d.ts +42 -6
- package/dist/core/sessions/session.d.ts.map +1 -1
- package/dist/core/sessions/session.js +176 -44
- package/dist/core/sessions/session.js.map +1 -1
- package/dist/core/sessions/state.d.ts +10 -1
- package/dist/core/sessions/state.d.ts.map +1 -1
- package/dist/core/sessions/state.js +11 -1
- package/dist/core/sessions/state.js.map +1 -1
- package/dist/core/system.d.ts +9 -0
- package/dist/core/system.d.ts.map +1 -1
- package/dist/core/system.js +4 -1
- package/dist/core/system.js.map +1 -1
- package/dist/core/tools/executor.d.ts +1 -1
- package/dist/core/wake-key.d.ts +34 -0
- package/dist/core/wake-key.d.ts.map +1 -0
- package/dist/core/wake-key.js +51 -0
- package/dist/core/wake-key.js.map +1 -0
- package/dist/index.d.ts +23 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/archive/archive-inspection.d.ts +48 -0
- package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
- package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
- package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
- package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
- package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
- package/dist/lib/archive/archive-inspection.js +253 -0
- package/dist/lib/archive/archive-inspection.js.map +1 -0
- package/dist/lib/archive/index.d.ts +3 -0
- package/dist/lib/archive/index.d.ts.map +1 -0
- package/dist/lib/archive/index.js +2 -0
- package/dist/lib/archive/index.js.map +1 -0
- package/dist/lib/logger/console.d.ts +5 -12
- package/dist/lib/logger/console.d.ts.map +1 -1
- package/dist/lib/logger/console.js +5 -47
- package/dist/lib/logger/console.js.map +1 -1
- package/dist/lib/logger/file.d.ts +8 -11
- package/dist/lib/logger/file.d.ts.map +1 -1
- package/dist/lib/logger/file.js +26 -37
- package/dist/lib/logger/file.js.map +1 -1
- package/dist/lib/logger/index.d.ts +3 -1
- package/dist/lib/logger/index.d.ts.map +1 -1
- package/dist/lib/logger/index.js +3 -1
- package/dist/lib/logger/index.js.map +1 -1
- package/dist/lib/logger/jsonl.d.ts +21 -0
- package/dist/lib/logger/jsonl.d.ts.map +1 -0
- package/dist/lib/logger/jsonl.js +29 -0
- package/dist/lib/logger/jsonl.js.map +1 -0
- package/dist/lib/logger/logger.d.ts +22 -0
- package/dist/lib/logger/logger.d.ts.map +1 -1
- package/dist/lib/logger/logger.js +37 -0
- package/dist/lib/logger/logger.js.map +1 -1
- package/dist/lib/logger/session-log.d.ts +21 -0
- package/dist/lib/logger/session-log.d.ts.map +1 -0
- package/dist/lib/logger/session-log.js +37 -0
- package/dist/lib/logger/session-log.js.map +1 -0
- package/dist/lib/utils/concurrency.d.ts +1 -1
- package/dist/lib/utils/concurrency.d.ts.map +1 -1
- package/dist/lib/utils/concurrency.js +30 -7
- package/dist/lib/utils/concurrency.js.map +1 -1
- package/dist/lib/utils/fs-batch.d.ts +17 -0
- package/dist/lib/utils/fs-batch.d.ts.map +1 -0
- package/dist/lib/utils/fs-batch.js +38 -0
- package/dist/lib/utils/fs-batch.js.map +1 -0
- package/dist/lib/utils/result.d.ts +7 -22
- package/dist/lib/utils/result.d.ts.map +1 -1
- package/dist/lib/utils/result.js +6 -17
- package/dist/lib/utils/result.js.map +1 -1
- package/dist/lib/utils/sleep.d.ts +10 -0
- package/dist/lib/utils/sleep.d.ts.map +1 -0
- package/dist/lib/utils/sleep.js +26 -0
- package/dist/lib/utils/sleep.js.map +1 -0
- package/dist/platform/fs-revision.d.ts +21 -0
- package/dist/platform/fs-revision.d.ts.map +1 -0
- package/dist/platform/fs-revision.js +9 -0
- package/dist/platform/fs-revision.js.map +1 -0
- package/dist/platform/fs.d.ts +104 -1
- package/dist/platform/fs.d.ts.map +1 -1
- package/dist/platform/git.d.ts +59 -0
- package/dist/platform/git.d.ts.map +1 -0
- package/dist/platform/git.js +8 -0
- package/dist/platform/git.js.map +1 -0
- package/dist/platform/index.d.ts +40 -1
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +1 -1
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/llm-call-log.d.ts +80 -0
- package/dist/platform/llm-call-log.d.ts.map +1 -0
- package/dist/platform/llm-call-log.js +12 -0
- package/dist/platform/llm-call-log.js.map +1 -0
- package/dist/platform/scheduler.d.ts +32 -0
- package/dist/platform/scheduler.d.ts.map +1 -0
- package/dist/platform/scheduler.js +46 -0
- package/dist/platform/scheduler.js.map +1 -0
- package/dist/platform/session-log.d.ts +36 -0
- package/dist/platform/session-log.d.ts.map +1 -0
- package/dist/platform/session-log.js +12 -0
- package/dist/platform/session-log.js.map +1 -0
- package/dist/platform/shell.d.ts +83 -0
- package/dist/platform/shell.d.ts.map +1 -0
- package/dist/platform/shell.js +13 -0
- package/dist/platform/shell.js.map +1 -0
- package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
- package/dist/plugins/agent-status/plugin.js +1 -0
- package/dist/plugins/agent-status/plugin.js.map +1 -1
- package/dist/plugins/agents/plugin.d.ts.map +1 -1
- package/dist/plugins/agents/plugin.js +129 -62
- package/dist/plugins/agents/plugin.js.map +1 -1
- package/dist/plugins/filesystem/listing.d.ts +3 -0
- package/dist/plugins/filesystem/listing.d.ts.map +1 -1
- package/dist/plugins/filesystem/listing.js +66 -10
- package/dist/plugins/filesystem/listing.js.map +1 -1
- package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
- package/dist/plugins/filesystem/plugin.js +8 -6
- package/dist/plugins/filesystem/plugin.js.map +1 -1
- package/dist/plugins/git-status/plugin.d.ts +34 -7
- package/dist/plugins/git-status/plugin.d.ts.map +1 -1
- package/dist/plugins/git-status/plugin.js +168 -64
- package/dist/plugins/git-status/plugin.js.map +1 -1
- package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
- package/dist/plugins/llm-debug/plugin.js +1 -0
- package/dist/plugins/llm-debug/plugin.js.map +1 -1
- package/dist/plugins/logs/plugin.d.ts +1 -4
- package/dist/plugins/logs/plugin.d.ts.map +1 -1
- package/dist/plugins/logs/plugin.js +7 -0
- package/dist/plugins/logs/plugin.js.map +1 -1
- package/dist/plugins/mailbox/helpers.d.ts +2 -2
- package/dist/plugins/mailbox/helpers.js +1 -1
- package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
- package/dist/plugins/mailbox/plugin.js +38 -43
- package/dist/plugins/mailbox/plugin.js.map +1 -1
- package/dist/plugins/mailbox/query.d.ts +7 -2
- package/dist/plugins/mailbox/query.d.ts.map +1 -1
- package/dist/plugins/mailbox/query.js +14 -7
- package/dist/plugins/mailbox/query.js.map +1 -1
- package/dist/plugins/mailbox/state.d.ts +5 -4
- package/dist/plugins/mailbox/state.d.ts.map +1 -1
- package/dist/plugins/mailbox/state.js +6 -5
- package/dist/plugins/mailbox/state.js.map +1 -1
- package/dist/plugins/resources/filename.d.ts +4 -0
- package/dist/plugins/resources/filename.d.ts.map +1 -0
- package/dist/plugins/resources/filename.js +18 -0
- package/dist/plugins/resources/filename.js.map +1 -0
- package/dist/plugins/resources/plugin.d.ts +3 -0
- package/dist/plugins/resources/plugin.d.ts.map +1 -1
- package/dist/plugins/resources/plugin.js +97 -60
- package/dist/plugins/resources/plugin.js.map +1 -1
- package/dist/plugins/resources/state.d.ts +1 -1
- package/dist/plugins/resources/state.js +1 -1
- package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
- package/dist/plugins/result-eviction/plugin.js +6 -1
- package/dist/plugins/result-eviction/plugin.js.map +1 -1
- package/dist/plugins/services/plugin.d.ts +4 -1
- package/dist/plugins/services/plugin.d.ts.map +1 -1
- package/dist/plugins/services/plugin.js +251 -100
- package/dist/plugins/services/plugin.js.map +1 -1
- package/dist/plugins/services/prompt.d.ts.map +1 -1
- package/dist/plugins/services/prompt.js +1 -4
- package/dist/plugins/services/prompt.js.map +1 -1
- package/dist/plugins/services/schema.d.ts +15 -5
- package/dist/plugins/services/schema.d.ts.map +1 -1
- package/dist/plugins/services/service.d.ts +100 -18
- package/dist/plugins/services/service.d.ts.map +1 -1
- package/dist/plugins/services/service.js +680 -230
- package/dist/plugins/services/service.js.map +1 -1
- package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
- package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
- package/dist/plugins/session-lifecycle/plugin.js +53 -40
- package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
- package/dist/plugins/session-state/plugin.d.ts +21 -13
- package/dist/plugins/session-state/plugin.d.ts.map +1 -1
- package/dist/plugins/session-state/plugin.js +214 -79
- package/dist/plugins/session-state/plugin.js.map +1 -1
- package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
- package/dist/plugins/session-stats/plugin.js +1 -0
- package/dist/plugins/session-stats/plugin.js.map +1 -1
- package/dist/plugins/shell/executor.d.ts +17 -15
- package/dist/plugins/shell/executor.d.ts.map +1 -1
- package/dist/plugins/shell/executor.js +130 -195
- package/dist/plugins/shell/executor.js.map +1 -1
- package/dist/plugins/shell/index.d.ts +2 -2
- package/dist/plugins/shell/index.d.ts.map +1 -1
- package/dist/plugins/shell/index.js +2 -2
- package/dist/plugins/shell/index.js.map +1 -1
- package/dist/plugins/shell/plugin.d.ts +5 -4
- package/dist/plugins/shell/plugin.d.ts.map +1 -1
- package/dist/plugins/shell/plugin.js +4 -8
- package/dist/plugins/shell/plugin.js.map +1 -1
- package/dist/plugins/skills/discovery.d.ts.map +1 -1
- package/dist/plugins/skills/discovery.js +10 -8
- package/dist/plugins/skills/discovery.js.map +1 -1
- package/dist/plugins/skills/index.d.ts +1 -1
- package/dist/plugins/skills/index.d.ts.map +1 -1
- package/dist/plugins/skills/plugin.d.ts +1 -1
- package/dist/plugins/skills/plugin.d.ts.map +1 -1
- package/dist/plugins/skills/plugin.js +23 -30
- package/dist/plugins/skills/plugin.js.map +1 -1
- package/dist/plugins/skills/prompts.d.ts +3 -3
- package/dist/plugins/skills/prompts.d.ts.map +1 -1
- package/dist/plugins/skills/prompts.js.map +1 -1
- package/dist/plugins/skills/schema.d.ts +4 -2
- package/dist/plugins/skills/schema.d.ts.map +1 -1
- package/dist/plugins/todo/schema.d.ts +1 -1
- package/dist/plugins/uploads/plugin.d.ts +11 -4
- package/dist/plugins/uploads/plugin.d.ts.map +1 -1
- package/dist/plugins/uploads/plugin.js +891 -225
- package/dist/plugins/uploads/plugin.js.map +1 -1
- package/dist/plugins/uploads/preprocessor.d.ts +14 -0
- package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessor.js +11 -0
- package/dist/plugins/uploads/preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
- package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/schema.d.ts +25 -2
- package/dist/plugins/uploads/schema.d.ts.map +1 -1
- package/dist/plugins/uploads/schema.js +24 -3
- package/dist/plugins/uploads/schema.js.map +1 -1
- package/dist/plugins/uploads/state.d.ts +13 -1
- package/dist/plugins/uploads/state.d.ts.map +1 -1
- package/dist/plugins/uploads/state.js +4 -1
- package/dist/plugins/uploads/state.js.map +1 -1
- package/dist/plugins/user-chat/plugin.d.ts +12 -5
- package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
- package/dist/plugins/user-chat/plugin.js +141 -32
- package/dist/plugins/user-chat/plugin.js.map +1 -1
- package/dist/plugins/workers/context.d.ts +35 -13
- package/dist/plugins/workers/context.d.ts.map +1 -1
- package/dist/plugins/workers/context.js +82 -32
- package/dist/plugins/workers/context.js.map +1 -1
- package/dist/plugins/workers/definition.d.ts +7 -0
- package/dist/plugins/workers/definition.d.ts.map +1 -1
- package/dist/plugins/workers/definition.js.map +1 -1
- package/dist/plugins/workers/index.d.ts +4 -4
- package/dist/plugins/workers/index.d.ts.map +1 -1
- package/dist/plugins/workers/index.js +2 -2
- package/dist/plugins/workers/index.js.map +1 -1
- package/dist/plugins/workers/plugin.d.ts +10 -57
- package/dist/plugins/workers/plugin.d.ts.map +1 -1
- package/dist/plugins/workers/plugin.js +385 -123
- package/dist/plugins/workers/plugin.js.map +1 -1
- package/dist/plugins/workers/state.d.ts +69 -0
- package/dist/plugins/workers/state.d.ts.map +1 -0
- package/dist/plugins/workers/state.js +52 -0
- package/dist/plugins/workers/state.js.map +1 -0
- package/dist/plugins/workers/worker.d.ts +15 -4
- package/dist/plugins/workers/worker.d.ts.map +1 -1
- package/dist/testing/conformance.d.ts +106 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +1463 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/node-platform.d.ts.map +1 -1
- package/dist/testing/node-platform.js +5 -0
- package/dist/testing/node-platform.js.map +1 -1
- package/dist/testing/test-harness.d.ts +11 -1
- package/dist/testing/test-harness.d.ts.map +1 -1
- package/dist/testing/test-harness.js +17 -37
- package/dist/testing/test-harness.js.map +1 -1
- package/dist/testing/wait-helpers.d.ts.map +1 -1
- package/dist/testing/wait-helpers.js +1 -3
- package/dist/testing/wait-helpers.js.map +1 -1
- package/dist/transport/adapter/client-adapter.d.ts +6 -0
- package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
- package/dist/transport/adapter/client-adapter.js +50 -3
- package/dist/transport/adapter/client-adapter.js.map +1 -1
- package/dist/transport/adapter/heartbeat.d.ts +16 -0
- package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
- package/dist/transport/adapter/heartbeat.js +41 -0
- package/dist/transport/adapter/heartbeat.js.map +1 -0
- package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
- package/dist/transport/adapter/server-adapter.js +6 -0
- package/dist/transport/adapter/server-adapter.js.map +1 -1
- package/dist/transport/http/app.d.ts +3 -30
- package/dist/transport/http/app.d.ts.map +1 -1
- package/dist/transport/http/app.js +3 -7
- package/dist/transport/http/app.js.map +1 -1
- package/dist/transport/http/context.d.ts +40 -0
- package/dist/transport/http/context.d.ts.map +1 -0
- package/dist/transport/http/context.js +17 -0
- package/dist/transport/http/context.js.map +1 -0
- package/dist/transport/http/fetch-guard.d.ts +49 -0
- package/dist/transport/http/fetch-guard.d.ts.map +1 -0
- package/dist/transport/http/fetch-guard.js +312 -0
- package/dist/transport/http/fetch-guard.js.map +1 -0
- package/dist/transport/http/index.d.ts +1 -1
- package/dist/transport/http/index.d.ts.map +1 -1
- package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
- package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
- package/dist/transport/http/middleware/error-handler.d.ts +2 -2
- package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
- package/dist/transport/http/path-containment.d.ts +20 -0
- package/dist/transport/http/path-containment.d.ts.map +1 -0
- package/dist/transport/http/path-containment.js +31 -0
- package/dist/transport/http/path-containment.js.map +1 -0
- package/dist/transport/http/responses.d.ts +30 -0
- package/dist/transport/http/responses.d.ts.map +1 -0
- package/dist/transport/http/responses.js +5 -0
- package/dist/transport/http/responses.js.map +1 -0
- package/dist/transport/http/routes/files.d.ts +1 -1
- package/dist/transport/http/routes/files.d.ts.map +1 -1
- package/dist/transport/http/routes/files.js +54 -155
- package/dist/transport/http/routes/files.js.map +1 -1
- package/dist/transport/http/routes/resources.d.ts +1 -1
- package/dist/transport/http/routes/resources.d.ts.map +1 -1
- package/dist/transport/http/routes/resources.js +92 -57
- package/dist/transport/http/routes/resources.js.map +1 -1
- package/dist/transport/http/routes/rpc.d.ts +6 -1
- package/dist/transport/http/routes/rpc.d.ts.map +1 -1
- package/dist/transport/http/routes/rpc.js +51 -21
- package/dist/transport/http/routes/rpc.js.map +1 -1
- package/dist/transport/http/routes/upload.d.ts +1 -1
- package/dist/transport/http/routes/upload.d.ts.map +1 -1
- package/dist/transport/http/routes/upload.js +256 -169
- package/dist/transport/http/routes/upload.js.map +1 -1
- package/dist/user-config.d.ts +34 -7
- package/dist/user-config.d.ts.map +1 -1
- package/dist/user-config.js +71 -0
- package/dist/user-config.js.map +1 -1
- package/package.json +17 -7
- package/src/bootstrap.ts +119 -35
- package/src/bun-platform/fs.ts +1 -0
- package/src/bun-platform/index.ts +18 -1
- package/src/bun-platform/server-lifecycle.ts +218 -0
- package/src/bun-platform/shell.ts +362 -0
- package/src/config.ts +130 -0
- package/src/core/agents/agent.ts +210 -92
- package/src/core/agents/config.ts +8 -0
- package/src/core/agents/retry.ts +16 -17
- package/src/core/agents/state.ts +2 -0
- package/src/core/events/base-event-store.ts +24 -16
- package/src/core/events/file.ts +198 -22
- package/src/core/file-store/containment.ts +75 -0
- package/src/core/file-store/file-store.ts +106 -25
- package/src/core/file-store/types.ts +14 -1
- package/src/core/image/image-processor.ts +3 -1
- package/src/core/image/types.ts +2 -0
- package/src/core/image/vips-resizer.ts +102 -37
- package/src/core/llm/anthropic.ts +63 -79
- package/src/core/llm/logger.ts +175 -37
- package/src/core/llm/openrouter.ts +57 -72
- package/src/core/llm/provider-request.ts +40 -0
- package/src/core/llm/provider.ts +28 -0
- package/src/core/plugins/plugin-builder.ts +106 -14
- package/src/core/preset/preset-builder.ts +12 -22
- package/src/core/sessions/context.ts +18 -0
- package/src/core/sessions/runtime-activity.ts +78 -0
- package/src/core/sessions/schema.ts +29 -3
- package/src/core/sessions/session-manager.ts +560 -140
- package/src/core/sessions/session-store.ts +38 -0
- package/src/core/sessions/session.ts +187 -47
- package/src/core/sessions/state.ts +11 -0
- package/src/core/system.ts +15 -0
- package/src/core/wake-key.ts +65 -0
- package/src/index.ts +30 -12
- package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
- package/src/lib/archive/archive-inspection.ts +359 -0
- package/src/lib/archive/index.ts +17 -0
- package/src/lib/logger/console.ts +7 -57
- package/src/lib/logger/file.ts +28 -50
- package/src/lib/logger/index.ts +3 -1
- package/src/lib/logger/jsonl.ts +36 -0
- package/src/lib/logger/logger.ts +48 -0
- package/src/lib/logger/session-log.ts +42 -0
- package/src/lib/utils/concurrency.ts +37 -8
- package/src/lib/utils/fs-batch.ts +49 -0
- package/src/lib/utils/result.ts +7 -31
- package/src/lib/utils/sleep.ts +23 -0
- package/src/platform/fs-revision.ts +21 -0
- package/src/platform/fs.ts +109 -1
- package/src/platform/git.ts +67 -0
- package/src/platform/index.ts +51 -1
- package/src/platform/llm-call-log.ts +86 -0
- package/src/platform/scheduler.ts +71 -0
- package/src/platform/session-log.ts +39 -0
- package/src/platform/shell.ts +89 -0
- package/src/plugins/agent-status/plugin.ts +1 -0
- package/src/plugins/agents/plugin.ts +134 -81
- package/src/plugins/filesystem/listing.ts +70 -12
- package/src/plugins/filesystem/plugin.ts +8 -6
- package/src/plugins/git-status/plugin.ts +204 -77
- package/src/plugins/llm-debug/plugin.ts +1 -0
- package/src/plugins/logs/plugin.ts +9 -0
- package/src/plugins/mailbox/plugin.ts +46 -64
- package/src/plugins/mailbox/query.ts +15 -7
- package/src/plugins/mailbox/state.ts +1 -0
- package/src/plugins/resources/filename.ts +19 -0
- package/src/plugins/resources/plugin.ts +111 -59
- package/src/plugins/result-eviction/plugin.ts +6 -1
- package/src/plugins/services/plugin.ts +254 -98
- package/src/plugins/services/prompt.ts +1 -6
- package/src/plugins/services/schema.ts +17 -3
- package/src/plugins/services/service.ts +702 -252
- package/src/plugins/session-lifecycle/plugin.ts +56 -41
- package/src/plugins/session-state/plugin.ts +242 -88
- package/src/plugins/session-stats/plugin.ts +1 -0
- package/src/plugins/shell/executor.ts +144 -226
- package/src/plugins/shell/index.ts +1 -4
- package/src/plugins/shell/plugin.ts +7 -9
- package/src/plugins/skills/discovery.ts +10 -8
- package/src/plugins/skills/index.ts +1 -1
- package/src/plugins/skills/plugin.ts +19 -27
- package/src/plugins/skills/prompts.ts +3 -3
- package/src/plugins/skills/schema.ts +5 -2
- package/src/plugins/uploads/plugin.ts +991 -273
- package/src/plugins/uploads/preprocessor.ts +25 -0
- package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
- package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
- package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
- package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
- package/src/plugins/uploads/schema.ts +30 -3
- package/src/plugins/uploads/state.ts +12 -0
- package/src/plugins/user-chat/plugin.ts +196 -40
- package/src/plugins/workers/context.ts +102 -39
- package/src/plugins/workers/definition.ts +7 -0
- package/src/plugins/workers/index.ts +4 -4
- package/src/plugins/workers/plugin.ts +461 -151
- package/src/plugins/workers/state.ts +64 -0
- package/src/plugins/workers/worker.ts +15 -4
- package/src/testing/conformance.ts +1751 -0
- package/src/testing/node-platform.ts +5 -0
- package/src/testing/test-harness.ts +21 -38
- package/src/testing/wait-helpers.ts +1 -4
- package/src/transport/adapter/client-adapter.ts +60 -3
- package/src/transport/adapter/heartbeat.ts +50 -0
- package/src/transport/adapter/server-adapter.ts +6 -0
- package/src/transport/http/app.ts +7 -35
- package/src/transport/http/context.ts +46 -0
- package/src/transport/http/fetch-guard.ts +318 -0
- package/src/transport/http/index.ts +1 -1
- package/src/transport/http/middleware/bearer-auth.ts +1 -1
- package/src/transport/http/middleware/error-handler.ts +1 -1
- package/src/transport/http/path-containment.ts +44 -0
- package/src/transport/http/responses.ts +20 -0
- package/src/transport/http/routes/files.ts +69 -159
- package/src/transport/http/routes/resources.ts +124 -93
- package/src/transport/http/routes/rpc.ts +63 -26
- package/src/transport/http/routes/upload.ts +327 -258
- package/src/user-config.ts +93 -7
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -155
- package/dist/config.test.js.map +0 -1
- package/dist/core/agent-loop.integration.test.d.ts +0 -2
- package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
- package/dist/core/agent-loop.integration.test.js +0 -414
- package/dist/core/agent-loop.integration.test.js.map +0 -1
- package/dist/core/agents/agent-config.test.d.ts +0 -2
- package/dist/core/agents/agent-config.test.d.ts.map +0 -1
- package/dist/core/agents/agent-config.test.js +0 -194
- package/dist/core/agents/agent-config.test.js.map +0 -1
- package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
- package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
- package/dist/core/agents/agent-shutdown.test.js +0 -180
- package/dist/core/agents/agent-shutdown.test.js.map +0 -1
- package/dist/core/agents/agent.test.d.ts +0 -2
- package/dist/core/agents/agent.test.d.ts.map +0 -1
- package/dist/core/agents/agent.test.js +0 -313
- package/dist/core/agents/agent.test.js.map +0 -1
- package/dist/core/agents/communicator.d.ts +0 -3
- package/dist/core/agents/communicator.d.ts.map +0 -1
- package/dist/core/agents/communicator.js +0 -13
- package/dist/core/agents/communicator.js.map +0 -1
- package/dist/core/agents/handler-events.test.d.ts +0 -5
- package/dist/core/agents/handler-events.test.d.ts.map +0 -1
- package/dist/core/agents/handler-events.test.js +0 -115
- package/dist/core/agents/handler-events.test.js.map +0 -1
- package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
- package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
- package/dist/core/agents/response-sanitizer.test.js +0 -101
- package/dist/core/agents/response-sanitizer.test.js.map +0 -1
- package/dist/core/error-recovery.integration.test.d.ts +0 -2
- package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
- package/dist/core/error-recovery.integration.test.js +0 -288
- package/dist/core/error-recovery.integration.test.js.map +0 -1
- package/dist/core/event-sourcing.integration.test.d.ts +0 -2
- package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
- package/dist/core/event-sourcing.integration.test.js +0 -154
- package/dist/core/event-sourcing.integration.test.js.map +0 -1
- package/dist/core/events/file.test.d.ts +0 -2
- package/dist/core/events/file.test.d.ts.map +0 -1
- package/dist/core/events/file.test.js +0 -284
- package/dist/core/events/file.test.js.map +0 -1
- package/dist/core/events/memory.test.d.ts +0 -2
- package/dist/core/events/memory.test.d.ts.map +0 -1
- package/dist/core/events/memory.test.js +0 -502
- package/dist/core/events/memory.test.js.map +0 -1
- package/dist/core/image/image-processor.test.d.ts +0 -2
- package/dist/core/image/image-processor.test.d.ts.map +0 -1
- package/dist/core/image/image-processor.test.js +0 -171
- package/dist/core/image/image-processor.test.js.map +0 -1
- package/dist/core/image/vips-resizer.test.d.ts +0 -2
- package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
- package/dist/core/image/vips-resizer.test.js +0 -336
- package/dist/core/image/vips-resizer.test.js.map +0 -1
- package/dist/core/llm/anthropic.test.d.ts +0 -2
- package/dist/core/llm/anthropic.test.d.ts.map +0 -1
- package/dist/core/llm/anthropic.test.js +0 -464
- package/dist/core/llm/anthropic.test.js.map +0 -1
- package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
- package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
- package/dist/core/llm/cache-breakpoints.test.js +0 -69
- package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
- package/dist/core/llm/cache-live.test.d.ts +0 -16
- package/dist/core/llm/cache-live.test.d.ts.map +0 -1
- package/dist/core/llm/cache-live.test.js +0 -137
- package/dist/core/llm/cache-live.test.js.map +0 -1
- package/dist/core/llm/logger.test.d.ts +0 -7
- package/dist/core/llm/logger.test.d.ts.map +0 -1
- package/dist/core/llm/logger.test.js +0 -228
- package/dist/core/llm/logger.test.js.map +0 -1
- package/dist/core/llm/message-sanitization.test.d.ts +0 -2
- package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
- package/dist/core/llm/message-sanitization.test.js +0 -181
- package/dist/core/llm/message-sanitization.test.js.map +0 -1
- package/dist/core/llm/mock.test.d.ts +0 -2
- package/dist/core/llm/mock.test.d.ts.map +0 -1
- package/dist/core/llm/mock.test.js +0 -318
- package/dist/core/llm/mock.test.js.map +0 -1
- package/dist/core/llm/model-shortlist-live.test.d.ts +0 -35
- package/dist/core/llm/model-shortlist-live.test.d.ts.map +0 -1
- package/dist/core/llm/model-shortlist-live.test.js +0 -452
- package/dist/core/llm/model-shortlist-live.test.js.map +0 -1
- package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
- package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
- package/dist/core/llm/openrouter-mapping.test.js +0 -190
- package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
- package/dist/core/llm/openrouter.test.d.ts +0 -2
- package/dist/core/llm/openrouter.test.d.ts.map +0 -1
- package/dist/core/llm/openrouter.test.js +0 -377
- package/dist/core/llm/openrouter.test.js.map +0 -1
- package/dist/core/llm/provider-integration.test.d.ts +0 -12
- package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
- package/dist/core/llm/provider-integration.test.js +0 -350
- package/dist/core/llm/provider-integration.test.js.map +0 -1
- package/dist/core/llm/reasoning-details.test.d.ts +0 -2
- package/dist/core/llm/reasoning-details.test.d.ts.map +0 -1
- package/dist/core/llm/reasoning-details.test.js +0 -144
- package/dist/core/llm/reasoning-details.test.js.map +0 -1
- package/dist/core/llm/routing-provider.test.d.ts +0 -2
- package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
- package/dist/core/llm/routing-provider.test.js +0 -94
- package/dist/core/llm/routing-provider.test.js.map +0 -1
- package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
- package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
- package/dist/core/llm/snapshot-middleware.test.js +0 -144
- package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
- package/dist/core/llm/thinking-blocks.test.d.ts +0 -2
- package/dist/core/llm/thinking-blocks.test.d.ts.map +0 -1
- package/dist/core/llm/thinking-blocks.test.js +0 -291
- package/dist/core/llm/thinking-blocks.test.js.map +0 -1
- package/dist/core/multi-agent.integration.test.d.ts +0 -2
- package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
- package/dist/core/multi-agent.integration.test.js +0 -298
- package/dist/core/multi-agent.integration.test.js.map +0 -1
- package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
- package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
- package/dist/core/plugin-hooks.integration.test.js +0 -458
- package/dist/core/plugin-hooks.integration.test.js.map +0 -1
- package/dist/core/reasoning-round-trip.integration.test.d.ts +0 -2
- package/dist/core/reasoning-round-trip.integration.test.d.ts.map +0 -1
- package/dist/core/reasoning-round-trip.integration.test.js +0 -150
- package/dist/core/reasoning-round-trip.integration.test.js.map +0 -1
- package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
- package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/core/session-lifecycle.integration.test.js +0 -159
- package/dist/core/session-lifecycle.integration.test.js.map +0 -1
- package/dist/core/sessions/fork-utils.test.d.ts +0 -2
- package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
- package/dist/core/sessions/fork-utils.test.js +0 -129
- package/dist/core/sessions/fork-utils.test.js.map +0 -1
- package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
- package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
- package/dist/core/sessions/session-overrides.integration.test.js +0 -154
- package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
- package/dist/core/sessions/session.test.d.ts +0 -2
- package/dist/core/sessions/session.test.d.ts.map +0 -1
- package/dist/core/sessions/session.test.js +0 -1100
- package/dist/core/sessions/session.test.js.map +0 -1
- package/dist/core/tools/executor.test.d.ts +0 -2
- package/dist/core/tools/executor.test.d.ts.map +0 -1
- package/dist/core/tools/executor.test.js +0 -144
- package/dist/core/tools/executor.test.js.map +0 -1
- package/dist/lib/logger/console.test.d.ts +0 -2
- package/dist/lib/logger/console.test.d.ts.map +0 -1
- package/dist/lib/logger/console.test.js +0 -258
- package/dist/lib/logger/console.test.js.map +0 -1
- package/dist/lib/never.d.ts +0 -2
- package/dist/lib/never.d.ts.map +0 -1
- package/dist/lib/never.js +0 -4
- package/dist/lib/never.js.map +0 -1
- package/dist/lib/utils/concurrency.test.d.ts +0 -2
- package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
- package/dist/lib/utils/concurrency.test.js +0 -135
- package/dist/lib/utils/concurrency.test.js.map +0 -1
- package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
- package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
- package/dist/plugins/agent-status/agent-status.test.js +0 -136
- package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
- package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
- package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
- package/dist/plugins/agents/agents.integration.test.js +0 -830
- package/dist/plugins/agents/agents.integration.test.js.map +0 -1
- package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
- package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
- package/dist/plugins/agents/supervision.integration.test.js +0 -215
- package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
- package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
- package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/compaction-live.test.js +0 -177
- package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
- package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
- package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
- package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
- package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
- package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/context-compactor.test.js +0 -858
- package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
- package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
- package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
- package/dist/plugins/context-compact/history-offloader.test.js +0 -77
- package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
- package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
- package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
- package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
- package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
- package/dist/plugins/filesystem/schema.d.ts +0 -7
- package/dist/plugins/filesystem/schema.d.ts.map +0 -1
- package/dist/plugins/filesystem/schema.js +0 -2
- package/dist/plugins/filesystem/schema.js.map +0 -1
- package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
- package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
- package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
- package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
- package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
- package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
- package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
- package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
- package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
- package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
- package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
- package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
- package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
- package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
- package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
- package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
- package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
- package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
- package/dist/plugins/resources/resources.integration.test.js +0 -62
- package/dist/plugins/resources/resources.integration.test.js.map +0 -1
- package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
- package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
- package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
- package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
- package/dist/plugins/services/pid-registry.test.d.ts +0 -2
- package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
- package/dist/plugins/services/pid-registry.test.js +0 -161
- package/dist/plugins/services/pid-registry.test.js.map +0 -1
- package/dist/plugins/services/services.integration.test.d.ts +0 -2
- package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
- package/dist/plugins/services/services.integration.test.js +0 -1057
- package/dist/plugins/services/services.integration.test.js.map +0 -1
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
- package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
- package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
- package/dist/plugins/session-stats/plugin.test.js +0 -145
- package/dist/plugins/session-stats/plugin.test.js.map +0 -1
- package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
- package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
- package/dist/plugins/shell/shell.integration.test.js +0 -234
- package/dist/plugins/shell/shell.integration.test.js.map +0 -1
- package/dist/plugins/shell/shell.test.d.ts +0 -2
- package/dist/plugins/shell/shell.test.d.ts.map +0 -1
- package/dist/plugins/shell/shell.test.js +0 -236
- package/dist/plugins/shell/shell.test.js.map +0 -1
- package/dist/plugins/skills/discovery.test.d.ts +0 -2
- package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
- package/dist/plugins/skills/discovery.test.js +0 -312
- package/dist/plugins/skills/discovery.test.js.map +0 -1
- package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
- package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
- package/dist/plugins/skills/skills.integration.test.js +0 -475
- package/dist/plugins/skills/skills.integration.test.js.map +0 -1
- package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
- package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
- package/dist/plugins/todo/todo.integration.test.js +0 -605
- package/dist/plugins/todo/todo.integration.test.js.map +0 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
- package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
- package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
- package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
- package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
- package/dist/plugins/uploads/uploads.integration.test.js +0 -639
- package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
- package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
- package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
- package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
- package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
- package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
- package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
- package/dist/plugins/workers/workers.integration.test.js +0 -629
- package/dist/plugins/workers/workers.integration.test.js.map +0 -1
- package/dist/prompts/macros.test.d.ts +0 -2
- package/dist/prompts/macros.test.d.ts.map +0 -1
- package/dist/prompts/macros.test.js +0 -80
- package/dist/prompts/macros.test.js.map +0 -1
- package/dist/testing/test-harness.test.d.ts +0 -2
- package/dist/testing/test-harness.test.d.ts.map +0 -1
- package/dist/testing/test-harness.test.js +0 -92
- package/dist/testing/test-harness.test.js.map +0 -1
- package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
- package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
- package/dist/transport/http/routes/rpc.integration.test.js +0 -189
- package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
- package/dist/transport/http/routes/rpc.test.d.ts +0 -2
- package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
- package/dist/transport/http/routes/rpc.test.js +0 -316
- package/dist/transport/http/routes/rpc.test.js.map +0 -1
- package/src/config.test.ts +0 -174
- package/src/core/agent-loop.integration.test.ts +0 -503
- package/src/core/agents/agent-config.test.ts +0 -240
- package/src/core/agents/agent-shutdown.test.ts +0 -236
- package/src/core/agents/agent.test.ts +0 -387
- package/src/core/agents/communicator.ts +0 -16
- package/src/core/agents/handler-events.test.ts +0 -167
- package/src/core/agents/response-sanitizer.test.ts +0 -137
- package/src/core/error-recovery.integration.test.ts +0 -343
- package/src/core/event-sourcing.integration.test.ts +0 -191
- package/src/core/events/file.test.ts +0 -436
- package/src/core/events/memory.test.ts +0 -741
- package/src/core/image/image-processor.test.ts +0 -218
- package/src/core/image/vips-resizer.test.ts +0 -388
- package/src/core/llm/anthropic.test.ts +0 -546
- package/src/core/llm/cache-breakpoints.test.ts +0 -85
- package/src/core/llm/cache-live.test.ts +0 -155
- package/src/core/llm/logger.test.ts +0 -270
- package/src/core/llm/message-sanitization.test.ts +0 -217
- package/src/core/llm/mock.test.ts +0 -402
- package/src/core/llm/model-shortlist-live.test.ts +0 -577
- package/src/core/llm/openrouter-mapping.test.ts +0 -234
- package/src/core/llm/openrouter.test.ts +0 -499
- package/src/core/llm/provider-integration.test.ts +0 -408
- package/src/core/llm/reasoning-details.test.ts +0 -177
- package/src/core/llm/routing-provider.test.ts +0 -113
- package/src/core/llm/snapshot-middleware.test.ts +0 -168
- package/src/core/llm/thinking-blocks.test.ts +0 -345
- package/src/core/multi-agent.integration.test.ts +0 -340
- package/src/core/plugin-hooks.integration.test.ts +0 -568
- package/src/core/reasoning-round-trip.integration.test.ts +0 -188
- package/src/core/session-lifecycle.integration.test.ts +0 -202
- package/src/core/sessions/fork-utils.test.ts +0 -158
- package/src/core/sessions/session-overrides.integration.test.ts +0 -210
- package/src/core/sessions/session.test.ts +0 -1736
- package/src/core/tools/executor.test.ts +0 -161
- package/src/lib/logger/console.test.ts +0 -348
- package/src/lib/never.ts +0 -3
- package/src/lib/utils/concurrency.test.ts +0 -169
- package/src/plugins/agent-status/agent-status.test.ts +0 -164
- package/src/plugins/agents/agents.integration.test.ts +0 -976
- package/src/plugins/agents/supervision.integration.test.ts +0 -249
- package/src/plugins/context-compact/compaction-live.test.ts +0 -221
- package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
- package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
- package/src/plugins/context-compact/history-offloader.test.ts +0 -100
- package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
- package/src/plugins/filesystem/schema.ts +0 -6
- package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
- package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
- package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
- package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
- package/src/plugins/resources/resources.integration.test.ts +0 -68
- package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
- package/src/plugins/services/pid-registry.test.ts +0 -180
- package/src/plugins/services/services.integration.test.ts +0 -1223
- package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
- package/src/plugins/session-stats/plugin.test.ts +0 -160
- package/src/plugins/shell/shell.integration.test.ts +0 -273
- package/src/plugins/shell/shell.test.ts +0 -314
- package/src/plugins/skills/discovery.test.ts +0 -395
- package/src/plugins/skills/skills.integration.test.ts +0 -580
- package/src/plugins/todo/todo.integration.test.ts +0 -687
- package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
- package/src/plugins/uploads/uploads.integration.test.ts +0 -831
- package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
- package/src/plugins/workers/workers.integration.test.ts +0 -778
- package/src/prompts/macros.test.ts +0 -107
- package/src/testing/test-harness.test.ts +0 -114
- package/src/transport/http/routes/rpc.integration.test.ts +0 -243
- package/src/transport/http/routes/rpc.test.ts +0 -372
package/src/index.ts
CHANGED
|
@@ -9,8 +9,12 @@ export { loadConfig, validateConfig } from './config.js'
|
|
|
9
9
|
export type { Config } from './config.js'
|
|
10
10
|
|
|
11
11
|
// Bootstrap
|
|
12
|
-
export { bootstrap, createSystemFromServices } from './bootstrap.js'
|
|
13
|
-
export type { Services } from './bootstrap.js'
|
|
12
|
+
export { bootstrap, createSystemFromServices, fullPlugins, isolatePlugins } from './bootstrap.js'
|
|
13
|
+
export type { BootstrapOptions, BuiltinMethodSchemas, IsolateMethodSchemas, PluginProfile, Services } from './bootstrap.js'
|
|
14
|
+
|
|
15
|
+
// Scheduler wake keys — a host delivering its own wakes mints and reads them
|
|
16
|
+
export { agentWakeKey, parseAgentWakeKey, pluginWakeKey, parsePluginWakeKey } from './core/wake-key.js'
|
|
17
|
+
export type { AgentWake, AgentWakeKind, PluginWake } from './core/wake-key.js'
|
|
14
18
|
|
|
15
19
|
// System
|
|
16
20
|
export { createSystem } from './core/system.js'
|
|
@@ -25,8 +29,8 @@ export type { ConsoleLoggerConfig } from '~/lib/logger/index.js'
|
|
|
25
29
|
export type { LogLevel, Logger } from '~/lib/logger/logger.js'
|
|
26
30
|
|
|
27
31
|
// User config
|
|
28
|
-
export { defineConfig } from './user-config.js'
|
|
29
|
-
export type { LocalResource, RojConfig } from './user-config.js'
|
|
32
|
+
export { defineConfig, parseExtraBinds } from './user-config.js'
|
|
33
|
+
export type { LocalResource, RojConfig, SessionDefaults } from './user-config.js'
|
|
30
34
|
|
|
31
35
|
// Transport adapters
|
|
32
36
|
export { ClientAdapter, createAgentTransport, ServerAdapter } from './transport/adapter/index.js'
|
|
@@ -37,7 +41,7 @@ export { Agent } from '~/core/agents/agent.js'
|
|
|
37
41
|
export type { AgentConfig } from '~/core/agents/agent.js'
|
|
38
42
|
export { SessionManager } from '~/core/sessions/session-manager.js'
|
|
39
43
|
export type { SessionManagerOptions } from '~/core/sessions/session-manager.js'
|
|
40
|
-
export { SessionStore } from '~/core/sessions/session-store.js'
|
|
44
|
+
export { SessionRuntimeDetachedError, SessionStore } from '~/core/sessions/session-store.js'
|
|
41
45
|
export { Session } from '~/core/sessions/session.js'
|
|
42
46
|
export type { UserOutputCallback } from '~/core/sessions/session.js'
|
|
43
47
|
|
|
@@ -48,8 +52,11 @@ export type { Preset } from '~/core/preset/index.js'
|
|
|
48
52
|
// Domain types (re-exported for external consumers, replacing @roj-ai/shared root exports)
|
|
49
53
|
export { AgentId } from '~/core/agents/schema.js'
|
|
50
54
|
export type { AgentStatus as DomainAgentStatus, ProtocolAgentStatus, ProtocolAgentStatus as AgentStatus } from '~/core/agents/schema.js'
|
|
55
|
+
// Event factories behind BuiltinEvent — a third-party plugin declares these in
|
|
56
|
+
// .events([...]) to react to built-in events without reaching into src/.
|
|
51
57
|
export { agentEvents } from '~/core/agents/state.js'
|
|
52
58
|
export type { AgentPauseReason, AgentState, LLMMessage } from '~/core/agents/state.js'
|
|
59
|
+
export { contextEvents } from '~/core/context/state.js'
|
|
53
60
|
export type { DomainEvent } from '~/core/events/types.js'
|
|
54
61
|
export type { FactoryEventType } from '~/core/events/types.js'
|
|
55
62
|
export { isDomainEvent } from '~/core/events/types.js'
|
|
@@ -61,29 +68,39 @@ export type { InferenceNext, LLMMiddleware } from '~/core/llm/middleware.js'
|
|
|
61
68
|
export type { OpenRouterProviderRouting, OpenRouterReasoningOptions, OpenRouterRequestOptions } from '~/core/llm/provider.js'
|
|
62
69
|
export { ModelId } from '~/core/llm/schema.js'
|
|
63
70
|
export type { LLMCallId } from '~/core/llm/schema.js'
|
|
71
|
+
export { llmEvents } from '~/core/llm/state.js'
|
|
64
72
|
export type { InferenceCompletedEvent, InferenceFailedEvent, InferenceStartedEvent } from '~/core/llm/state.js'
|
|
65
73
|
export { estimateTokens } from '~/core/llm/tokens.js'
|
|
66
74
|
export { applyEvent } from '~/core/sessions/apply-event.js'
|
|
67
75
|
export { selectPluginState } from '~/core/sessions/reducer.js'
|
|
68
|
-
export { SessionId } from '~/core/sessions/schema.js'
|
|
76
|
+
export { isValidSessionId, parseSessionId, SessionId } from '~/core/sessions/schema.js'
|
|
77
|
+
export type { RuntimeLeaseRelease, SessionRuntimeActivity, SessionRuntimeActivitySnapshot } from '~/core/sessions/runtime-activity.js'
|
|
69
78
|
export type { SessionMetadata } from '~/core/sessions/schema.js'
|
|
79
|
+
// Exported so a consumer can validate a callManagerMethod('sessions.list')
|
|
80
|
+
// result — that call is typed Result<unknown>, so the plugin's output schema
|
|
81
|
+
// does not reach the caller.
|
|
82
|
+
export { sessionMetadataSchema } from '~/core/sessions/schema.js'
|
|
70
83
|
export type { AgentOverrides, SessionOverrides, SessionOverridesPatch } from '~/core/sessions/state.js'
|
|
71
84
|
export {
|
|
72
85
|
agentOverridesSchema,
|
|
73
86
|
createSessionState,
|
|
74
87
|
reconstructSessionState,
|
|
75
88
|
resolveAgentOverrides,
|
|
89
|
+
sessionEvents,
|
|
76
90
|
sessionOverridesPatchSchema,
|
|
77
91
|
} from '~/core/sessions/state.js'
|
|
78
92
|
export type { SessionState } from '~/core/sessions/state.js'
|
|
79
|
-
export
|
|
93
|
+
export { ToolCallId } from '~/core/tools/schema.js'
|
|
94
|
+
export { toolEvents } from '~/core/tools/state.js'
|
|
80
95
|
export type { ToolStartedEvent } from '~/core/tools/state.js'
|
|
81
|
-
export { getAgentMailbox, selectMailboxState } from '~/plugins/mailbox/query.js'
|
|
96
|
+
export { getAgentMailbox, getAgentUnconsumedMailbox, selectMailboxState } from '~/plugins/mailbox/query.js'
|
|
82
97
|
export type { MailboxPluginState } from '~/plugins/mailbox/query.js'
|
|
98
|
+
export { mailboxEvents } from '~/plugins/mailbox/state.js'
|
|
83
99
|
export { MessageId } from '~/plugins/mailbox/schema.js'
|
|
84
100
|
export type { MailboxMessage } from '~/plugins/mailbox/schema.js'
|
|
85
|
-
export type { ServiceStatus } from '~/plugins/services/schema.js'
|
|
101
|
+
export type { ServiceStatus, ServiceStoppedBy, ServiceStopSource } from '~/plugins/services/schema.js'
|
|
86
102
|
export { ChatMessageId } from '~/plugins/user-chat/schema.js'
|
|
103
|
+
export { isValidUploadId, parseUploadId, UploadId } from '~/plugins/uploads/schema.js'
|
|
87
104
|
export type { AskUserInputType, AskUserInputTypeSchema, AskUserOption } from '~/plugins/user-chat/schema.js'
|
|
88
105
|
export type { BuiltinEvent } from './builtin-events.js'
|
|
89
106
|
|
|
@@ -129,7 +146,8 @@ export type {
|
|
|
129
146
|
export { RESOURCE_MANIFEST_FILENAME, ResourceManifestSchema } from '~/plugins/resources/manifest.js'
|
|
130
147
|
export type { ResourceManifest } from '~/plugins/resources/manifest.js'
|
|
131
148
|
export { uploadsPlugin } from '~/plugins/uploads/plugin.js'
|
|
132
|
-
export {
|
|
149
|
+
export type { ArchiveLimitOverrides, ArchiveLimits } from '~/lib/archive/index.js'
|
|
150
|
+
export { userChatEvents, userChatPlugin } from '~/plugins/user-chat/plugin.js'
|
|
133
151
|
export type { UserChatAgentConfig, UserChatPresetConfig, UserCommunicationMode } from '~/plugins/user-chat/plugin.js'
|
|
134
152
|
|
|
135
153
|
// Workers plugin
|
|
@@ -141,8 +159,8 @@ export type { WorkerContext } from '~/plugins/workers/index.js'
|
|
|
141
159
|
export type { WorkerError, WorkerResult } from '~/plugins/workers/index.js'
|
|
142
160
|
|
|
143
161
|
// Plugin builder
|
|
144
|
-
export { definePlugin } from '~/core/plugins/plugin-builder.js'
|
|
145
|
-
export type { CallerContext, ConfiguredPlugin, PluginDefinition } from '~/core/plugins/plugin-builder.js'
|
|
162
|
+
export { DEFAULT_PLUGIN_ORDER, definePlugin } from '~/core/plugins/plugin-builder.js'
|
|
163
|
+
export type { CallerContext, ConfiguredPlugin, PluginDefinition, SessionCloseReason } from '~/core/plugins/plugin-builder.js'
|
|
146
164
|
|
|
147
165
|
// Zod (re-export for presets that need schemas)
|
|
148
166
|
export { default as z } from 'zod/v4'
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Captured from Info-ZIP 6.00; unrelated verbose fields were omitted.
|
|
2
|
+
export const SAFE_INFO_ZIP_6_FIXTURE = `Archive: fixture.zip
|
|
3
|
+
There is no zipfile comment.
|
|
4
|
+
|
|
5
|
+
End-of-central-directory record:
|
|
6
|
+
-------------------------------
|
|
7
|
+
|
|
8
|
+
This zipfile constitutes the sole disk of a single-part archive; its
|
|
9
|
+
central directory contains 3 entries.
|
|
10
|
+
|
|
11
|
+
Central directory entry #1:
|
|
12
|
+
---------------------------
|
|
13
|
+
|
|
14
|
+
regular.txt
|
|
15
|
+
|
|
16
|
+
file system or operating system of origin: Unix
|
|
17
|
+
uncompressed size: 1 bytes
|
|
18
|
+
length of filename: 11 characters
|
|
19
|
+
Unix file attributes (100664 octal): -rw-rw-r--
|
|
20
|
+
MS-DOS file attributes (00 hex): none
|
|
21
|
+
|
|
22
|
+
Central directory entry #2:
|
|
23
|
+
---------------------------
|
|
24
|
+
|
|
25
|
+
space ž.txt
|
|
26
|
+
|
|
27
|
+
file system or operating system of origin: Unix
|
|
28
|
+
uncompressed size: 7 bytes
|
|
29
|
+
length of filename: 12 characters
|
|
30
|
+
Unix file attributes (100664 octal): -rw-rw-r--
|
|
31
|
+
MS-DOS file attributes (00 hex): none
|
|
32
|
+
|
|
33
|
+
Central directory entry #3:
|
|
34
|
+
---------------------------
|
|
35
|
+
|
|
36
|
+
dir/
|
|
37
|
+
|
|
38
|
+
file system or operating system of origin: Unix
|
|
39
|
+
uncompressed size: 0 bytes
|
|
40
|
+
length of filename: 4 characters
|
|
41
|
+
Unix file attributes (040775 octal): drwxrwxr-x
|
|
42
|
+
MS-DOS file attributes (10 hex): dir
|
|
43
|
+
`
|
|
44
|
+
|
|
45
|
+
export const BACKSLASH_INFO_ZIP_6_FIXTURE = `Archive: backslash.zip
|
|
46
|
+
There is no zipfile comment.
|
|
47
|
+
|
|
48
|
+
This zipfile constitutes the sole disk of a single-part archive; its
|
|
49
|
+
central directory contains 1 entry.
|
|
50
|
+
|
|
51
|
+
Central directory entry #1:
|
|
52
|
+
---------------------------
|
|
53
|
+
|
|
54
|
+
trailing\\
|
|
55
|
+
|
|
56
|
+
file system or operating system of origin: Unix
|
|
57
|
+
uncompressed size: 5 bytes
|
|
58
|
+
length of filename: 9 characters
|
|
59
|
+
Unix file attributes (100664 octal): -rw-rw-r--
|
|
60
|
+
MS-DOS file attributes (00 hex): none
|
|
61
|
+
`
|
|
62
|
+
|
|
63
|
+
export const SYMLINK_INFO_ZIP_6_FIXTURE = `Archive: symlink.zip
|
|
64
|
+
There is no zipfile comment.
|
|
65
|
+
|
|
66
|
+
This zipfile constitutes the sole disk of a single-part archive; its
|
|
67
|
+
central directory contains 1 entry.
|
|
68
|
+
|
|
69
|
+
Central directory entry #1:
|
|
70
|
+
---------------------------
|
|
71
|
+
|
|
72
|
+
dir/link
|
|
73
|
+
|
|
74
|
+
file system or operating system of origin: Unix
|
|
75
|
+
uncompressed size: 14 bytes
|
|
76
|
+
length of filename: 8 characters
|
|
77
|
+
Unix file attributes (120777 octal): lrwxrwxrwx
|
|
78
|
+
MS-DOS file attributes (00 hex): none
|
|
79
|
+
`
|
|
80
|
+
|
|
81
|
+
export const DOS_INFO_ZIP_6_FIXTURE = `Archive: windows.zip
|
|
82
|
+
There is no zipfile comment.
|
|
83
|
+
|
|
84
|
+
This zipfile constitutes the sole disk of a single-part archive; its
|
|
85
|
+
central directory contains 2 entries.
|
|
86
|
+
|
|
87
|
+
Central directory entry #1:
|
|
88
|
+
---------------------------
|
|
89
|
+
|
|
90
|
+
win-file.txt
|
|
91
|
+
|
|
92
|
+
file system or operating system of origin: MS-DOS, OS/2 or NT FAT
|
|
93
|
+
uncompressed size: 1 bytes
|
|
94
|
+
length of filename: 12 characters
|
|
95
|
+
non-MSDOS external file attributes: 000000 hex
|
|
96
|
+
MS-DOS file attributes (20 hex): arc
|
|
97
|
+
|
|
98
|
+
Central directory entry #2:
|
|
99
|
+
---------------------------
|
|
100
|
+
|
|
101
|
+
win-dir/
|
|
102
|
+
|
|
103
|
+
file system or operating system of origin: MS-DOS, OS/2 or NT FAT
|
|
104
|
+
uncompressed size: 0 bytes
|
|
105
|
+
length of filename: 8 characters
|
|
106
|
+
non-MSDOS external file attributes: 000000 hex
|
|
107
|
+
MS-DOS file attributes (10 hex): dir
|
|
108
|
+
`
|
|
109
|
+
|
|
110
|
+
export const EMPTY_INFO_ZIP_6_FIXTURE = `Archive: empty.zip
|
|
111
|
+
There is no zipfile comment.
|
|
112
|
+
|
|
113
|
+
End-of-central-directory record:
|
|
114
|
+
-------------------------------
|
|
115
|
+
|
|
116
|
+
This zipfile constitutes the sole disk of a single-part archive; its
|
|
117
|
+
central directory contains 0 entries.
|
|
118
|
+
The central directory is 0 (0000000000000000h) bytes long,
|
|
119
|
+
and its (expected) offset in bytes from the beginning of the zipfile
|
|
120
|
+
is 0 (0000000000000000h).
|
|
121
|
+
|
|
122
|
+
Empty zipfile.
|
|
123
|
+
`
|
|
124
|
+
|
|
125
|
+
export const TRUNCATED_INFO_ZIP_6_FIXTURE = `Archive: truncated.zip
|
|
126
|
+
There is no zipfile comment.
|
|
127
|
+
|
|
128
|
+
This zipfile constitutes the sole disk of a single-part archive; its
|
|
129
|
+
central directory contains 1 entry.
|
|
130
|
+
|
|
131
|
+
Central directory entry #1:
|
|
132
|
+
---------------------------
|
|
133
|
+
|
|
134
|
+
truncated.txt
|
|
135
|
+
|
|
136
|
+
file system or operating system of origin: Unix
|
|
137
|
+
uncompressed size: 1 bytes
|
|
138
|
+
`
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import type { Result } from '~/lib/utils/result.js'
|
|
2
|
+
import { Err, Ok } from '~/lib/utils/result.js'
|
|
3
|
+
import type { ProcessRunner } from '~/platform/process.js'
|
|
4
|
+
|
|
5
|
+
const MEBIBYTE = 1024 * 1024
|
|
6
|
+
const ZIPINFO_TIMEOUT_MS = 60_000
|
|
7
|
+
const ZIPINFO_MAX_BUFFER = 10 * MEBIBYTE
|
|
8
|
+
|
|
9
|
+
export interface ArchiveLimits {
|
|
10
|
+
maxEntries: number
|
|
11
|
+
maxTotalUncompressedSize: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type ArchiveLimitOverrides = Partial<ArchiveLimits>
|
|
15
|
+
|
|
16
|
+
export const DEFAULT_ARCHIVE_LIMITS: Readonly<ArchiveLimits> = {
|
|
17
|
+
maxEntries: 500,
|
|
18
|
+
maxTotalUncompressedSize: 100 * MEBIBYTE,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ArchiveEntry {
|
|
22
|
+
name: string
|
|
23
|
+
uncompressedSize: number
|
|
24
|
+
type: 'file' | 'directory'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ArchiveInspection {
|
|
28
|
+
entries: readonly ArchiveEntry[]
|
|
29
|
+
fileCount: number
|
|
30
|
+
directoryCount: number
|
|
31
|
+
totalUncompressedSize: number
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type ArchiveInspectionErrorCode =
|
|
35
|
+
| 'aborted'
|
|
36
|
+
| 'command_failed'
|
|
37
|
+
| 'empty_archive'
|
|
38
|
+
| 'invalid_listing'
|
|
39
|
+
| 'unsafe_path'
|
|
40
|
+
| 'too_many_entries'
|
|
41
|
+
| 'too_large'
|
|
42
|
+
| 'unsupported_entry_type'
|
|
43
|
+
|
|
44
|
+
export class ArchiveInspectionError extends Error {
|
|
45
|
+
readonly code: ArchiveInspectionErrorCode
|
|
46
|
+
readonly entryName?: string
|
|
47
|
+
|
|
48
|
+
constructor(code: ArchiveInspectionErrorCode, message: string, options?: { cause?: unknown; entryName?: string }) {
|
|
49
|
+
super(message, options?.cause === undefined ? undefined : { cause: options.cause })
|
|
50
|
+
this.name = 'ArchiveInspectionError'
|
|
51
|
+
this.code = code
|
|
52
|
+
this.entryName = options?.entryName
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface InspectZipArchiveOptions {
|
|
57
|
+
signal?: AbortSignal
|
|
58
|
+
timeoutMs?: number
|
|
59
|
+
limits?: ArchiveLimitOverrides
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function resolveArchiveLimits(overrides: ArchiveLimitOverrides = {}): Readonly<ArchiveLimits> {
|
|
63
|
+
return { ...DEFAULT_ARCHIVE_LIMITS, ...overrides }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Tracks one aggregate extraction budget across a top-level archive and every nested archive. */
|
|
67
|
+
export class ArchiveBudget {
|
|
68
|
+
readonly limits: Readonly<ArchiveLimits>
|
|
69
|
+
private consumedEntries = 0
|
|
70
|
+
private consumedUncompressedSize = 0
|
|
71
|
+
|
|
72
|
+
constructor(limits: ArchiveLimitOverrides = {}) {
|
|
73
|
+
this.limits = resolveArchiveLimits(limits)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
consume(inspection: ArchiveInspection): Result<void, ArchiveInspectionError> {
|
|
77
|
+
if (!isValidLimit(this.limits.maxEntries) || !isValidLimit(this.limits.maxTotalUncompressedSize)) {
|
|
78
|
+
return invalidListing('Archive limits must be non-negative safe integers')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const nextEntries = this.consumedEntries + inspection.entries.length
|
|
82
|
+
if (!Number.isSafeInteger(nextEntries) || nextEntries > this.limits.maxEntries) {
|
|
83
|
+
return Err(new ArchiveInspectionError(
|
|
84
|
+
'too_many_entries',
|
|
85
|
+
`Nested ZIP archives exceed the aggregate ${this.limits.maxEntries} entry limit`,
|
|
86
|
+
))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const nextSize = this.consumedUncompressedSize + inspection.totalUncompressedSize
|
|
90
|
+
if (!Number.isSafeInteger(nextSize) || nextSize > this.limits.maxTotalUncompressedSize) {
|
|
91
|
+
return Err(new ArchiveInspectionError(
|
|
92
|
+
'too_large',
|
|
93
|
+
`Nested ZIP archives exceed the aggregate ${this.limits.maxTotalUncompressedSize} byte uncompressed size limit`,
|
|
94
|
+
))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
this.consumedEntries = nextEntries
|
|
98
|
+
this.consumedUncompressedSize = nextSize
|
|
99
|
+
return Ok(undefined)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Inspect the central directory before a caller performs extraction. */
|
|
104
|
+
export async function inspectZipArchive(
|
|
105
|
+
process: ProcessRunner,
|
|
106
|
+
archivePath: string,
|
|
107
|
+
options: InspectZipArchiveOptions = {},
|
|
108
|
+
): Promise<Result<ArchiveInspection, ArchiveInspectionError>> {
|
|
109
|
+
if (options.signal?.aborted) {
|
|
110
|
+
return Err(abortedError(options.signal))
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let stdout: string
|
|
114
|
+
try {
|
|
115
|
+
const result = await process.execFile('unzip', ['-Z', '-v', archivePath], {
|
|
116
|
+
timeout: options.timeoutMs ?? ZIPINFO_TIMEOUT_MS,
|
|
117
|
+
maxBuffer: ZIPINFO_MAX_BUFFER,
|
|
118
|
+
signal: options.signal,
|
|
119
|
+
})
|
|
120
|
+
stdout = result.stdout
|
|
121
|
+
} catch (cause) {
|
|
122
|
+
if (options.signal?.aborted) {
|
|
123
|
+
return Err(abortedError(options.signal))
|
|
124
|
+
}
|
|
125
|
+
// Info-ZIP uses non-zero exits for warnings; inspection fails closed on all of them.
|
|
126
|
+
return Err(new ArchiveInspectionError('command_failed', 'Failed to inspect ZIP archive', { cause }))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const parsed = parseZipInfoVerbose(stdout)
|
|
130
|
+
if (!parsed.ok) return parsed
|
|
131
|
+
return validateArchiveEntries(parsed.value, resolveArchiveLimits(options.limits))
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Parse the stable fields emitted by Info-ZIP's verbose central-directory listing. */
|
|
135
|
+
export function parseZipInfoVerbose(output: string): Result<readonly ArchiveEntry[], ArchiveInspectionError> {
|
|
136
|
+
const normalized = output.replaceAll('\r\n', '\n')
|
|
137
|
+
const countMatches = [...normalized.matchAll(/central directory contains (\d+) entr(?:y|ies)\./g)]
|
|
138
|
+
if (countMatches.length !== 1) {
|
|
139
|
+
return invalidListing('ZIP listing does not contain one central-directory entry count')
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const expectedCountText = countMatches[0]?.[1]
|
|
143
|
+
const expectedCount = expectedCountText === undefined ? Number.NaN : Number(expectedCountText)
|
|
144
|
+
if (!Number.isSafeInteger(expectedCount) || expectedCount < 0) {
|
|
145
|
+
return invalidListing('ZIP listing contains an invalid central-directory entry count')
|
|
146
|
+
}
|
|
147
|
+
if (expectedCount === 0) {
|
|
148
|
+
return Err(new ArchiveInspectionError('empty_archive', 'Empty ZIP archives are not accepted'))
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const markers = [...normalized.matchAll(/^Central directory entry #(\d+):\n-+\n/gm)]
|
|
152
|
+
if (markers.length !== expectedCount) {
|
|
153
|
+
return invalidListing(`ZIP listing declared ${expectedCount} entries but described ${markers.length}`)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const entries: ArchiveEntry[] = []
|
|
157
|
+
for (let index = 0; index < markers.length; index++) {
|
|
158
|
+
const marker = markers[index]
|
|
159
|
+
const nextMarker = markers[index + 1]
|
|
160
|
+
if (marker === undefined || marker.index === undefined) {
|
|
161
|
+
return invalidListing('ZIP listing contains an entry without a location')
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const declaredIndex = marker[1] === undefined ? Number.NaN : Number(marker[1])
|
|
165
|
+
if (declaredIndex !== index + 1) {
|
|
166
|
+
return invalidListing('ZIP listing entry numbers are not sequential')
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const bodyStart = marker.index + marker[0].length
|
|
170
|
+
const bodyEnd = nextMarker?.index ?? normalized.length
|
|
171
|
+
const body = normalized.slice(bodyStart, bodyEnd)
|
|
172
|
+
const nameMatch = /^\n {2}([^\n]*)\n\n/.exec(body)
|
|
173
|
+
if (nameMatch?.[1] === undefined || nameMatch[1].length === 0) {
|
|
174
|
+
return invalidListing(`ZIP listing entry #${index + 1} has no unambiguous filename`)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const name = nameMatch[1]
|
|
178
|
+
const size = parseSingleIntegerField(body, 'uncompressed size')
|
|
179
|
+
const filenameLength = parseSingleIntegerField(body, 'length of filename')
|
|
180
|
+
if (!size.ok) return size
|
|
181
|
+
if (!filenameLength.ok) return filenameLength
|
|
182
|
+
if (new TextEncoder().encode(name).byteLength !== filenameLength.value) {
|
|
183
|
+
return invalidListing(`ZIP listing entry #${index + 1} has an ambiguous filename`)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const type = parseEntryType(body, name)
|
|
187
|
+
if (!type.ok) return type
|
|
188
|
+
|
|
189
|
+
entries.push({
|
|
190
|
+
name,
|
|
191
|
+
uncompressedSize: size.value,
|
|
192
|
+
type: type.value,
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return Ok(entries)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function validateArchiveEntries(
|
|
200
|
+
entries: readonly ArchiveEntry[],
|
|
201
|
+
limits: Readonly<ArchiveLimits> = DEFAULT_ARCHIVE_LIMITS,
|
|
202
|
+
): Result<ArchiveInspection, ArchiveInspectionError> {
|
|
203
|
+
if (!isValidLimit(limits.maxEntries) || !isValidLimit(limits.maxTotalUncompressedSize)) {
|
|
204
|
+
return invalidListing('Archive limits must be non-negative safe integers')
|
|
205
|
+
}
|
|
206
|
+
if (entries.length === 0) {
|
|
207
|
+
return Err(new ArchiveInspectionError('empty_archive', 'Empty ZIP archives are not accepted'))
|
|
208
|
+
}
|
|
209
|
+
if (entries.length > limits.maxEntries) {
|
|
210
|
+
return Err(new ArchiveInspectionError(
|
|
211
|
+
'too_many_entries',
|
|
212
|
+
`ZIP archive exceeds the ${limits.maxEntries} entry limit`,
|
|
213
|
+
))
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
let fileCount = 0
|
|
217
|
+
let directoryCount = 0
|
|
218
|
+
let totalUncompressedSize = 0
|
|
219
|
+
|
|
220
|
+
for (const entry of entries) {
|
|
221
|
+
const pathError = validateArchivePath(entry.name)
|
|
222
|
+
if (pathError !== null) {
|
|
223
|
+
return Err(new ArchiveInspectionError('unsafe_path', pathError, { entryName: entry.name }))
|
|
224
|
+
}
|
|
225
|
+
if (!isValidLimit(entry.uncompressedSize)) {
|
|
226
|
+
return invalidListing(`ZIP entry has an invalid uncompressed size: ${entry.name}`)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (entry.type === 'directory') {
|
|
230
|
+
if (!entry.name.endsWith('/') || entry.uncompressedSize !== 0) {
|
|
231
|
+
return Err(new ArchiveInspectionError(
|
|
232
|
+
'unsupported_entry_type',
|
|
233
|
+
'ZIP directory entry has an inconsistent name or size',
|
|
234
|
+
{ entryName: entry.name },
|
|
235
|
+
))
|
|
236
|
+
}
|
|
237
|
+
directoryCount++
|
|
238
|
+
continue
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (entry.name.endsWith('/')) {
|
|
242
|
+
return Err(new ArchiveInspectionError(
|
|
243
|
+
'unsupported_entry_type',
|
|
244
|
+
'ZIP regular file entry has a directory name',
|
|
245
|
+
{ entryName: entry.name },
|
|
246
|
+
))
|
|
247
|
+
}
|
|
248
|
+
fileCount++
|
|
249
|
+
totalUncompressedSize += entry.uncompressedSize
|
|
250
|
+
if (!Number.isSafeInteger(totalUncompressedSize) || totalUncompressedSize > limits.maxTotalUncompressedSize) {
|
|
251
|
+
return Err(new ArchiveInspectionError(
|
|
252
|
+
'too_large',
|
|
253
|
+
`ZIP archive exceeds the ${limits.maxTotalUncompressedSize} byte uncompressed size limit`,
|
|
254
|
+
))
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return Ok({ entries, fileCount, directoryCount, totalUncompressedSize })
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function parseEntryType(
|
|
262
|
+
body: string,
|
|
263
|
+
name: string,
|
|
264
|
+
): Result<ArchiveEntry['type'], ArchiveInspectionError> {
|
|
265
|
+
const origin = parseSingleTextField(body, 'file system or operating system of origin')
|
|
266
|
+
if (!origin.ok) return origin
|
|
267
|
+
|
|
268
|
+
let type: ArchiveEntry['type']
|
|
269
|
+
if (origin.value === 'Unix') {
|
|
270
|
+
const modeMatches = [...body.matchAll(/^ {2}Unix file attributes \(([0-7]{6}) octal\):\s+.*$/gm)]
|
|
271
|
+
const modeText = modeMatches[0]?.[1]
|
|
272
|
+
if (modeMatches.length !== 1 || modeText === undefined) {
|
|
273
|
+
return invalidListing('ZIP listing entry has invalid Unix file attributes')
|
|
274
|
+
}
|
|
275
|
+
const kind = Number.parseInt(modeText, 8) & 0o170000
|
|
276
|
+
if (kind === 0o100000) type = 'file'
|
|
277
|
+
else if (kind === 0o040000) type = 'directory'
|
|
278
|
+
else return unsupportedEntryType(name)
|
|
279
|
+
} else if (origin.value === 'MS-DOS, OS/2 or NT FAT') {
|
|
280
|
+
const attributeMatches = [...body.matchAll(/^ {2}MS-DOS file attributes \(([0-9A-Fa-f]{2}) hex\):\s+.*$/gm)]
|
|
281
|
+
const attributesText = attributeMatches[0]?.[1]
|
|
282
|
+
if (attributeMatches.length !== 1 || attributesText === undefined) {
|
|
283
|
+
return invalidListing('ZIP listing entry has invalid MS-DOS file attributes')
|
|
284
|
+
}
|
|
285
|
+
const attributes = Number.parseInt(attributesText, 16)
|
|
286
|
+
if ((attributes & 0x08) !== 0) return unsupportedEntryType(name)
|
|
287
|
+
type = (attributes & 0x10) !== 0 ? 'directory' : 'file'
|
|
288
|
+
} else {
|
|
289
|
+
return unsupportedEntryType(name)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if ((type === 'directory') !== name.endsWith('/')) {
|
|
293
|
+
return Err(new ArchiveInspectionError(
|
|
294
|
+
'unsupported_entry_type',
|
|
295
|
+
'ZIP entry name and file type are inconsistent',
|
|
296
|
+
{ entryName: name },
|
|
297
|
+
))
|
|
298
|
+
}
|
|
299
|
+
return Ok(type)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function parseSingleIntegerField(
|
|
303
|
+
body: string,
|
|
304
|
+
field: 'uncompressed size' | 'length of filename',
|
|
305
|
+
): Result<number, ArchiveInspectionError> {
|
|
306
|
+
const expression = new RegExp(`^ ${field}:\\s+(\\d+)(?: bytes| characters)$`, 'gm')
|
|
307
|
+
const matches = [...body.matchAll(expression)]
|
|
308
|
+
const valueText = matches[0]?.[1]
|
|
309
|
+
const value = valueText === undefined ? Number.NaN : Number(valueText)
|
|
310
|
+
if (matches.length !== 1 || !Number.isSafeInteger(value) || value < 0) {
|
|
311
|
+
return invalidListing(`ZIP listing entry has an invalid ${field} field`)
|
|
312
|
+
}
|
|
313
|
+
return Ok(value)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function parseSingleTextField(
|
|
317
|
+
body: string,
|
|
318
|
+
field: 'file system or operating system of origin',
|
|
319
|
+
): Result<string, ArchiveInspectionError> {
|
|
320
|
+
const expression = new RegExp(`^ ${field}:\\s+(.+)$`, 'gm')
|
|
321
|
+
const matches = [...body.matchAll(expression)]
|
|
322
|
+
const value = matches[0]?.[1]
|
|
323
|
+
if (matches.length !== 1 || value === undefined || value.length === 0) {
|
|
324
|
+
return invalidListing(`ZIP listing entry has an invalid ${field} field`)
|
|
325
|
+
}
|
|
326
|
+
return Ok(value)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function validateArchivePath(name: string): string | null {
|
|
330
|
+
if (name.includes('\0')) return 'ZIP entry name contains a NUL byte'
|
|
331
|
+
if (name.includes('\\')) return 'ZIP entry name contains a backslash'
|
|
332
|
+
if (name.startsWith('/')) return 'ZIP entry path is absolute'
|
|
333
|
+
if (/^[A-Za-z]:/.test(name)) return 'ZIP entry path contains a drive prefix'
|
|
334
|
+
|
|
335
|
+
if (name.split('/').some(segment => segment === '..')) {
|
|
336
|
+
return 'ZIP entry path escapes the extraction root'
|
|
337
|
+
}
|
|
338
|
+
return null
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function unsupportedEntryType(name: string): Result<never, ArchiveInspectionError> {
|
|
342
|
+
return Err(new ArchiveInspectionError(
|
|
343
|
+
'unsupported_entry_type',
|
|
344
|
+
'ZIP archive contains a symlink or unsupported special entry',
|
|
345
|
+
{ entryName: name },
|
|
346
|
+
))
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function invalidListing(message: string): Result<never, ArchiveInspectionError> {
|
|
350
|
+
return Err(new ArchiveInspectionError('invalid_listing', message))
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function isValidLimit(value: number): boolean {
|
|
354
|
+
return Number.isSafeInteger(value) && value >= 0
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function abortedError(signal: AbortSignal): ArchiveInspectionError {
|
|
358
|
+
return new ArchiveInspectionError('aborted', 'ZIP archive inspection was aborted', { cause: signal.reason })
|
|
359
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export {
|
|
2
|
+
ArchiveBudget,
|
|
3
|
+
ArchiveInspectionError,
|
|
4
|
+
DEFAULT_ARCHIVE_LIMITS,
|
|
5
|
+
inspectZipArchive,
|
|
6
|
+
parseZipInfoVerbose,
|
|
7
|
+
resolveArchiveLimits,
|
|
8
|
+
validateArchiveEntries,
|
|
9
|
+
} from './archive-inspection.js'
|
|
10
|
+
export type {
|
|
11
|
+
ArchiveEntry,
|
|
12
|
+
ArchiveInspection,
|
|
13
|
+
ArchiveInspectionErrorCode,
|
|
14
|
+
ArchiveLimitOverrides,
|
|
15
|
+
ArchiveLimits,
|
|
16
|
+
InspectZipArchiveOptions,
|
|
17
|
+
} from './archive-inspection.js'
|