@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,468 @@
|
|
|
1
|
+
import { join, relative, resolve } from 'node:path'
|
|
2
|
+
import z from 'zod/v4'
|
|
3
|
+
import { agentEvents } from '~/core/agents/state.js'
|
|
4
|
+
import { ValidationErrors } from '~/core/errors.js'
|
|
5
|
+
import type { FileEntry } from '~/core/file-store/types.js'
|
|
6
|
+
import type { ToolResultContent } from '~/core/llm/llm-log-types.js'
|
|
7
|
+
import { truncateByTokens } from '~/core/llm/tokens.js'
|
|
8
|
+
import { definePlugin } from '~/core/plugins/plugin-builder.js'
|
|
9
|
+
import { createTool, type ToolDefinition } from '~/core/tools/definition.js'
|
|
10
|
+
import { getImageMimeType } from '~/lib/mime.js'
|
|
11
|
+
import { Err, Ok } from '~/lib/utils/result.js'
|
|
12
|
+
import type { Result } from '~/lib/utils/result.js'
|
|
13
|
+
import type { ToolError } from '../../core/tools/executor.js'
|
|
14
|
+
import {
|
|
15
|
+
buildDirectoryListingPreamble,
|
|
16
|
+
CALLS_DIR,
|
|
17
|
+
checkDeniedPaths,
|
|
18
|
+
EVENTS_DIR,
|
|
19
|
+
fileEntryToTreeEntry,
|
|
20
|
+
formatFlatListing,
|
|
21
|
+
formatTreeRecursive,
|
|
22
|
+
loadGitignoreViaStore,
|
|
23
|
+
type TreeEntry,
|
|
24
|
+
} from './helpers.js'
|
|
25
|
+
import { listDirectory, listDirectoryRecursive, ListingError, preventTraversal } from './listing.js'
|
|
26
|
+
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Configuration
|
|
29
|
+
// ============================================================================
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Session-wide filesystem configuration.
|
|
33
|
+
*/
|
|
34
|
+
export interface FilesystemPresetConfig {
|
|
35
|
+
/** Maximum file size to read (bytes) - files larger than this are rejected (default: 10MB) */
|
|
36
|
+
maxReadSize?: number
|
|
37
|
+
/** Allowed file extensions (empty = all allowed) */
|
|
38
|
+
allowedExtensions?: string[]
|
|
39
|
+
/** Denied path segments (e.g. [".events"]) */
|
|
40
|
+
deniedPaths?: string[]
|
|
41
|
+
/** Approximate max tokens before auto-truncating (default: 20000) */
|
|
42
|
+
maxTokens?: number
|
|
43
|
+
/** Respect .gitignore files when listing directories (default: true) */
|
|
44
|
+
respectGitignore?: boolean
|
|
45
|
+
/** Default enabled state for agents (default: true). Agents can override via FilesystemAgentConfig.enabled. */
|
|
46
|
+
defaultEnabled?: boolean
|
|
47
|
+
/** Whether write tools (write_file, replace_in_file) are available by default (default: true). Agents can override via FilesystemAgentConfig.writable. */
|
|
48
|
+
writable?: boolean
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Agent-specific filesystem configuration.
|
|
53
|
+
*/
|
|
54
|
+
export interface FilesystemAgentConfig {
|
|
55
|
+
/** Whether filesystem is enabled for this agent (default: true) */
|
|
56
|
+
enabled?: boolean
|
|
57
|
+
/** Whether write tools (write_file, replace_in_file) are available for this agent. Overrides preset-level writable when set. */
|
|
58
|
+
writable?: boolean
|
|
59
|
+
/** Emit a directory listing preamble when the agent starts. true uses default depth (1), or pass { maxDepth } to override. */
|
|
60
|
+
directoryListing?: boolean | { maxDepth?: number }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Zod Schemas
|
|
65
|
+
// ============================================================================
|
|
66
|
+
|
|
67
|
+
const directoryEntrySchema = z.object({
|
|
68
|
+
name: z.string(),
|
|
69
|
+
path: z.string().optional(),
|
|
70
|
+
type: z.enum(['file', 'directory']),
|
|
71
|
+
size: z.number(),
|
|
72
|
+
mimeType: z.string().optional(),
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
const readFileInputSchema = z.object({
|
|
76
|
+
path: z.string().describe('Absolute path to the file within session or workspace directory.'),
|
|
77
|
+
offset: z.number().int().min(0).optional()
|
|
78
|
+
.describe('Line offset to start reading from (0-based). Defaults to 0.'),
|
|
79
|
+
maxLines: z.number().int().min(1).optional()
|
|
80
|
+
.describe('Maximum number of lines to return. If omitted, returns the entire file.'),
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
const writeFileInputSchema = z.object({
|
|
84
|
+
path: z.string().describe('Absolute path to the file within session or workspace directory.'),
|
|
85
|
+
content: z.string().describe('Content to write'),
|
|
86
|
+
encoding: z.enum(['utf-8', 'base64']).optional()
|
|
87
|
+
.describe('Content encoding (utf-8 for text, base64 for binary). Defaults to utf-8.'),
|
|
88
|
+
createDirs: z.boolean().optional()
|
|
89
|
+
.describe("Create parent directories if they don't exist. Defaults to true."),
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
const listDirectoryInputSchema = z.object({
|
|
93
|
+
path: z.string().describe('Absolute path to the directory within session or workspace directory.'),
|
|
94
|
+
recursive: z.boolean().optional()
|
|
95
|
+
.describe('List contents recursively. Defaults to false.'),
|
|
96
|
+
includeHidden: z.boolean().optional()
|
|
97
|
+
.describe('Include hidden files (starting with .). Defaults to false.'),
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
const replaceInFileInputSchema = z.object({
|
|
101
|
+
path: z.string().describe('Absolute path to the file.'),
|
|
102
|
+
searchValue: z.string().describe('Exact text to find.'),
|
|
103
|
+
replaceValue: z.string().describe('Text to replace with.'),
|
|
104
|
+
expectedOccurrences: z.number().int().min(1).optional().describe('Expected number of occurrences. Aborts if actual count differs.'),
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// ============================================================================
|
|
108
|
+
// Filesystem Plugin
|
|
109
|
+
// ============================================================================
|
|
110
|
+
|
|
111
|
+
export const filesystemPlugin = definePlugin('filesystem')
|
|
112
|
+
.pluginConfig<FilesystemPresetConfig>()
|
|
113
|
+
.context(async () => {
|
|
114
|
+
return {} // No plugin-specific context needed
|
|
115
|
+
})
|
|
116
|
+
.agentConfig<FilesystemAgentConfig>()
|
|
117
|
+
.tools((ctx) => {
|
|
118
|
+
const pluginConfig = ctx.pluginConfig ?? {}
|
|
119
|
+
const defaultEnabled = pluginConfig.defaultEnabled ?? true
|
|
120
|
+
const agentEnabled = ctx.pluginAgentConfig?.enabled ?? defaultEnabled
|
|
121
|
+
if (!agentEnabled) return []
|
|
122
|
+
|
|
123
|
+
const deniedPaths = pluginConfig.deniedPaths ?? [EVENTS_DIR, CALLS_DIR]
|
|
124
|
+
const maxReadSize = pluginConfig.maxReadSize ?? 10 * 1024 * 1024 // 10MB default
|
|
125
|
+
const maxTokens = pluginConfig.maxTokens ?? 20_000
|
|
126
|
+
// Reserve 10% for JSON envelope/metadata so result-eviction plugin doesn't double-truncate
|
|
127
|
+
const contentTokenBudget = Math.floor(maxTokens * 0.9)
|
|
128
|
+
const respectGitignore = pluginConfig.respectGitignore ?? true
|
|
129
|
+
const writable = ctx.pluginAgentConfig?.writable ?? pluginConfig.writable ?? true
|
|
130
|
+
|
|
131
|
+
const tools: ToolDefinition<any>[] = [
|
|
132
|
+
// read_file tool
|
|
133
|
+
createTool({
|
|
134
|
+
name: 'read_file',
|
|
135
|
+
description: 'Read the contents of a file. For image files, the image is returned visually. For other binary files, only metadata is returned.',
|
|
136
|
+
input: readFileInputSchema,
|
|
137
|
+
execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
|
|
138
|
+
const denied = checkDeniedPaths(input.path, deniedPaths)
|
|
139
|
+
if (!denied.ok) return denied
|
|
140
|
+
|
|
141
|
+
const fileStore = context.files
|
|
142
|
+
|
|
143
|
+
const statResult = await fileStore.stat(input.path)
|
|
144
|
+
if (!statResult.ok) {
|
|
145
|
+
return Err({
|
|
146
|
+
message: statResult.error,
|
|
147
|
+
recoverable: false,
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const stats = statResult.value
|
|
152
|
+
|
|
153
|
+
if (stats.type !== 'file') {
|
|
154
|
+
return Err({
|
|
155
|
+
message: `'${input.path}' is not a file`,
|
|
156
|
+
recoverable: false,
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Image files → return as multimodal image content
|
|
161
|
+
const mimeType = getImageMimeType(input.path)
|
|
162
|
+
if (mimeType) {
|
|
163
|
+
const realPathResult = fileStore.realPath(input.path)
|
|
164
|
+
if (!realPathResult.ok) {
|
|
165
|
+
return Err({ message: realPathResult.error, recoverable: false })
|
|
166
|
+
}
|
|
167
|
+
return Ok([
|
|
168
|
+
{ type: 'text', text: `Image: ${input.path} (${mimeType}, ${stats.size} bytes)` },
|
|
169
|
+
{ type: 'image_url', imageUrl: { url: `file://${realPathResult.value}` } },
|
|
170
|
+
])
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Reject files that are too large to read into memory
|
|
174
|
+
if ((stats.size ?? 0) > maxReadSize) {
|
|
175
|
+
return Err({
|
|
176
|
+
message: `File is too large (${stats.size} bytes, max ${maxReadSize}). Use offset and maxLines to read specific sections.`,
|
|
177
|
+
recoverable: true,
|
|
178
|
+
})
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Read as text
|
|
182
|
+
const readResult = await fileStore.read(input.path)
|
|
183
|
+
if (!readResult.ok) {
|
|
184
|
+
return Err({ message: readResult.error, recoverable: false })
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const rawContent = readResult.value as string
|
|
188
|
+
|
|
189
|
+
// Detect binary content (null bytes in first 8KB)
|
|
190
|
+
if (rawContent.slice(0, 8192).includes('\0')) {
|
|
191
|
+
return Ok(JSON.stringify({ path: input.path, type: 'binary', size: stats.size }, null, 2))
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
let content = rawContent
|
|
195
|
+
const hasExplicitRange = input.offset !== undefined || input.maxLines !== undefined
|
|
196
|
+
const lines = content.split('\n')
|
|
197
|
+
const totalLines = lines.length
|
|
198
|
+
|
|
199
|
+
// Auto-truncate files exceeding maxTokens when no explicit range is specified
|
|
200
|
+
const truncation = !hasExplicitRange ? truncateByTokens(content, contentTokenBudget) : null
|
|
201
|
+
if (truncation) {
|
|
202
|
+
return Ok(JSON.stringify(
|
|
203
|
+
{
|
|
204
|
+
content: truncation.content,
|
|
205
|
+
size: stats.size,
|
|
206
|
+
truncated: true,
|
|
207
|
+
totalLines,
|
|
208
|
+
instructions:
|
|
209
|
+
`File is large (${totalLines} lines, ~${truncation.originalTokens} tokens). Use offset and maxLines parameters to read specific sections.`,
|
|
210
|
+
},
|
|
211
|
+
null,
|
|
212
|
+
2,
|
|
213
|
+
))
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
let truncated = false
|
|
217
|
+
if (hasExplicitRange) {
|
|
218
|
+
const start = input.offset ?? 0
|
|
219
|
+
const end = input.maxLines !== undefined ? start + input.maxLines : totalLines
|
|
220
|
+
const sliced = lines.slice(start, end)
|
|
221
|
+
truncated = end < totalLines
|
|
222
|
+
content = sliced.join('\n')
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Cap explicit range results to maxTokens as well
|
|
226
|
+
const rangeTruncation = truncateByTokens(content, contentTokenBudget)
|
|
227
|
+
if (rangeTruncation) {
|
|
228
|
+
content = rangeTruncation.content
|
|
229
|
+
truncated = true
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return Ok(JSON.stringify(
|
|
233
|
+
{
|
|
234
|
+
content,
|
|
235
|
+
size: stats.size,
|
|
236
|
+
...(truncated ? { truncated: true } : {}),
|
|
237
|
+
...(hasExplicitRange || truncated ? { totalLines } : {}),
|
|
238
|
+
},
|
|
239
|
+
null,
|
|
240
|
+
2,
|
|
241
|
+
))
|
|
242
|
+
},
|
|
243
|
+
}),
|
|
244
|
+
|
|
245
|
+
// list_directory tool
|
|
246
|
+
createTool({
|
|
247
|
+
name: 'list_directory',
|
|
248
|
+
description: 'List the contents of a directory. Returns a compact tree view.',
|
|
249
|
+
input: listDirectoryInputSchema,
|
|
250
|
+
execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
|
|
251
|
+
const denied = checkDeniedPaths(input.path, deniedPaths)
|
|
252
|
+
if (!denied.ok) return denied
|
|
253
|
+
|
|
254
|
+
const fileStore = context.files
|
|
255
|
+
const recursive = input.recursive ?? false
|
|
256
|
+
const includeHidden = input.includeHidden ?? false
|
|
257
|
+
|
|
258
|
+
const statResult = await fileStore.stat(input.path)
|
|
259
|
+
if (!statResult.ok) {
|
|
260
|
+
return Err({
|
|
261
|
+
message: statResult.error,
|
|
262
|
+
recoverable: false,
|
|
263
|
+
})
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (statResult.value.type !== 'directory') {
|
|
267
|
+
return Err({
|
|
268
|
+
message: `'${input.path}' is not a directory`,
|
|
269
|
+
recoverable: false,
|
|
270
|
+
})
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const ig = respectGitignore ? await loadGitignoreViaStore(input.path, input.path, fileStore) : null
|
|
274
|
+
|
|
275
|
+
async function collectEntries(dirPath: string): Promise<TreeEntry[]> {
|
|
276
|
+
const listResult = await fileStore.list(dirPath)
|
|
277
|
+
if (!listResult.ok) return []
|
|
278
|
+
|
|
279
|
+
const entries: TreeEntry[] = []
|
|
280
|
+
for (const item of listResult.value as FileEntry[]) {
|
|
281
|
+
if (!includeHidden && item.name.startsWith('.')) continue
|
|
282
|
+
if (deniedPaths.includes(item.name)) continue
|
|
283
|
+
|
|
284
|
+
const itemRelative = relative(input.path, join(dirPath, item.name))
|
|
285
|
+
|
|
286
|
+
if (ig) {
|
|
287
|
+
const testPath = item.type === 'directory' ? `${itemRelative}/` : itemRelative
|
|
288
|
+
if (ig.ignores(testPath)) continue
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const treeEntry = fileEntryToTreeEntry(item)
|
|
292
|
+
if (item.type === 'directory' && recursive) {
|
|
293
|
+
treeEntry.children = await collectEntries(join(dirPath, item.name))
|
|
294
|
+
}
|
|
295
|
+
entries.push(treeEntry)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return entries
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const entries = await collectEntries(input.path)
|
|
302
|
+
|
|
303
|
+
let output: string
|
|
304
|
+
if (recursive) {
|
|
305
|
+
output = `${input.path}/\n${formatTreeRecursive(entries, '')}`
|
|
306
|
+
} else {
|
|
307
|
+
output = `${input.path}/\n${formatFlatListing(entries)}`
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return Ok(output)
|
|
311
|
+
},
|
|
312
|
+
}),
|
|
313
|
+
]
|
|
314
|
+
|
|
315
|
+
if (writable) {
|
|
316
|
+
tools.push(
|
|
317
|
+
// write_file tool
|
|
318
|
+
createTool({
|
|
319
|
+
name: 'write_file',
|
|
320
|
+
description:
|
|
321
|
+
"Write content to a file. Automatically creates parent directories — no need to mkdir first. Creates the file if it doesn't exist, overwrites if it does.",
|
|
322
|
+
input: writeFileInputSchema,
|
|
323
|
+
execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
|
|
324
|
+
const denied = checkDeniedPaths(input.path, deniedPaths)
|
|
325
|
+
if (!denied.ok) return denied
|
|
326
|
+
|
|
327
|
+
const fileStore = context.files
|
|
328
|
+
const encoding = input.encoding ?? 'utf-8'
|
|
329
|
+
|
|
330
|
+
const buffer = encoding === 'base64'
|
|
331
|
+
? Buffer.from(input.content, 'base64')
|
|
332
|
+
: input.content
|
|
333
|
+
|
|
334
|
+
const writeResult = await fileStore.write(input.path, buffer)
|
|
335
|
+
if (!writeResult.ok) {
|
|
336
|
+
return Err({
|
|
337
|
+
message: `Failed to write file: ${writeResult.error}`,
|
|
338
|
+
recoverable: false,
|
|
339
|
+
})
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Get size after write
|
|
343
|
+
const statResult = await fileStore.stat(input.path)
|
|
344
|
+
const size = statResult.ok ? statResult.value.size : Buffer.byteLength(typeof buffer === 'string' ? buffer : buffer)
|
|
345
|
+
|
|
346
|
+
return Ok(JSON.stringify({ path: input.path, size }, null, 2))
|
|
347
|
+
},
|
|
348
|
+
}),
|
|
349
|
+
// replace_in_file tool
|
|
350
|
+
createTool({
|
|
351
|
+
name: 'replace_in_file',
|
|
352
|
+
description:
|
|
353
|
+
'Replace text in a file. More efficient and safer than write_file for targeted changes. Use write_file only for new files or complete rewrites.',
|
|
354
|
+
input: replaceInFileInputSchema,
|
|
355
|
+
execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
|
|
356
|
+
const denied = checkDeniedPaths(input.path, deniedPaths)
|
|
357
|
+
if (!denied.ok) return denied
|
|
358
|
+
|
|
359
|
+
const fileStore = context.files
|
|
360
|
+
|
|
361
|
+
const readResult = await fileStore.read(input.path)
|
|
362
|
+
if (!readResult.ok) {
|
|
363
|
+
return Err({ message: readResult.error, recoverable: false })
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const content = readResult.value as string
|
|
367
|
+
const parts = content.split(input.searchValue)
|
|
368
|
+
const occurrences = parts.length - 1
|
|
369
|
+
|
|
370
|
+
if (occurrences === 0) {
|
|
371
|
+
return Err({ message: 'No occurrences found', recoverable: true })
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (input.expectedOccurrences !== undefined && occurrences !== input.expectedOccurrences) {
|
|
375
|
+
return Err({
|
|
376
|
+
message: `Expected ${input.expectedOccurrences} occurrences, but found ${occurrences}`,
|
|
377
|
+
recoverable: true,
|
|
378
|
+
})
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const newContent = parts.join(input.replaceValue)
|
|
382
|
+
const writeResult = await fileStore.write(input.path, newContent)
|
|
383
|
+
if (!writeResult.ok) {
|
|
384
|
+
return Err({ message: `Failed to write file: ${writeResult.error}`, recoverable: false })
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return Ok(`Replaced ${occurrences} occurrence${occurrences === 1 ? '' : 's'}`)
|
|
388
|
+
},
|
|
389
|
+
}),
|
|
390
|
+
)
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return tools
|
|
394
|
+
})
|
|
395
|
+
.method('listSession', {
|
|
396
|
+
input: z.object({ path: z.string().optional() }),
|
|
397
|
+
output: z.object({
|
|
398
|
+
entries: z.array(directoryEntrySchema),
|
|
399
|
+
path: z.string(),
|
|
400
|
+
root: z.literal('session'),
|
|
401
|
+
}),
|
|
402
|
+
handler: async (ctx, input) => {
|
|
403
|
+
const baseDir = ctx.environment.sessionDir
|
|
404
|
+
try {
|
|
405
|
+
const entries = await listDirectory(ctx.platform.fs, baseDir, input.path ?? '')
|
|
406
|
+
return Ok({ entries, path: input.path ?? '', root: 'session' })
|
|
407
|
+
} catch (e) {
|
|
408
|
+
if (e instanceof ListingError) {
|
|
409
|
+
return Err(ValidationErrors.invalid(e.message))
|
|
410
|
+
}
|
|
411
|
+
throw e
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
})
|
|
415
|
+
.method('listWorkspace', {
|
|
416
|
+
input: z.object({ path: z.string().optional(), recursive: z.boolean().optional() }),
|
|
417
|
+
output: z.object({
|
|
418
|
+
entries: z.array(directoryEntrySchema),
|
|
419
|
+
path: z.string(),
|
|
420
|
+
root: z.literal('workspace'),
|
|
421
|
+
}),
|
|
422
|
+
handler: async (ctx, input) => {
|
|
423
|
+
const workspaceDir = ctx.environment.workspaceDir
|
|
424
|
+
if (!workspaceDir) {
|
|
425
|
+
return Err(ValidationErrors.invalid('No workspace configured for this session'))
|
|
426
|
+
}
|
|
427
|
+
const resolvedWorkspace = resolve(workspaceDir)
|
|
428
|
+
const subPath = input.path ?? ''
|
|
429
|
+
|
|
430
|
+
try {
|
|
431
|
+
if (input.recursive) {
|
|
432
|
+
const targetDir = subPath ? preventTraversal(resolvedWorkspace, subPath) : resolvedWorkspace
|
|
433
|
+
if (!targetDir) {
|
|
434
|
+
return Err(ValidationErrors.invalid('Path traversal not allowed'))
|
|
435
|
+
}
|
|
436
|
+
const entries = await listDirectoryRecursive(ctx.platform.fs, targetDir)
|
|
437
|
+
return Ok({ entries, path: subPath, root: 'workspace' })
|
|
438
|
+
}
|
|
439
|
+
const entries = await listDirectory(ctx.platform.fs, resolvedWorkspace, subPath)
|
|
440
|
+
return Ok({ entries, path: subPath, root: 'workspace' })
|
|
441
|
+
} catch (e) {
|
|
442
|
+
if (e instanceof ListingError) {
|
|
443
|
+
return Err(ValidationErrors.invalid(e.message))
|
|
444
|
+
}
|
|
445
|
+
throw e
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
})
|
|
449
|
+
.hook('onStart', async (ctx) => {
|
|
450
|
+
const pluginConfig = ctx.pluginConfig ?? {}
|
|
451
|
+
const defaultEnabled = pluginConfig.defaultEnabled ?? true
|
|
452
|
+
if (!(ctx.pluginAgentConfig?.enabled ?? defaultEnabled)) return null
|
|
453
|
+
|
|
454
|
+
const dirListingConfig = ctx.pluginAgentConfig?.directoryListing
|
|
455
|
+
if (!dirListingConfig) return null
|
|
456
|
+
|
|
457
|
+
const maxDepth = typeof dirListingConfig === 'object' ? dirListingConfig.maxDepth : undefined
|
|
458
|
+
const deniedPaths = pluginConfig.deniedPaths ?? [EVENTS_DIR, CALLS_DIR]
|
|
459
|
+
const content = await buildDirectoryListingPreamble(ctx.files, { maxDepth, deniedPaths })
|
|
460
|
+
|
|
461
|
+
await ctx.emitEvent(agentEvents.create('preamble_added', {
|
|
462
|
+
agentId: ctx.agentId,
|
|
463
|
+
messages: [{ role: 'user', content }],
|
|
464
|
+
}))
|
|
465
|
+
|
|
466
|
+
return null
|
|
467
|
+
})
|
|
468
|
+
.build()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { gitStatusPlugin } from './plugin.js'
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Status Plugin
|
|
3
|
+
*
|
|
4
|
+
* Polls git state (commits ahead of the default branch, uncommitted files,
|
|
5
|
+
* last commit metadata) inside the session's workspace directory every few
|
|
6
|
+
* seconds and emits a `git_status_changed` notification when the snapshot
|
|
7
|
+
* changes. The worker DO persists the last snapshot into its session table so
|
|
8
|
+
* versions sidebar and publish bars can render without reaching into the
|
|
9
|
+
* sandbox on every page view.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import z from 'zod/v4'
|
|
13
|
+
import { definePlugin } from '~/core/plugins/index.js'
|
|
14
|
+
import { sessionIdSchema } from '~/core/sessions/schema.js'
|
|
15
|
+
import type { ProcessRunner } from '~/platform/process.js'
|
|
16
|
+
|
|
17
|
+
const POLL_INTERVAL_MS = 2000
|
|
18
|
+
const GIT_TIMEOUT_MS = 5000
|
|
19
|
+
const DEFAULT_BRANCH_FALLBACK = 'main'
|
|
20
|
+
|
|
21
|
+
interface GitStatusSnapshot {
|
|
22
|
+
committedAhead: number
|
|
23
|
+
uncommittedFiles: number
|
|
24
|
+
lastCommitAt: number | null
|
|
25
|
+
lastCommitMessage: string | null
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface GitStatusPluginContext {
|
|
29
|
+
intervals: Map<string, NodeJS.Timeout>
|
|
30
|
+
lastSnapshots: Map<string, GitStatusSnapshot>
|
|
31
|
+
defaultBranches: Map<string, string>
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const gitStatusPlugin = definePlugin('git-status')
|
|
35
|
+
.notification('git_status_changed', {
|
|
36
|
+
schema: z.object({
|
|
37
|
+
sessionId: sessionIdSchema,
|
|
38
|
+
committedAhead: z.number(),
|
|
39
|
+
uncommittedFiles: z.number(),
|
|
40
|
+
lastCommitAt: z.number().nullable(),
|
|
41
|
+
lastCommitMessage: z.string().nullable(),
|
|
42
|
+
updatedAt: z.number(),
|
|
43
|
+
}),
|
|
44
|
+
})
|
|
45
|
+
.context(async (): Promise<GitStatusPluginContext> => ({
|
|
46
|
+
intervals: new Map(),
|
|
47
|
+
lastSnapshots: new Map(),
|
|
48
|
+
defaultBranches: new Map(),
|
|
49
|
+
}))
|
|
50
|
+
.sessionHook('onSessionReady', async (ctx) => {
|
|
51
|
+
const workdir = ctx.sessionState.workspaceDir
|
|
52
|
+
if (!workdir) return
|
|
53
|
+
|
|
54
|
+
const sessionId = ctx.sessionId
|
|
55
|
+
const pluginCtx = ctx.pluginContext
|
|
56
|
+
const processRunner = ctx.platform.process
|
|
57
|
+
|
|
58
|
+
const tick = async () => {
|
|
59
|
+
let baseBranch = pluginCtx.defaultBranches.get(sessionId)
|
|
60
|
+
if (!baseBranch) {
|
|
61
|
+
baseBranch = await detectDefaultBranch(processRunner, workdir) ?? DEFAULT_BRANCH_FALLBACK
|
|
62
|
+
pluginCtx.defaultBranches.set(sessionId, baseBranch)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const snapshot = await computeGitStatus(processRunner, workdir, baseBranch)
|
|
66
|
+
if (!snapshot) {
|
|
67
|
+
ctx.logger.warn('git-status: snapshot failed', { sessionId, workdir, baseBranch })
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const last = pluginCtx.lastSnapshots.get(sessionId)
|
|
72
|
+
if (last && snapshotsEqual(last, snapshot)) return
|
|
73
|
+
|
|
74
|
+
pluginCtx.lastSnapshots.set(sessionId, snapshot)
|
|
75
|
+
ctx.notify('git_status_changed', {
|
|
76
|
+
sessionId,
|
|
77
|
+
committedAhead: snapshot.committedAhead,
|
|
78
|
+
uncommittedFiles: snapshot.uncommittedFiles,
|
|
79
|
+
lastCommitAt: snapshot.lastCommitAt,
|
|
80
|
+
lastCommitMessage: snapshot.lastCommitMessage,
|
|
81
|
+
updatedAt: Date.now(),
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const runTick = () => {
|
|
86
|
+
tick().catch((err) => {
|
|
87
|
+
ctx.logger.warn('git-status tick failed', { sessionId, err: err instanceof Error ? err.message : String(err) })
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
runTick()
|
|
92
|
+
const interval = setInterval(runTick, POLL_INTERVAL_MS)
|
|
93
|
+
|
|
94
|
+
pluginCtx.intervals.set(sessionId, interval)
|
|
95
|
+
})
|
|
96
|
+
.sessionHook('onSessionClose', async (ctx) => {
|
|
97
|
+
const sessionId = ctx.sessionId
|
|
98
|
+
const pluginCtx = ctx.pluginContext
|
|
99
|
+
const interval = pluginCtx.intervals.get(sessionId)
|
|
100
|
+
if (interval) {
|
|
101
|
+
clearInterval(interval)
|
|
102
|
+
pluginCtx.intervals.delete(sessionId)
|
|
103
|
+
}
|
|
104
|
+
pluginCtx.lastSnapshots.delete(sessionId)
|
|
105
|
+
pluginCtx.defaultBranches.delete(sessionId)
|
|
106
|
+
})
|
|
107
|
+
.build()
|
|
108
|
+
|
|
109
|
+
function snapshotsEqual(a: GitStatusSnapshot, b: GitStatusSnapshot): boolean {
|
|
110
|
+
return a.committedAhead === b.committedAhead
|
|
111
|
+
&& a.uncommittedFiles === b.uncommittedFiles
|
|
112
|
+
&& a.lastCommitAt === b.lastCommitAt
|
|
113
|
+
&& a.lastCommitMessage === b.lastCommitMessage
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function computeGitStatus(process: ProcessRunner, workdir: string, baseBranch: string): Promise<GitStatusSnapshot | null> {
|
|
117
|
+
const countOutput = await runGit(process, workdir, ['rev-list', '--count', `${baseBranch}..HEAD`])
|
|
118
|
+
if (countOutput === null) return null
|
|
119
|
+
const committedAhead = Number.parseInt(countOutput.trim(), 10)
|
|
120
|
+
if (!Number.isFinite(committedAhead)) return null
|
|
121
|
+
|
|
122
|
+
const statusOutput = await runGit(process, workdir, ['status', '--porcelain'])
|
|
123
|
+
if (statusOutput === null) return null
|
|
124
|
+
const uncommittedFiles = countNonEmptyLines(statusOutput)
|
|
125
|
+
|
|
126
|
+
const logOutput = await runGit(process, workdir, ['log', '-1', '--format=%ct|%s', 'HEAD'])
|
|
127
|
+
if (logOutput === null) return null
|
|
128
|
+
|
|
129
|
+
let lastCommitAt: number | null = null
|
|
130
|
+
let lastCommitMessage: string | null = null
|
|
131
|
+
const trimmed = logOutput.trim()
|
|
132
|
+
if (trimmed.length > 0) {
|
|
133
|
+
const [tsRaw, ...rest] = trimmed.split('|')
|
|
134
|
+
const ts = Number.parseInt(tsRaw ?? '', 10)
|
|
135
|
+
if (Number.isFinite(ts)) lastCommitAt = ts * 1000
|
|
136
|
+
lastCommitMessage = rest.join('|').trim() || null
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return { committedAhead, uncommittedFiles, lastCommitAt, lastCommitMessage }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function detectDefaultBranch(process: ProcessRunner, workdir: string): Promise<string | null> {
|
|
143
|
+
const output = await runGit(process, workdir, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'])
|
|
144
|
+
if (output === null) return null
|
|
145
|
+
const trimmed = output.trim()
|
|
146
|
+
if (!trimmed.startsWith('origin/')) return null
|
|
147
|
+
const branch = trimmed.slice('origin/'.length)
|
|
148
|
+
return branch.length > 0 ? branch : null
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function runGit(process: ProcessRunner, workdir: string, args: string[]): Promise<string | null> {
|
|
152
|
+
try {
|
|
153
|
+
const { stdout } = await process.execFile('git', args, { cwd: workdir, timeout: GIT_TIMEOUT_MS, maxBuffer: 1024 * 1024 })
|
|
154
|
+
return stdout
|
|
155
|
+
} catch {
|
|
156
|
+
return null
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function countNonEmptyLines(output: string): number {
|
|
161
|
+
let count = 0
|
|
162
|
+
for (const line of output.split('\n')) {
|
|
163
|
+
if (line.length > 0) count += 1
|
|
164
|
+
}
|
|
165
|
+
return count
|
|
166
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Agent Limits
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Anti-looping limits for agents.
|
|
7
|
+
* All fields are optional - defaults applied via resolveAgentLimits().
|
|
8
|
+
*/
|
|
9
|
+
export interface AgentLimits {
|
|
10
|
+
/** Maximum number of inference turns. Default: 100 */
|
|
11
|
+
maxTurns?: number
|
|
12
|
+
/** Maximum total tool calls. Default: 200 */
|
|
13
|
+
maxToolCalls?: number
|
|
14
|
+
/** Maximum consecutive failures for the same tool before blocking. Default: 3 */
|
|
15
|
+
maxConsecutiveToolFailures?: number
|
|
16
|
+
/** Maximum child agents this agent can spawn. Default: 10 */
|
|
17
|
+
maxSpawnedAgents?: number
|
|
18
|
+
/** Maximum messages sent to other agents. Default: 100 */
|
|
19
|
+
maxMessagesSent?: number
|
|
20
|
+
/** Ratio of hard limit at which soft warning is emitted. Default: 0.8 */
|
|
21
|
+
softLimitRatio?: number
|
|
22
|
+
/** Maximum consecutive identical tool calls (same name+input hash). Default: 3 */
|
|
23
|
+
maxRepeatedToolCalls?: number
|
|
24
|
+
/** Maximum consecutive identical text-only responses. Default: 3 */
|
|
25
|
+
maxRepeatedResponses?: number
|
|
26
|
+
}
|