@roj-ai/sdk 0.1.3 → 0.1.4
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.js +191 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/builtin-events.js +8 -0
- package/dist/builtin-events.js.map +1 -0
- package/dist/bun-platform/fs.js +39 -0
- package/dist/bun-platform/fs.js.map +1 -0
- package/dist/bun-platform/index.js +18 -0
- package/dist/bun-platform/index.js.map +1 -0
- package/dist/bun-platform/process.js +21 -0
- package/dist/bun-platform/process.js.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.js +155 -0
- package/dist/config.test.js.map +1 -0
- package/dist/core/agent-loop.integration.test.js +414 -0
- package/dist/core/agent-loop.integration.test.js.map +1 -0
- package/dist/core/agents/agent-config.test.js +194 -0
- package/dist/core/agents/agent-config.test.js.map +1 -0
- package/dist/core/agents/agent-roles.js +25 -0
- package/dist/core/agents/agent-roles.js.map +1 -0
- package/dist/core/agents/agent-shutdown.test.js +180 -0
- package/dist/core/agents/agent-shutdown.test.js.map +1 -0
- package/dist/core/agents/agent.js +1205 -0
- package/dist/core/agents/agent.js.map +1 -0
- package/dist/core/agents/agent.test.js +313 -0
- package/dist/core/agents/agent.test.js.map +1 -0
- package/dist/core/agents/communicator.js +13 -0
- package/dist/core/agents/communicator.js.map +1 -0
- package/dist/core/agents/config.js +5 -0
- package/dist/core/agents/config.js.map +1 -0
- package/dist/core/agents/context.js +2 -0
- package/dist/core/agents/context.js.map +1 -0
- package/dist/core/agents/debounce.js +74 -0
- package/dist/core/agents/debounce.js.map +1 -0
- package/dist/core/agents/handler-events.test.js +115 -0
- package/dist/core/agents/handler-events.test.js.map +1 -0
- package/dist/core/agents/index.js +2 -0
- package/dist/core/agents/index.js.map +1 -0
- package/dist/core/agents/response-sanitizer.js +46 -0
- package/dist/core/agents/response-sanitizer.js.map +1 -0
- package/dist/core/agents/response-sanitizer.test.js +101 -0
- package/dist/core/agents/response-sanitizer.test.js.map +1 -0
- package/dist/core/agents/retry.js +105 -0
- package/dist/core/agents/retry.js.map +1 -0
- package/dist/core/agents/schema.js +39 -0
- package/dist/core/agents/schema.js.map +1 -0
- package/dist/core/agents/state.js +90 -0
- package/dist/core/agents/state.js.map +1 -0
- package/dist/core/context/state.js +23 -0
- package/dist/core/context/state.js.map +1 -0
- package/dist/core/errors.js +38 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/event-sourcing.integration.test.js +154 -0
- package/dist/core/event-sourcing.integration.test.js.map +1 -0
- package/dist/core/events/base-event-store.js +201 -0
- package/dist/core/events/base-event-store.js.map +1 -0
- package/dist/core/events/event-store.js +26 -0
- package/dist/core/events/event-store.js.map +1 -0
- package/dist/core/events/file.js +320 -0
- package/dist/core/events/file.js.map +1 -0
- package/dist/core/events/file.test.js +284 -0
- package/dist/core/events/file.test.js.map +1 -0
- package/dist/core/events/index.js +3 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/events/memory.js +101 -0
- package/dist/core/events/memory.js.map +1 -0
- package/dist/core/events/memory.test.js +502 -0
- package/dist/core/events/memory.test.js.map +1 -0
- package/dist/core/events/metadata-utils.js +107 -0
- package/dist/core/events/metadata-utils.js.map +1 -0
- package/dist/core/events/test-helpers.js +15 -0
- package/dist/core/events/test-helpers.js.map +1 -0
- package/dist/core/events/types.js +21 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/file-store/file-store.js +250 -0
- package/dist/core/file-store/file-store.js.map +1 -0
- package/dist/core/file-store/types.js +7 -0
- package/dist/core/file-store/types.js.map +1 -0
- package/dist/core/image/image-processor.js +106 -0
- package/dist/core/image/image-processor.js.map +1 -0
- package/dist/core/image/image-processor.test.js +171 -0
- package/dist/core/image/image-processor.test.js.map +1 -0
- package/dist/core/image/index.js +4 -0
- package/dist/core/image/index.js.map +1 -0
- package/dist/core/image/noop-resizer.js +6 -0
- package/dist/core/image/noop-resizer.js.map +1 -0
- package/dist/core/image/types.js +2 -0
- package/dist/core/image/types.js.map +1 -0
- package/dist/core/image/vips-resizer.js +100 -0
- package/dist/core/image/vips-resizer.js.map +1 -0
- package/dist/core/image/vips-resizer.test.js +324 -0
- package/dist/core/image/vips-resizer.test.js.map +1 -0
- package/dist/core/llm/anthropic.js +396 -0
- package/dist/core/llm/anthropic.js.map +1 -0
- package/dist/core/llm/anthropic.test.js +434 -0
- package/dist/core/llm/anthropic.test.js.map +1 -0
- package/dist/core/llm/cache-breakpoints.js +37 -0
- package/dist/core/llm/cache-breakpoints.js.map +1 -0
- package/dist/core/llm/cache-live.test.js +137 -0
- package/dist/core/llm/cache-live.test.js.map +1 -0
- package/dist/core/llm/index.js +9 -0
- package/dist/core/llm/index.js.map +1 -0
- package/dist/core/llm/llm-log-types.js +12 -0
- package/dist/core/llm/llm-log-types.js.map +1 -0
- package/dist/core/llm/logger.js +241 -0
- package/dist/core/llm/logger.js.map +1 -0
- package/dist/core/llm/logger.test.js +228 -0
- package/dist/core/llm/logger.test.js.map +1 -0
- package/dist/core/llm/logging-provider.js +49 -0
- package/dist/core/llm/logging-provider.js.map +1 -0
- package/dist/core/llm/middleware.js +114 -0
- package/dist/core/llm/middleware.js.map +1 -0
- package/dist/core/llm/mock.js +186 -0
- package/dist/core/llm/mock.js.map +1 -0
- package/dist/core/llm/mock.test.js +318 -0
- package/dist/core/llm/mock.test.js.map +1 -0
- package/dist/core/llm/openrouter-mapping.test.js +125 -0
- package/dist/core/llm/openrouter-mapping.test.js.map +1 -0
- package/dist/core/llm/openrouter.js +298 -0
- package/dist/core/llm/openrouter.js.map +1 -0
- package/dist/core/llm/openrouter.test.js +377 -0
- package/dist/core/llm/openrouter.test.js.map +1 -0
- package/dist/core/llm/provider-integration.test.js +350 -0
- package/dist/core/llm/provider-integration.test.js.map +1 -0
- package/dist/core/llm/provider.js +18 -0
- package/dist/core/llm/provider.js.map +1 -0
- package/dist/core/llm/routing-provider.js +52 -0
- package/dist/core/llm/routing-provider.js.map +1 -0
- package/dist/core/llm/routing-provider.test.js +94 -0
- package/dist/core/llm/routing-provider.test.js.map +1 -0
- package/dist/core/llm/schema.js +31 -0
- package/dist/core/llm/schema.js.map +1 -0
- package/dist/core/llm/snapshot-fetch.js +122 -0
- package/dist/core/llm/snapshot-fetch.js.map +1 -0
- package/dist/core/llm/snapshot-middleware.js +142 -0
- package/dist/core/llm/snapshot-middleware.js.map +1 -0
- package/dist/core/llm/snapshot-middleware.test.js +144 -0
- package/dist/core/llm/snapshot-middleware.test.js.map +1 -0
- package/dist/core/llm/state.js +48 -0
- package/dist/core/llm/state.js.map +1 -0
- package/dist/core/llm/tokens.js +40 -0
- package/dist/core/llm/tokens.js.map +1 -0
- package/dist/core/multi-agent.integration.test.js +298 -0
- package/dist/core/multi-agent.integration.test.js.map +1 -0
- package/dist/core/plugin-hooks.integration.test.js +344 -0
- package/dist/core/plugin-hooks.integration.test.js.map +1 -0
- package/dist/core/plugins/hook-types.js +5 -0
- package/dist/core/plugins/hook-types.js.map +1 -0
- package/dist/core/plugins/index.js +5 -0
- package/dist/core/plugins/index.js.map +1 -0
- package/dist/core/plugins/plugin-builder.js +321 -0
- package/dist/core/plugins/plugin-builder.js.map +1 -0
- package/dist/core/preset/config.js +54 -0
- package/dist/core/preset/config.js.map +1 -0
- package/dist/core/preset/index.js +6 -0
- package/dist/core/preset/index.js.map +1 -0
- package/dist/core/preset/preset-builder.js +63 -0
- package/dist/core/preset/preset-builder.js.map +1 -0
- package/dist/core/session-lifecycle.integration.test.js +159 -0
- package/dist/core/session-lifecycle.integration.test.js.map +1 -0
- package/dist/core/sessions/apply-event.js +41 -0
- package/dist/core/sessions/apply-event.js.map +1 -0
- package/dist/core/sessions/context.js +2 -0
- package/dist/core/sessions/context.js.map +1 -0
- package/dist/core/sessions/fork-utils.js +42 -0
- package/dist/core/sessions/fork-utils.js.map +1 -0
- package/dist/core/sessions/fork-utils.test.js +129 -0
- package/dist/core/sessions/fork-utils.test.js.map +1 -0
- package/dist/core/sessions/reducer.js +55 -0
- package/dist/core/sessions/reducer.js.map +1 -0
- package/dist/core/sessions/schema.js +66 -0
- package/dist/core/sessions/schema.js.map +1 -0
- package/dist/core/sessions/session-environment.js +2 -0
- package/dist/core/sessions/session-environment.js.map +1 -0
- package/dist/core/sessions/session-manager.js +650 -0
- package/dist/core/sessions/session-manager.js.map +1 -0
- package/dist/core/sessions/session-store.js +118 -0
- package/dist/core/sessions/session-store.js.map +1 -0
- package/dist/core/sessions/session.js +675 -0
- package/dist/core/sessions/session.js.map +1 -0
- package/dist/core/sessions/session.test.js +1095 -0
- package/dist/core/sessions/session.test.js.map +1 -0
- package/dist/core/sessions/state.js +377 -0
- package/dist/core/sessions/state.js.map +1 -0
- package/dist/core/system.js +66 -0
- package/dist/core/system.js.map +1 -0
- package/dist/core/tools/context.js +2 -0
- package/dist/core/tools/context.js.map +1 -0
- package/dist/core/tools/definition.js +4 -0
- package/dist/core/tools/definition.js.map +1 -0
- package/dist/core/tools/executor.js +82 -0
- package/dist/core/tools/executor.js.map +1 -0
- package/dist/core/tools/executor.test.js +143 -0
- package/dist/core/tools/executor.test.js.map +1 -0
- package/dist/core/tools/index.js +4 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/schema.js +20 -0
- package/dist/core/tools/schema.js.map +1 -0
- package/dist/core/tools/state.js +29 -0
- package/dist/core/tools/state.js.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/json/index.js +5 -0
- package/dist/lib/json/index.js.map +1 -0
- package/dist/lib/logger/console.js +147 -0
- package/dist/lib/logger/console.js.map +1 -0
- package/dist/lib/logger/console.test.js +258 -0
- package/dist/lib/logger/console.test.js.map +1 -0
- package/dist/lib/logger/file.js +54 -0
- package/dist/lib/logger/file.js.map +1 -0
- package/dist/lib/logger/index.js +4 -0
- package/dist/lib/logger/index.js.map +1 -0
- package/dist/lib/logger/logger.js +28 -0
- package/dist/lib/logger/logger.js.map +1 -0
- package/dist/lib/logger/ring-buffer.js +61 -0
- package/dist/lib/logger/ring-buffer.js.map +1 -0
- package/dist/lib/logger/tee.js +43 -0
- package/dist/lib/logger/tee.js.map +1 -0
- package/dist/lib/mime.js +22 -0
- package/dist/lib/mime.js.map +1 -0
- package/dist/lib/never.js +4 -0
- package/dist/lib/never.js.map +1 -0
- package/dist/lib/utils/hash.js +35 -0
- package/dist/lib/utils/hash.js.map +1 -0
- package/dist/lib/utils/result.js +21 -0
- package/dist/lib/utils/result.js.map +1 -0
- package/dist/platform/fs.js +8 -0
- package/dist/platform/fs.js.map +1 -0
- package/dist/platform/index.js +9 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/process.js +8 -0
- package/dist/platform/process.js.map +1 -0
- package/dist/plugins/agent-status/plugin.js +77 -0
- package/dist/plugins/agent-status/plugin.js.map +1 -0
- package/dist/plugins/agents/agents.integration.test.js +683 -0
- package/dist/plugins/agents/agents.integration.test.js.map +1 -0
- package/dist/plugins/agents/index.js +2 -0
- package/dist/plugins/agents/index.js.map +1 -0
- package/dist/plugins/agents/plugin.js +199 -0
- package/dist/plugins/agents/plugin.js.map +1 -0
- package/dist/plugins/context-compact/context-compact.integration.test.js +174 -0
- package/dist/plugins/context-compact/context-compact.integration.test.js.map +1 -0
- package/dist/plugins/context-compact/context-compactor.js +238 -0
- package/dist/plugins/context-compact/context-compactor.js.map +1 -0
- package/dist/plugins/context-compact/context-compactor.test.js +763 -0
- package/dist/plugins/context-compact/context-compactor.test.js.map +1 -0
- package/dist/plugins/context-compact/history-offloader.js +42 -0
- package/dist/plugins/context-compact/history-offloader.js.map +1 -0
- package/dist/plugins/context-compact/history-offloader.test.js +77 -0
- package/dist/plugins/context-compact/history-offloader.test.js.map +1 -0
- package/dist/plugins/context-compact/index.js +4 -0
- package/dist/plugins/context-compact/index.js.map +1 -0
- package/dist/plugins/context-compact/plugin.js +37 -0
- package/dist/plugins/context-compact/plugin.js.map +1 -0
- package/dist/plugins/filesystem/filesystem.integration.test.js +411 -0
- package/dist/plugins/filesystem/filesystem.integration.test.js.map +1 -0
- package/dist/plugins/filesystem/helpers.js +170 -0
- package/dist/plugins/filesystem/helpers.js.map +1 -0
- package/dist/plugins/filesystem/index.js +3 -0
- package/dist/plugins/filesystem/index.js.map +1 -0
- package/dist/plugins/filesystem/listing.js +247 -0
- package/dist/plugins/filesystem/listing.js.map +1 -0
- package/dist/plugins/filesystem/plugin.js +364 -0
- package/dist/plugins/filesystem/plugin.js.map +1 -0
- package/dist/plugins/filesystem/schema.js +2 -0
- package/dist/plugins/filesystem/schema.js.map +1 -0
- package/dist/plugins/git-status/index.js +2 -0
- package/dist/plugins/git-status/index.js.map +1 -0
- package/dist/plugins/git-status/plugin.js +144 -0
- package/dist/plugins/git-status/plugin.js.map +1 -0
- package/dist/plugins/limits-guard/config.js +5 -0
- package/dist/plugins/limits-guard/config.js.map +1 -0
- package/dist/plugins/limits-guard/index.js +3 -0
- package/dist/plugins/limits-guard/index.js.map +1 -0
- package/dist/plugins/limits-guard/limit-guard.js +125 -0
- package/dist/plugins/limits-guard/limit-guard.js.map +1 -0
- package/dist/plugins/limits-guard/limit-guard.test.js +121 -0
- package/dist/plugins/limits-guard/limit-guard.test.js.map +1 -0
- package/dist/plugins/limits-guard/limits-guard.integration.test.js +378 -0
- package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +1 -0
- package/dist/plugins/limits-guard/plugin.js +240 -0
- package/dist/plugins/limits-guard/plugin.js.map +1 -0
- package/dist/plugins/llm-debug/index.js +2 -0
- package/dist/plugins/llm-debug/index.js.map +1 -0
- package/dist/plugins/llm-debug/llm-debug.integration.test.js +157 -0
- package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +1 -0
- package/dist/plugins/llm-debug/plugin.js +148 -0
- package/dist/plugins/llm-debug/plugin.js.map +1 -0
- package/dist/plugins/logs/index.js +2 -0
- package/dist/plugins/logs/index.js.map +1 -0
- package/dist/plugins/logs/plugin.js +38 -0
- package/dist/plugins/logs/plugin.js.map +1 -0
- package/dist/plugins/mailbox/helpers.js +66 -0
- package/dist/plugins/mailbox/helpers.js.map +1 -0
- package/dist/plugins/mailbox/index.js +9 -0
- package/dist/plugins/mailbox/index.js.map +1 -0
- package/dist/plugins/mailbox/mailbox.integration.test.js +605 -0
- package/dist/plugins/mailbox/mailbox.integration.test.js.map +1 -0
- package/dist/plugins/mailbox/plugin.js +204 -0
- package/dist/plugins/mailbox/plugin.js.map +1 -0
- package/dist/plugins/mailbox/prompts.js +93 -0
- package/dist/plugins/mailbox/prompts.js.map +1 -0
- package/dist/plugins/mailbox/query.js +38 -0
- package/dist/plugins/mailbox/query.js.map +1 -0
- package/dist/plugins/mailbox/schema.js +32 -0
- package/dist/plugins/mailbox/schema.js.map +1 -0
- package/dist/plugins/mailbox/state.js +41 -0
- package/dist/plugins/mailbox/state.js.map +1 -0
- package/dist/plugins/resources/index.js +4 -0
- package/dist/plugins/resources/index.js.map +1 -0
- package/dist/plugins/resources/manifest.js +20 -0
- package/dist/plugins/resources/manifest.js.map +1 -0
- package/dist/plugins/resources/plugin.js +171 -0
- package/dist/plugins/resources/plugin.js.map +1 -0
- package/dist/plugins/resources/post-inject.js +32 -0
- package/dist/plugins/resources/post-inject.js.map +1 -0
- package/dist/plugins/resources/state.js +16 -0
- package/dist/plugins/resources/state.js.map +1 -0
- package/dist/plugins/result-eviction/index.js +2 -0
- package/dist/plugins/result-eviction/index.js.map +1 -0
- package/dist/plugins/result-eviction/plugin.js +43 -0
- package/dist/plugins/result-eviction/plugin.js.map +1 -0
- package/dist/plugins/result-eviction/result-eviction.integration.test.js +217 -0
- package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +1 -0
- package/dist/plugins/services/plugin.js +453 -0
- package/dist/plugins/services/plugin.js.map +1 -0
- package/dist/plugins/services/port-pool.js +70 -0
- package/dist/plugins/services/port-pool.js.map +1 -0
- package/dist/plugins/services/prompt.js +40 -0
- package/dist/plugins/services/prompt.js.map +1 -0
- package/dist/plugins/services/schema.js +9 -0
- package/dist/plugins/services/schema.js.map +1 -0
- package/dist/plugins/services/service.js +470 -0
- package/dist/plugins/services/service.js.map +1 -0
- package/dist/plugins/services/services.integration.test.js +485 -0
- package/dist/plugins/services/services.integration.test.js.map +1 -0
- package/dist/plugins/session-lifecycle/index.js +2 -0
- package/dist/plugins/session-lifecycle/index.js.map +1 -0
- package/dist/plugins/session-lifecycle/plugin.js +273 -0
- package/dist/plugins/session-lifecycle/plugin.js.map +1 -0
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +498 -0
- package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +1 -0
- package/dist/plugins/session-state/plugin.js +159 -0
- package/dist/plugins/session-state/plugin.js.map +1 -0
- package/dist/plugins/session-stats/index.js +3 -0
- package/dist/plugins/session-stats/index.js.map +1 -0
- package/dist/plugins/session-stats/plugin.js +81 -0
- package/dist/plugins/session-stats/plugin.js.map +1 -0
- package/dist/plugins/shell/executor.js +339 -0
- package/dist/plugins/shell/executor.js.map +1 -0
- package/dist/plugins/shell/index.js +6 -0
- package/dist/plugins/shell/index.js.map +1 -0
- package/dist/plugins/shell/plugin.js +66 -0
- package/dist/plugins/shell/plugin.js.map +1 -0
- package/dist/plugins/shell/shell.integration.test.js +234 -0
- package/dist/plugins/shell/shell.integration.test.js.map +1 -0
- package/dist/plugins/shell/shell.test.js +236 -0
- package/dist/plugins/shell/shell.test.js.map +1 -0
- package/dist/plugins/skills/discovery.js +205 -0
- package/dist/plugins/skills/discovery.js.map +1 -0
- package/dist/plugins/skills/discovery.test.js +312 -0
- package/dist/plugins/skills/discovery.test.js.map +1 -0
- package/dist/plugins/skills/index.js +12 -0
- package/dist/plugins/skills/index.js.map +1 -0
- package/dist/plugins/skills/plugin.js +293 -0
- package/dist/plugins/skills/plugin.js.map +1 -0
- package/dist/plugins/skills/prompts.js +70 -0
- package/dist/plugins/skills/prompts.js.map +1 -0
- package/dist/plugins/skills/schema.js +18 -0
- package/dist/plugins/skills/schema.js.map +1 -0
- package/dist/plugins/skills/skills.integration.test.js +475 -0
- package/dist/plugins/skills/skills.integration.test.js.map +1 -0
- package/dist/plugins/snapshotting/index.js +3 -0
- package/dist/plugins/snapshotting/index.js.map +1 -0
- package/dist/plugins/snapshotting/jj-snapshotter.js +106 -0
- package/dist/plugins/snapshotting/jj-snapshotter.js.map +1 -0
- package/dist/plugins/snapshotting/plugin.js +28 -0
- package/dist/plugins/snapshotting/plugin.js.map +1 -0
- package/dist/plugins/snapshotting/snapshotter.js +2 -0
- package/dist/plugins/snapshotting/snapshotter.js.map +1 -0
- package/dist/plugins/todo/index.js +7 -0
- package/dist/plugins/todo/index.js.map +1 -0
- package/dist/plugins/todo/plugin.js +319 -0
- package/dist/plugins/todo/plugin.js.map +1 -0
- package/dist/plugins/todo/prompts.js +54 -0
- package/dist/plugins/todo/prompts.js.map +1 -0
- package/dist/plugins/todo/schema.js +18 -0
- package/dist/plugins/todo/schema.js.map +1 -0
- package/dist/plugins/todo/todo.integration.test.js +605 -0
- package/dist/plugins/todo/todo.integration.test.js.map +1 -0
- package/dist/plugins/uploads/index.js +8 -0
- package/dist/plugins/uploads/index.js.map +1 -0
- package/dist/plugins/uploads/plugin.js +346 -0
- package/dist/plugins/uploads/plugin.js.map +1 -0
- package/dist/plugins/uploads/preprocessor.js +44 -0
- package/dist/plugins/uploads/preprocessor.js.map +1 -0
- package/dist/plugins/uploads/preprocessors/image-classifier.js +127 -0
- package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -0
- package/dist/plugins/uploads/preprocessors/index.js +7 -0
- package/dist/plugins/uploads/preprocessors/index.js.map +1 -0
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +204 -0
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -0
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +172 -0
- package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -0
- package/dist/plugins/uploads/schema.js +20 -0
- package/dist/plugins/uploads/schema.js.map +1 -0
- package/dist/plugins/uploads/state.js +22 -0
- package/dist/plugins/uploads/state.js.map +1 -0
- package/dist/plugins/uploads/uploads.integration.test.js +496 -0
- package/dist/plugins/uploads/uploads.integration.test.js.map +1 -0
- package/dist/plugins/user-chat/index.js +5 -0
- package/dist/plugins/user-chat/index.js.map +1 -0
- package/dist/plugins/user-chat/plugin.js +544 -0
- package/dist/plugins/user-chat/plugin.js.map +1 -0
- package/dist/plugins/user-chat/prompts.js +29 -0
- package/dist/plugins/user-chat/prompts.js.map +1 -0
- package/dist/plugins/user-chat/schema.js +46 -0
- package/dist/plugins/user-chat/schema.js.map +1 -0
- package/dist/plugins/user-chat/user-chat.integration.test.js +668 -0
- package/dist/plugins/user-chat/user-chat.integration.test.js.map +1 -0
- package/dist/plugins/workers/context.js +143 -0
- package/dist/plugins/workers/context.js.map +1 -0
- package/dist/plugins/workers/definition.js +30 -0
- package/dist/plugins/workers/definition.js.map +1 -0
- package/dist/plugins/workers/index.js +7 -0
- package/dist/plugins/workers/index.js.map +1 -0
- package/dist/plugins/workers/plugin.js +578 -0
- package/dist/plugins/workers/plugin.js.map +1 -0
- package/dist/plugins/workers/worker.js +18 -0
- package/dist/plugins/workers/worker.js.map +1 -0
- package/dist/plugins/workers/workers.integration.test.js +629 -0
- package/dist/plugins/workers/workers.integration.test.js.map +1 -0
- package/dist/prompts/base.js +239 -0
- package/dist/prompts/base.js.map +1 -0
- package/dist/prompts/builder.js +131 -0
- package/dist/prompts/builder.js.map +1 -0
- package/dist/prompts/index.js +20 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/macros.js +26 -0
- package/dist/prompts/macros.js.map +1 -0
- package/dist/prompts/macros.test.js +80 -0
- package/dist/prompts/macros.test.js.map +1 -0
- package/dist/testing/bootstrap-for-testing.js +28 -0
- package/dist/testing/bootstrap-for-testing.js.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/node-platform.js +65 -0
- package/dist/testing/node-platform.js.map +1 -0
- package/dist/testing/notification-collector.js +82 -0
- package/dist/testing/notification-collector.js.map +1 -0
- package/dist/testing/preset-helpers.js +37 -0
- package/dist/testing/preset-helpers.js.map +1 -0
- package/dist/testing/test-harness.js +226 -0
- package/dist/testing/test-harness.js.map +1 -0
- package/dist/testing/test-harness.test.js +51 -0
- package/dist/testing/test-harness.test.js.map +1 -0
- package/dist/testing/wait-helpers.js +64 -0
- package/dist/testing/wait-helpers.js.map +1 -0
- package/dist/transport/adapter/client-adapter.js +64 -0
- package/dist/transport/adapter/client-adapter.js.map +1 -0
- package/dist/transport/adapter/index.js +24 -0
- package/dist/transport/adapter/index.js.map +1 -0
- package/dist/transport/adapter/server-adapter.js +73 -0
- package/dist/transport/adapter/server-adapter.js.map +1 -0
- package/dist/transport/adapter/types.js +8 -0
- package/dist/transport/adapter/types.js.map +1 -0
- package/dist/transport/http/app.js +86 -0
- package/dist/transport/http/app.js.map +1 -0
- package/dist/transport/http/index.js +6 -0
- package/dist/transport/http/index.js.map +1 -0
- package/dist/transport/http/middleware/bearer-auth.js +33 -0
- package/dist/transport/http/middleware/bearer-auth.js.map +1 -0
- package/dist/transport/http/middleware/error-handler.js +56 -0
- package/dist/transport/http/middleware/error-handler.js.map +1 -0
- package/dist/transport/http/routes/files.js +237 -0
- package/dist/transport/http/routes/files.js.map +1 -0
- package/dist/transport/http/routes/resources.js +77 -0
- package/dist/transport/http/routes/resources.js.map +1 -0
- package/dist/transport/http/routes/rpc.integration.test.js +189 -0
- package/dist/transport/http/routes/rpc.integration.test.js.map +1 -0
- package/dist/transport/http/routes/rpc.js +110 -0
- package/dist/transport/http/routes/rpc.js.map +1 -0
- package/dist/transport/http/routes/rpc.test.js +316 -0
- package/dist/transport/http/routes/rpc.test.js.map +1 -0
- package/dist/transport/http/routes/upload.js +205 -0
- package/dist/transport/http/routes/upload.js.map +1 -0
- package/dist/transport/rpc/index.js +7 -0
- package/dist/transport/rpc/index.js.map +1 -0
- package/dist/transport/rpc/methods.js +8 -0
- package/dist/transport/rpc/methods.js.map +1 -0
- package/dist/user-config.js +14 -0
- package/dist/user-config.js.map +1 -0
- package/package.json +47 -57
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/adapter/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAA;AAC7E,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAA;AAa7E,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAChE,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;QACvC,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;QACvC,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Adapter
|
|
3
|
+
*
|
|
4
|
+
* Standalone mode - agent is the WebSocket server.
|
|
5
|
+
* Simplified for broadcast-only communication (agent -> SPA).
|
|
6
|
+
* User messages and answers are handled via REST API.
|
|
7
|
+
*/
|
|
8
|
+
import { ConnectionManager, ServerConnection } from '@roj-ai/transport/server';
|
|
9
|
+
export class ServerAdapter {
|
|
10
|
+
connectionManager;
|
|
11
|
+
logger;
|
|
12
|
+
wsToConnectionId = new WeakMap();
|
|
13
|
+
constructor(config = {}) {
|
|
14
|
+
this.logger = config.logger?.child({ component: 'ServerAdapter' });
|
|
15
|
+
this.connectionManager = new ConnectionManager();
|
|
16
|
+
}
|
|
17
|
+
async start() {
|
|
18
|
+
this.logger?.info('Server adapter started');
|
|
19
|
+
}
|
|
20
|
+
async stop() {
|
|
21
|
+
this.connectionManager.clear();
|
|
22
|
+
this.logger?.info('Server adapter stopped');
|
|
23
|
+
}
|
|
24
|
+
broadcast(notification) {
|
|
25
|
+
// Extract sessionId from payload for routing to the correct session's subscribers
|
|
26
|
+
const payload = notification.payload;
|
|
27
|
+
if (typeof payload !== 'object' || payload === null || !('sessionId' in payload)) {
|
|
28
|
+
this.logger?.warn('Notification dropped: no sessionId in payload', { type: notification.type });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const sessionId = String(payload.sessionId);
|
|
32
|
+
const wireMessage = JSON.stringify({ type: notification.type, payload: notification.payload, ts: Date.now() });
|
|
33
|
+
this.connectionManager.broadcast(sessionId, wireMessage);
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// WebSocket Handler Integration (called from Bun server)
|
|
37
|
+
// ============================================================================
|
|
38
|
+
handleOpen(ws, sessionId) {
|
|
39
|
+
const connection = new ServerConnection({});
|
|
40
|
+
// No handlers needed - SPA doesn't send anything via WebSocket
|
|
41
|
+
// Session subscription is determined by sessionId passed at connection time
|
|
42
|
+
connection.attach(ws);
|
|
43
|
+
this.connectionManager.add(connection);
|
|
44
|
+
this.wsToConnectionId.set(ws, connection.getConnectionId());
|
|
45
|
+
// If sessionId provided, auto-subscribe
|
|
46
|
+
if (sessionId) {
|
|
47
|
+
this.connectionManager.subscribe(connection.getConnectionId(), sessionId);
|
|
48
|
+
this.logger?.debug('Client connected and subscribed', { connectionId: connection.getConnectionId(), sessionId });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.logger?.debug('Client connected', { connectionId: connection.getConnectionId() });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
handleClose(ws, code, reason) {
|
|
55
|
+
const connectionId = this.wsToConnectionId.get(ws);
|
|
56
|
+
if (connectionId) {
|
|
57
|
+
this.connectionManager.remove(connectionId);
|
|
58
|
+
this.wsToConnectionId.delete(ws);
|
|
59
|
+
this.logger?.debug('Client disconnected', { connectionId, code, reason });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
handleMessage(ws, message) {
|
|
63
|
+
// Forward message to the connection's onmessage handler
|
|
64
|
+
ws.onmessage?.(message);
|
|
65
|
+
}
|
|
66
|
+
handleError(_ws, error) {
|
|
67
|
+
this.logger?.error('WebSocket error', error);
|
|
68
|
+
}
|
|
69
|
+
getConnectionManager() {
|
|
70
|
+
return this.connectionManager;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=server-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-adapter.js","sourceRoot":"","sources":["../../../src/transport/adapter/server-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/transport/adapter/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hono App Setup
|
|
3
|
+
*
|
|
4
|
+
* Creates the main HTTP application with middleware and routes.
|
|
5
|
+
*/
|
|
6
|
+
import { Hono } from 'hono';
|
|
7
|
+
import { cors } from 'hono/cors';
|
|
8
|
+
import { createBearerAuth } from './middleware/bearer-auth.js';
|
|
9
|
+
import { errorHandler } from './middleware/error-handler.js';
|
|
10
|
+
import { createFileRoutes } from './routes/files.js';
|
|
11
|
+
import { createResourceRoutes } from './routes/resources.js';
|
|
12
|
+
import { createRpcRoutes } from './routes/rpc.js';
|
|
13
|
+
import { createUploadRoutes } from './routes/upload.js';
|
|
14
|
+
/**
|
|
15
|
+
* Type-safe accessor for services from Hono context.
|
|
16
|
+
* Guarantees services are present (set by middleware).
|
|
17
|
+
*/
|
|
18
|
+
export function getServices(c) {
|
|
19
|
+
return c.get('services');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates the Hono application with all middleware and routes.
|
|
23
|
+
*/
|
|
24
|
+
export function createApp(services) {
|
|
25
|
+
const app = new Hono();
|
|
26
|
+
// Middleware
|
|
27
|
+
app.use('*', cors());
|
|
28
|
+
app.use('*', async (c, next) => {
|
|
29
|
+
c.set('services', services);
|
|
30
|
+
await next();
|
|
31
|
+
});
|
|
32
|
+
// Error handler
|
|
33
|
+
app.onError(errorHandler);
|
|
34
|
+
// Health check (public - no auth required)
|
|
35
|
+
app.get('/health', (c) => {
|
|
36
|
+
return c.json({
|
|
37
|
+
status: 'ok',
|
|
38
|
+
timestamp: Date.now(),
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
// Bearer auth for protected routes
|
|
42
|
+
const bearerAuth = createBearerAuth(services.agentToken);
|
|
43
|
+
// Activity status for DO polling (protected)
|
|
44
|
+
// Returns lastActivityAt timestamp for the caller to determine if agent is active
|
|
45
|
+
app.get('/status', bearerAuth, async (c) => {
|
|
46
|
+
const { sessionRuntime } = getServices(c);
|
|
47
|
+
const stats = await sessionRuntime.getStats();
|
|
48
|
+
return c.json({
|
|
49
|
+
lastActivityAt: stats.lastActivityAt,
|
|
50
|
+
stats: {
|
|
51
|
+
sessionCount: stats.sessionCount,
|
|
52
|
+
pendingAgents: stats.pendingAgents,
|
|
53
|
+
processingAgents: stats.processingAgents,
|
|
54
|
+
},
|
|
55
|
+
sessions: stats.sessions.map(s => ({
|
|
56
|
+
id: s.id,
|
|
57
|
+
presetId: s.presetId,
|
|
58
|
+
status: s.status,
|
|
59
|
+
metrics: s.metrics,
|
|
60
|
+
})),
|
|
61
|
+
timestamp: Date.now(),
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
// Protected routes
|
|
65
|
+
const rpcRoutes = createRpcRoutes();
|
|
66
|
+
const uploadRoutes = createUploadRoutes();
|
|
67
|
+
const resourceRoutes = createResourceRoutes();
|
|
68
|
+
const fileRoutes = createFileRoutes();
|
|
69
|
+
app.use('/rpc/*', bearerAuth);
|
|
70
|
+
app.use('/sessions/*', bearerAuth);
|
|
71
|
+
app.route('/rpc', rpcRoutes);
|
|
72
|
+
app.route('/sessions', uploadRoutes);
|
|
73
|
+
app.route('/sessions', resourceRoutes);
|
|
74
|
+
app.route('/sessions', fileRoutes);
|
|
75
|
+
// 404 handler
|
|
76
|
+
app.notFound((c) => {
|
|
77
|
+
return c.json({
|
|
78
|
+
error: {
|
|
79
|
+
type: 'not_found',
|
|
80
|
+
message: `Route not found: ${c.req.method} ${c.req.path}`,
|
|
81
|
+
},
|
|
82
|
+
}, 404);
|
|
83
|
+
});
|
|
84
|
+
return app;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/transport/http/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/http/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bearer Auth Middleware
|
|
3
|
+
*
|
|
4
|
+
* Validates Authorization: Bearer <token> header against configured agentToken.
|
|
5
|
+
* Only active when agentToken is configured (worker mode).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Creates bearer auth middleware.
|
|
9
|
+
* Returns 401 if token is invalid or missing (when required).
|
|
10
|
+
*
|
|
11
|
+
* @param expectedToken - The expected bearer token. If undefined, middleware is a no-op.
|
|
12
|
+
*/
|
|
13
|
+
export function createBearerAuth(expectedToken) {
|
|
14
|
+
return async (c, next) => {
|
|
15
|
+
// Skip auth if no token configured (local dev mode)
|
|
16
|
+
if (!expectedToken) {
|
|
17
|
+
return next();
|
|
18
|
+
}
|
|
19
|
+
const authHeader = c.req.header('Authorization');
|
|
20
|
+
if (!authHeader) {
|
|
21
|
+
return c.json({ error: { type: 'unauthorized', message: 'Missing Authorization header' } }, 401);
|
|
22
|
+
}
|
|
23
|
+
const [scheme, token] = authHeader.split(' ');
|
|
24
|
+
if (scheme !== 'Bearer' || !token) {
|
|
25
|
+
return c.json({ error: { type: 'unauthorized', message: 'Invalid Authorization header format' } }, 401);
|
|
26
|
+
}
|
|
27
|
+
if (token !== expectedToken) {
|
|
28
|
+
return c.json({ error: { type: 'unauthorized', message: 'Invalid token' } }, 401);
|
|
29
|
+
}
|
|
30
|
+
return next();
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bearer-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bearer-auth.js","sourceRoot":"","sources":["../../../../src/transport/http/middleware/bearer-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,aAAiC;IACjE,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACxB,oDAAoD;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,OAAO,IAAI,EAAE,CAAA;QACd,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,8BAA8B,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QACjG,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QACxG,CAAC;QAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAClF,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACd,CAAC,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handler Middleware
|
|
3
|
+
*
|
|
4
|
+
* Handles all errors thrown during request processing:
|
|
5
|
+
* - HTTPException from Hono
|
|
6
|
+
* - Domain errors from business logic (self-describing with httpStatus)
|
|
7
|
+
* - Validation errors from Zod
|
|
8
|
+
* - Unknown errors (logged and returned as 500)
|
|
9
|
+
*/
|
|
10
|
+
import { HTTPException } from 'hono/http-exception';
|
|
11
|
+
import { isDomainError } from '../../../core/errors.js';
|
|
12
|
+
/**
|
|
13
|
+
* Global error handler for Hono app.
|
|
14
|
+
*/
|
|
15
|
+
export const errorHandler = (error, c) => {
|
|
16
|
+
const services = c.get('services');
|
|
17
|
+
const logger = services?.logger;
|
|
18
|
+
// HTTPException (from Hono)
|
|
19
|
+
if (error instanceof HTTPException) {
|
|
20
|
+
return c.json({
|
|
21
|
+
error: {
|
|
22
|
+
type: 'http_error',
|
|
23
|
+
message: error.message,
|
|
24
|
+
},
|
|
25
|
+
}, error.status);
|
|
26
|
+
}
|
|
27
|
+
// Domain errors (self-describing — carry their own httpStatus)
|
|
28
|
+
if (isDomainError(error)) {
|
|
29
|
+
return c.json({ error: { type: error.type, message: error.message } }, error.httpStatus);
|
|
30
|
+
}
|
|
31
|
+
// Validation errors (from Zod)
|
|
32
|
+
if (error.name === 'ZodError') {
|
|
33
|
+
const zodError = error;
|
|
34
|
+
return c.json({
|
|
35
|
+
error: {
|
|
36
|
+
type: 'validation_error',
|
|
37
|
+
message: 'Invalid request',
|
|
38
|
+
details: zodError.issues,
|
|
39
|
+
},
|
|
40
|
+
}, 400);
|
|
41
|
+
}
|
|
42
|
+
// Unknown errors
|
|
43
|
+
if (logger) {
|
|
44
|
+
logger.error('Unhandled error', error);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.error('Unhandled error (no logger available):', error);
|
|
48
|
+
}
|
|
49
|
+
return c.json({
|
|
50
|
+
error: {
|
|
51
|
+
type: 'internal_error',
|
|
52
|
+
message: 'Internal server error',
|
|
53
|
+
},
|
|
54
|
+
}, 500);
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../src/transport/http/middleware/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,CAAkB,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAA;IAE/B,4BAA4B;IAC5B,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,KAAK,EAAE;gBACN,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;aACtB;SACD,EACD,KAAK,CAAC,MAAM,CACZ,CAAA;IACF,CAAC;IAED,+DAA+D;IAC/D,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EACvD,KAAK,CAAC,UAAkC,CACxC,CAAA;IACF,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAA6B,CAAA;QAC9C,OAAO,CAAC,CAAC,IAAI,CACZ;YACC,KAAK,EAAE;gBACN,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,QAAQ,CAAC,MAAM;aACxB;SACD,EACD,GAAG,CACH,CAAA;IACF,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,CAAC,CAAC,IAAI,CACZ;QACC,KAAK,EAAE;YACN,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,uBAAuB;SAChC;KACD,EACD,GAAG,CACH,CAAA;AACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Proxy Routes
|
|
3
|
+
*
|
|
4
|
+
* Serves session files (e.g. screenshots from tools) via HTTP.
|
|
5
|
+
* Used by the debug UI to display images from LLM call logs.
|
|
6
|
+
*/
|
|
7
|
+
import { Hono } from 'hono';
|
|
8
|
+
import { extname, resolve } from 'node:path';
|
|
9
|
+
import { SessionId } from '../../../core/sessions/schema.js';
|
|
10
|
+
import { getServices } from '../app.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/** Known MIME types for specific extensions. */
|
|
15
|
+
const MIME_TYPES = {
|
|
16
|
+
// Images
|
|
17
|
+
'.jpg': 'image/jpeg',
|
|
18
|
+
'.jpeg': 'image/jpeg',
|
|
19
|
+
'.png': 'image/png',
|
|
20
|
+
'.gif': 'image/gif',
|
|
21
|
+
'.webp': 'image/webp',
|
|
22
|
+
'.svg': 'image/svg+xml',
|
|
23
|
+
'.ico': 'image/x-icon',
|
|
24
|
+
'.bmp': 'image/bmp',
|
|
25
|
+
'.avif': 'image/avif',
|
|
26
|
+
// Video
|
|
27
|
+
'.mp4': 'video/mp4',
|
|
28
|
+
'.webm': 'video/webm',
|
|
29
|
+
'.mov': 'video/quicktime',
|
|
30
|
+
// Audio
|
|
31
|
+
'.mp3': 'audio/mpeg',
|
|
32
|
+
'.wav': 'audio/wav',
|
|
33
|
+
'.ogg': 'audio/ogg',
|
|
34
|
+
// Documents
|
|
35
|
+
'.pdf': 'application/pdf',
|
|
36
|
+
// Data/markup
|
|
37
|
+
'.json': 'application/json',
|
|
38
|
+
'.html': 'text/html',
|
|
39
|
+
'.css': 'text/css',
|
|
40
|
+
'.js': 'application/javascript',
|
|
41
|
+
'.mjs': 'application/javascript',
|
|
42
|
+
'.xml': 'text/xml',
|
|
43
|
+
'.yaml': 'text/yaml',
|
|
44
|
+
'.yml': 'text/yaml',
|
|
45
|
+
'.md': 'text/markdown',
|
|
46
|
+
// Archives
|
|
47
|
+
'.zip': 'application/zip',
|
|
48
|
+
'.tar': 'application/x-tar',
|
|
49
|
+
'.gz': 'application/gzip',
|
|
50
|
+
// Fonts
|
|
51
|
+
'.woff': 'font/woff',
|
|
52
|
+
'.woff2': 'font/woff2',
|
|
53
|
+
'.ttf': 'font/ttf',
|
|
54
|
+
'.otf': 'font/otf',
|
|
55
|
+
// Binary
|
|
56
|
+
'.wasm': 'application/wasm',
|
|
57
|
+
};
|
|
58
|
+
/** Extensions known to be binary — files that cannot be displayed as text. */
|
|
59
|
+
const BINARY_EXTENSIONS = new Set([
|
|
60
|
+
// Images
|
|
61
|
+
'.jpg',
|
|
62
|
+
'.jpeg',
|
|
63
|
+
'.png',
|
|
64
|
+
'.gif',
|
|
65
|
+
'.webp',
|
|
66
|
+
'.bmp',
|
|
67
|
+
'.ico',
|
|
68
|
+
'.tiff',
|
|
69
|
+
'.tif',
|
|
70
|
+
'.avif',
|
|
71
|
+
// Video
|
|
72
|
+
'.mp4',
|
|
73
|
+
'.webm',
|
|
74
|
+
'.avi',
|
|
75
|
+
'.mov',
|
|
76
|
+
'.mkv',
|
|
77
|
+
'.flv',
|
|
78
|
+
'.wmv',
|
|
79
|
+
// Audio
|
|
80
|
+
'.mp3',
|
|
81
|
+
'.wav',
|
|
82
|
+
'.ogg',
|
|
83
|
+
'.flac',
|
|
84
|
+
'.aac',
|
|
85
|
+
'.wma',
|
|
86
|
+
'.m4a',
|
|
87
|
+
// Archives
|
|
88
|
+
'.zip',
|
|
89
|
+
'.tar',
|
|
90
|
+
'.gz',
|
|
91
|
+
'.bz2',
|
|
92
|
+
'.xz',
|
|
93
|
+
'.7z',
|
|
94
|
+
'.rar',
|
|
95
|
+
'.zst',
|
|
96
|
+
// Documents (binary)
|
|
97
|
+
'.pdf',
|
|
98
|
+
'.doc',
|
|
99
|
+
'.docx',
|
|
100
|
+
'.xls',
|
|
101
|
+
'.xlsx',
|
|
102
|
+
'.ppt',
|
|
103
|
+
'.pptx',
|
|
104
|
+
'.odt',
|
|
105
|
+
// Fonts
|
|
106
|
+
'.woff',
|
|
107
|
+
'.woff2',
|
|
108
|
+
'.ttf',
|
|
109
|
+
'.otf',
|
|
110
|
+
'.eot',
|
|
111
|
+
// Compiled/binary
|
|
112
|
+
'.wasm',
|
|
113
|
+
'.exe',
|
|
114
|
+
'.dll',
|
|
115
|
+
'.so',
|
|
116
|
+
'.dylib',
|
|
117
|
+
'.o',
|
|
118
|
+
'.a',
|
|
119
|
+
'.class',
|
|
120
|
+
'.pyc',
|
|
121
|
+
'.pyo',
|
|
122
|
+
// Database
|
|
123
|
+
'.sqlite',
|
|
124
|
+
'.db',
|
|
125
|
+
'.sqlite3',
|
|
126
|
+
// Other
|
|
127
|
+
'.bin',
|
|
128
|
+
'.dat',
|
|
129
|
+
]);
|
|
130
|
+
// ============================================================================
|
|
131
|
+
// Helpers
|
|
132
|
+
// ============================================================================
|
|
133
|
+
/**
|
|
134
|
+
* Determine MIME type for a file.
|
|
135
|
+
* Known extensions get their specific MIME type, known binary extensions
|
|
136
|
+
* get `application/octet-stream`, everything else defaults to `text/plain`
|
|
137
|
+
* so that code/config files (.astro, .vue, .svelte, .go, .rs, etc.)
|
|
138
|
+
* are previewable as text.
|
|
139
|
+
*/
|
|
140
|
+
function getMimeType(filePath) {
|
|
141
|
+
const ext = extname(filePath).toLowerCase();
|
|
142
|
+
if (MIME_TYPES[ext])
|
|
143
|
+
return MIME_TYPES[ext];
|
|
144
|
+
if (BINARY_EXTENSIONS.has(ext))
|
|
145
|
+
return 'application/octet-stream';
|
|
146
|
+
return 'text/plain';
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Extract the wildcard path suffix from a request.
|
|
150
|
+
*
|
|
151
|
+
* Hono's c.req.param('*') doesn't work in sub-routers mounted via app.route(),
|
|
152
|
+
* so we extract it from c.req.path by finding the marker segment and taking everything after it.
|
|
153
|
+
*/
|
|
154
|
+
function extractWildcardPath(c, marker) {
|
|
155
|
+
const idx = c.req.path.indexOf(`/${marker}/`);
|
|
156
|
+
if (idx === -1)
|
|
157
|
+
return '';
|
|
158
|
+
return c.req.path.slice(idx + marker.length + 2);
|
|
159
|
+
}
|
|
160
|
+
function preventTraversal(baseDir, requestedPath) {
|
|
161
|
+
const resolved = resolve(baseDir, requestedPath);
|
|
162
|
+
if (!resolved.startsWith(baseDir + '/') && resolved !== baseDir) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return resolved;
|
|
166
|
+
}
|
|
167
|
+
async function serveFile(c, filePath) {
|
|
168
|
+
const { platform } = getServices(c);
|
|
169
|
+
let data;
|
|
170
|
+
try {
|
|
171
|
+
data = await platform.fs.readFile(filePath);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return c.json({ error: { type: 'not_found', message: 'File not found' } }, 404);
|
|
175
|
+
}
|
|
176
|
+
const contentType = getMimeType(filePath);
|
|
177
|
+
return new Response(data, {
|
|
178
|
+
headers: {
|
|
179
|
+
'Content-Type': contentType,
|
|
180
|
+
'Content-Length': data.length.toString(),
|
|
181
|
+
'Cache-Control': 'public, max-age=3600',
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async function resolveWorkspaceDir(c, sessionId) {
|
|
186
|
+
const { sessionRuntime } = getServices(c);
|
|
187
|
+
const result = await sessionRuntime.getSession(SessionId(sessionId));
|
|
188
|
+
if (!result.ok)
|
|
189
|
+
return null;
|
|
190
|
+
return result.value.state.workspaceDir ?? null;
|
|
191
|
+
}
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// Routes
|
|
194
|
+
// ============================================================================
|
|
195
|
+
/**
|
|
196
|
+
* Creates file proxy routes.
|
|
197
|
+
*
|
|
198
|
+
* GET /:sessionId/files/*path - Serve session file
|
|
199
|
+
* GET /:sessionId/workspace/*path - Serve workspace file
|
|
200
|
+
*/
|
|
201
|
+
export function createFileRoutes() {
|
|
202
|
+
const app = new Hono();
|
|
203
|
+
// --- Serve session file ---
|
|
204
|
+
app.get('/:sessionId/files/*', async (c) => {
|
|
205
|
+
const { config } = getServices(c);
|
|
206
|
+
const sessionId = c.req.param('sessionId');
|
|
207
|
+
const filePath = extractWildcardPath(c, 'files');
|
|
208
|
+
if (!filePath) {
|
|
209
|
+
return c.json({ error: { type: 'validation_error', message: 'File path is required' } }, 400);
|
|
210
|
+
}
|
|
211
|
+
const sessionDir = resolve(config.dataPath, 'sessions', sessionId);
|
|
212
|
+
const resolvedPath = preventTraversal(sessionDir, filePath);
|
|
213
|
+
if (!resolvedPath) {
|
|
214
|
+
return c.json({ error: { type: 'forbidden', message: 'Path traversal not allowed' } }, 403);
|
|
215
|
+
}
|
|
216
|
+
return serveFile(c, resolvedPath);
|
|
217
|
+
});
|
|
218
|
+
// --- Serve workspace file ---
|
|
219
|
+
app.get('/:sessionId/workspace/*', async (c) => {
|
|
220
|
+
const sessionId = c.req.param('sessionId');
|
|
221
|
+
const filePath = extractWildcardPath(c, 'workspace');
|
|
222
|
+
if (!filePath) {
|
|
223
|
+
return c.json({ error: { type: 'validation_error', message: 'File path is required' } }, 400);
|
|
224
|
+
}
|
|
225
|
+
const workspaceDir = await resolveWorkspaceDir(c, sessionId);
|
|
226
|
+
if (!workspaceDir) {
|
|
227
|
+
return c.json({ error: { type: 'not_found', message: 'No workspace configured for this session' } }, 404);
|
|
228
|
+
}
|
|
229
|
+
const resolvedPath = preventTraversal(resolve(workspaceDir), filePath);
|
|
230
|
+
if (!resolvedPath) {
|
|
231
|
+
return c.json({ error: { type: 'forbidden', message: 'Path traversal not allowed' } }, 403);
|
|
232
|
+
}
|
|
233
|
+
return serveFile(c, resolvedPath);
|
|
234
|
+
});
|
|
235
|
+
return app;
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource injection routes.
|
|
3
|
+
*
|
|
4
|
+
* POST /sessions/:sessionId/inject-resource
|
|
5
|
+
* Downloads a file from a URL and injects it directly into the session workspace
|
|
6
|
+
* (ZIP files are extracted, other files are copied). Used by the worker to inject
|
|
7
|
+
* organization resources into sessions, bypassing the uploads/attachment pipeline.
|
|
8
|
+
*/
|
|
9
|
+
import { Hono } from 'hono';
|
|
10
|
+
import { getServices } from '../app.js';
|
|
11
|
+
import { SessionId } from '../../../core/sessions/schema.js';
|
|
12
|
+
export function createResourceRoutes() {
|
|
13
|
+
const app = new Hono();
|
|
14
|
+
app.post('/:sessionId/inject-resource', async (c) => {
|
|
15
|
+
const { sessionRuntime, logger } = getServices(c);
|
|
16
|
+
const sessionId = SessionId(c.req.param('sessionId'));
|
|
17
|
+
// 1. Verify session exists
|
|
18
|
+
const sessionResult = await sessionRuntime.getSession(sessionId);
|
|
19
|
+
if (!sessionResult.ok) {
|
|
20
|
+
return c.json({ error: { type: 'session_not_found', message: `Session not found: ${sessionId}` } }, 404);
|
|
21
|
+
}
|
|
22
|
+
// 2. Parse JSON body
|
|
23
|
+
let body;
|
|
24
|
+
try {
|
|
25
|
+
body = await c.req.json();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return c.json({ error: { type: 'parse_error', message: 'Failed to parse JSON body' } }, 400);
|
|
29
|
+
}
|
|
30
|
+
if (!body.url || !body.filename || !body.mimeType) {
|
|
31
|
+
return c.json({ error: { type: 'validation_error', message: 'Missing required fields: url, filename, mimeType' } }, 400);
|
|
32
|
+
}
|
|
33
|
+
// 3. Fetch URL
|
|
34
|
+
const maxSize = 50 * 1024 * 1024; // 50MB
|
|
35
|
+
let response;
|
|
36
|
+
try {
|
|
37
|
+
response = await fetch(body.url, { signal: AbortSignal.timeout(120_000) });
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return c.json({ error: { type: 'fetch_error', message: `Failed to fetch URL: ${err instanceof Error ? err.message : String(err)}` } }, 400);
|
|
41
|
+
}
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
return c.json({ error: { type: 'fetch_error', message: `URL returned ${response.status}` } }, 400);
|
|
44
|
+
}
|
|
45
|
+
// 4. Read response with size limit
|
|
46
|
+
const contentLength = response.headers.get('Content-Length');
|
|
47
|
+
if (contentLength && Number.parseInt(contentLength, 10) > maxSize) {
|
|
48
|
+
return c.json({ error: { type: 'validation_error', message: 'File too large (max 50MB)' } }, 400);
|
|
49
|
+
}
|
|
50
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
51
|
+
if (arrayBuffer.byteLength > maxSize) {
|
|
52
|
+
return c.json({ error: { type: 'validation_error', message: 'File too large (max 50MB)' } }, 400);
|
|
53
|
+
}
|
|
54
|
+
const fileBuffer = Buffer.from(arrayBuffer);
|
|
55
|
+
// 5. Call resources plugin
|
|
56
|
+
const result = await sessionRuntime.callPluginMethod(sessionId, 'resources.inject', {
|
|
57
|
+
sessionId: String(sessionId),
|
|
58
|
+
filename: body.filename,
|
|
59
|
+
mimeType: body.mimeType,
|
|
60
|
+
size: fileBuffer.length,
|
|
61
|
+
fileBuffer,
|
|
62
|
+
metadata: body.metadata,
|
|
63
|
+
});
|
|
64
|
+
if (!result.ok) {
|
|
65
|
+
logger.error('Resource injection failed', undefined, { sessionId: String(sessionId), error: result.error });
|
|
66
|
+
return c.json({ error: { type: result.error.type, message: 'Resource injection failed' } }, 400);
|
|
67
|
+
}
|
|
68
|
+
const injectResult = result.value;
|
|
69
|
+
return c.json({
|
|
70
|
+
ok: true,
|
|
71
|
+
resourceId: injectResult.resourceId,
|
|
72
|
+
paths: injectResult.paths,
|
|
73
|
+
}, 201);
|
|
74
|
+
});
|
|
75
|
+
return app;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/resources.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,MAAM,UAAU,oBAAoB;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,CAAa,EAAE,EAAE;QAC/D,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QACjD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC,CAAA;QAEtD,2BAA2B;QAC3B,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAChE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,sBAAsB,SAAS,EAAE,EAAE,EAAE,EACpF,GAAG,CACH,CAAA;QACF,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAsG,CAAA;QAC1G,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC1B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,EACxE,GAAG,CACH,CAAA;QACF,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnD,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,kDAAkD,EAAE,EAAE,EACpG,GAAG,CACH,CAAA;QACF,CAAC;QAED,eAAe;QACf,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,OAAO;QACxC,IAAI,QAAkB,CAAA;QACtB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EACvH,GAAG,CACH,CAAA;QACF,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAC9E,GAAG,CACH,CAAA;QACF,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QAC5D,IAAI,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC;YACnE,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,EAC7E,GAAG,CACH,CAAA;QACF,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAA;QAChD,IAAI,WAAW,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,EAC7E,GAAG,CACH,CAAA;QACF,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAE3C,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,kBAAkB,EAAE;YACnF,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,UAAU,CAAC,MAAM;YACvB,UAAU;YACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YAC3G,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,EAC5E,GAAG,CACH,CAAA;QACF,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,KAAgD,CAAA;QAE5E,OAAO,CAAC,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,KAAK,EAAE,YAAY,CAAC,KAAK;SACzB,EAAE,GAAG,CAAC,CAAA;IACR,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACX,CAAC"}
|