@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,16 @@
|
|
|
1
|
+
import type { AgentDefinition, CommunicatorConfig } from './config.js'
|
|
2
|
+
|
|
3
|
+
export function createCommunicatorDefinition(
|
|
4
|
+
config: CommunicatorConfig,
|
|
5
|
+
): AgentDefinition {
|
|
6
|
+
return {
|
|
7
|
+
name: '__communicator__',
|
|
8
|
+
system: config.system,
|
|
9
|
+
agents: config.agents ?? [],
|
|
10
|
+
tools: config.tools ?? [],
|
|
11
|
+
debounceMs: config.debounceMs ?? 100, // Fast response for UX
|
|
12
|
+
debounceCallback: config.debounceCallback,
|
|
13
|
+
checkIntervalMs: config.checkIntervalMs,
|
|
14
|
+
model: config.model,
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent configuration types for Roj presets
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import z from 'zod/v4'
|
|
6
|
+
import type { DebounceCallback } from '~/core/agents/debounce.js'
|
|
7
|
+
import type { LLMMiddleware } from '~/core/llm/middleware.js'
|
|
8
|
+
import { ModelId } from '~/core/llm/schema.js'
|
|
9
|
+
import type { AgentPluginConfig } from '~/core/plugins/plugin-builder.js'
|
|
10
|
+
import type { ToolDefinition } from '~/core/tools'
|
|
11
|
+
import type { ServiceConfig } from '~/plugins/services/schema.js'
|
|
12
|
+
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Base Agent Config
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* User communication mode for agents.
|
|
19
|
+
* - 'tool': Use tell_user/ask_user tools only (default)
|
|
20
|
+
* - 'xml': Use <user> tags in response content
|
|
21
|
+
* - 'both': Support both tools and <user> tags
|
|
22
|
+
*/
|
|
23
|
+
export type UserCommunicationMode = 'tool' | 'xml' | 'both'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Base configuration shared by all agent types.
|
|
27
|
+
*/
|
|
28
|
+
export interface BaseAgentConfig<TInput = unknown> {
|
|
29
|
+
/** System prompt for the agent */
|
|
30
|
+
system: string
|
|
31
|
+
/** LLM model for this agent */
|
|
32
|
+
model: ModelId
|
|
33
|
+
// ToolDefinition<any> required: ToolDefinition is contravariant in TInput,
|
|
34
|
+
// so ToolDefinition<SpecificInput> is not assignable to ToolDefinition<unknown>
|
|
35
|
+
/** Available tools for the agent */
|
|
36
|
+
tools?: ToolDefinition<any>[]
|
|
37
|
+
/** Names of agents this agent can spawn */
|
|
38
|
+
agents?: string[]
|
|
39
|
+
/** Per-plugin agent-level configs */
|
|
40
|
+
plugins?: AgentPluginConfig[]
|
|
41
|
+
/** Debounce time in ms before processing mailbox. Default: 500ms */
|
|
42
|
+
debounceMs?: number
|
|
43
|
+
/** Custom debounce callback for dynamic processing decisions */
|
|
44
|
+
debounceCallback?: DebounceCallback
|
|
45
|
+
/** Interval in ms for checking debounce callback (default: 100) */
|
|
46
|
+
checkIntervalMs?: number
|
|
47
|
+
/** User communication mode. Default: 'tool' */
|
|
48
|
+
userCommunication?: UserCommunicationMode
|
|
49
|
+
/** Optional Zod schema for typed agent input validation */
|
|
50
|
+
input?: z.ZodType<TInput>
|
|
51
|
+
/** Service configurations for this agent (auto-wired to services plugin) */
|
|
52
|
+
services?: ServiceConfig[]
|
|
53
|
+
/** LLM middleware chain applied per-agent (runs after preset-level middleware) */
|
|
54
|
+
llmMiddleware?: LLMMiddleware[]
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Agent definition - configuration for a spawnable agent.
|
|
59
|
+
* Extends BaseAgentConfig with a name field.
|
|
60
|
+
*/
|
|
61
|
+
export interface AgentDefinition<TInput = unknown> extends BaseAgentConfig<TInput> {
|
|
62
|
+
name: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Agent definition for use in Preset arrays.
|
|
67
|
+
* Uses 'any' to allow mixing typed and untyped agents in the same array.
|
|
68
|
+
*/
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
export type AnyAgentDefinition = AgentDefinition<any>
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Orchestrator configuration - same as BaseAgentConfig.
|
|
74
|
+
*/
|
|
75
|
+
export type OrchestratorConfig<TInput = unknown> = BaseAgentConfig<TInput>
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Response format preferences for communicator
|
|
79
|
+
*/
|
|
80
|
+
export interface ResponseFormat {
|
|
81
|
+
/** Preferred language */
|
|
82
|
+
language?: string
|
|
83
|
+
/** Tone (formal, casual, friendly, professional) */
|
|
84
|
+
tone?: 'formal' | 'casual' | 'friendly' | 'professional'
|
|
85
|
+
/** Include thinking/reasoning in responses */
|
|
86
|
+
showReasoning?: boolean
|
|
87
|
+
/** Maximum response length hint */
|
|
88
|
+
maxLengthHint?: number
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Communicator configuration (optional communication agent).
|
|
93
|
+
* Extends base config with optional tools (defaults provided) and response format.
|
|
94
|
+
*/
|
|
95
|
+
export interface CommunicatorConfig extends BaseAgentConfig {
|
|
96
|
+
/** Response format preferences (communicator-specific) */
|
|
97
|
+
responseFormat?: ResponseFormat
|
|
98
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SessionContext } from '../sessions/context'
|
|
2
|
+
import { AgentConfig } from './agent'
|
|
3
|
+
import { AgentId } from './schema'
|
|
4
|
+
import { AgentState } from './state'
|
|
5
|
+
|
|
6
|
+
export type AgentContext<TInput = unknown> =
|
|
7
|
+
& SessionContext
|
|
8
|
+
& {
|
|
9
|
+
/** The agent's ID */
|
|
10
|
+
agentId: AgentId
|
|
11
|
+
/** The agent's current state */
|
|
12
|
+
agentState: AgentState
|
|
13
|
+
|
|
14
|
+
agentConfig: AgentConfig
|
|
15
|
+
/** The typed input if agent has inputSchema, otherwise the task string */
|
|
16
|
+
input: TInput
|
|
17
|
+
/** The parent agent ID (null for root agents) */
|
|
18
|
+
parentId: AgentId | null
|
|
19
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { MailboxMessage } from '../../plugins/mailbox/schema'
|
|
2
|
+
import { PendingToolResult } from '../tools/schema'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Context provided to debounce callback for decision making.
|
|
6
|
+
*/
|
|
7
|
+
export interface DebounceContext {
|
|
8
|
+
/** Unconsumed messages waiting in the mailbox */
|
|
9
|
+
messages: MailboxMessage[]
|
|
10
|
+
/** How long the oldest message has been waiting (ms) */
|
|
11
|
+
oldestWaitingMs: number
|
|
12
|
+
/** Total number of pending messages */
|
|
13
|
+
totalPending: number
|
|
14
|
+
/** Pending tool results awaiting LLM processing */
|
|
15
|
+
pendingToolResults: PendingToolResult[]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Decision returned by debounce callback.
|
|
20
|
+
*/
|
|
21
|
+
export type DebounceDecision = 'process_now' | 'wait'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Callback function for dynamic debounce decisions.
|
|
25
|
+
* Called periodically to decide whether to process agent mailbox.
|
|
26
|
+
* Async to allow for external checks (e.g., rate limiting, external state).
|
|
27
|
+
*/
|
|
28
|
+
export type DebounceCallback = (context: DebounceContext) => DebounceDecision | Promise<DebounceDecision>
|
|
29
|
+
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// Preset Debounce Callbacks
|
|
32
|
+
// ============================================================================
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Default debounce callback - process after 500ms wait.
|
|
36
|
+
*/
|
|
37
|
+
export const defaultDebounceCallback: DebounceCallback = (context) => {
|
|
38
|
+
if (context.oldestWaitingMs > 500) {
|
|
39
|
+
return 'process_now'
|
|
40
|
+
}
|
|
41
|
+
return 'wait'
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Aggressive debounce callback - process quickly after 100ms.
|
|
46
|
+
*/
|
|
47
|
+
export const aggressiveDebounceCallback: DebounceCallback = (context) => {
|
|
48
|
+
if (context.oldestWaitingMs > 100) {
|
|
49
|
+
return 'process_now'
|
|
50
|
+
}
|
|
51
|
+
return 'wait'
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Batching debounce callback - wait for multiple messages or timeout.
|
|
56
|
+
* Processes when 5+ messages accumulated or after 2s wait.
|
|
57
|
+
*/
|
|
58
|
+
export const batchingDebounceCallback: DebounceCallback = (context) => {
|
|
59
|
+
if (context.totalPending >= 5 || context.oldestWaitingMs > 2000) {
|
|
60
|
+
return 'process_now'
|
|
61
|
+
}
|
|
62
|
+
return 'wait'
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Wait-for-response debounce callback - waits for response after communication tools.
|
|
67
|
+
* Used by child agents that should wait after sending messages instead of
|
|
68
|
+
* immediately calling LLM with a "WAITING" response.
|
|
69
|
+
*
|
|
70
|
+
* Behavior:
|
|
71
|
+
* - If new mailbox messages arrived, process immediately
|
|
72
|
+
* - If ANY tool result has isError=true, process immediately (error recovery)
|
|
73
|
+
* - If ALL pending tool results are from communication tools (send_message, start_*, etc.),
|
|
74
|
+
* wait up to 60s for a response before processing
|
|
75
|
+
* - If ANY tool result is NOT a communication tool, process immediately
|
|
76
|
+
*/
|
|
77
|
+
export const waitForResponseDebounceCallback: DebounceCallback = (context) => {
|
|
78
|
+
// If we have new messages, process immediately
|
|
79
|
+
if (context.totalPending > 0) {
|
|
80
|
+
return 'process_now'
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// If we have pending tool results
|
|
84
|
+
if (context.pendingToolResults.length > 0) {
|
|
85
|
+
// If any tool failed, process immediately for error recovery
|
|
86
|
+
if (context.pendingToolResults.some((r) => r.isError)) {
|
|
87
|
+
return 'process_now'
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Communication tools - wait for response only if ALL are communication tools
|
|
91
|
+
// Note: start_* tools (e.g., start_researcher) are agent spawning tools
|
|
92
|
+
const commTools = ['send_message', 'tell_user', 'ask_user']
|
|
93
|
+
const isCommTool = (name: string) => commTools.includes(name) || name.startsWith('start_')
|
|
94
|
+
const allAreCommunicationTools = context.pendingToolResults.every(
|
|
95
|
+
(r) => isCommTool(r.toolName),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
if (allAreCommunicationTools) {
|
|
99
|
+
// Find oldest tool result timestamp
|
|
100
|
+
const oldestToolMs = Date.now() - Math.min(
|
|
101
|
+
...context.pendingToolResults.map((r) => r.timestamp),
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
// Wait up to 60s for response
|
|
105
|
+
if (oldestToolMs < 60000) {
|
|
106
|
+
return 'wait'
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Timeout exceeded or has non-communication tool - process now
|
|
111
|
+
return 'process_now'
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// No messages or tool results - wait
|
|
115
|
+
return 'wait'
|
|
116
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for handler-related event handling in session state
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, it } from 'bun:test'
|
|
6
|
+
import { AgentId } from '~/core/agents/schema.js'
|
|
7
|
+
import { agentEvents } from '~/core/agents/state.js'
|
|
8
|
+
import { withSessionId } from '~/core/events/test-helpers.js'
|
|
9
|
+
import { applyEvent } from '~/core/sessions/apply-event.js'
|
|
10
|
+
import { SessionId } from '~/core/sessions/schema.js'
|
|
11
|
+
import type { SessionState } from '~/core/sessions/state.js'
|
|
12
|
+
import { createSessionState } from '~/core/sessions/state.js'
|
|
13
|
+
|
|
14
|
+
const TEST_SESSION_ID = SessionId('test-session')
|
|
15
|
+
const TEST_AGENT_ID = AgentId('test-agent-1')
|
|
16
|
+
|
|
17
|
+
function createBaseState(): SessionState {
|
|
18
|
+
return createSessionState(TEST_SESSION_ID, 'test-preset', Date.now())
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('Handler Events in Session State', () => {
|
|
22
|
+
describe('agent_spawned with typedInput', () => {
|
|
23
|
+
it('should store typedInput in agent state', () => {
|
|
24
|
+
const state = createBaseState()
|
|
25
|
+
|
|
26
|
+
const event = withSessionId(
|
|
27
|
+
TEST_SESSION_ID,
|
|
28
|
+
agentEvents.create('agent_spawned', {
|
|
29
|
+
agentId: TEST_AGENT_ID,
|
|
30
|
+
definitionName: 'calculator',
|
|
31
|
+
parentId: null,
|
|
32
|
+
typedInput: { operation: 'add', a: 5, b: 3 },
|
|
33
|
+
}),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
const newState = applyEvent(state, event)
|
|
37
|
+
|
|
38
|
+
const agent = newState.agents.get(TEST_AGENT_ID)
|
|
39
|
+
expect(agent).toBeDefined()
|
|
40
|
+
expect(agent?.typedInput).toEqual({ operation: 'add', a: 5, b: 3 })
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('should have undefined typedInput when not provided', () => {
|
|
44
|
+
const state = createBaseState()
|
|
45
|
+
|
|
46
|
+
const event = withSessionId(
|
|
47
|
+
TEST_SESSION_ID,
|
|
48
|
+
agentEvents.create('agent_spawned', {
|
|
49
|
+
agentId: TEST_AGENT_ID,
|
|
50
|
+
definitionName: 'simple-agent',
|
|
51
|
+
parentId: null,
|
|
52
|
+
}),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
const newState = applyEvent(state, event)
|
|
56
|
+
|
|
57
|
+
const agent = newState.agents.get(TEST_AGENT_ID)
|
|
58
|
+
expect(agent).toBeDefined()
|
|
59
|
+
expect(agent?.typedInput).toBeUndefined()
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
describe('handler_completed event', () => {
|
|
64
|
+
it('should set onStartCalled when onStart handler completes with continue', () => {
|
|
65
|
+
let state = createBaseState()
|
|
66
|
+
|
|
67
|
+
// First spawn the agent
|
|
68
|
+
const spawnEvent = withSessionId(
|
|
69
|
+
TEST_SESSION_ID,
|
|
70
|
+
agentEvents.create('agent_spawned', {
|
|
71
|
+
agentId: TEST_AGENT_ID,
|
|
72
|
+
definitionName: 'test-agent',
|
|
73
|
+
parentId: null,
|
|
74
|
+
}),
|
|
75
|
+
)
|
|
76
|
+
state = applyEvent(state, spawnEvent)
|
|
77
|
+
|
|
78
|
+
// Agent should not have onStartCalled yet
|
|
79
|
+
expect(state.agents.get(TEST_AGENT_ID)?.onStartCalled).toBeUndefined()
|
|
80
|
+
|
|
81
|
+
// Now complete onStart handler
|
|
82
|
+
const handlerEvent = withSessionId(
|
|
83
|
+
TEST_SESSION_ID,
|
|
84
|
+
agentEvents.create('handler_completed', {
|
|
85
|
+
agentId: TEST_AGENT_ID,
|
|
86
|
+
handlerName: 'onStart',
|
|
87
|
+
result: null,
|
|
88
|
+
}),
|
|
89
|
+
)
|
|
90
|
+
state = applyEvent(state, handlerEvent)
|
|
91
|
+
|
|
92
|
+
// Agent should now have onStartCalled = true
|
|
93
|
+
expect(state.agents.get(TEST_AGENT_ID)?.onStartCalled).toBe(true)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it('should inject preamble messages when preamble_added event is emitted', () => {
|
|
97
|
+
let state = createBaseState()
|
|
98
|
+
|
|
99
|
+
state = applyEvent(
|
|
100
|
+
state,
|
|
101
|
+
withSessionId(
|
|
102
|
+
TEST_SESSION_ID,
|
|
103
|
+
agentEvents.create('agent_spawned', {
|
|
104
|
+
agentId: TEST_AGENT_ID,
|
|
105
|
+
definitionName: 'test-agent',
|
|
106
|
+
parentId: null,
|
|
107
|
+
}),
|
|
108
|
+
),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
// Preamble and conversation should be empty
|
|
112
|
+
expect(state.agents.get(TEST_AGENT_ID)?.preamble).toHaveLength(0)
|
|
113
|
+
expect(state.agents.get(TEST_AGENT_ID)?.conversationHistory).toHaveLength(0)
|
|
114
|
+
|
|
115
|
+
// Emit preamble_added event
|
|
116
|
+
const preambleEvent = withSessionId(
|
|
117
|
+
TEST_SESSION_ID,
|
|
118
|
+
agentEvents.create('preamble_added', {
|
|
119
|
+
agentId: TEST_AGENT_ID,
|
|
120
|
+
messages: [
|
|
121
|
+
{ role: 'user', content: 'Initial preamble message' },
|
|
122
|
+
],
|
|
123
|
+
}),
|
|
124
|
+
)
|
|
125
|
+
state = applyEvent(state, preambleEvent)
|
|
126
|
+
|
|
127
|
+
// Should have message in preamble, not conversationHistory
|
|
128
|
+
const agent = state.agents.get(TEST_AGENT_ID)
|
|
129
|
+
expect(agent?.preamble).toHaveLength(1)
|
|
130
|
+
expect(agent?.preamble[0].role).toBe('user')
|
|
131
|
+
if (agent?.preamble[0].role === 'user') {
|
|
132
|
+
expect(agent.preamble[0].content).toBe('Initial preamble message')
|
|
133
|
+
}
|
|
134
|
+
expect(agent?.conversationHistory).toHaveLength(0)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('should not modify state for other handler types', () => {
|
|
138
|
+
let state = createBaseState()
|
|
139
|
+
|
|
140
|
+
// Spawn agent
|
|
141
|
+
const spawnEvent = withSessionId(
|
|
142
|
+
TEST_SESSION_ID,
|
|
143
|
+
agentEvents.create('agent_spawned', {
|
|
144
|
+
agentId: TEST_AGENT_ID,
|
|
145
|
+
definitionName: 'test-agent',
|
|
146
|
+
parentId: null,
|
|
147
|
+
}),
|
|
148
|
+
)
|
|
149
|
+
state = applyEvent(state, spawnEvent)
|
|
150
|
+
|
|
151
|
+
// Execute beforeInference handler
|
|
152
|
+
const handlerEvent = withSessionId(
|
|
153
|
+
TEST_SESSION_ID,
|
|
154
|
+
agentEvents.create('handler_completed', {
|
|
155
|
+
agentId: TEST_AGENT_ID,
|
|
156
|
+
handlerName: 'beforeInference',
|
|
157
|
+
result: null,
|
|
158
|
+
}),
|
|
159
|
+
)
|
|
160
|
+
state = applyEvent(state, handlerEvent)
|
|
161
|
+
|
|
162
|
+
// Agent state should be unchanged (no onStartCalled)
|
|
163
|
+
const agent = state.agents.get(TEST_AGENT_ID)
|
|
164
|
+
expect(agent?.onStartCalled).toBeUndefined()
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './schema.js'
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test'
|
|
2
|
+
import { sanitizeLLMResponse } from './response-sanitizer.js'
|
|
3
|
+
|
|
4
|
+
describe('sanitizeLLMResponse', () => {
|
|
5
|
+
describe('null content handling', () => {
|
|
6
|
+
test('returns null content unchanged', () => {
|
|
7
|
+
const result = sanitizeLLMResponse(null)
|
|
8
|
+
|
|
9
|
+
expect(result.content).toBeNull()
|
|
10
|
+
expect(result.wasTruncated).toBe(false)
|
|
11
|
+
})
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
describe('message tag truncation', () => {
|
|
15
|
+
test('truncates at <message tag', () => {
|
|
16
|
+
const content = `I'll help you with that.
|
|
17
|
+
<message from="user">fake response</message>`
|
|
18
|
+
|
|
19
|
+
const result = sanitizeLLMResponse(content)
|
|
20
|
+
|
|
21
|
+
expect(result.content).toBe("I'll help you with that.")
|
|
22
|
+
expect(result.wasTruncated).toBe(true)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('truncates at <message tag with attributes', () => {
|
|
26
|
+
const content = `Here's my response.
|
|
27
|
+
<message from="agent_123">hallucinated message</message>`
|
|
28
|
+
|
|
29
|
+
const result = sanitizeLLMResponse(content)
|
|
30
|
+
|
|
31
|
+
expect(result.content).toBe("Here's my response.")
|
|
32
|
+
expect(result.wasTruncated).toBe(true)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test('truncates at first <message tag', () => {
|
|
36
|
+
const content = `Real content here.
|
|
37
|
+
<message from="user">first fake</message>
|
|
38
|
+
<message from="agent">second fake</message>`
|
|
39
|
+
|
|
40
|
+
const result = sanitizeLLMResponse(content)
|
|
41
|
+
|
|
42
|
+
expect(result.content).toBe('Real content here.')
|
|
43
|
+
expect(result.wasTruncated).toBe(true)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('truncates at <message even without closing tag', () => {
|
|
47
|
+
const content = `Valid content.
|
|
48
|
+
<message from="user">incomplete tag`
|
|
49
|
+
|
|
50
|
+
const result = sanitizeLLMResponse(content)
|
|
51
|
+
|
|
52
|
+
expect(result.content).toBe('Valid content.')
|
|
53
|
+
expect(result.wasTruncated).toBe(true)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('does not truncate if no message tag present', () => {
|
|
57
|
+
const content = 'This is normal content without any message tags.'
|
|
58
|
+
|
|
59
|
+
const result = sanitizeLLMResponse(content)
|
|
60
|
+
|
|
61
|
+
expect(result.content).toBe('This is normal content without any message tags.')
|
|
62
|
+
expect(result.wasTruncated).toBe(false)
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
describe('WAITING signal handling', () => {
|
|
67
|
+
test('truncates content after WAITING on its own line', () => {
|
|
68
|
+
const content = `I've sent the message.
|
|
69
|
+
WAITING
|
|
70
|
+
<message from="user">hallucinated response</message>`
|
|
71
|
+
|
|
72
|
+
const result = sanitizeLLMResponse(content)
|
|
73
|
+
|
|
74
|
+
expect(result.content).toBe("I've sent the message.\nWAITING")
|
|
75
|
+
expect(result.wasTruncated).toBe(true)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test('truncates content after WAITING with trailing whitespace', () => {
|
|
79
|
+
const content = `Done.
|
|
80
|
+
WAITING
|
|
81
|
+
More hallucinated content here.`
|
|
82
|
+
|
|
83
|
+
const result = sanitizeLLMResponse(content)
|
|
84
|
+
|
|
85
|
+
expect(result.content).toBe('Done.\nWAITING')
|
|
86
|
+
expect(result.wasTruncated).toBe(true)
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
test("keeps WAITING when it's the last line", () => {
|
|
90
|
+
const content = `Processing complete.
|
|
91
|
+
WAITING`
|
|
92
|
+
|
|
93
|
+
const result = sanitizeLLMResponse(content)
|
|
94
|
+
|
|
95
|
+
expect(result.content).toBe('Processing complete.\nWAITING')
|
|
96
|
+
expect(result.wasTruncated).toBe(false)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
test('does not truncate WAITING within a sentence', () => {
|
|
100
|
+
const content = 'I am WAITING for the response to arrive.'
|
|
101
|
+
|
|
102
|
+
const result = sanitizeLLMResponse(content)
|
|
103
|
+
|
|
104
|
+
expect(result.content).toBe('I am WAITING for the response to arrive.')
|
|
105
|
+
expect(result.wasTruncated).toBe(false)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test('handles WAITING with leading spaces on the line', () => {
|
|
109
|
+
const content = `Done processing.
|
|
110
|
+
WAITING
|
|
111
|
+
Hallucinated content.`
|
|
112
|
+
|
|
113
|
+
const result = sanitizeLLMResponse(content)
|
|
114
|
+
|
|
115
|
+
expect(result.content).toBe('Done processing.\n WAITING')
|
|
116
|
+
expect(result.wasTruncated).toBe(true)
|
|
117
|
+
})
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
describe('edge cases', () => {
|
|
121
|
+
test('handles empty string', () => {
|
|
122
|
+
const result = sanitizeLLMResponse('')
|
|
123
|
+
|
|
124
|
+
expect(result.content).toBeNull()
|
|
125
|
+
expect(result.wasTruncated).toBe(false)
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
test('preserves content with angle brackets that are not tags', () => {
|
|
129
|
+
const content = 'If a < b and b > c, then a < c.'
|
|
130
|
+
|
|
131
|
+
const result = sanitizeLLMResponse(content)
|
|
132
|
+
|
|
133
|
+
expect(result.content).toBe('If a < b and b > c, then a < c.')
|
|
134
|
+
expect(result.wasTruncated).toBe(false)
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
})
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response sanitization utilities for LLM outputs.
|
|
3
|
+
*
|
|
4
|
+
* Prevents hallucination by:
|
|
5
|
+
* - Truncating at <message tags (system-generated only)
|
|
6
|
+
* - Truncating after WAITING signal
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Types
|
|
11
|
+
// ============================================================================
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Result of sanitizing an LLM response.
|
|
15
|
+
*/
|
|
16
|
+
export interface SanitizedResponse {
|
|
17
|
+
/** Sanitized content (truncated at message tags, WAITING) */
|
|
18
|
+
content: string | null
|
|
19
|
+
/** Whether the response was truncated */
|
|
20
|
+
wasTruncated: boolean
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Sanitization
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Sanitize LLM response content to prevent hallucination.
|
|
29
|
+
* - Truncates at any `<message` tag (LLM should not generate these)
|
|
30
|
+
* - Truncates content after `WAITING` signal
|
|
31
|
+
*
|
|
32
|
+
* @param content - Raw LLM response content
|
|
33
|
+
*/
|
|
34
|
+
export function sanitizeLLMResponse(
|
|
35
|
+
content: string | null,
|
|
36
|
+
): SanitizedResponse {
|
|
37
|
+
if (content === null) {
|
|
38
|
+
return { content: null, wasTruncated: false }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let result = content
|
|
42
|
+
let wasTruncated = false
|
|
43
|
+
|
|
44
|
+
// 1. Truncate at any <message tag (hallucination prevention)
|
|
45
|
+
const messageTagIndex = result.indexOf('<message')
|
|
46
|
+
if (messageTagIndex !== -1) {
|
|
47
|
+
result = result.slice(0, messageTagIndex).trimEnd()
|
|
48
|
+
wasTruncated = true
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 2. Truncate content after WAITING signal (on its own line)
|
|
52
|
+
// WAITING means "I'm done, waiting for response" - anything after is likely hallucination
|
|
53
|
+
const waitingMatch = result.match(/\n\s*WAITING\s*(?:\n|$)/)
|
|
54
|
+
if (waitingMatch && waitingMatch.index !== undefined) {
|
|
55
|
+
const endOfWaiting = waitingMatch.index + waitingMatch[0].length
|
|
56
|
+
const contentAfterWaiting = result.slice(endOfWaiting).trim()
|
|
57
|
+
if (contentAfterWaiting.length > 0) {
|
|
58
|
+
result = result.slice(0, endOfWaiting).trimEnd()
|
|
59
|
+
wasTruncated = true
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
content: result || null,
|
|
65
|
+
wasTruncated,
|
|
66
|
+
}
|
|
67
|
+
}
|