@roj-ai/sdk 0.1.35 → 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 +209 -90
- 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 +27 -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.d.ts.map +1 -1
- package/dist/core/context/state.js +6 -2
- package/dist/core/context/state.js.map +1 -1
- 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 +101 -74
- 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 +70 -74
- 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 +45 -3
- 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 +4 -2
- package/dist/core/llm/state.d.ts.map +1 -1
- package/dist/core/llm/state.js +15 -4
- package/dist/core/llm/state.js.map +1 -1
- 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 +16 -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 +24 -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 +18 -8
- 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 +219 -95
- package/src/core/agents/config.ts +8 -0
- package/src/core/agents/retry.ts +16 -17
- package/src/core/agents/state.ts +28 -0
- package/src/core/context/state.ts +4 -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 +127 -82
- package/src/core/llm/logger.ts +175 -37
- package/src/core/llm/openrouter.ts +82 -81
- package/src/core/llm/provider-request.ts +40 -0
- package/src/core/llm/provider.ts +72 -3
- package/src/core/llm/state.ts +12 -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 +16 -0
- package/src/core/system.ts +15 -0
- package/src/core/wake-key.ts +65 -0
- package/src/index.ts +31 -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/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 -172
- 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/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/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/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/openrouter-mapping.test.ts +0 -210
- package/src/core/llm/openrouter.test.ts +0 -499
- package/src/core/llm/provider-integration.test.ts +0 -408
- package/src/core/llm/routing-provider.test.ts +0 -113
- package/src/core/llm/snapshot-middleware.test.ts +0 -168
- package/src/core/multi-agent.integration.test.ts +0 -340
- package/src/core/plugin-hooks.integration.test.ts +0 -568
- 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
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* validation, agent-visible path mapping). Replaces the separate path-resolver
|
|
6
6
|
* functions for FileStore consumers.
|
|
7
7
|
*
|
|
8
|
+
* Every operation resolves the path lexically and then checks that its real
|
|
9
|
+
* target is still inside the area the store may touch — session and workspace
|
|
10
|
+
* together, or whatever root a `scoped()` sub-store was carved out of. Links
|
|
11
|
+
* are not banned: one whose target lands back inside stays usable.
|
|
12
|
+
*
|
|
8
13
|
* Three scopes:
|
|
9
14
|
* - 'full': accepts agent-visible paths (/home/user/session/... or real paths)
|
|
10
15
|
* - 'session': paths relative to sessionDir
|
|
@@ -12,8 +17,9 @@
|
|
|
12
17
|
*/
|
|
13
18
|
|
|
14
19
|
import { dirname, join, normalize, resolve } from 'node:path'
|
|
20
|
+
import { containmentOf } from '~/core/file-store/containment.js'
|
|
15
21
|
import type { FileEntry, FileStore } from '~/core/file-store/types.js'
|
|
16
|
-
import type { FileSystem } from '~/platform/fs.js'
|
|
22
|
+
import type { FileSystem, WalkEntry } from '~/platform/fs.js'
|
|
17
23
|
import { Err, Ok } from '~/lib/utils/result.js'
|
|
18
24
|
import type { Result } from '~/lib/utils/result.js'
|
|
19
25
|
|
|
@@ -23,6 +29,19 @@ const VIRTUAL_WORKSPACE = '/home/user/workspace'
|
|
|
23
29
|
|
|
24
30
|
type FileStoreScope = 'full' | 'session' | 'workspace'
|
|
25
31
|
|
|
32
|
+
/** A lexically resolved path plus the roots its real target must stay inside. */
|
|
33
|
+
interface ResolvedPath {
|
|
34
|
+
absolute: string
|
|
35
|
+
roots: readonly string[]
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* What the operation does with the final link, which decides what an
|
|
40
|
+
* unresolvable one means: `follow` leaves it to the operation, `create` refuses
|
|
41
|
+
* it because writing would create the target, `entry` checks the parent instead.
|
|
42
|
+
*/
|
|
43
|
+
type ContainmentMode = 'follow' | 'create' | 'entry'
|
|
44
|
+
|
|
26
45
|
export class SessionFileStore implements FileStore {
|
|
27
46
|
constructor(
|
|
28
47
|
private readonly sessionDir: string,
|
|
@@ -30,25 +49,31 @@ export class SessionFileStore implements FileStore {
|
|
|
30
49
|
private readonly sandboxed: boolean,
|
|
31
50
|
private readonly fs: FileSystem,
|
|
32
51
|
private readonly scope: FileStoreScope = 'full',
|
|
52
|
+
/** Set by `scoped()` so a sub-store cannot escape the roots it was carved out of. */
|
|
53
|
+
private readonly containmentRoots?: readonly string[],
|
|
33
54
|
) {}
|
|
34
55
|
|
|
35
56
|
/** Create a session-scoped FileStore (relative paths → sessionDir) */
|
|
36
57
|
get session(): SessionFileStore {
|
|
37
|
-
return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'session')
|
|
58
|
+
return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'session', this.containmentRoots)
|
|
38
59
|
}
|
|
39
60
|
|
|
40
61
|
/** Create a workspace-scoped FileStore (relative paths → workspaceDir), or undefined if no workspace */
|
|
41
62
|
get workspace(): SessionFileStore | undefined {
|
|
42
63
|
if (!this.workspaceDir) return undefined
|
|
43
|
-
return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'workspace')
|
|
64
|
+
return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'workspace', this.containmentRoots)
|
|
44
65
|
}
|
|
45
66
|
|
|
46
67
|
async write(path: string, content: string | Buffer): Promise<Result<{ path: string }, string>> {
|
|
47
|
-
const resolved = this.
|
|
68
|
+
const resolved = await this.resolveContained(path, 'create')
|
|
48
69
|
if (!resolved.ok) return resolved
|
|
49
70
|
|
|
50
|
-
|
|
51
|
-
|
|
71
|
+
try {
|
|
72
|
+
await this.fs.mkdir(dirname(resolved.value), { recursive: true })
|
|
73
|
+
await this.fs.writeFile(resolved.value, content)
|
|
74
|
+
} catch {
|
|
75
|
+
return Err(`Failed to write: ${path}`)
|
|
76
|
+
}
|
|
52
77
|
|
|
53
78
|
return Ok({ path: this.toAgentPath(resolved.value) })
|
|
54
79
|
}
|
|
@@ -56,7 +81,7 @@ export class SessionFileStore implements FileStore {
|
|
|
56
81
|
async read(path: string): Promise<Result<string, string>>
|
|
57
82
|
async read(path: string, opts: { type: 'buffer' }): Promise<Result<Buffer, string>>
|
|
58
83
|
async read(path: string, opts?: { type: 'buffer' }): Promise<Result<string | Buffer, string>> {
|
|
59
|
-
const resolved = this.
|
|
84
|
+
const resolved = await this.resolveContained(path, 'follow')
|
|
60
85
|
if (!resolved.ok) return resolved
|
|
61
86
|
|
|
62
87
|
try {
|
|
@@ -70,21 +95,22 @@ export class SessionFileStore implements FileStore {
|
|
|
70
95
|
}
|
|
71
96
|
|
|
72
97
|
async exists(path: string): Promise<Result<boolean, string>> {
|
|
73
|
-
const resolved = this.
|
|
98
|
+
const resolved = await this.resolveContained(path, 'follow')
|
|
74
99
|
if (!resolved.ok) return resolved
|
|
75
100
|
|
|
76
101
|
return Ok(await this.fs.exists(resolved.value))
|
|
77
102
|
}
|
|
78
103
|
|
|
79
104
|
async stat(path: string): Promise<Result<FileEntry, string>> {
|
|
80
|
-
const resolved = this.
|
|
105
|
+
const resolved = await this.resolveContained(path, 'follow')
|
|
81
106
|
if (!resolved.ok) return resolved
|
|
82
107
|
|
|
83
108
|
try {
|
|
109
|
+
// `stat` follows links on purpose — a link to a file inside the root is a file here.
|
|
84
110
|
const s = await this.fs.stat(resolved.value)
|
|
85
111
|
return Ok({
|
|
86
112
|
size: s.size,
|
|
87
|
-
type: s.isFile() ? 'file' : s.isDirectory() ? 'directory' :
|
|
113
|
+
type: s.isFile() ? 'file' : s.isDirectory() ? 'directory' : 'other',
|
|
88
114
|
name: resolved.value.split('/').pop() || '',
|
|
89
115
|
})
|
|
90
116
|
} catch {
|
|
@@ -96,15 +122,24 @@ export class SessionFileStore implements FileStore {
|
|
|
96
122
|
path: string,
|
|
97
123
|
options?: { maxDepth?: number; gitIgnore?: boolean },
|
|
98
124
|
): Promise<Result<FileEntry[], string>> {
|
|
99
|
-
const resolved = this.
|
|
125
|
+
const resolved = await this.resolveContained(path, 'follow')
|
|
100
126
|
if (!resolved.ok) return resolved
|
|
101
127
|
|
|
102
128
|
const maxDepth = options?.maxDepth ?? 1
|
|
103
129
|
if (maxDepth < 1) return Ok([])
|
|
104
130
|
|
|
105
131
|
try {
|
|
132
|
+
// A readdir plus a stat per file is one question asked in pieces. Where
|
|
133
|
+
// the platform takes it whole, ask it whole.
|
|
134
|
+
if (this.fs.walk) {
|
|
135
|
+
const base = resolved.value
|
|
136
|
+
const found = await this.fs.walk(base, { depth: maxDepth })
|
|
137
|
+
return Ok(found.map((entry) => toFileEntry(entry, base)))
|
|
138
|
+
}
|
|
139
|
+
|
|
106
140
|
const entries: FileEntry[] = []
|
|
107
|
-
|
|
141
|
+
const readAll = (): Promise<void> => this.walkInto(resolved.value, '', maxDepth, entries)
|
|
142
|
+
await (this.fs.scopeReads ? this.fs.scopeReads(readAll) : readAll())
|
|
108
143
|
return Ok(entries)
|
|
109
144
|
} catch {
|
|
110
145
|
return Err(`Directory not found: ${path}`)
|
|
@@ -142,7 +177,7 @@ export class SessionFileStore implements FileStore {
|
|
|
142
177
|
}
|
|
143
178
|
|
|
144
179
|
async remove(path: string): Promise<Result<void, string>> {
|
|
145
|
-
const resolved = this.
|
|
180
|
+
const resolved = await this.resolveContained(path, 'entry')
|
|
146
181
|
if (!resolved.ok) return resolved
|
|
147
182
|
|
|
148
183
|
try {
|
|
@@ -166,24 +201,60 @@ export class SessionFileStore implements FileStore {
|
|
|
166
201
|
}
|
|
167
202
|
}
|
|
168
203
|
|
|
204
|
+
/** Lexical resolution only — despite the name it never follows a symlink. See FileStore.realPath. */
|
|
169
205
|
realPath(path: string): Result<string, string> {
|
|
170
|
-
|
|
206
|
+
const resolved = this.resolveScoped(path)
|
|
207
|
+
return resolved.ok ? Ok(resolved.value.absolute) : resolved
|
|
171
208
|
}
|
|
172
209
|
|
|
210
|
+
/** See FileStore.containedPath. */
|
|
211
|
+
containedPath(path: string): Promise<Result<string, string>> {
|
|
212
|
+
return this.resolveContained(path, 'create')
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Throws on a path it cannot resolve — never hand it unvalidated request data; use `realPath` there. */
|
|
173
216
|
scoped(basePath: string): SessionFileStore {
|
|
174
217
|
// Resolve basePath relative to current scope
|
|
175
|
-
const resolved = this.
|
|
218
|
+
const resolved = this.resolveScoped(basePath)
|
|
176
219
|
if (!resolved.ok) {
|
|
177
220
|
throw new Error(`Cannot scope to invalid path: ${basePath}`)
|
|
178
221
|
}
|
|
179
|
-
return new SessionFileStore(resolved.value, undefined, false, this.fs, 'session')
|
|
222
|
+
return new SessionFileStore(resolved.value.absolute, undefined, false, this.fs, 'session', resolved.value.roots)
|
|
180
223
|
}
|
|
181
224
|
|
|
182
225
|
// ============================================================================
|
|
183
226
|
// Path resolution
|
|
184
227
|
// ============================================================================
|
|
185
228
|
|
|
186
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Lexical resolution, plus a check that the real target has not left the roots.
|
|
231
|
+
* `mode` says what the operation does with the final link — see ContainmentMode.
|
|
232
|
+
*/
|
|
233
|
+
private async resolveContained(path: string, mode: ContainmentMode): Promise<Result<string, string>> {
|
|
234
|
+
const resolved = this.resolveScoped(path)
|
|
235
|
+
if (!resolved.ok) return resolved
|
|
236
|
+
|
|
237
|
+
const { absolute, roots } = resolved.value
|
|
238
|
+
const subject = mode === 'entry' ? dirname(absolute) : absolute
|
|
239
|
+
switch (await containmentOf(this.fs, roots, subject)) {
|
|
240
|
+
case 'outside':
|
|
241
|
+
return Err(`Path '${path}' resolves outside allowed directories`)
|
|
242
|
+
case 'unresolvable':
|
|
243
|
+
return mode === 'create' ? Err(`Path '${path}' cannot be resolved`) : Ok(absolute)
|
|
244
|
+
case 'inside':
|
|
245
|
+
return Ok(absolute)
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** The area this store may touch — both roots where a workspace is configured. */
|
|
250
|
+
private allowedRoots(): readonly string[] {
|
|
251
|
+
if (this.containmentRoots) return this.containmentRoots
|
|
252
|
+
const roots = [resolve(this.sessionDir)]
|
|
253
|
+
if (this.workspaceDir) roots.push(resolve(this.workspaceDir))
|
|
254
|
+
return roots
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private resolveScoped(path: string): Result<ResolvedPath, string> {
|
|
187
258
|
switch (this.scope) {
|
|
188
259
|
case 'full':
|
|
189
260
|
return this.resolveAgentPath(path)
|
|
@@ -196,7 +267,7 @@ export class SessionFileStore implements FileStore {
|
|
|
196
267
|
}
|
|
197
268
|
|
|
198
269
|
/** Resolve a relative path within a root directory */
|
|
199
|
-
private resolveRelativePath(path: string, rootDir: string): Result<
|
|
270
|
+
private resolveRelativePath(path: string, rootDir: string): Result<ResolvedPath, string> {
|
|
200
271
|
const normalized = normalize(path)
|
|
201
272
|
if (normalized.startsWith('..') || normalized.startsWith('/')) {
|
|
202
273
|
return Err(`Path traversal not allowed: ${path}`)
|
|
@@ -205,18 +276,18 @@ export class SessionFileStore implements FileStore {
|
|
|
205
276
|
if (!absolute.startsWith(rootDir)) {
|
|
206
277
|
return Err(`Path traversal not allowed: ${path}`)
|
|
207
278
|
}
|
|
208
|
-
return Ok(absolute)
|
|
279
|
+
return Ok({ absolute, roots: this.allowedRoots() })
|
|
209
280
|
}
|
|
210
281
|
|
|
211
282
|
/** Resolve an agent-visible path to real filesystem path (handles sandboxed virtual paths) */
|
|
212
|
-
private resolveAgentPath(agentPath: string): Result<
|
|
283
|
+
private resolveAgentPath(agentPath: string): Result<ResolvedPath, string> {
|
|
213
284
|
if (this.sandboxed) {
|
|
214
285
|
return this.resolveSandboxedPath(agentPath)
|
|
215
286
|
}
|
|
216
287
|
return this.resolveNonSandboxedPath(agentPath)
|
|
217
288
|
}
|
|
218
289
|
|
|
219
|
-
private resolveSandboxedPath(agentPath: string): Result<
|
|
290
|
+
private resolveSandboxedPath(agentPath: string): Result<ResolvedPath, string> {
|
|
220
291
|
if (agentPath.startsWith(VIRTUAL_SESSION + '/') || agentPath === VIRTUAL_SESSION) {
|
|
221
292
|
const relative = agentPath.slice(VIRTUAL_SESSION.length)
|
|
222
293
|
const absolutePath = resolve(this.sessionDir, relative.slice(1) || '.')
|
|
@@ -239,7 +310,7 @@ export class SessionFileStore implements FileStore {
|
|
|
239
310
|
return Err(`Path must start with ${validPrefixes}. Got: '${agentPath}'`)
|
|
240
311
|
}
|
|
241
312
|
|
|
242
|
-
private resolveNonSandboxedPath(agentPath: string): Result<
|
|
313
|
+
private resolveNonSandboxedPath(agentPath: string): Result<ResolvedPath, string> {
|
|
243
314
|
const absolutePath = resolve(agentPath)
|
|
244
315
|
const normalizedSession = resolve(this.sessionDir)
|
|
245
316
|
const normalizedWorkspace = this.workspaceDir ? resolve(this.workspaceDir) : null
|
|
@@ -252,10 +323,10 @@ export class SessionFileStore implements FileStore {
|
|
|
252
323
|
return Err(`Path '${agentPath}' is outside allowed directories`)
|
|
253
324
|
}
|
|
254
325
|
|
|
255
|
-
return Ok(absolutePath)
|
|
326
|
+
return Ok({ absolute: absolutePath, roots: this.allowedRoots() })
|
|
256
327
|
}
|
|
257
328
|
|
|
258
|
-
private validateWithinRoot(absolutePath: string, rootDir: string, originalPath: string): Result<
|
|
329
|
+
private validateWithinRoot(absolutePath: string, rootDir: string, originalPath: string): Result<ResolvedPath, string> {
|
|
259
330
|
const normalizedRoot = resolve(rootDir)
|
|
260
331
|
const isWithin = absolutePath === normalizedRoot || absolutePath.startsWith(normalizedRoot + '/')
|
|
261
332
|
|
|
@@ -263,7 +334,7 @@ export class SessionFileStore implements FileStore {
|
|
|
263
334
|
return Err(`Path '${originalPath}' resolves outside allowed directories`)
|
|
264
335
|
}
|
|
265
336
|
|
|
266
|
-
return Ok(absolutePath)
|
|
337
|
+
return Ok({ absolute: absolutePath, roots: this.allowedRoots() })
|
|
267
338
|
}
|
|
268
339
|
|
|
269
340
|
// ============================================================================
|
|
@@ -293,3 +364,13 @@ export class SessionFileStore implements FileStore {
|
|
|
293
364
|
return realPath
|
|
294
365
|
}
|
|
295
366
|
}
|
|
367
|
+
|
|
368
|
+
/** A walked entry as the store reports it: name relative to the listed directory. */
|
|
369
|
+
function toFileEntry(entry: WalkEntry, baseDir: string): FileEntry {
|
|
370
|
+
const prefixLength = baseDir.endsWith('/') ? baseDir.length : baseDir.length + 1
|
|
371
|
+
return {
|
|
372
|
+
name: entry.path.slice(prefixLength),
|
|
373
|
+
type: entry.type,
|
|
374
|
+
size: entry.type === 'file' ? entry.size : undefined,
|
|
375
|
+
}
|
|
376
|
+
}
|
|
@@ -39,9 +39,22 @@ export interface FileStore {
|
|
|
39
39
|
/** Remove a file. */
|
|
40
40
|
remove(path: string): Promise<Result<void, string>>
|
|
41
41
|
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Resolve an agent-visible path to a real filesystem path, lexically.
|
|
44
|
+
*
|
|
45
|
+
* Does not follow symlinks, so it cannot decide containment on its own. Use
|
|
46
|
+
* it only where the path is never handed to the filesystem — everything that
|
|
47
|
+
* goes on to read, write or spawn wants `containedPath` instead.
|
|
48
|
+
*/
|
|
43
49
|
realPath(path: string): Result<string, string>
|
|
44
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Resolve to a real filesystem path, refusing one whose real target leaves
|
|
53
|
+
* the store's roots. What a caller that reaches the filesystem itself, rather
|
|
54
|
+
* than through this store, should ask for.
|
|
55
|
+
*/
|
|
56
|
+
containedPath(path: string): Promise<Result<string, string>>
|
|
57
|
+
|
|
45
58
|
/** Get the agent-visible root paths (virtual when sandboxed, real otherwise) */
|
|
46
59
|
getRoots(): { session: string; workspace?: string }
|
|
47
60
|
|
|
@@ -80,7 +80,9 @@ export class DefaultImageProcessor implements ImageProcessor {
|
|
|
80
80
|
return { type: 'text', text: `[Image unavailable: ${path} - unsupported format]` }
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
// Not `realPath`: the URL comes back from conversation history, and what it
|
|
84
|
+
// names may have become a link out of the store since it was first read.
|
|
85
|
+
const resolved = await fileStore.containedPath(path)
|
|
84
86
|
if (!resolved.ok) {
|
|
85
87
|
return { type: 'text', text: `[Image unavailable: ${path} - ${resolved.error}]` }
|
|
86
88
|
}
|
package/src/core/image/types.ts
CHANGED
|
@@ -5,6 +5,8 @@ export interface ImageResizeOptions {
|
|
|
5
5
|
maxFileSizeBytes?: number
|
|
6
6
|
/** Override the resizer's default max dimension (long side, px). */
|
|
7
7
|
maxDimension?: number
|
|
8
|
+
/** Cancels external image-processing commands. */
|
|
9
|
+
signal?: AbortSignal
|
|
8
10
|
}
|
|
9
11
|
|
|
10
12
|
export interface ImageResizer {
|
|
@@ -25,31 +25,59 @@ export class VipsImageResizer implements ImageResizer {
|
|
|
25
25
|
|
|
26
26
|
async resize(filePath: string, mimeType: string, options?: ImageResizeOptions): Promise<ImageResizeResult> {
|
|
27
27
|
const effectiveMaxDimension = options?.maxDimension ?? this.maxDimension
|
|
28
|
+
const signal = options?.signal
|
|
29
|
+
let ownedTempFile: string | undefined
|
|
28
30
|
try {
|
|
31
|
+
signal?.throwIfAborted()
|
|
29
32
|
// Step 1: Dimension resize if needed
|
|
30
|
-
const result = await this.dimensionResize(filePath, mimeType, effectiveMaxDimension)
|
|
33
|
+
const result = await this.dimensionResize(filePath, mimeType, effectiveMaxDimension, signal)
|
|
34
|
+
ownedTempFile = result.tempFile
|
|
35
|
+
signal?.throwIfAborted()
|
|
31
36
|
|
|
32
37
|
// Step 2: If no size constraint, done
|
|
33
|
-
if (!options?.maxFileSizeBytes)
|
|
38
|
+
if (!options?.maxFileSizeBytes) {
|
|
39
|
+
signal?.throwIfAborted()
|
|
40
|
+
return result
|
|
41
|
+
}
|
|
34
42
|
|
|
35
43
|
// Step 3: Check if result fits
|
|
36
44
|
const fileSize = (await this.fs.stat(result.path)).size
|
|
37
|
-
|
|
45
|
+
signal?.throwIfAborted()
|
|
46
|
+
if (fileSize <= options.maxFileSizeBytes) {
|
|
47
|
+
signal?.throwIfAborted()
|
|
48
|
+
return result
|
|
49
|
+
}
|
|
38
50
|
|
|
39
51
|
// Step 4: Compress to fit — clean up dimension resize temp first
|
|
40
52
|
if (result.tempFile) {
|
|
41
53
|
await this.fs.unlink(result.tempFile).catch(() => {})
|
|
54
|
+
ownedTempFile = undefined
|
|
42
55
|
}
|
|
43
56
|
|
|
44
|
-
|
|
57
|
+
signal?.throwIfAborted()
|
|
58
|
+
const compressed = await this.compressToFit(filePath, options.maxFileSizeBytes, effectiveMaxDimension, signal)
|
|
59
|
+
ownedTempFile = compressed.tempFile
|
|
60
|
+
signal?.throwIfAborted()
|
|
61
|
+
return compressed
|
|
45
62
|
} catch (e) {
|
|
63
|
+
if (ownedTempFile) {
|
|
64
|
+
await this.fs.unlink(ownedTempFile).catch(() => {})
|
|
65
|
+
}
|
|
66
|
+
if (signal?.aborted) signal.throwIfAborted()
|
|
46
67
|
console.warn('[image-resize] failed, using original image:', e instanceof Error ? e.message : e)
|
|
47
68
|
return { path: filePath, mimeType }
|
|
48
69
|
}
|
|
49
70
|
}
|
|
50
71
|
|
|
51
|
-
private async getImageDimensions(
|
|
52
|
-
|
|
72
|
+
private async getImageDimensions(
|
|
73
|
+
filePath: string,
|
|
74
|
+
signal?: AbortSignal,
|
|
75
|
+
): Promise<{ width: number; height: number } | null> {
|
|
76
|
+
const { stdout } = await this.process.execFile('vipsheader', ['-f', 'width', '-f', 'height', filePath], {
|
|
77
|
+
timeout: 30_000,
|
|
78
|
+
signal,
|
|
79
|
+
})
|
|
80
|
+
signal?.throwIfAborted()
|
|
53
81
|
const lines = stdout.trim().split('\n')
|
|
54
82
|
if (lines.length < 2) return null
|
|
55
83
|
const width = parseInt(lines[0], 10)
|
|
@@ -58,12 +86,19 @@ export class VipsImageResizer implements ImageResizer {
|
|
|
58
86
|
return { width, height }
|
|
59
87
|
}
|
|
60
88
|
|
|
61
|
-
private async dimensionResize(
|
|
62
|
-
|
|
89
|
+
private async dimensionResize(
|
|
90
|
+
filePath: string,
|
|
91
|
+
mimeType: string,
|
|
92
|
+
maxDimension: number,
|
|
93
|
+
signal?: AbortSignal,
|
|
94
|
+
): Promise<ImageResizeResult> {
|
|
95
|
+
const dims = await this.getImageDimensions(filePath, signal)
|
|
96
|
+
signal?.throwIfAborted()
|
|
63
97
|
const needsResize = dims !== null && (dims.width > maxDimension || dims.height > maxDimension)
|
|
64
98
|
|
|
65
99
|
// JPEGs within dimension limits pass through unchanged
|
|
66
100
|
if (mimeType === 'image/jpeg' && !needsResize) {
|
|
101
|
+
signal?.throwIfAborted()
|
|
67
102
|
return { path: filePath, mimeType }
|
|
68
103
|
}
|
|
69
104
|
|
|
@@ -71,17 +106,27 @@ export class VipsImageResizer implements ImageResizer {
|
|
|
71
106
|
const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`
|
|
72
107
|
const outputPath = join(this.tmpDir, `roj-resize-${id}.jpg`)
|
|
73
108
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
109
|
+
try {
|
|
110
|
+
await this.process.execFile(
|
|
111
|
+
'vipsthumbnail',
|
|
112
|
+
[filePath, '--size', `${maxDimension}x${maxDimension}`, '-o', outputPath],
|
|
113
|
+
{ timeout: 30_000, signal },
|
|
114
|
+
)
|
|
115
|
+
signal?.throwIfAborted()
|
|
116
|
+
} catch (error) {
|
|
117
|
+
await this.fs.unlink(outputPath).catch(() => {})
|
|
118
|
+
throw error
|
|
119
|
+
}
|
|
120
|
+
signal?.throwIfAborted()
|
|
81
121
|
return { path: outputPath, mimeType: 'image/jpeg', tempFile: outputPath }
|
|
82
122
|
}
|
|
83
123
|
|
|
84
|
-
private async compressToFit(
|
|
124
|
+
private async compressToFit(
|
|
125
|
+
filePath: string,
|
|
126
|
+
maxFileSizeBytes: number,
|
|
127
|
+
maxDimension: number,
|
|
128
|
+
signal?: AbortSignal,
|
|
129
|
+
): Promise<ImageResizeResult> {
|
|
85
130
|
const halfDim = Math.floor(maxDimension / 2)
|
|
86
131
|
const attempts = [
|
|
87
132
|
{ dimension: maxDimension, quality: 85 },
|
|
@@ -95,31 +140,51 @@ export class VipsImageResizer implements ImageResizer {
|
|
|
95
140
|
|
|
96
141
|
let lastResult: ImageResizeResult | undefined
|
|
97
142
|
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
143
|
+
try {
|
|
144
|
+
for (const { dimension, quality } of attempts) {
|
|
145
|
+
signal?.throwIfAborted()
|
|
146
|
+
const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`
|
|
147
|
+
const outputPath = join(this.tmpDir, `roj-compress-${id}.jpg`)
|
|
148
|
+
|
|
149
|
+
try {
|
|
150
|
+
await this.process.execFile(
|
|
151
|
+
'vipsthumbnail',
|
|
152
|
+
[filePath, '--size', `${dimension}x${dimension}`, '-o', `${outputPath}[Q=${quality}]`],
|
|
153
|
+
{ timeout: 30_000, signal },
|
|
154
|
+
)
|
|
155
|
+
signal?.throwIfAborted()
|
|
156
|
+
|
|
157
|
+
const outputSize = (await this.fs.stat(outputPath)).size
|
|
158
|
+
signal?.throwIfAborted()
|
|
159
|
+
if (lastResult?.tempFile) {
|
|
160
|
+
await this.fs.unlink(lastResult.tempFile).catch(() => {})
|
|
161
|
+
}
|
|
162
|
+
signal?.throwIfAborted()
|
|
163
|
+
|
|
164
|
+
lastResult = {
|
|
165
|
+
path: outputPath,
|
|
166
|
+
mimeType: 'image/jpeg',
|
|
167
|
+
tempFile: outputPath,
|
|
168
|
+
}
|
|
169
|
+
if (outputSize <= maxFileSizeBytes) {
|
|
170
|
+
signal?.throwIfAborted()
|
|
171
|
+
return lastResult
|
|
172
|
+
}
|
|
173
|
+
} catch (error) {
|
|
174
|
+
await this.fs.unlink(outputPath).catch(() => {})
|
|
175
|
+
throw error
|
|
176
|
+
}
|
|
177
|
+
}
|
|
109
178
|
|
|
110
|
-
//
|
|
179
|
+
// Return best effort (most compressed) — caller decides what to do
|
|
180
|
+
if (!lastResult) throw new Error('Image compression produced no result')
|
|
181
|
+
signal?.throwIfAborted()
|
|
182
|
+
return lastResult
|
|
183
|
+
} catch (error) {
|
|
111
184
|
if (lastResult?.tempFile) {
|
|
112
185
|
await this.fs.unlink(lastResult.tempFile).catch(() => {})
|
|
113
186
|
}
|
|
114
|
-
|
|
115
|
-
lastResult = { path: outputPath, mimeType: 'image/jpeg', tempFile: outputPath }
|
|
116
|
-
|
|
117
|
-
if ((await this.fs.stat(outputPath)).size <= maxFileSizeBytes) {
|
|
118
|
-
return lastResult
|
|
119
|
-
}
|
|
187
|
+
throw error
|
|
120
188
|
}
|
|
121
|
-
|
|
122
|
-
// Return best effort (most compressed) — caller decides what to do
|
|
123
|
-
return lastResult!
|
|
124
189
|
}
|
|
125
190
|
}
|