@roj-ai/sdk 0.0.2
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 +453 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/builtin-events.d.ts +16 -0
- package/dist/builtin-events.d.ts.map +1 -0
- package/dist/bun-platform/fs.d.ts +9 -0
- package/dist/bun-platform/fs.d.ts.map +1 -0
- package/dist/bun-platform/index.d.ts +12 -0
- package/dist/bun-platform/index.d.ts.map +1 -0
- package/dist/bun-platform/process.d.ts +6 -0
- package/dist/bun-platform/process.d.ts.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/core/agent-loop.integration.test.d.ts +2 -0
- package/dist/core/agent-loop.integration.test.d.ts.map +1 -0
- package/dist/core/agents/agent-config.test.d.ts +2 -0
- package/dist/core/agents/agent-config.test.d.ts.map +1 -0
- package/dist/core/agents/agent-roles.d.ts +33 -0
- package/dist/core/agents/agent-roles.d.ts.map +1 -0
- package/dist/core/agents/agent-shutdown.test.d.ts +6 -0
- package/dist/core/agents/agent-shutdown.test.d.ts.map +1 -0
- package/dist/core/agents/agent.d.ts +234 -0
- package/dist/core/agents/agent.d.ts.map +1 -0
- package/dist/core/agents/agent.test.d.ts +2 -0
- package/dist/core/agents/agent.test.d.ts.map +1 -0
- package/dist/core/agents/communicator.d.ts +3 -0
- package/dist/core/agents/communicator.d.ts.map +1 -0
- package/dist/core/agents/config.d.ts +84 -0
- package/dist/core/agents/config.d.ts.map +1 -0
- package/dist/core/agents/context.d.ts +16 -0
- package/dist/core/agents/context.d.ts.map +1 -0
- package/dist/core/agents/debounce.d.ts +52 -0
- package/dist/core/agents/debounce.d.ts.map +1 -0
- package/dist/core/agents/handler-events.test.d.ts +5 -0
- package/dist/core/agents/handler-events.test.d.ts.map +1 -0
- package/dist/core/agents/index.d.ts +2 -0
- package/dist/core/agents/index.d.ts.map +1 -0
- package/dist/core/agents/response-sanitizer.d.ts +25 -0
- package/dist/core/agents/response-sanitizer.d.ts.map +1 -0
- package/dist/core/agents/response-sanitizer.test.d.ts +2 -0
- package/dist/core/agents/response-sanitizer.test.d.ts.map +1 -0
- package/dist/core/agents/retry.d.ts +40 -0
- package/dist/core/agents/retry.d.ts.map +1 -0
- package/dist/core/agents/schema.d.ts +57 -0
- package/dist/core/agents/schema.d.ts.map +1 -0
- package/dist/core/agents/state.d.ts +255 -0
- package/dist/core/agents/state.d.ts.map +1 -0
- package/dist/core/context/state.d.ts +28 -0
- package/dist/core/context/state.d.ts.map +1 -0
- package/dist/core/errors.d.ts +29 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/event-sourcing.integration.test.d.ts +2 -0
- package/dist/core/event-sourcing.integration.test.d.ts.map +1 -0
- package/dist/core/events/base-event-store.d.ts +55 -0
- package/dist/core/events/base-event-store.d.ts.map +1 -0
- package/dist/core/events/event-store.d.ts +108 -0
- package/dist/core/events/event-store.d.ts.map +1 -0
- package/dist/core/events/file.d.ts +50 -0
- package/dist/core/events/file.d.ts.map +1 -0
- package/dist/core/events/file.test.d.ts +2 -0
- package/dist/core/events/file.test.d.ts.map +1 -0
- package/dist/core/events/index.d.ts +4 -0
- package/dist/core/events/index.d.ts.map +1 -0
- package/dist/core/events/memory.d.ts +43 -0
- package/dist/core/events/memory.d.ts.map +1 -0
- package/dist/core/events/memory.test.d.ts +2 -0
- package/dist/core/events/memory.test.d.ts.map +1 -0
- package/dist/core/events/metadata-utils.d.ts +27 -0
- package/dist/core/events/metadata-utils.d.ts.map +1 -0
- package/dist/core/events/test-helpers.d.ts +28 -0
- package/dist/core/events/test-helpers.d.ts.map +1 -0
- package/dist/core/events/types.d.ts +46 -0
- package/dist/core/events/types.d.ts.map +1 -0
- package/dist/core/file-store/file-store.d.ts +56 -0
- package/dist/core/file-store/file-store.d.ts.map +1 -0
- package/dist/core/file-store/types.d.ts +50 -0
- package/dist/core/file-store/types.d.ts.map +1 -0
- package/dist/core/image/image-processor.d.ts +15 -0
- package/dist/core/image/image-processor.d.ts.map +1 -0
- package/dist/core/image/image-processor.test.d.ts +2 -0
- package/dist/core/image/image-processor.test.d.ts.map +1 -0
- package/dist/core/image/index.d.ts +5 -0
- package/dist/core/image/index.d.ts.map +1 -0
- package/dist/core/image/noop-resizer.d.ts +5 -0
- package/dist/core/image/noop-resizer.d.ts.map +1 -0
- package/dist/core/image/types.d.ts +20 -0
- package/dist/core/image/types.d.ts.map +1 -0
- package/dist/core/image/vips-resizer.d.ts +21 -0
- package/dist/core/image/vips-resizer.d.ts.map +1 -0
- package/dist/core/image/vips-resizer.test.d.ts +2 -0
- package/dist/core/image/vips-resizer.test.d.ts.map +1 -0
- package/dist/core/llm/anthropic.d.ts +51 -0
- package/dist/core/llm/anthropic.d.ts.map +1 -0
- package/dist/core/llm/anthropic.test.d.ts +2 -0
- package/dist/core/llm/anthropic.test.d.ts.map +1 -0
- package/dist/core/llm/cache-breakpoints.d.ts +17 -0
- package/dist/core/llm/cache-breakpoints.d.ts.map +1 -0
- package/dist/core/llm/cache-live.test.d.ts +16 -0
- package/dist/core/llm/cache-live.test.d.ts.map +1 -0
- package/dist/core/llm/index.d.ts +16 -0
- package/dist/core/llm/index.d.ts.map +1 -0
- package/dist/core/llm/llm-log-types.d.ts +148 -0
- package/dist/core/llm/llm-log-types.d.ts.map +1 -0
- package/dist/core/llm/logger.d.ts +74 -0
- package/dist/core/llm/logger.d.ts.map +1 -0
- package/dist/core/llm/logger.test.d.ts +7 -0
- package/dist/core/llm/logger.test.d.ts.map +1 -0
- package/dist/core/llm/logging-provider.d.ts +20 -0
- package/dist/core/llm/logging-provider.d.ts.map +1 -0
- package/dist/core/llm/middleware.d.ts +79 -0
- package/dist/core/llm/middleware.d.ts.map +1 -0
- package/dist/core/llm/mock.d.ts +79 -0
- package/dist/core/llm/mock.d.ts.map +1 -0
- package/dist/core/llm/mock.test.d.ts +2 -0
- package/dist/core/llm/mock.test.d.ts.map +1 -0
- package/dist/core/llm/openrouter-mapping.test.d.ts +2 -0
- package/dist/core/llm/openrouter-mapping.test.d.ts.map +1 -0
- package/dist/core/llm/openrouter.d.ts +37 -0
- package/dist/core/llm/openrouter.d.ts.map +1 -0
- package/dist/core/llm/openrouter.test.d.ts +2 -0
- package/dist/core/llm/openrouter.test.d.ts.map +1 -0
- package/dist/core/llm/provider-integration.test.d.ts +12 -0
- package/dist/core/llm/provider-integration.test.d.ts.map +1 -0
- package/dist/core/llm/provider.d.ts +175 -0
- package/dist/core/llm/provider.d.ts.map +1 -0
- package/dist/core/llm/routing-provider.d.ts +31 -0
- package/dist/core/llm/routing-provider.d.ts.map +1 -0
- package/dist/core/llm/routing-provider.test.d.ts +2 -0
- package/dist/core/llm/routing-provider.test.d.ts.map +1 -0
- package/dist/core/llm/schema.d.ts +24 -0
- package/dist/core/llm/schema.d.ts.map +1 -0
- package/dist/core/llm/snapshot-fetch.d.ts +21 -0
- package/dist/core/llm/snapshot-fetch.d.ts.map +1 -0
- package/dist/core/llm/snapshot-middleware.d.ts +71 -0
- package/dist/core/llm/snapshot-middleware.d.ts.map +1 -0
- package/dist/core/llm/snapshot-middleware.test.d.ts +2 -0
- package/dist/core/llm/snapshot-middleware.test.d.ts.map +1 -0
- package/dist/core/llm/state.d.ts +73 -0
- package/dist/core/llm/state.d.ts.map +1 -0
- package/dist/core/llm/tokens.d.ts +36 -0
- package/dist/core/llm/tokens.d.ts.map +1 -0
- package/dist/core/multi-agent.integration.test.d.ts +2 -0
- package/dist/core/multi-agent.integration.test.d.ts.map +1 -0
- package/dist/core/plugin-hooks.integration.test.d.ts +2 -0
- package/dist/core/plugin-hooks.integration.test.d.ts.map +1 -0
- package/dist/core/plugins/hook-types.d.ts +55 -0
- package/dist/core/plugins/hook-types.d.ts.map +1 -0
- package/dist/core/plugins/index.d.ts +23 -0
- package/dist/core/plugins/index.d.ts.map +1 -0
- package/dist/core/plugins/plugin-builder.d.ts +474 -0
- package/dist/core/plugins/plugin-builder.d.ts.map +1 -0
- package/dist/core/preset/config.d.ts +55 -0
- package/dist/core/preset/config.d.ts.map +1 -0
- package/dist/core/preset/index.d.ts +8 -0
- package/dist/core/preset/index.d.ts.map +1 -0
- package/dist/core/preset/preset-builder.d.ts +44 -0
- package/dist/core/preset/preset-builder.d.ts.map +1 -0
- package/dist/core/session-lifecycle.integration.test.d.ts +2 -0
- package/dist/core/session-lifecycle.integration.test.d.ts.map +1 -0
- package/dist/core/sessions/apply-event.d.ts +19 -0
- package/dist/core/sessions/apply-event.d.ts.map +1 -0
- package/dist/core/sessions/context.d.ts +34 -0
- package/dist/core/sessions/context.d.ts.map +1 -0
- package/dist/core/sessions/fork-utils.d.ts +20 -0
- package/dist/core/sessions/fork-utils.d.ts.map +1 -0
- package/dist/core/sessions/fork-utils.test.d.ts +2 -0
- package/dist/core/sessions/fork-utils.test.d.ts.map +1 -0
- package/dist/core/sessions/reducer.d.ts +50 -0
- package/dist/core/sessions/reducer.d.ts.map +1 -0
- package/dist/core/sessions/schema.d.ts +82 -0
- package/dist/core/sessions/schema.d.ts.map +1 -0
- package/dist/core/sessions/session-environment.d.ts +13 -0
- package/dist/core/sessions/session-environment.d.ts.map +1 -0
- package/dist/core/sessions/session-manager.d.ts +183 -0
- package/dist/core/sessions/session-manager.d.ts.map +1 -0
- package/dist/core/sessions/session-store.d.ts +69 -0
- package/dist/core/sessions/session-store.d.ts.map +1 -0
- package/dist/core/sessions/session.d.ts +212 -0
- package/dist/core/sessions/session.d.ts.map +1 -0
- package/dist/core/sessions/session.test.d.ts +2 -0
- package/dist/core/sessions/session.test.d.ts.map +1 -0
- package/dist/core/sessions/state.d.ts +110 -0
- package/dist/core/sessions/state.d.ts.map +1 -0
- package/dist/core/system.d.ts +97 -0
- package/dist/core/system.d.ts.map +1 -0
- package/dist/core/tools/context.d.ts +3 -0
- package/dist/core/tools/context.d.ts.map +1 -0
- package/dist/core/tools/definition.d.ts +10 -0
- package/dist/core/tools/definition.d.ts.map +1 -0
- package/dist/core/tools/executor.d.ts +28 -0
- package/dist/core/tools/executor.d.ts.map +1 -0
- package/dist/core/tools/executor.test.d.ts +2 -0
- package/dist/core/tools/executor.test.d.ts.map +1 -0
- package/dist/core/tools/index.d.ts +4 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/schema.d.ts +61 -0
- package/dist/core/tools/schema.d.ts.map +1 -0
- package/dist/core/tools/state.d.ts +28 -0
- package/dist/core/tools/state.d.ts.map +1 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/lib/json/index.d.ts +17 -0
- package/dist/lib/json/index.d.ts.map +1 -0
- package/dist/lib/logger/console.d.ts +35 -0
- package/dist/lib/logger/console.d.ts.map +1 -0
- package/dist/lib/logger/console.test.d.ts +2 -0
- package/dist/lib/logger/console.test.d.ts.map +1 -0
- package/dist/lib/logger/file.d.ts +20 -0
- package/dist/lib/logger/file.d.ts.map +1 -0
- package/dist/lib/logger/index.d.ts +5 -0
- package/dist/lib/logger/index.d.ts.map +1 -0
- package/dist/lib/logger/logger.d.ts +87 -0
- package/dist/lib/logger/logger.d.ts.map +1 -0
- package/dist/lib/logger/ring-buffer.d.ts +33 -0
- package/dist/lib/logger/ring-buffer.d.ts.map +1 -0
- package/dist/lib/logger/tee.d.ts +15 -0
- package/dist/lib/logger/tee.d.ts.map +1 -0
- package/dist/lib/mime.d.ts +9 -0
- package/dist/lib/mime.d.ts.map +1 -0
- package/dist/lib/never.d.ts +2 -0
- package/dist/lib/never.d.ts.map +1 -0
- package/dist/lib/utils/hash.d.ts +19 -0
- package/dist/lib/utils/hash.d.ts.map +1 -0
- package/dist/lib/utils/result.d.ts +26 -0
- package/dist/lib/utils/result.d.ts.map +1 -0
- package/dist/platform/fs.d.ts +39 -0
- package/dist/platform/fs.d.ts.map +1 -0
- package/dist/platform/index.d.ts +21 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/process.d.ts +24 -0
- package/dist/platform/process.d.ts.map +1 -0
- package/dist/plugins/agent-status/plugin.d.ts +8 -0
- package/dist/plugins/agent-status/plugin.d.ts.map +1 -0
- package/dist/plugins/agents/agents.integration.test.d.ts +2 -0
- package/dist/plugins/agents/agents.integration.test.d.ts.map +1 -0
- package/dist/plugins/agents/index.d.ts +3 -0
- package/dist/plugins/agents/index.d.ts.map +1 -0
- package/dist/plugins/agents/plugin.d.ts +57 -0
- package/dist/plugins/agents/plugin.d.ts.map +1 -0
- package/dist/plugins/context-compact/context-compact.integration.test.d.ts +2 -0
- package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +1 -0
- package/dist/plugins/context-compact/context-compactor.d.ts +88 -0
- package/dist/plugins/context-compact/context-compactor.d.ts.map +1 -0
- package/dist/plugins/context-compact/context-compactor.test.d.ts +2 -0
- package/dist/plugins/context-compact/context-compactor.test.d.ts.map +1 -0
- package/dist/plugins/context-compact/history-offloader.d.ts +17 -0
- package/dist/plugins/context-compact/history-offloader.d.ts.map +1 -0
- package/dist/plugins/context-compact/history-offloader.test.d.ts +2 -0
- package/dist/plugins/context-compact/history-offloader.test.d.ts.map +1 -0
- package/dist/plugins/context-compact/index.d.ts +4 -0
- package/dist/plugins/context-compact/index.d.ts.map +1 -0
- package/dist/plugins/context-compact/plugin.d.ts +15 -0
- package/dist/plugins/context-compact/plugin.d.ts.map +1 -0
- package/dist/plugins/filesystem/filesystem.integration.test.d.ts +2 -0
- package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +1 -0
- package/dist/plugins/filesystem/helpers.d.ts +34 -0
- package/dist/plugins/filesystem/helpers.d.ts.map +1 -0
- package/dist/plugins/filesystem/index.d.ts +5 -0
- package/dist/plugins/filesystem/index.d.ts.map +1 -0
- package/dist/plugins/filesystem/listing.d.ts +38 -0
- package/dist/plugins/filesystem/listing.d.ts.map +1 -0
- package/dist/plugins/filesystem/plugin.d.ts +53 -0
- package/dist/plugins/filesystem/plugin.d.ts.map +1 -0
- package/dist/plugins/filesystem/schema.d.ts +7 -0
- package/dist/plugins/filesystem/schema.d.ts.map +1 -0
- package/dist/plugins/git-status/index.d.ts +2 -0
- package/dist/plugins/git-status/index.d.ts.map +1 -0
- package/dist/plugins/git-status/plugin.d.ts +12 -0
- package/dist/plugins/git-status/plugin.d.ts.map +1 -0
- package/dist/plugins/limits-guard/config.d.ts +23 -0
- package/dist/plugins/limits-guard/config.d.ts.map +1 -0
- package/dist/plugins/limits-guard/index.d.ts +5 -0
- package/dist/plugins/limits-guard/index.d.ts.map +1 -0
- package/dist/plugins/limits-guard/limit-guard.d.ts +40 -0
- package/dist/plugins/limits-guard/limit-guard.d.ts.map +1 -0
- package/dist/plugins/limits-guard/limit-guard.test.d.ts +2 -0
- package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +1 -0
- package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +2 -0
- package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +1 -0
- package/dist/plugins/limits-guard/plugin.d.ts +39 -0
- package/dist/plugins/limits-guard/plugin.d.ts.map +1 -0
- package/dist/plugins/llm-debug/index.d.ts +2 -0
- package/dist/plugins/llm-debug/index.d.ts.map +1 -0
- package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +2 -0
- package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +1 -0
- package/dist/plugins/llm-debug/plugin.d.ts +31 -0
- package/dist/plugins/llm-debug/plugin.d.ts.map +1 -0
- package/dist/plugins/logs/index.d.ts +2 -0
- package/dist/plugins/logs/index.d.ts.map +1 -0
- package/dist/plugins/logs/plugin.d.ts +10 -0
- package/dist/plugins/logs/plugin.d.ts.map +1 -0
- package/dist/plugins/mailbox/helpers.d.ts +20 -0
- package/dist/plugins/mailbox/helpers.d.ts.map +1 -0
- package/dist/plugins/mailbox/index.d.ts +9 -0
- package/dist/plugins/mailbox/index.d.ts.map +1 -0
- package/dist/plugins/mailbox/mailbox.integration.test.d.ts +2 -0
- package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +1 -0
- package/dist/plugins/mailbox/plugin.d.ts +31 -0
- package/dist/plugins/mailbox/plugin.d.ts.map +1 -0
- package/dist/plugins/mailbox/prompts.d.ts +21 -0
- package/dist/plugins/mailbox/prompts.d.ts.map +1 -0
- package/dist/plugins/mailbox/query.d.ts +33 -0
- package/dist/plugins/mailbox/query.d.ts.map +1 -0
- package/dist/plugins/mailbox/schema.d.ts +54 -0
- package/dist/plugins/mailbox/schema.d.ts.map +1 -0
- package/dist/plugins/mailbox/state.d.ts +40 -0
- package/dist/plugins/mailbox/state.d.ts.map +1 -0
- package/dist/plugins/resources/index.d.ts +7 -0
- package/dist/plugins/resources/index.d.ts.map +1 -0
- package/dist/plugins/resources/manifest.d.ts +23 -0
- package/dist/plugins/resources/manifest.d.ts.map +1 -0
- package/dist/plugins/resources/plugin.d.ts +28 -0
- package/dist/plugins/resources/plugin.d.ts.map +1 -0
- package/dist/plugins/resources/post-inject.d.ts +39 -0
- package/dist/plugins/resources/post-inject.d.ts.map +1 -0
- package/dist/plugins/resources/state.d.ts +25 -0
- package/dist/plugins/resources/state.d.ts.map +1 -0
- package/dist/plugins/result-eviction/index.d.ts +3 -0
- package/dist/plugins/result-eviction/index.d.ts.map +1 -0
- package/dist/plugins/result-eviction/plugin.d.ts +19 -0
- package/dist/plugins/result-eviction/plugin.d.ts.map +1 -0
- package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +2 -0
- package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +1 -0
- package/dist/plugins/services/plugin.d.ts +85 -0
- package/dist/plugins/services/plugin.d.ts.map +1 -0
- package/dist/plugins/services/port-pool.d.ts +32 -0
- package/dist/plugins/services/port-pool.d.ts.map +1 -0
- package/dist/plugins/services/prompt.d.ts +13 -0
- package/dist/plugins/services/prompt.d.ts.map +1 -0
- package/dist/plugins/services/schema.d.ts +70 -0
- package/dist/plugins/services/schema.d.ts.map +1 -0
- package/dist/plugins/services/service.d.ts +86 -0
- package/dist/plugins/services/service.d.ts.map +1 -0
- package/dist/plugins/services/services.integration.test.d.ts +2 -0
- package/dist/plugins/services/services.integration.test.d.ts.map +1 -0
- package/dist/plugins/session-lifecycle/index.d.ts +2 -0
- package/dist/plugins/session-lifecycle/index.d.ts.map +1 -0
- package/dist/plugins/session-lifecycle/plugin.d.ts +97 -0
- package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -0
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +2 -0
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +1 -0
- package/dist/plugins/session-state/plugin.d.ts +48 -0
- package/dist/plugins/session-state/plugin.d.ts.map +1 -0
- package/dist/plugins/session-stats/index.d.ts +4 -0
- package/dist/plugins/session-stats/index.d.ts.map +1 -0
- package/dist/plugins/session-stats/plugin.d.ts +29 -0
- package/dist/plugins/session-stats/plugin.d.ts.map +1 -0
- package/dist/plugins/shell/executor.d.ts +78 -0
- package/dist/plugins/shell/executor.d.ts.map +1 -0
- package/dist/plugins/shell/index.d.ts +6 -0
- package/dist/plugins/shell/index.d.ts.map +1 -0
- package/dist/plugins/shell/plugin.d.ts +51 -0
- package/dist/plugins/shell/plugin.d.ts.map +1 -0
- package/dist/plugins/shell/shell.integration.test.d.ts +2 -0
- package/dist/plugins/shell/shell.integration.test.d.ts.map +1 -0
- package/dist/plugins/shell/shell.test.d.ts +2 -0
- package/dist/plugins/shell/shell.test.d.ts.map +1 -0
- package/dist/plugins/skills/discovery.d.ts +69 -0
- package/dist/plugins/skills/discovery.d.ts.map +1 -0
- package/dist/plugins/skills/discovery.test.d.ts +2 -0
- package/dist/plugins/skills/discovery.test.d.ts.map +1 -0
- package/dist/plugins/skills/index.d.ts +11 -0
- package/dist/plugins/skills/index.d.ts.map +1 -0
- package/dist/plugins/skills/plugin.d.ts +94 -0
- package/dist/plugins/skills/plugin.d.ts.map +1 -0
- package/dist/plugins/skills/prompts.d.ts +29 -0
- package/dist/plugins/skills/prompts.d.ts.map +1 -0
- package/dist/plugins/skills/schema.d.ts +64 -0
- package/dist/plugins/skills/schema.d.ts.map +1 -0
- package/dist/plugins/skills/skills.integration.test.d.ts +2 -0
- package/dist/plugins/skills/skills.integration.test.d.ts.map +1 -0
- package/dist/plugins/snapshotting/index.d.ts +4 -0
- package/dist/plugins/snapshotting/index.d.ts.map +1 -0
- package/dist/plugins/snapshotting/jj-snapshotter.d.ts +27 -0
- package/dist/plugins/snapshotting/jj-snapshotter.d.ts.map +1 -0
- package/dist/plugins/snapshotting/plugin.d.ts +15 -0
- package/dist/plugins/snapshotting/plugin.d.ts.map +1 -0
- package/dist/plugins/snapshotting/snapshotter.d.ts +19 -0
- package/dist/plugins/snapshotting/snapshotter.d.ts.map +1 -0
- package/dist/plugins/todo/index.d.ts +7 -0
- package/dist/plugins/todo/index.d.ts.map +1 -0
- package/dist/plugins/todo/plugin.d.ts +95 -0
- package/dist/plugins/todo/plugin.d.ts.map +1 -0
- package/dist/plugins/todo/prompts.d.ts +13 -0
- package/dist/plugins/todo/prompts.d.ts.map +1 -0
- package/dist/plugins/todo/schema.d.ts +44 -0
- package/dist/plugins/todo/schema.d.ts.map +1 -0
- package/dist/plugins/todo/todo.integration.test.d.ts +2 -0
- package/dist/plugins/todo/todo.integration.test.d.ts.map +1 -0
- package/dist/plugins/uploads/index.d.ts +9 -0
- package/dist/plugins/uploads/index.d.ts.map +1 -0
- package/dist/plugins/uploads/plugin.d.ts +56 -0
- package/dist/plugins/uploads/plugin.d.ts.map +1 -0
- package/dist/plugins/uploads/preprocessor.d.ts +70 -0
- package/dist/plugins/uploads/preprocessor.d.ts.map +1 -0
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +49 -0
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -0
- package/dist/plugins/uploads/preprocessors/index.d.ts +7 -0
- package/dist/plugins/uploads/preprocessors/index.d.ts.map +1 -0
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +43 -0
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -0
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +30 -0
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -0
- package/dist/plugins/uploads/schema.d.ts +72 -0
- package/dist/plugins/uploads/schema.d.ts.map +1 -0
- package/dist/plugins/uploads/state.d.ts +38 -0
- package/dist/plugins/uploads/state.d.ts.map +1 -0
- package/dist/plugins/uploads/uploads.integration.test.d.ts +2 -0
- package/dist/plugins/uploads/uploads.integration.test.d.ts.map +1 -0
- package/dist/plugins/user-chat/index.d.ts +7 -0
- package/dist/plugins/user-chat/index.d.ts.map +1 -0
- package/dist/plugins/user-chat/plugin.d.ts +221 -0
- package/dist/plugins/user-chat/plugin.d.ts.map +1 -0
- package/dist/plugins/user-chat/prompts.d.ts +13 -0
- package/dist/plugins/user-chat/prompts.d.ts.map +1 -0
- package/dist/plugins/user-chat/schema.d.ts +82 -0
- package/dist/plugins/user-chat/schema.d.ts.map +1 -0
- package/dist/plugins/user-chat/user-chat.integration.test.d.ts +2 -0
- package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +1 -0
- package/dist/plugins/workers/context.d.ts +159 -0
- package/dist/plugins/workers/context.d.ts.map +1 -0
- package/dist/plugins/workers/definition.d.ts +118 -0
- package/dist/plugins/workers/definition.d.ts.map +1 -0
- package/dist/plugins/workers/index.d.ts +11 -0
- package/dist/plugins/workers/index.d.ts.map +1 -0
- package/dist/plugins/workers/plugin.d.ts +125 -0
- package/dist/plugins/workers/plugin.d.ts.map +1 -0
- package/dist/plugins/workers/worker.d.ts +76 -0
- package/dist/plugins/workers/worker.d.ts.map +1 -0
- package/dist/plugins/workers/workers.integration.test.d.ts +2 -0
- package/dist/plugins/workers/workers.integration.test.d.ts.map +1 -0
- package/dist/prompts/base.d.ts +75 -0
- package/dist/prompts/base.d.ts.map +1 -0
- package/dist/prompts/builder.d.ts +73 -0
- package/dist/prompts/builder.d.ts.map +1 -0
- package/dist/prompts/index.d.ts +10 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/macros.d.ts +15 -0
- package/dist/prompts/macros.d.ts.map +1 -0
- package/dist/prompts/macros.test.d.ts +2 -0
- package/dist/prompts/macros.test.d.ts.map +1 -0
- package/dist/testing/bootstrap-for-testing.d.ts +12 -0
- package/dist/testing/bootstrap-for-testing.d.ts.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/node-platform.d.ts +12 -0
- package/dist/testing/node-platform.d.ts.map +1 -0
- package/dist/testing/notification-collector.d.ts +46 -0
- package/dist/testing/notification-collector.d.ts.map +1 -0
- package/dist/testing/preset-helpers.d.ts +28 -0
- package/dist/testing/preset-helpers.d.ts.map +1 -0
- package/dist/testing/test-harness.d.ts +117 -0
- package/dist/testing/test-harness.d.ts.map +1 -0
- package/dist/testing/test-harness.test.d.ts +2 -0
- package/dist/testing/test-harness.test.d.ts.map +1 -0
- package/dist/testing/wait-helpers.d.ts +17 -0
- package/dist/testing/wait-helpers.d.ts.map +1 -0
- package/dist/transport/adapter/client-adapter.d.ts +32 -0
- package/dist/transport/adapter/client-adapter.d.ts.map +1 -0
- package/dist/transport/adapter/index.d.ts +23 -0
- package/dist/transport/adapter/index.d.ts.map +1 -0
- package/dist/transport/adapter/server-adapter.d.ts +29 -0
- package/dist/transport/adapter/server-adapter.d.ts.map +1 -0
- package/dist/transport/adapter/types.d.ts +14 -0
- package/dist/transport/adapter/types.d.ts.map +1 -0
- package/dist/transport/http/app.d.ts +41 -0
- package/dist/transport/http/app.d.ts.map +1 -0
- package/dist/transport/http/index.d.ts +7 -0
- package/dist/transport/http/index.d.ts.map +1 -0
- package/dist/transport/http/middleware/bearer-auth.d.ts +16 -0
- package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -0
- package/dist/transport/http/middleware/error-handler.d.ts +21 -0
- package/dist/transport/http/middleware/error-handler.d.ts.map +1 -0
- package/dist/transport/http/routes/files.d.ts +16 -0
- package/dist/transport/http/routes/files.d.ts.map +1 -0
- package/dist/transport/http/routes/resources.d.ts +12 -0
- package/dist/transport/http/routes/resources.d.ts.map +1 -0
- package/dist/transport/http/routes/rpc.d.ts +22 -0
- package/dist/transport/http/routes/rpc.d.ts.map +1 -0
- package/dist/transport/http/routes/rpc.integration.test.d.ts +2 -0
- package/dist/transport/http/routes/rpc.integration.test.d.ts.map +1 -0
- package/dist/transport/http/routes/rpc.test.d.ts +2 -0
- package/dist/transport/http/routes/rpc.test.d.ts.map +1 -0
- package/dist/transport/http/routes/upload.d.ts +14 -0
- package/dist/transport/http/routes/upload.d.ts.map +1 -0
- package/dist/transport/rpc/index.d.ts +8 -0
- package/dist/transport/rpc/index.d.ts.map +1 -0
- package/dist/transport/rpc/methods.d.ts +25 -0
- package/dist/transport/rpc/methods.d.ts.map +1 -0
- package/dist/user-config.d.ts +29 -0
- package/dist/user-config.d.ts.map +1 -0
- package/package.json +154 -0
- package/src/bootstrap.ts +268 -0
- package/src/builtin-events.ts +25 -0
- package/src/bun-platform/fs.ts +50 -0
- package/src/bun-platform/index.ts +21 -0
- package/src/bun-platform/process.ts +25 -0
- package/src/config.test.ts +174 -0
- package/src/config.ts +103 -0
- package/src/core/agent-loop.integration.test.ts +503 -0
- package/src/core/agents/agent-config.test.ts +240 -0
- package/src/core/agents/agent-roles.ts +41 -0
- package/src/core/agents/agent-shutdown.test.ts +236 -0
- package/src/core/agents/agent.test.ts +387 -0
- package/src/core/agents/agent.ts +1472 -0
- package/src/core/agents/communicator.ts +16 -0
- package/src/core/agents/config.ts +98 -0
- package/src/core/agents/context.ts +19 -0
- package/src/core/agents/debounce.ts +116 -0
- package/src/core/agents/handler-events.test.ts +167 -0
- package/src/core/agents/index.ts +1 -0
- package/src/core/agents/response-sanitizer.test.ts +137 -0
- package/src/core/agents/response-sanitizer.ts +67 -0
- package/src/core/agents/retry.ts +164 -0
- package/src/core/agents/schema.ts +75 -0
- package/src/core/agents/state.ts +272 -0
- package/src/core/context/state.ts +38 -0
- package/src/core/errors.ts +55 -0
- package/src/core/event-sourcing.integration.test.ts +191 -0
- package/src/core/events/base-event-store.ts +264 -0
- package/src/core/events/event-store.ts +143 -0
- package/src/core/events/file.test.ts +436 -0
- package/src/core/events/file.ts +372 -0
- package/src/core/events/index.ts +3 -0
- package/src/core/events/memory.test.ts +741 -0
- package/src/core/events/memory.ts +131 -0
- package/src/core/events/metadata-utils.ts +133 -0
- package/src/core/events/test-helpers.ts +31 -0
- package/src/core/events/types.ts +64 -0
- package/src/core/file-store/file-store.ts +275 -0
- package/src/core/file-store/types.ts +52 -0
- package/src/core/image/image-processor.test.ts +218 -0
- package/src/core/image/image-processor.ts +127 -0
- package/src/core/image/index.ts +4 -0
- package/src/core/image/noop-resizer.ts +7 -0
- package/src/core/image/types.ts +24 -0
- package/src/core/image/vips-resizer.test.ts +377 -0
- package/src/core/image/vips-resizer.ts +124 -0
- package/src/core/llm/__snapshots__/anthropic-assistant-text-with-tool-calls.json +156 -0
- package/src/core/llm/__snapshots__/anthropic-consecutive-tool-results.json +152 -0
- package/src/core/llm/__snapshots__/anthropic-image-data-url.json +105 -0
- package/src/core/llm/__snapshots__/anthropic-image-http-url.json +104 -0
- package/src/core/llm/__snapshots__/anthropic-multiple-images.json +113 -0
- package/src/core/llm/__snapshots__/anthropic-multiple-tool-calls-requested.json +151 -0
- package/src/core/llm/__snapshots__/anthropic-simple-user-message.json +97 -0
- package/src/core/llm/__snapshots__/anthropic-system-message-in-conversation.json +119 -0
- package/src/core/llm/__snapshots__/anthropic-tool-call.json +123 -0
- package/src/core/llm/__snapshots__/anthropic-tool-error-result.json +139 -0
- package/src/core/llm/__snapshots__/anthropic-tool-result-with-image.json +152 -0
- package/src/core/llm/__snapshots__/anthropic-tool-roundtrip.json +139 -0
- package/src/core/llm/__snapshots__/openrouter-assistant-text-with-tool-calls.json +150 -0
- package/src/core/llm/__snapshots__/openrouter-consecutive-tool-results.json +150 -0
- package/src/core/llm/__snapshots__/openrouter-image-data-url.json +107 -0
- package/src/core/llm/__snapshots__/openrouter-image-http-url.json +107 -0
- package/src/core/llm/__snapshots__/openrouter-multiple-images.json +113 -0
- package/src/core/llm/__snapshots__/openrouter-multiple-tool-calls-requested.json +158 -0
- package/src/core/llm/__snapshots__/openrouter-simple-user-message.json +96 -0
- package/src/core/llm/__snapshots__/openrouter-system-message-in-conversation.json +108 -0
- package/src/core/llm/__snapshots__/openrouter-tool-call.json +129 -0
- package/src/core/llm/__snapshots__/openrouter-tool-error-result.json +137 -0
- package/src/core/llm/__snapshots__/openrouter-tool-result-with-image.json +148 -0
- package/src/core/llm/__snapshots__/openrouter-tool-roundtrip.json +137 -0
- package/src/core/llm/anthropic.test.ts +509 -0
- package/src/core/llm/anthropic.ts +578 -0
- package/src/core/llm/cache-breakpoints.ts +38 -0
- package/src/core/llm/cache-live.test.ts +155 -0
- package/src/core/llm/index.ts +30 -0
- package/src/core/llm/llm-log-types.ts +167 -0
- package/src/core/llm/logger.test.ts +270 -0
- package/src/core/llm/logger.ts +306 -0
- package/src/core/llm/logging-provider.ts +73 -0
- package/src/core/llm/middleware.ts +172 -0
- package/src/core/llm/mock.test.ts +402 -0
- package/src/core/llm/mock.ts +234 -0
- package/src/core/llm/openrouter-mapping.test.ts +153 -0
- package/src/core/llm/openrouter.test.ts +499 -0
- package/src/core/llm/openrouter.ts +458 -0
- package/src/core/llm/provider-integration.test.ts +408 -0
- package/src/core/llm/provider.ts +238 -0
- package/src/core/llm/routing-provider.test.ts +113 -0
- package/src/core/llm/routing-provider.ts +86 -0
- package/src/core/llm/schema.ts +47 -0
- package/src/core/llm/snapshot-fetch.ts +158 -0
- package/src/core/llm/snapshot-middleware.test.ts +168 -0
- package/src/core/llm/snapshot-middleware.ts +185 -0
- package/src/core/llm/state.ts +92 -0
- package/src/core/llm/tokens.ts +61 -0
- package/src/core/multi-agent.integration.test.ts +340 -0
- package/src/core/plugin-hooks.integration.test.ts +428 -0
- package/src/core/plugins/hook-types.ts +49 -0
- package/src/core/plugins/index.ts +52 -0
- package/src/core/plugins/plugin-builder.ts +967 -0
- package/src/core/preset/config.ts +110 -0
- package/src/core/preset/index.ts +11 -0
- package/src/core/preset/preset-builder.ts +111 -0
- package/src/core/session-lifecycle.integration.test.ts +202 -0
- package/src/core/sessions/apply-event.ts +46 -0
- package/src/core/sessions/context.ts +36 -0
- package/src/core/sessions/fork-utils.test.ts +158 -0
- package/src/core/sessions/fork-utils.ts +71 -0
- package/src/core/sessions/reducer.ts +95 -0
- package/src/core/sessions/schema.ts +91 -0
- package/src/core/sessions/session-environment.ts +12 -0
- package/src/core/sessions/session-manager.ts +883 -0
- package/src/core/sessions/session-store.ts +141 -0
- package/src/core/sessions/session.test.ts +1730 -0
- package/src/core/sessions/session.ts +833 -0
- package/src/core/sessions/state.ts +520 -0
- package/src/core/system.ts +206 -0
- package/src/core/tools/context.ts +3 -0
- package/src/core/tools/definition.ts +15 -0
- package/src/core/tools/executor.test.ts +160 -0
- package/src/core/tools/executor.ts +117 -0
- package/src/core/tools/index.ts +3 -0
- package/src/core/tools/schema.ts +80 -0
- package/src/core/tools/state.ts +34 -0
- package/src/index.ts +165 -0
- package/src/lib/json/index.ts +20 -0
- package/src/lib/logger/console.test.ts +348 -0
- package/src/lib/logger/console.ts +185 -0
- package/src/lib/logger/file.ts +65 -0
- package/src/lib/logger/index.ts +4 -0
- package/src/lib/logger/logger.ts +114 -0
- package/src/lib/logger/ring-buffer.ts +65 -0
- package/src/lib/logger/tee.ts +51 -0
- package/src/lib/mime.ts +23 -0
- package/src/lib/never.ts +3 -0
- package/src/lib/utils/hash.ts +38 -0
- package/src/lib/utils/result.ts +35 -0
- package/src/platform/fs.ts +38 -0
- package/src/platform/index.ts +23 -0
- package/src/platform/process.ts +28 -0
- package/src/plugins/agent-status/plugin.ts +77 -0
- package/src/plugins/agents/agents.integration.test.ts +808 -0
- package/src/plugins/agents/index.ts +2 -0
- package/src/plugins/agents/plugin.ts +242 -0
- package/src/plugins/context-compact/context-compact.integration.test.ts +207 -0
- package/src/plugins/context-compact/context-compactor.test.ts +923 -0
- package/src/plugins/context-compact/context-compactor.ts +343 -0
- package/src/plugins/context-compact/history-offloader.test.ts +100 -0
- package/src/plugins/context-compact/history-offloader.ts +47 -0
- package/src/plugins/context-compact/index.ts +3 -0
- package/src/plugins/context-compact/plugin.ts +62 -0
- package/src/plugins/filesystem/filesystem.integration.test.ts +485 -0
- package/src/plugins/filesystem/helpers.ts +216 -0
- package/src/plugins/filesystem/index.ts +4 -0
- package/src/plugins/filesystem/listing.ts +276 -0
- package/src/plugins/filesystem/plugin.ts +468 -0
- package/src/plugins/filesystem/schema.ts +6 -0
- package/src/plugins/git-status/index.ts +1 -0
- package/src/plugins/git-status/plugin.ts +166 -0
- package/src/plugins/limits-guard/config.ts +26 -0
- package/src/plugins/limits-guard/index.ts +4 -0
- package/src/plugins/limits-guard/limit-guard.test.ts +161 -0
- package/src/plugins/limits-guard/limit-guard.ts +164 -0
- package/src/plugins/limits-guard/limits-guard.integration.test.ts +437 -0
- package/src/plugins/limits-guard/plugin.ts +306 -0
- package/src/plugins/llm-debug/index.ts +1 -0
- package/src/plugins/llm-debug/llm-debug.integration.test.ts +192 -0
- package/src/plugins/llm-debug/plugin.ts +172 -0
- package/src/plugins/logs/index.ts +1 -0
- package/src/plugins/logs/plugin.ts +39 -0
- package/src/plugins/mailbox/helpers.ts +83 -0
- package/src/plugins/mailbox/index.ts +13 -0
- package/src/plugins/mailbox/mailbox.integration.test.ts +705 -0
- package/src/plugins/mailbox/plugin.ts +270 -0
- package/src/plugins/mailbox/prompts.ts +104 -0
- package/src/plugins/mailbox/query.ts +53 -0
- package/src/plugins/mailbox/schema.ts +81 -0
- package/src/plugins/mailbox/state.ts +52 -0
- package/src/plugins/resources/index.ts +11 -0
- package/src/plugins/resources/manifest.ts +25 -0
- package/src/plugins/resources/plugin.ts +201 -0
- package/src/plugins/resources/post-inject.ts +74 -0
- package/src/plugins/resources/state.ts +30 -0
- package/src/plugins/result-eviction/index.ts +2 -0
- package/src/plugins/result-eviction/plugin.ts +65 -0
- package/src/plugins/result-eviction/result-eviction.integration.test.ts +244 -0
- package/src/plugins/services/plugin.ts +485 -0
- package/src/plugins/services/port-pool.ts +73 -0
- package/src/plugins/services/prompt.ts +53 -0
- package/src/plugins/services/schema.ts +83 -0
- package/src/plugins/services/service.ts +578 -0
- package/src/plugins/services/services.integration.test.ts +595 -0
- package/src/plugins/session-lifecycle/index.ts +1 -0
- package/src/plugins/session-lifecycle/plugin.ts +302 -0
- package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +639 -0
- package/src/plugins/session-state/plugin.ts +179 -0
- package/src/plugins/session-stats/index.ts +3 -0
- package/src/plugins/session-stats/plugin.ts +120 -0
- package/src/plugins/shell/executor.ts +462 -0
- package/src/plugins/shell/index.ts +23 -0
- package/src/plugins/shell/plugin.ts +118 -0
- package/src/plugins/shell/shell.integration.test.ts +273 -0
- package/src/plugins/shell/shell.test.ts +314 -0
- package/src/plugins/skills/discovery.test.ts +395 -0
- package/src/plugins/skills/discovery.ts +276 -0
- package/src/plugins/skills/index.ts +32 -0
- package/src/plugins/skills/plugin.ts +381 -0
- package/src/plugins/skills/prompts.ts +84 -0
- package/src/plugins/skills/schema.ts +88 -0
- package/src/plugins/skills/skills.integration.test.ts +580 -0
- package/src/plugins/snapshotting/index.ts +3 -0
- package/src/plugins/snapshotting/jj-snapshotter.ts +122 -0
- package/src/plugins/snapshotting/plugin.ts +36 -0
- package/src/plugins/snapshotting/snapshotter.ts +20 -0
- package/src/plugins/todo/index.ts +11 -0
- package/src/plugins/todo/plugin.ts +363 -0
- package/src/plugins/todo/prompts.ts +63 -0
- package/src/plugins/todo/schema.ts +71 -0
- package/src/plugins/todo/todo.integration.test.ts +687 -0
- package/src/plugins/uploads/index.ts +13 -0
- package/src/plugins/uploads/plugin.ts +406 -0
- package/src/plugins/uploads/preprocessor.ts +111 -0
- package/src/plugins/uploads/preprocessors/image-classifier.ts +176 -0
- package/src/plugins/uploads/preprocessors/index.ts +7 -0
- package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +262 -0
- package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +210 -0
- package/src/plugins/uploads/schema.ts +92 -0
- package/src/plugins/uploads/state.ts +42 -0
- package/src/plugins/uploads/uploads.integration.test.ts +654 -0
- package/src/plugins/user-chat/index.ts +17 -0
- package/src/plugins/user-chat/plugin.ts +728 -0
- package/src/plugins/user-chat/prompts.ts +30 -0
- package/src/plugins/user-chat/schema.ts +80 -0
- package/src/plugins/user-chat/user-chat.integration.test.ts +794 -0
- package/src/plugins/workers/context.ts +251 -0
- package/src/plugins/workers/definition.ts +169 -0
- package/src/plugins/workers/index.ts +21 -0
- package/src/plugins/workers/plugin.ts +722 -0
- package/src/plugins/workers/worker.ts +115 -0
- package/src/plugins/workers/workers.integration.test.ts +778 -0
- package/src/prompts/base.ts +266 -0
- package/src/prompts/builder.ts +194 -0
- package/src/prompts/index.ts +36 -0
- package/src/prompts/macros.test.ts +107 -0
- package/src/prompts/macros.ts +27 -0
- package/src/testing/bootstrap-for-testing.ts +39 -0
- package/src/testing/index.ts +7 -0
- package/src/testing/node-platform.ts +80 -0
- package/src/testing/notification-collector.ts +100 -0
- package/src/testing/preset-helpers.ts +57 -0
- package/src/testing/test-harness.test.ts +63 -0
- package/src/testing/test-harness.ts +279 -0
- package/src/testing/wait-helpers.ts +84 -0
- package/src/transport/adapter/client-adapter.ts +81 -0
- package/src/transport/adapter/index.ts +42 -0
- package/src/transport/adapter/server-adapter.ts +93 -0
- package/src/transport/adapter/types.ts +20 -0
- package/src/transport/http/app.ts +129 -0
- package/src/transport/http/index.ts +7 -0
- package/src/transport/http/middleware/bearer-auth.ts +40 -0
- package/src/transport/http/middleware/error-handler.ts +76 -0
- package/src/transport/http/routes/files.ts +274 -0
- package/src/transport/http/routes/resources.ts +115 -0
- package/src/transport/http/routes/rpc.integration.test.ts +243 -0
- package/src/transport/http/routes/rpc.test.ts +372 -0
- package/src/transport/http/routes/rpc.ts +156 -0
- package/src/transport/http/routes/upload.ts +286 -0
- package/src/transport/rpc/index.ts +11 -0
- package/src/transport/rpc/methods.ts +38 -0
- package/src/user-config.ts +33 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { DomainEvent } from '~/core/events/types.js'
|
|
2
|
+
import type { SessionId, SessionMetadata } from '~/core/sessions/schema.js'
|
|
3
|
+
import { BaseEventStore } from './base-event-store.js'
|
|
4
|
+
import type { LoadRangeOptions, LoadRangeResult } from './event-store.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* MemoryEventStore - In-memory event store for testing.
|
|
8
|
+
*
|
|
9
|
+
* Provides simple in-memory storage with test helpers for inspecting events.
|
|
10
|
+
*/
|
|
11
|
+
export class MemoryEventStore extends BaseEventStore {
|
|
12
|
+
private events = new Map<SessionId, DomainEvent[]>()
|
|
13
|
+
private metadata = new Map<SessionId, SessionMetadata>()
|
|
14
|
+
|
|
15
|
+
protected async doAppend(sessionId: SessionId, event: DomainEvent): Promise<void> {
|
|
16
|
+
const existing = this.events.get(sessionId) ?? []
|
|
17
|
+
this.events.set(sessionId, [...existing, event])
|
|
18
|
+
await this.updateMetadataFromEvents(sessionId, [event])
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
protected async doAppendBatch(sessionId: SessionId, events: DomainEvent[]): Promise<void> {
|
|
22
|
+
if (events.length === 0) return
|
|
23
|
+
|
|
24
|
+
const existing = this.events.get(sessionId) ?? []
|
|
25
|
+
this.events.set(sessionId, [...existing, ...events])
|
|
26
|
+
await this.updateMetadataFromEvents(sessionId, events)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async load(sessionId: SessionId): Promise<DomainEvent[]> {
|
|
30
|
+
return this.events.get(sessionId) ?? []
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async exists(sessionId: SessionId): Promise<boolean> {
|
|
34
|
+
return this.events.has(sessionId)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async listSessions(): Promise<SessionId[]> {
|
|
38
|
+
return Array.from(this.events.keys())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async loadRange(
|
|
42
|
+
sessionId: SessionId,
|
|
43
|
+
options?: LoadRangeOptions,
|
|
44
|
+
): Promise<LoadRangeResult> {
|
|
45
|
+
const allEvents = this.events.get(sessionId) ?? []
|
|
46
|
+
const since = options?.since ?? -1
|
|
47
|
+
const limit = options?.limit
|
|
48
|
+
|
|
49
|
+
// toIndex always reflects the actual last event in the store (for polling cursor)
|
|
50
|
+
const storeLastIndex = allEvents.length - 1
|
|
51
|
+
|
|
52
|
+
const fromIndex = since + 1
|
|
53
|
+
if (fromIndex >= allEvents.length) {
|
|
54
|
+
// No new events, but return the actual last index so client can continue polling
|
|
55
|
+
return { events: [], fromIndex: -1, toIndex: storeLastIndex }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const endIndex = limit !== undefined
|
|
59
|
+
? Math.min(fromIndex + limit, allEvents.length)
|
|
60
|
+
: allEvents.length
|
|
61
|
+
|
|
62
|
+
const events = allEvents.slice(fromIndex, endIndex)
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
events,
|
|
66
|
+
fromIndex: events.length > 0 ? fromIndex : -1,
|
|
67
|
+
toIndex: endIndex - 1,
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// =========================================================================
|
|
72
|
+
// Metadata storage primitives
|
|
73
|
+
// =========================================================================
|
|
74
|
+
|
|
75
|
+
protected async readMetadata(sessionId: SessionId): Promise<SessionMetadata | null> {
|
|
76
|
+
return this.metadata.get(sessionId) ?? null
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected async writeMetadata(sessionId: SessionId, metadata: SessionMetadata): Promise<void> {
|
|
80
|
+
this.metadata.set(sessionId, metadata)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
protected async getAllSessionMetadata(): Promise<SessionMetadata[]> {
|
|
84
|
+
return Array.from(this.metadata.values())
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// =========================================================================
|
|
88
|
+
// Test helpers
|
|
89
|
+
// =========================================================================
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Clears all events and metadata.
|
|
93
|
+
*/
|
|
94
|
+
clear(): void {
|
|
95
|
+
this.events.clear()
|
|
96
|
+
this.metadata.clear()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Returns all events for inspection in tests.
|
|
101
|
+
*/
|
|
102
|
+
getAll(): Map<SessionId, DomainEvent[]> {
|
|
103
|
+
return new Map(this.events)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Returns event count for a session.
|
|
108
|
+
*/
|
|
109
|
+
getEventCount(sessionId: SessionId): number {
|
|
110
|
+
return this.events.get(sessionId)?.length ?? 0
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Returns the last event for a session.
|
|
115
|
+
*/
|
|
116
|
+
getLastEvent(sessionId: SessionId): DomainEvent | undefined {
|
|
117
|
+
const events = this.events.get(sessionId)
|
|
118
|
+
return events?.[events.length - 1]
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Returns events of a given type.
|
|
123
|
+
*/
|
|
124
|
+
getEventsByType(
|
|
125
|
+
sessionId: SessionId,
|
|
126
|
+
type: string,
|
|
127
|
+
): DomainEvent[] {
|
|
128
|
+
const events = this.events.get(sessionId) ?? []
|
|
129
|
+
return events.filter((e) => e.type === type)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for computing session metadata from events.
|
|
3
|
+
* Used for metadata reconciliation after crashes.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { agentEvents } from '~/core/agents/state.js'
|
|
7
|
+
import type { DomainEvent, FactoryEventType } from '~/core/events/types.js'
|
|
8
|
+
import type { llmEvents } from '~/core/llm/state.js'
|
|
9
|
+
import type { SessionId, SessionMetadata, SessionMetadataMetrics } from '~/core/sessions/schema.js'
|
|
10
|
+
import type { sessionEvents } from '~/core/sessions/state.js'
|
|
11
|
+
import type { toolEvents } from '~/core/tools/state.js'
|
|
12
|
+
import type { mailboxEvents } from '~/plugins/mailbox/state.js'
|
|
13
|
+
|
|
14
|
+
export type MetadataEvent = FactoryEventType<typeof sessionEvents | typeof agentEvents | typeof llmEvents | typeof mailboxEvents | typeof toolEvents>
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Compute metrics from a list of events.
|
|
18
|
+
* This is the source of truth for what metrics should be.
|
|
19
|
+
*/
|
|
20
|
+
export function computeMetricsFromEvents(events: DomainEvent[]): SessionMetadataMetrics {
|
|
21
|
+
const metrics: SessionMetadataMetrics = {
|
|
22
|
+
totalEvents: events.length,
|
|
23
|
+
totalAgents: 0,
|
|
24
|
+
totalTokens: 0,
|
|
25
|
+
totalLLMCalls: 0,
|
|
26
|
+
inputTokens: 0,
|
|
27
|
+
outputTokens: 0,
|
|
28
|
+
totalCost: 0,
|
|
29
|
+
totalMessages: 0,
|
|
30
|
+
totalToolCalls: 0,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const event of events as MetadataEvent[]) {
|
|
34
|
+
switch (event.type) {
|
|
35
|
+
case 'agent_spawned':
|
|
36
|
+
metrics.totalAgents++
|
|
37
|
+
break
|
|
38
|
+
|
|
39
|
+
case 'inference_completed':
|
|
40
|
+
if (event.metrics) {
|
|
41
|
+
metrics.totalLLMCalls++
|
|
42
|
+
metrics.totalTokens += event.metrics.totalTokens ?? 0
|
|
43
|
+
metrics.inputTokens! += event.metrics.promptTokens ?? 0
|
|
44
|
+
metrics.outputTokens! += event.metrics.completionTokens ?? 0
|
|
45
|
+
if (event.metrics.cost !== undefined) {
|
|
46
|
+
metrics.totalCost! += event.metrics.cost
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
break
|
|
50
|
+
|
|
51
|
+
case 'mailbox_message':
|
|
52
|
+
metrics.totalMessages!++
|
|
53
|
+
break
|
|
54
|
+
|
|
55
|
+
case 'tool_started':
|
|
56
|
+
metrics.totalToolCalls!++
|
|
57
|
+
break
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return metrics
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compute full metadata from events (for initial creation or full reconciliation).
|
|
66
|
+
*/
|
|
67
|
+
export function computeMetadataFromEvents(
|
|
68
|
+
sessionId: SessionId,
|
|
69
|
+
events: DomainEvent[],
|
|
70
|
+
): SessionMetadata | null {
|
|
71
|
+
if (events.length === 0) return null
|
|
72
|
+
|
|
73
|
+
const firstEvent = events[0] as MetadataEvent
|
|
74
|
+
if (firstEvent.type !== 'session_created') {
|
|
75
|
+
return null
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const lastEvent = events[events.length - 1]
|
|
79
|
+
const metrics = computeMetricsFromEvents(events)
|
|
80
|
+
|
|
81
|
+
// Determine status from events
|
|
82
|
+
let status: SessionMetadata['status'] = 'active'
|
|
83
|
+
for (const event of events as MetadataEvent[]) {
|
|
84
|
+
if (event.type === 'session_closed') {
|
|
85
|
+
status = 'closed'
|
|
86
|
+
} else if (event.type === 'session_reopened') {
|
|
87
|
+
status = 'active'
|
|
88
|
+
}
|
|
89
|
+
// Check for errored state - if last event is inference_failed, session might be errored
|
|
90
|
+
if (event.type === 'inference_failed') {
|
|
91
|
+
// Only mark as errored if it's the most recent significant event
|
|
92
|
+
// This is a heuristic - actual status should come from session state
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
sessionId,
|
|
98
|
+
presetId: firstEvent.presetId,
|
|
99
|
+
createdAt: firstEvent.timestamp,
|
|
100
|
+
lastActivityAt: lastEvent.timestamp,
|
|
101
|
+
status,
|
|
102
|
+
metrics,
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Check if stored metadata needs reconciliation by comparing key metrics.
|
|
108
|
+
* Returns true if reconciliation is needed.
|
|
109
|
+
*/
|
|
110
|
+
export function needsReconciliation(
|
|
111
|
+
stored: SessionMetadata | null,
|
|
112
|
+
computed: SessionMetadata,
|
|
113
|
+
): boolean {
|
|
114
|
+
if (!stored) return true
|
|
115
|
+
if (!stored.metrics) return true
|
|
116
|
+
if (!computed.metrics) return false
|
|
117
|
+
|
|
118
|
+
// Check totalEvents as the primary consistency indicator
|
|
119
|
+
if (stored.metrics.totalEvents !== computed.metrics.totalEvents) {
|
|
120
|
+
return true
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Check other metrics for consistency
|
|
124
|
+
if (stored.metrics.totalAgents !== computed.metrics.totalAgents) {
|
|
125
|
+
return true
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (stored.metrics.totalLLMCalls !== computed.metrics.totalLLMCalls) {
|
|
129
|
+
return true
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return false
|
|
133
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for creating branded DomainEvent objects.
|
|
3
|
+
*
|
|
4
|
+
* Event factories (sessionEvents, agentEvents, etc.) produce events
|
|
5
|
+
* without `sessionId` (it's added by `emitEvent()` at runtime).
|
|
6
|
+
* `withSessionId` adds the missing field and returns a full DomainEvent.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const event = withSessionId(sessionId, sessionEvents.create('session_created', { presetId: 'test' }))
|
|
10
|
+
*/
|
|
11
|
+
import type { BaseEvent } from '~/core/events/types.js'
|
|
12
|
+
import type { DomainEvent } from '~/core/events/types.js'
|
|
13
|
+
import type { SessionId } from '~/core/sessions/schema.js'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Add `sessionId` to a factory-created event, producing a full DomainEvent.
|
|
17
|
+
*
|
|
18
|
+
* The factory `.create()` returns `Omit<BaseEvent<K>, 'sessionId'> & payload`
|
|
19
|
+
* (branded but missing sessionId). This function adds the missing field.
|
|
20
|
+
*
|
|
21
|
+
* TypeScript cannot prove `Omit<Union, 'key'> & { key }` reconstructs the
|
|
22
|
+
* original union (Omit destroys discriminants). The return type uses the same
|
|
23
|
+
* brand-bridging pattern as `createEventsFactory` — safe because all factory
|
|
24
|
+
* events with sessionId are structurally valid DomainEvent members.
|
|
25
|
+
*/
|
|
26
|
+
export function withSessionId<T extends Omit<BaseEvent<string>, 'sessionId'>>(
|
|
27
|
+
sessionId: SessionId,
|
|
28
|
+
event: T,
|
|
29
|
+
): T & { sessionId: SessionId } & DomainEvent {
|
|
30
|
+
return Object.assign(event, { sessionId }) as T & { sessionId: SessionId } & DomainEvent
|
|
31
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import z4 from 'zod/v4'
|
|
2
|
+
import { SessionId } from '~/core/sessions/schema'
|
|
3
|
+
|
|
4
|
+
declare const __brand: unique symbol
|
|
5
|
+
type TheBrand<B> = { [__brand]: B }
|
|
6
|
+
type Brand<T, B> = T & TheBrand<B>
|
|
7
|
+
|
|
8
|
+
export type BaseEvent<T extends string> = Brand<{
|
|
9
|
+
sessionId: SessionId
|
|
10
|
+
timestamp: number
|
|
11
|
+
type: T
|
|
12
|
+
}, 'Event'>
|
|
13
|
+
|
|
14
|
+
export type EventsMap = Record<string, z4.ZodObject<z4.ZodRawShape>>
|
|
15
|
+
|
|
16
|
+
export type EventUnion<TEvents extends EventsMap> = {
|
|
17
|
+
[K in keyof TEvents & string]: BaseEvent<K> & z4.infer<TEvents[K]>
|
|
18
|
+
}[keyof TEvents & string]
|
|
19
|
+
|
|
20
|
+
type EventsOf<TEvents extends EventsMap> = {
|
|
21
|
+
[K in keyof TEvents & string]: BaseEvent<K> & z4.infer<TEvents[K]>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface EventsFactory<TEvents extends EventsMap> {
|
|
25
|
+
create<K extends keyof TEvents & string>(type: K, input: z4.infer<TEvents[K]>): Omit<BaseEvent<K>, 'sessionId'> & z4.infer<TEvents[K]>
|
|
26
|
+
EventType: EventUnion<TEvents>
|
|
27
|
+
Events: EventsOf<TEvents>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Extract the event union type from an EventsFactory instance.
|
|
32
|
+
* Usage: FactoryEventType<typeof sessionEvents | typeof agentEvents>
|
|
33
|
+
*/
|
|
34
|
+
export type FactoryEventType<F extends { EventType: unknown }> = F['EventType'] & BaseEvent<string>
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Generic domain event type — any event with sessionId, timestamp, and type.
|
|
38
|
+
* Replaces the monolithic DomainEvent union from events.ts.
|
|
39
|
+
* Individual reducers use their own narrower event types via EventsFactory.
|
|
40
|
+
*/
|
|
41
|
+
export type DomainEvent = BaseEvent<string>
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Type guard to check if an unknown value is a DomainEvent.
|
|
45
|
+
*/
|
|
46
|
+
export const isDomainEvent = (event: unknown): event is DomainEvent =>
|
|
47
|
+
typeof event === 'object'
|
|
48
|
+
&& event !== null
|
|
49
|
+
&& 'type' in event
|
|
50
|
+
&& 'sessionId' in event
|
|
51
|
+
&& 'timestamp' in event
|
|
52
|
+
|
|
53
|
+
export const createEventsFactory = <TEvents extends EventsMap>(_args: { events: TEvents }): EventsFactory<TEvents> => {
|
|
54
|
+
return {
|
|
55
|
+
create: (type, input) => ({
|
|
56
|
+
type,
|
|
57
|
+
...input,
|
|
58
|
+
...({} as TheBrand<'Event'>),
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
}),
|
|
61
|
+
EventType: undefined!,
|
|
62
|
+
Events: undefined!,
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionFileStore - single FileStore implementation with path resolution.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates all path resolution logic (sandboxed virtual paths, traversal
|
|
5
|
+
* validation, agent-visible path mapping). Replaces the separate path-resolver
|
|
6
|
+
* functions for FileStore consumers.
|
|
7
|
+
*
|
|
8
|
+
* Three scopes:
|
|
9
|
+
* - 'full': accepts agent-visible paths (/home/user/session/... or real paths)
|
|
10
|
+
* - 'session': paths relative to sessionDir
|
|
11
|
+
* - 'workspace': paths relative to workspaceDir
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { dirname, join, normalize, resolve } from 'node:path'
|
|
15
|
+
import type { FileEntry, FileStore } from '~/core/file-store/types.js'
|
|
16
|
+
import type { FileSystem } from '~/platform/fs.js'
|
|
17
|
+
import { Err, Ok } from '~/lib/utils/result.js'
|
|
18
|
+
import type { Result } from '~/lib/utils/result.js'
|
|
19
|
+
|
|
20
|
+
// Virtual roots for sandboxed mode
|
|
21
|
+
const VIRTUAL_SESSION = '/home/user/session'
|
|
22
|
+
const VIRTUAL_WORKSPACE = '/home/user/workspace'
|
|
23
|
+
|
|
24
|
+
type FileStoreScope = 'full' | 'session' | 'workspace'
|
|
25
|
+
|
|
26
|
+
export class SessionFileStore implements FileStore {
|
|
27
|
+
constructor(
|
|
28
|
+
private readonly sessionDir: string,
|
|
29
|
+
private readonly workspaceDir: string | undefined,
|
|
30
|
+
private readonly sandboxed: boolean,
|
|
31
|
+
private readonly fs: FileSystem,
|
|
32
|
+
private readonly scope: FileStoreScope = 'full',
|
|
33
|
+
) {}
|
|
34
|
+
|
|
35
|
+
/** Create a session-scoped FileStore (relative paths → sessionDir) */
|
|
36
|
+
get session(): SessionFileStore {
|
|
37
|
+
return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'session')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Create a workspace-scoped FileStore (relative paths → workspaceDir), or undefined if no workspace */
|
|
41
|
+
get workspace(): SessionFileStore | undefined {
|
|
42
|
+
if (!this.workspaceDir) return undefined
|
|
43
|
+
return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'workspace')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async write(path: string, content: string | Buffer): Promise<Result<{ path: string }, string>> {
|
|
47
|
+
const resolved = this.resolvePath(path)
|
|
48
|
+
if (!resolved.ok) return resolved
|
|
49
|
+
|
|
50
|
+
await this.fs.mkdir(dirname(resolved.value), { recursive: true })
|
|
51
|
+
await this.fs.writeFile(resolved.value, content)
|
|
52
|
+
|
|
53
|
+
return Ok({ path: this.toAgentPath(resolved.value) })
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async read(path: string): Promise<Result<string, string>>
|
|
57
|
+
async read(path: string, opts: { type: 'buffer' }): Promise<Result<Buffer, string>>
|
|
58
|
+
async read(path: string, opts?: { type: 'buffer' }): Promise<Result<string | Buffer, string>> {
|
|
59
|
+
const resolved = this.resolvePath(path)
|
|
60
|
+
if (!resolved.ok) return resolved
|
|
61
|
+
|
|
62
|
+
try {
|
|
63
|
+
if (opts?.type === 'buffer') {
|
|
64
|
+
return Ok(await this.fs.readFile(resolved.value))
|
|
65
|
+
}
|
|
66
|
+
return Ok(await this.fs.readFile(resolved.value, 'utf-8'))
|
|
67
|
+
} catch {
|
|
68
|
+
return Err(`File not found: ${path}`)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async exists(path: string): Promise<Result<boolean, string>> {
|
|
73
|
+
const resolved = this.resolvePath(path)
|
|
74
|
+
if (!resolved.ok) return resolved
|
|
75
|
+
|
|
76
|
+
return Ok(await this.fs.exists(resolved.value))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async stat(path: string): Promise<Result<FileEntry, string>> {
|
|
80
|
+
const resolved = this.resolvePath(path)
|
|
81
|
+
if (!resolved.ok) return resolved
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const s = await this.fs.stat(resolved.value)
|
|
85
|
+
return Ok({
|
|
86
|
+
size: s.size,
|
|
87
|
+
type: s.isFile() ? 'file' : s.isDirectory() ? 'directory' : s.isSymbolicLink() ? 'symlink' : 'other',
|
|
88
|
+
name: resolved.value.split('/').pop() || '',
|
|
89
|
+
})
|
|
90
|
+
} catch {
|
|
91
|
+
return Err(`Not found: ${path}`)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async list(path: string): Promise<Result<FileEntry[], string>> {
|
|
96
|
+
const resolved = this.resolvePath(path)
|
|
97
|
+
if (!resolved.ok) return resolved
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const items = await this.fs.readdir(resolved.value, { withFileTypes: true })
|
|
101
|
+
const entries: FileEntry[] = []
|
|
102
|
+
for (const item of items) {
|
|
103
|
+
let type: FileEntry['type']
|
|
104
|
+
let size: number | undefined
|
|
105
|
+
if (item.isFile()) {
|
|
106
|
+
type = 'file'
|
|
107
|
+
const s = await this.fs.stat(join(resolved.value, item.name))
|
|
108
|
+
size = s.size
|
|
109
|
+
} else if (item.isDirectory()) {
|
|
110
|
+
type = 'directory'
|
|
111
|
+
} else if (item.isSymbolicLink()) {
|
|
112
|
+
type = 'symlink'
|
|
113
|
+
} else {
|
|
114
|
+
type = 'other'
|
|
115
|
+
}
|
|
116
|
+
entries.push({ name: item.name, type, size })
|
|
117
|
+
}
|
|
118
|
+
return Ok(entries)
|
|
119
|
+
} catch {
|
|
120
|
+
return Err(`Directory not found: ${path}`)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async remove(path: string): Promise<Result<void, string>> {
|
|
125
|
+
const resolved = this.resolvePath(path)
|
|
126
|
+
if (!resolved.ok) return resolved
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
await this.fs.unlink(resolved.value)
|
|
130
|
+
return Ok(undefined)
|
|
131
|
+
} catch {
|
|
132
|
+
return Err(`Failed to remove: ${path}`)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
getRoots(): { session: string; workspace?: string } {
|
|
137
|
+
if (this.sandboxed) {
|
|
138
|
+
return {
|
|
139
|
+
session: VIRTUAL_SESSION,
|
|
140
|
+
workspace: this.workspaceDir ? VIRTUAL_WORKSPACE : undefined,
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
session: this.sessionDir,
|
|
145
|
+
workspace: this.workspaceDir,
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
realPath(path: string): Result<string, string> {
|
|
150
|
+
return this.resolvePath(path)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
scoped(basePath: string): SessionFileStore {
|
|
154
|
+
// Resolve basePath relative to current scope
|
|
155
|
+
const resolved = this.resolvePath(basePath)
|
|
156
|
+
if (!resolved.ok) {
|
|
157
|
+
throw new Error(`Cannot scope to invalid path: ${basePath}`)
|
|
158
|
+
}
|
|
159
|
+
return new SessionFileStore(resolved.value, undefined, false, this.fs, 'session')
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// Path resolution
|
|
164
|
+
// ============================================================================
|
|
165
|
+
|
|
166
|
+
private resolvePath(path: string): Result<string, string> {
|
|
167
|
+
switch (this.scope) {
|
|
168
|
+
case 'full':
|
|
169
|
+
return this.resolveAgentPath(path)
|
|
170
|
+
case 'session':
|
|
171
|
+
return this.resolveRelativePath(path, this.sessionDir)
|
|
172
|
+
case 'workspace':
|
|
173
|
+
if (!this.workspaceDir) return Err('No workspace directory configured')
|
|
174
|
+
return this.resolveRelativePath(path, this.workspaceDir)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Resolve a relative path within a root directory */
|
|
179
|
+
private resolveRelativePath(path: string, rootDir: string): Result<string, string> {
|
|
180
|
+
const normalized = normalize(path)
|
|
181
|
+
if (normalized.startsWith('..') || normalized.startsWith('/')) {
|
|
182
|
+
return Err(`Path traversal not allowed: ${path}`)
|
|
183
|
+
}
|
|
184
|
+
const absolute = resolve(join(rootDir, normalized))
|
|
185
|
+
if (!absolute.startsWith(rootDir)) {
|
|
186
|
+
return Err(`Path traversal not allowed: ${path}`)
|
|
187
|
+
}
|
|
188
|
+
return Ok(absolute)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Resolve an agent-visible path to real filesystem path (handles sandboxed virtual paths) */
|
|
192
|
+
private resolveAgentPath(agentPath: string): Result<string, string> {
|
|
193
|
+
if (this.sandboxed) {
|
|
194
|
+
return this.resolveSandboxedPath(agentPath)
|
|
195
|
+
}
|
|
196
|
+
return this.resolveNonSandboxedPath(agentPath)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private resolveSandboxedPath(agentPath: string): Result<string, string> {
|
|
200
|
+
if (agentPath.startsWith(VIRTUAL_SESSION + '/') || agentPath === VIRTUAL_SESSION) {
|
|
201
|
+
const relative = agentPath.slice(VIRTUAL_SESSION.length)
|
|
202
|
+
const absolutePath = resolve(this.sessionDir, relative.slice(1) || '.')
|
|
203
|
+
return this.validateWithinRoot(absolutePath, this.sessionDir, agentPath)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (agentPath.startsWith(VIRTUAL_WORKSPACE + '/') || agentPath === VIRTUAL_WORKSPACE) {
|
|
207
|
+
if (!this.workspaceDir) {
|
|
208
|
+
return Err('No workspace directory is configured for this session. Only session paths are available.')
|
|
209
|
+
}
|
|
210
|
+
const relative = agentPath.slice(VIRTUAL_WORKSPACE.length)
|
|
211
|
+
const absolutePath = resolve(this.workspaceDir, relative.slice(1) || '.')
|
|
212
|
+
return this.validateWithinRoot(absolutePath, this.workspaceDir, agentPath)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const validPrefixes = this.workspaceDir
|
|
216
|
+
? `${VIRTUAL_SESSION}/ or ${VIRTUAL_WORKSPACE}/`
|
|
217
|
+
: `${VIRTUAL_SESSION}/`
|
|
218
|
+
|
|
219
|
+
return Err(`Path must start with ${validPrefixes}. Got: '${agentPath}'`)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private resolveNonSandboxedPath(agentPath: string): Result<string, string> {
|
|
223
|
+
const absolutePath = resolve(agentPath)
|
|
224
|
+
const normalizedSession = resolve(this.sessionDir)
|
|
225
|
+
const normalizedWorkspace = this.workspaceDir ? resolve(this.workspaceDir) : null
|
|
226
|
+
|
|
227
|
+
const isInSession = absolutePath === normalizedSession || absolutePath.startsWith(normalizedSession + '/')
|
|
228
|
+
const isInWorkspace = normalizedWorkspace
|
|
229
|
+
&& (absolutePath === normalizedWorkspace || absolutePath.startsWith(normalizedWorkspace + '/'))
|
|
230
|
+
|
|
231
|
+
if (!isInSession && !isInWorkspace) {
|
|
232
|
+
return Err(`Path '${agentPath}' is outside allowed directories`)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return Ok(absolutePath)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
private validateWithinRoot(absolutePath: string, rootDir: string, originalPath: string): Result<string, string> {
|
|
239
|
+
const normalizedRoot = resolve(rootDir)
|
|
240
|
+
const isWithin = absolutePath === normalizedRoot || absolutePath.startsWith(normalizedRoot + '/')
|
|
241
|
+
|
|
242
|
+
if (!isWithin) {
|
|
243
|
+
return Err(`Path '${originalPath}' resolves outside allowed directories`)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return Ok(absolutePath)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// Agent-visible path conversion
|
|
251
|
+
// ============================================================================
|
|
252
|
+
|
|
253
|
+
private toAgentPath(realPath: string): string {
|
|
254
|
+
if (!this.sandboxed) return realPath
|
|
255
|
+
|
|
256
|
+
const normalizedSession = resolve(this.sessionDir)
|
|
257
|
+
const normalizedWorkspace = this.workspaceDir ? resolve(this.workspaceDir) : null
|
|
258
|
+
|
|
259
|
+
// Try workspace first (more specific match if workspace is inside session)
|
|
260
|
+
if (normalizedWorkspace) {
|
|
261
|
+
if (realPath === normalizedWorkspace) return VIRTUAL_WORKSPACE
|
|
262
|
+
if (realPath.startsWith(normalizedWorkspace + '/')) {
|
|
263
|
+
return VIRTUAL_WORKSPACE + realPath.slice(normalizedWorkspace.length)
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (realPath === normalizedSession) return VIRTUAL_SESSION
|
|
268
|
+
if (realPath.startsWith(normalizedSession + '/')) {
|
|
269
|
+
return VIRTUAL_SESSION + realPath.slice(normalizedSession.length)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Path is outside known roots - return as-is
|
|
273
|
+
return realPath
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileStore interface for centralized file operations.
|
|
3
|
+
* All paths are relative to the store's root directory.
|
|
4
|
+
* Used by tools, lib functions, and the LLM provider.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Result } from '~/lib/utils/result.js'
|
|
8
|
+
|
|
9
|
+
export interface FileStat {
|
|
10
|
+
size: number
|
|
11
|
+
isFile: boolean
|
|
12
|
+
isDirectory: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface FileEntry {
|
|
16
|
+
name: string
|
|
17
|
+
type: 'file' | 'directory' | 'symlink' | 'other'
|
|
18
|
+
size?: number
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface FileStore {
|
|
22
|
+
/** Write text or binary content. Auto-creates parent dirs. Returns the agent-visible path. */
|
|
23
|
+
write(path: string, content: string | Buffer): Promise<Result<{ path: string }, string>>
|
|
24
|
+
|
|
25
|
+
/** Read file as UTF-8 text. */
|
|
26
|
+
read(path: string): Promise<Result<string, string>>
|
|
27
|
+
/** Read file as Buffer. */
|
|
28
|
+
read(path: string, opts: { type: 'buffer' }): Promise<Result<Buffer, string>>
|
|
29
|
+
|
|
30
|
+
/** Check if a file exists. */
|
|
31
|
+
exists(path: string): Promise<Result<boolean, string>>
|
|
32
|
+
|
|
33
|
+
/** Get file/directory stats. */
|
|
34
|
+
stat(path: string): Promise<Result<FileEntry, string>>
|
|
35
|
+
|
|
36
|
+
/** List entries in a directory with type and size info. */
|
|
37
|
+
list(path: string, options?: { maxDepth?: number; gitIgnore?: boolean }): Promise<Result<FileEntry[], string>>
|
|
38
|
+
|
|
39
|
+
/** Remove a file. */
|
|
40
|
+
remove(path: string): Promise<Result<void, string>>
|
|
41
|
+
|
|
42
|
+
/** Resolve an agent-visible path to real filesystem path. */
|
|
43
|
+
realPath(path: string): Result<string, string>
|
|
44
|
+
|
|
45
|
+
/** Get the agent-visible root paths (virtual when sandboxed, real otherwise) */
|
|
46
|
+
getRoots(): { session: string; workspace?: string }
|
|
47
|
+
|
|
48
|
+
scoped(subPath: string): FileStore
|
|
49
|
+
|
|
50
|
+
session: FileStore
|
|
51
|
+
workspace?: FileStore
|
|
52
|
+
}
|