@relaycast/engine 1.1.7
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/adapters/node/database.d.ts +25 -0
- package/dist/adapters/node/database.d.ts.map +1 -0
- package/dist/adapters/node/database.js +71 -0
- package/dist/adapters/node/database.js.map +1 -0
- package/dist/adapters/node/event-queue.d.ts +15 -0
- package/dist/adapters/node/event-queue.d.ts.map +1 -0
- package/dist/adapters/node/event-queue.js +27 -0
- package/dist/adapters/node/event-queue.js.map +1 -0
- package/dist/adapters/node/files.d.ts +47 -0
- package/dist/adapters/node/files.d.ts.map +1 -0
- package/dist/adapters/node/files.js +128 -0
- package/dist/adapters/node/files.js.map +1 -0
- package/dist/adapters/node/index.d.ts +60 -0
- package/dist/adapters/node/index.d.ts.map +1 -0
- package/dist/adapters/node/index.js +79 -0
- package/dist/adapters/node/index.js.map +1 -0
- package/dist/adapters/node/kv.d.ts +27 -0
- package/dist/adapters/node/kv.d.ts.map +1 -0
- package/dist/adapters/node/kv.js +67 -0
- package/dist/adapters/node/kv.js.map +1 -0
- package/dist/adapters/node/mcp.d.ts +18 -0
- package/dist/adapters/node/mcp.d.ts.map +1 -0
- package/dist/adapters/node/mcp.js +53 -0
- package/dist/adapters/node/mcp.js.map +1 -0
- package/dist/adapters/node/presence.d.ts +33 -0
- package/dist/adapters/node/presence.d.ts.map +1 -0
- package/dist/adapters/node/presence.js +113 -0
- package/dist/adapters/node/presence.js.map +1 -0
- package/dist/adapters/node/rate-limit.d.ts +17 -0
- package/dist/adapters/node/rate-limit.d.ts.map +1 -0
- package/dist/adapters/node/rate-limit.js +36 -0
- package/dist/adapters/node/rate-limit.js.map +1 -0
- package/dist/adapters/node/realtime.d.ts +72 -0
- package/dist/adapters/node/realtime.d.ts.map +1 -0
- package/dist/adapters/node/realtime.js +274 -0
- package/dist/adapters/node/realtime.js.map +1 -0
- package/dist/auth/index.d.ts +21 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +50 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/bin/serve.d.ts +3 -0
- package/dist/bin/serve.d.ts.map +1 -0
- package/dist/bin/serve.js +74 -0
- package/dist/bin/serve.js.map +1 -0
- package/dist/db/index.d.ts +16 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +24 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +14 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +16 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/0000_broad_dagger.sql +227 -0
- package/dist/db/migrations/0001_fts5_search.sql +23 -0
- package/dist/db/migrations/0002_add_metadata_columns.sql +16 -0
- package/dist/db/migrations/0003_add_channel_mute.sql +5 -0
- package/dist/db/migrations/0004_a2a_agents.sql +21 -0
- package/dist/db/migrations/0005_certifications.sql +24 -0
- package/dist/db/migrations/0006_message_logs.sql +30 -0
- package/dist/db/migrations/0007_directory.sql +125 -0
- package/dist/db/migrations/0008_smart_routing.sql +30 -0
- package/dist/db/migrations/0009_drop_workspace_name_unique.sql +4 -0
- package/dist/db/migrations/0010_actions_and_harness.sql +108 -0
- package/dist/db/migrations/0011_stable_handle.sql +5 -0
- package/dist/db/migrations/0012_delivery_and_sequence_constraints.sql +26 -0
- package/dist/db/migrations/0013_status_active.sql +9 -0
- package/dist/db/migrations/meta/0000_snapshot.json +1694 -0
- package/dist/db/migrations/meta/_journal.json +13 -0
- package/dist/db/schema.d.ts +4742 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +572 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/engine/a2a-health.d.ts +11 -0
- package/dist/engine/a2a-health.d.ts.map +1 -0
- package/dist/engine/a2a-health.js +65 -0
- package/dist/engine/a2a-health.js.map +1 -0
- package/dist/engine/a2a.d.ts +73 -0
- package/dist/engine/a2a.d.ts.map +1 -0
- package/dist/engine/a2a.js +549 -0
- package/dist/engine/a2a.js.map +1 -0
- package/dist/engine/action.d.ts +85 -0
- package/dist/engine/action.d.ts.map +1 -0
- package/dist/engine/action.js +220 -0
- package/dist/engine/action.js.map +1 -0
- package/dist/engine/activity.d.ts +21 -0
- package/dist/engine/activity.d.ts.map +1 -0
- package/dist/engine/activity.js +46 -0
- package/dist/engine/activity.js.map +1 -0
- package/dist/engine/agent.d.ts +155 -0
- package/dist/engine/agent.d.ts.map +1 -0
- package/dist/engine/agent.js +408 -0
- package/dist/engine/agent.js.map +1 -0
- package/dist/engine/cache.d.ts +19 -0
- package/dist/engine/cache.d.ts.map +1 -0
- package/dist/engine/cache.js +40 -0
- package/dist/engine/cache.js.map +1 -0
- package/dist/engine/certify.d.ts +84 -0
- package/dist/engine/certify.d.ts.map +1 -0
- package/dist/engine/certify.js +452 -0
- package/dist/engine/certify.js.map +1 -0
- package/dist/engine/channel.d.ts +67 -0
- package/dist/engine/channel.d.ts.map +1 -0
- package/dist/engine/channel.js +375 -0
- package/dist/engine/channel.js.map +1 -0
- package/dist/engine/console.d.ts +83 -0
- package/dist/engine/console.d.ts.map +1 -0
- package/dist/engine/console.js +189 -0
- package/dist/engine/console.js.map +1 -0
- package/dist/engine/directory.d.ts +241 -0
- package/dist/engine/directory.d.ts.map +1 -0
- package/dist/engine/directory.js +528 -0
- package/dist/engine/directory.js.map +1 -0
- package/dist/engine/dm.d.ts +63 -0
- package/dist/engine/dm.d.ts.map +1 -0
- package/dist/engine/dm.js +397 -0
- package/dist/engine/dm.js.map +1 -0
- package/dist/engine/dmAll.d.ts +11 -0
- package/dist/engine/dmAll.d.ts.map +1 -0
- package/dist/engine/dmAll.js +117 -0
- package/dist/engine/dmAll.js.map +1 -0
- package/dist/engine/event-id.d.ts +2 -0
- package/dist/engine/event-id.d.ts.map +1 -0
- package/dist/engine/event-id.js +0 -0
- package/dist/engine/event-id.js.map +1 -0
- package/dist/engine/eventDelivery.d.ts +12 -0
- package/dist/engine/eventDelivery.d.ts.map +1 -0
- package/dist/engine/eventDelivery.js +103 -0
- package/dist/engine/eventDelivery.js.map +1 -0
- package/dist/engine/eventQueue.d.ts +6 -0
- package/dist/engine/eventQueue.d.ts.map +1 -0
- package/dist/engine/eventQueue.js +23 -0
- package/dist/engine/eventQueue.js.map +1 -0
- package/dist/engine/eventSubscription.d.ts +59 -0
- package/dist/engine/eventSubscription.d.ts.map +1 -0
- package/dist/engine/eventSubscription.js +74 -0
- package/dist/engine/eventSubscription.js.map +1 -0
- package/dist/engine/file.d.ts +43 -0
- package/dist/engine/file.d.ts.map +1 -0
- package/dist/engine/file.js +115 -0
- package/dist/engine/file.js.map +1 -0
- package/dist/engine/groupDm.d.ts +54 -0
- package/dist/engine/groupDm.d.ts.map +1 -0
- package/dist/engine/groupDm.js +262 -0
- package/dist/engine/groupDm.js.map +1 -0
- package/dist/engine/inboundWebhook.d.ts +45 -0
- package/dist/engine/inboundWebhook.d.ts.map +1 -0
- package/dist/engine/inboundWebhook.js +170 -0
- package/dist/engine/inboundWebhook.js.map +1 -0
- package/dist/engine/inbox.d.ts +34 -0
- package/dist/engine/inbox.d.ts.map +1 -0
- package/dist/engine/inbox.js +141 -0
- package/dist/engine/inbox.js.map +1 -0
- package/dist/engine/index.d.ts +10 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +10 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/message.d.ts +81 -0
- package/dist/engine/message.d.ts.map +1 -0
- package/dist/engine/message.js +293 -0
- package/dist/engine/message.js.map +1 -0
- package/dist/engine/presence.d.ts +12 -0
- package/dist/engine/presence.d.ts.map +1 -0
- package/dist/engine/presence.js +24 -0
- package/dist/engine/presence.js.map +1 -0
- package/dist/engine/reaction.d.ts +19 -0
- package/dist/engine/reaction.d.ts.map +1 -0
- package/dist/engine/reaction.js +97 -0
- package/dist/engine/reaction.js.map +1 -0
- package/dist/engine/receipt.d.ts +19 -0
- package/dist/engine/receipt.d.ts.map +1 -0
- package/dist/engine/receipt.js +96 -0
- package/dist/engine/receipt.js.map +1 -0
- package/dist/engine/resyncQuery.d.ts +15 -0
- package/dist/engine/resyncQuery.d.ts.map +1 -0
- package/dist/engine/resyncQuery.js +124 -0
- package/dist/engine/resyncQuery.js.map +1 -0
- package/dist/engine/routing.d.ts +45 -0
- package/dist/engine/routing.d.ts.map +1 -0
- package/dist/engine/routing.js +390 -0
- package/dist/engine/routing.js.map +1 -0
- package/dist/engine/search.d.ts +19 -0
- package/dist/engine/search.d.ts.map +1 -0
- package/dist/engine/search.js +60 -0
- package/dist/engine/search.js.map +1 -0
- package/dist/engine/searchQuery.d.ts +8 -0
- package/dist/engine/searchQuery.d.ts.map +1 -0
- package/dist/engine/searchQuery.js +19 -0
- package/dist/engine/searchQuery.js.map +1 -0
- package/dist/engine/sessionEvent.d.ts +29 -0
- package/dist/engine/sessionEvent.d.ts.map +1 -0
- package/dist/engine/sessionEvent.js +76 -0
- package/dist/engine/sessionEvent.js.map +1 -0
- package/dist/engine/snowflake.d.ts +14 -0
- package/dist/engine/snowflake.d.ts.map +1 -0
- package/dist/engine/snowflake.js +88 -0
- package/dist/engine/snowflake.js.map +1 -0
- package/dist/engine/systemPrompt.d.ts +13 -0
- package/dist/engine/systemPrompt.d.ts.map +1 -0
- package/dist/engine/systemPrompt.js +31 -0
- package/dist/engine/systemPrompt.js.map +1 -0
- package/dist/engine/thread.d.ts +56 -0
- package/dist/engine/thread.d.ts.map +1 -0
- package/dist/engine/thread.js +158 -0
- package/dist/engine/thread.js.map +1 -0
- package/dist/engine/tokenRotate.d.ts +8 -0
- package/dist/engine/tokenRotate.d.ts.map +1 -0
- package/dist/engine/tokenRotate.js +25 -0
- package/dist/engine/tokenRotate.js.map +1 -0
- package/dist/engine/usage.d.ts +16 -0
- package/dist/engine/usage.d.ts.map +1 -0
- package/dist/engine/usage.js +24 -0
- package/dist/engine/usage.js.map +1 -0
- package/dist/engine/workspace.d.ts +44 -0
- package/dist/engine/workspace.d.ts.map +1 -0
- package/dist/engine/workspace.js +127 -0
- package/dist/engine/workspace.js.map +1 -0
- package/dist/engine/wsTransform.d.ts +14 -0
- package/dist/engine/wsTransform.d.ts.map +1 -0
- package/dist/engine/wsTransform.js +196 -0
- package/dist/engine/wsTransform.js.map +1 -0
- package/dist/engine.d.ts +18 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +275 -0
- package/dist/engine.js.map +1 -0
- package/dist/entrypoints/node.d.ts +35 -0
- package/dist/entrypoints/node.d.ts.map +1 -0
- package/dist/entrypoints/node.js +114 -0
- package/dist/entrypoints/node.js.map +1 -0
- package/dist/env.d.ts +38 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +2 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/logger.d.ts +47 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +214 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/origin.d.ts +25 -0
- package/dist/lib/origin.d.ts.map +1 -0
- package/dist/lib/origin.js +80 -0
- package/dist/lib/origin.js.map +1 -0
- package/dist/lib/serverTelemetry.d.ts +12 -0
- package/dist/lib/serverTelemetry.d.ts.map +1 -0
- package/dist/lib/serverTelemetry.js +46 -0
- package/dist/lib/serverTelemetry.js.map +1 -0
- package/dist/lib/ssrf.d.ts +23 -0
- package/dist/lib/ssrf.d.ts.map +1 -0
- package/dist/lib/ssrf.js +57 -0
- package/dist/lib/ssrf.js.map +1 -0
- package/dist/lib/workspaceStream.d.ts +9 -0
- package/dist/lib/workspaceStream.d.ts.map +1 -0
- package/dist/lib/workspaceStream.js +53 -0
- package/dist/lib/workspaceStream.js.map +1 -0
- package/dist/middleware/auth.d.ts +9 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +40 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/engine-context.d.ts +9 -0
- package/dist/middleware/engine-context.d.ts.map +1 -0
- package/dist/middleware/engine-context.js +15 -0
- package/dist/middleware/engine-context.js.map +1 -0
- package/dist/middleware/idempotency.d.ts +24 -0
- package/dist/middleware/idempotency.d.ts.map +1 -0
- package/dist/middleware/idempotency.js +148 -0
- package/dist/middleware/idempotency.js.map +1 -0
- package/dist/middleware/logger.d.ts +4 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +163 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/planLimits.d.ts +5 -0
- package/dist/middleware/planLimits.d.ts.map +1 -0
- package/dist/middleware/planLimits.js +35 -0
- package/dist/middleware/planLimits.js.map +1 -0
- package/dist/middleware/presenceRefresh.d.ts +3 -0
- package/dist/middleware/presenceRefresh.d.ts.map +1 -0
- package/dist/middleware/presenceRefresh.js +18 -0
- package/dist/middleware/presenceRefresh.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +3 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/rateLimit.js +69 -0
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware/usageTracker.d.ts +3 -0
- package/dist/middleware/usageTracker.d.ts.map +1 -0
- package/dist/middleware/usageTracker.js +10 -0
- package/dist/middleware/usageTracker.js.map +1 -0
- package/dist/ports/auth.d.ts +45 -0
- package/dist/ports/auth.d.ts.map +1 -0
- package/dist/ports/auth.js +2 -0
- package/dist/ports/auth.js.map +1 -0
- package/dist/ports/database.d.ts +20 -0
- package/dist/ports/database.d.ts.map +1 -0
- package/dist/ports/database.js +2 -0
- package/dist/ports/database.js.map +1 -0
- package/dist/ports/entitlements.d.ts +25 -0
- package/dist/ports/entitlements.d.ts.map +1 -0
- package/dist/ports/entitlements.js +2 -0
- package/dist/ports/entitlements.js.map +1 -0
- package/dist/ports/event-queue.d.ts +19 -0
- package/dist/ports/event-queue.d.ts.map +1 -0
- package/dist/ports/event-queue.js +2 -0
- package/dist/ports/event-queue.js.map +1 -0
- package/dist/ports/files.d.ts +28 -0
- package/dist/ports/files.d.ts.map +1 -0
- package/dist/ports/files.js +2 -0
- package/dist/ports/files.js.map +1 -0
- package/dist/ports/index.d.ts +84 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/kv.d.ts +25 -0
- package/dist/ports/kv.d.ts.map +1 -0
- package/dist/ports/kv.js +2 -0
- package/dist/ports/kv.js.map +1 -0
- package/dist/ports/mcp.d.ts +18 -0
- package/dist/ports/mcp.d.ts.map +1 -0
- package/dist/ports/mcp.js +2 -0
- package/dist/ports/mcp.js.map +1 -0
- package/dist/ports/presence.d.ts +18 -0
- package/dist/ports/presence.d.ts.map +1 -0
- package/dist/ports/presence.js +2 -0
- package/dist/ports/presence.js.map +1 -0
- package/dist/ports/rate-limit.d.ts +20 -0
- package/dist/ports/rate-limit.d.ts.map +1 -0
- package/dist/ports/rate-limit.js +2 -0
- package/dist/ports/rate-limit.js.map +1 -0
- package/dist/ports/realtime.d.ts +104 -0
- package/dist/ports/realtime.d.ts.map +1 -0
- package/dist/ports/realtime.js +19 -0
- package/dist/ports/realtime.js.map +1 -0
- package/dist/ports/telemetry.d.ts +20 -0
- package/dist/ports/telemetry.d.ts.map +1 -0
- package/dist/ports/telemetry.js +2 -0
- package/dist/ports/telemetry.js.map +1 -0
- package/dist/providers/noop-telemetry.d.ts +13 -0
- package/dist/providers/noop-telemetry.d.ts.map +1 -0
- package/dist/providers/noop-telemetry.js +16 -0
- package/dist/providers/noop-telemetry.js.map +1 -0
- package/dist/providers/static-entitlements.d.ts +23 -0
- package/dist/providers/static-entitlements.d.ts.map +1 -0
- package/dist/providers/static-entitlements.js +42 -0
- package/dist/providers/static-entitlements.js.map +1 -0
- package/dist/routes/a2a.d.ts +4 -0
- package/dist/routes/a2a.d.ts.map +1 -0
- package/dist/routes/a2a.js +375 -0
- package/dist/routes/a2a.js.map +1 -0
- package/dist/routes/action.d.ts +4 -0
- package/dist/routes/action.d.ts.map +1 -0
- package/dist/routes/action.js +213 -0
- package/dist/routes/action.js.map +1 -0
- package/dist/routes/agent.d.ts +4 -0
- package/dist/routes/agent.d.ts.map +1 -0
- package/dist/routes/agent.js +431 -0
- package/dist/routes/agent.js.map +1 -0
- package/dist/routes/background.d.ts +13 -0
- package/dist/routes/background.d.ts.map +1 -0
- package/dist/routes/background.js +33 -0
- package/dist/routes/background.js.map +1 -0
- package/dist/routes/certify.d.ts +4 -0
- package/dist/routes/certify.d.ts.map +1 -0
- package/dist/routes/certify.js +119 -0
- package/dist/routes/certify.js.map +1 -0
- package/dist/routes/channel.d.ts +4 -0
- package/dist/routes/channel.d.ts.map +1 -0
- package/dist/routes/channel.js +492 -0
- package/dist/routes/channel.js.map +1 -0
- package/dist/routes/console.d.ts +4 -0
- package/dist/routes/console.d.ts.map +1 -0
- package/dist/routes/console.js +117 -0
- package/dist/routes/console.js.map +1 -0
- package/dist/routes/directory.d.ts +4 -0
- package/dist/routes/directory.d.ts.map +1 -0
- package/dist/routes/directory.js +236 -0
- package/dist/routes/directory.js.map +1 -0
- package/dist/routes/dm.d.ts +4 -0
- package/dist/routes/dm.d.ts.map +1 -0
- package/dist/routes/dm.js +157 -0
- package/dist/routes/dm.js.map +1 -0
- package/dist/routes/eventSubscription.d.ts +4 -0
- package/dist/routes/eventSubscription.d.ts.map +1 -0
- package/dist/routes/eventSubscription.js +115 -0
- package/dist/routes/eventSubscription.js.map +1 -0
- package/dist/routes/fanout.d.ts +17 -0
- package/dist/routes/fanout.d.ts.map +1 -0
- package/dist/routes/fanout.js +150 -0
- package/dist/routes/fanout.js.map +1 -0
- package/dist/routes/file.d.ts +4 -0
- package/dist/routes/file.d.ts.map +1 -0
- package/dist/routes/file.js +166 -0
- package/dist/routes/file.js.map +1 -0
- package/dist/routes/groupDm.d.ts +4 -0
- package/dist/routes/groupDm.d.ts.map +1 -0
- package/dist/routes/groupDm.js +204 -0
- package/dist/routes/groupDm.js.map +1 -0
- package/dist/routes/health.d.ts +4 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +10 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/inboundWebhook.d.ts +4 -0
- package/dist/routes/inboundWebhook.d.ts.map +1 -0
- package/dist/routes/inboundWebhook.js +149 -0
- package/dist/routes/inboundWebhook.js.map +1 -0
- package/dist/routes/inbox.d.ts +4 -0
- package/dist/routes/inbox.d.ts.map +1 -0
- package/dist/routes/inbox.js +23 -0
- package/dist/routes/inbox.js.map +1 -0
- package/dist/routes/message.d.ts +4 -0
- package/dist/routes/message.d.ts.map +1 -0
- package/dist/routes/message.js +164 -0
- package/dist/routes/message.js.map +1 -0
- package/dist/routes/presence.d.ts +4 -0
- package/dist/routes/presence.d.ts.map +1 -0
- package/dist/routes/presence.js +70 -0
- package/dist/routes/presence.js.map +1 -0
- package/dist/routes/reaction.d.ts +4 -0
- package/dist/routes/reaction.d.ts.map +1 -0
- package/dist/routes/reaction.js +152 -0
- package/dist/routes/reaction.js.map +1 -0
- package/dist/routes/receipt.d.ts +4 -0
- package/dist/routes/receipt.d.ts.map +1 -0
- package/dist/routes/receipt.js +100 -0
- package/dist/routes/receipt.js.map +1 -0
- package/dist/routes/routing.d.ts +4 -0
- package/dist/routes/routing.d.ts.map +1 -0
- package/dist/routes/routing.js +186 -0
- package/dist/routes/routing.js.map +1 -0
- package/dist/routes/search.d.ts +4 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +48 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/systemPrompt.d.ts +4 -0
- package/dist/routes/systemPrompt.d.ts.map +1 -0
- package/dist/routes/systemPrompt.js +66 -0
- package/dist/routes/systemPrompt.js.map +1 -0
- package/dist/routes/thread.d.ts +4 -0
- package/dist/routes/thread.d.ts.map +1 -0
- package/dist/routes/thread.js +126 -0
- package/dist/routes/thread.js.map +1 -0
- package/dist/routes/workspace.d.ts +4 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +355 -0
- package/dist/routes/workspace.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import type { EngineDb } from '../../ports/database.js';
|
|
3
|
+
export interface SqliteDbHandle {
|
|
4
|
+
db: EngineDb;
|
|
5
|
+
/** The raw better-sqlite3 connection (for migrations, pragmas, backups). */
|
|
6
|
+
sqlite: Database.Database;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Open a SQLite-backed {@link EngineDb} for self-host. Pass a file path
|
|
10
|
+
* (created if absent) or `':memory:'` for tests. Sets WAL + foreign keys.
|
|
11
|
+
*
|
|
12
|
+
* The better-sqlite3 driver is synchronous; Drizzle query builders are thenable
|
|
13
|
+
* so the engine's `await db.select()...` works unchanged. The handle is cast to
|
|
14
|
+
* the async {@link EngineDb} surface once here.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getSqliteDb(path: string): SqliteDbHandle;
|
|
17
|
+
/**
|
|
18
|
+
* Apply the engine's SQL migrations to a fresh/old SQLite database, in order.
|
|
19
|
+
* Tracks applied files in a `_engine_migrations` table so repeated boots are
|
|
20
|
+
* idempotent. Runs each migration file as a single script.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runMigrations(handle: SqliteDbHandle): {
|
|
23
|
+
applied: string[];
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC;IACb,4EAA4E;IAC5E,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAMxD;AAeD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAuC3E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
6
|
+
import * as schema from '../../db/schema.js';
|
|
7
|
+
/**
|
|
8
|
+
* Open a SQLite-backed {@link EngineDb} for self-host. Pass a file path
|
|
9
|
+
* (created if absent) or `':memory:'` for tests. Sets WAL + foreign keys.
|
|
10
|
+
*
|
|
11
|
+
* The better-sqlite3 driver is synchronous; Drizzle query builders are thenable
|
|
12
|
+
* so the engine's `await db.select()...` works unchanged. The handle is cast to
|
|
13
|
+
* the async {@link EngineDb} surface once here.
|
|
14
|
+
*/
|
|
15
|
+
export function getSqliteDb(path) {
|
|
16
|
+
const sqlite = new Database(path);
|
|
17
|
+
sqlite.pragma('journal_mode = WAL');
|
|
18
|
+
sqlite.pragma('foreign_keys = ON');
|
|
19
|
+
const db = drizzle(sqlite, { schema });
|
|
20
|
+
return { db, sqlite };
|
|
21
|
+
}
|
|
22
|
+
function migrationsDir() {
|
|
23
|
+
// dist/adapters/node/database.js -> dist/db/migrations
|
|
24
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
const candidates = [
|
|
26
|
+
join(here, '../../db/migrations'),
|
|
27
|
+
join(here, '../../../src/db/migrations'),
|
|
28
|
+
];
|
|
29
|
+
for (const dir of candidates) {
|
|
30
|
+
if (existsSync(dir))
|
|
31
|
+
return dir;
|
|
32
|
+
}
|
|
33
|
+
return candidates[0];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Apply the engine's SQL migrations to a fresh/old SQLite database, in order.
|
|
37
|
+
* Tracks applied files in a `_engine_migrations` table so repeated boots are
|
|
38
|
+
* idempotent. Runs each migration file as a single script.
|
|
39
|
+
*/
|
|
40
|
+
export function runMigrations(handle) {
|
|
41
|
+
const { sqlite } = handle;
|
|
42
|
+
sqlite.exec(`CREATE TABLE IF NOT EXISTS _engine_migrations (name TEXT PRIMARY KEY, applied_at INTEGER NOT NULL)`);
|
|
43
|
+
const done = new Set(sqlite
|
|
44
|
+
.prepare(`SELECT name FROM _engine_migrations`)
|
|
45
|
+
.all()
|
|
46
|
+
.map((r) => r.name));
|
|
47
|
+
const dir = migrationsDir();
|
|
48
|
+
const files = readdirSync(dir)
|
|
49
|
+
.filter((f) => f.endsWith('.sql'))
|
|
50
|
+
.sort();
|
|
51
|
+
const applied = [];
|
|
52
|
+
const insert = sqlite.prepare(`INSERT INTO _engine_migrations (name, applied_at) VALUES (?, ?)`);
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
if (done.has(file))
|
|
55
|
+
continue;
|
|
56
|
+
// drizzle-kit separates statements with `--> statement-breakpoint`; SQLite's
|
|
57
|
+
// `exec` runs the whole script. Apply the DDL and record the migration as
|
|
58
|
+
// applied in one transaction so a crash mid-migration can't leave the schema
|
|
59
|
+
// changed but unrecorded (which would replay and fail on the next boot).
|
|
60
|
+
// drizzle migrations never contain their own BEGIN/COMMIT, so this won't nest.
|
|
61
|
+
const ddl = readFileSync(join(dir, file), 'utf8').replace(/-->\s*statement-breakpoint/g, '');
|
|
62
|
+
const applyOne = sqlite.transaction(() => {
|
|
63
|
+
sqlite.exec(ddl);
|
|
64
|
+
insert.run(file, Math.floor(Date.now() / 1000));
|
|
65
|
+
});
|
|
66
|
+
applyOne();
|
|
67
|
+
applied.push(file);
|
|
68
|
+
}
|
|
69
|
+
return { applied };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EventQueue, QueuedEvent } from '../../ports/event-queue.js';
|
|
2
|
+
import type { EngineDb } from '../../ports/database.js';
|
|
3
|
+
/**
|
|
4
|
+
* In-process webhook delivery, replacing the Cloudflare Queue + consumer Worker.
|
|
5
|
+
* `send` returns immediately and delivery runs in the background via
|
|
6
|
+
* `deliverEvent` (which fans out to the workspace's registered subscribers).
|
|
7
|
+
* Single-process best-effort: failures are logged, not retried across restarts.
|
|
8
|
+
*/
|
|
9
|
+
export declare class InProcessEventQueue implements EventQueue {
|
|
10
|
+
private readonly db;
|
|
11
|
+
private readonly onError;
|
|
12
|
+
constructor(db: EngineDb, onError?: (err: unknown, ctx: Record<string, unknown>) => void);
|
|
13
|
+
send(message: QueuedEvent): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=event-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/event-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IAElD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAe;IAGrF,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAUhD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { deliverEvent } from '../../engine/eventDelivery.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-process webhook delivery, replacing the Cloudflare Queue + consumer Worker.
|
|
4
|
+
* `send` returns immediately and delivery runs in the background via
|
|
5
|
+
* `deliverEvent` (which fans out to the workspace's registered subscribers).
|
|
6
|
+
* Single-process best-effort: failures are logged, not retried across restarts.
|
|
7
|
+
*/
|
|
8
|
+
export class InProcessEventQueue {
|
|
9
|
+
db;
|
|
10
|
+
onError;
|
|
11
|
+
constructor(db, onError = () => { }) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
this.onError = onError;
|
|
14
|
+
}
|
|
15
|
+
async send(message) {
|
|
16
|
+
// Fire-and-forget; do not block the request path on delivery.
|
|
17
|
+
void (async () => {
|
|
18
|
+
try {
|
|
19
|
+
await deliverEvent(this.db, message.workspaceId, message.type, message.data);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
this.onError(err, { source: 'node.event_queue', event_type: message.type });
|
|
23
|
+
}
|
|
24
|
+
})();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=event-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../../src/adapters/node/event-queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IAEX;IACA;IAFnB,YACmB,EAAY,EACZ,UAAgE,GAAG,EAAE,GAAE,CAAC;QADxE,OAAE,GAAF,EAAE,CAAU;QACZ,YAAO,GAAP,OAAO,CAAiE;IACxF,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,8DAA8D;QAC9D,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { FileStorage } from '../../ports/files.js';
|
|
2
|
+
interface TokenPayload {
|
|
3
|
+
key: string;
|
|
4
|
+
op: 'put' | 'get';
|
|
5
|
+
exp: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Local-filesystem file storage replacing Cloudflare R2 for self-host. Blobs are
|
|
9
|
+
* written under `dir`; upload/download URLs are short-lived HMAC-signed links
|
|
10
|
+
* pointing back at the engine-mounted handler ({@link createFileRouteHandler}),
|
|
11
|
+
* so the client PUT/GET flow matches the hosted (presigned-R2) experience.
|
|
12
|
+
*/
|
|
13
|
+
export declare class LocalFileStorage implements FileStorage {
|
|
14
|
+
private readonly dir;
|
|
15
|
+
private readonly baseUrl;
|
|
16
|
+
private readonly secret;
|
|
17
|
+
constructor(dir: string, baseUrl: string, secret: string);
|
|
18
|
+
private sign;
|
|
19
|
+
private url;
|
|
20
|
+
createUploadUrl(args: {
|
|
21
|
+
storageKey: string;
|
|
22
|
+
contentType: string;
|
|
23
|
+
sizeBytes: number;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
uploadUrl: string;
|
|
26
|
+
expiresAt: string;
|
|
27
|
+
}>;
|
|
28
|
+
createDownloadUrl(args: {
|
|
29
|
+
storageKey: string;
|
|
30
|
+
}): Promise<string>;
|
|
31
|
+
/** Resolve a storage key to an absolute path under `dir`, rejecting traversal. */
|
|
32
|
+
private resolvePath;
|
|
33
|
+
verify(token: string | null): TokenPayload | null;
|
|
34
|
+
write(key: string, bytes: Buffer, contentType: string): Promise<void>;
|
|
35
|
+
read(key: string): Promise<{
|
|
36
|
+
bytes: Buffer;
|
|
37
|
+
contentType: string;
|
|
38
|
+
} | null>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build a `fetch`-style handler for `${ROUTE_PREFIX}` PUT/GET. The Node
|
|
42
|
+
* entrypoint mounts it so signed upload/download URLs resolve.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createFileRouteHandler(storage: LocalFileStorage): (request: Request) => Promise<Response>;
|
|
45
|
+
export declare const FILE_ROUTE_PREFIX = "/_relayfiles";
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKxD,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAEhD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGjC,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,GAAG;IAKL,eAAe,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAQxI,iBAAiB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,kFAAkF;IAClF,OAAO,CAAC,WAAW;IASnB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI;IAmB3C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAahF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,IAChD,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CA2BnD;AAED,eAAO,MAAM,iBAAiB,iBAAe,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, normalize, sep } from 'node:path';
|
|
4
|
+
const URL_TTL_SECONDS = 3600;
|
|
5
|
+
const ROUTE_PREFIX = '/_relayfiles';
|
|
6
|
+
/**
|
|
7
|
+
* Local-filesystem file storage replacing Cloudflare R2 for self-host. Blobs are
|
|
8
|
+
* written under `dir`; upload/download URLs are short-lived HMAC-signed links
|
|
9
|
+
* pointing back at the engine-mounted handler ({@link createFileRouteHandler}),
|
|
10
|
+
* so the client PUT/GET flow matches the hosted (presigned-R2) experience.
|
|
11
|
+
*/
|
|
12
|
+
export class LocalFileStorage {
|
|
13
|
+
dir;
|
|
14
|
+
baseUrl;
|
|
15
|
+
secret;
|
|
16
|
+
constructor(dir, baseUrl, secret) {
|
|
17
|
+
this.dir = dir;
|
|
18
|
+
this.baseUrl = baseUrl;
|
|
19
|
+
this.secret = secret;
|
|
20
|
+
}
|
|
21
|
+
sign(payload) {
|
|
22
|
+
const body = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
23
|
+
const mac = createHmac('sha256', this.secret).update(body).digest('base64url');
|
|
24
|
+
return `${body}.${mac}`;
|
|
25
|
+
}
|
|
26
|
+
url(payload) {
|
|
27
|
+
const base = this.baseUrl.replace(/\/$/, '');
|
|
28
|
+
return `${base}${ROUTE_PREFIX}?token=${this.sign(payload)}`;
|
|
29
|
+
}
|
|
30
|
+
async createUploadUrl(args) {
|
|
31
|
+
const exp = Math.floor(Date.now() / 1000) + URL_TTL_SECONDS;
|
|
32
|
+
return {
|
|
33
|
+
uploadUrl: this.url({ key: args.storageKey, op: 'put', exp }),
|
|
34
|
+
expiresAt: new Date(exp * 1000).toISOString(),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async createDownloadUrl(args) {
|
|
38
|
+
const exp = Math.floor(Date.now() / 1000) + URL_TTL_SECONDS;
|
|
39
|
+
return this.url({ key: args.storageKey, op: 'get', exp });
|
|
40
|
+
}
|
|
41
|
+
/** Resolve a storage key to an absolute path under `dir`, rejecting traversal. */
|
|
42
|
+
resolvePath(key) {
|
|
43
|
+
const rel = normalize(key).replace(/^(\.\.(\/|\\|$))+/, '');
|
|
44
|
+
const abs = join(this.dir, rel);
|
|
45
|
+
if (!abs.startsWith(this.dir + sep) && abs !== this.dir) {
|
|
46
|
+
throw Object.assign(new Error('invalid storage key'), { code: 'invalid_key', status: 400 });
|
|
47
|
+
}
|
|
48
|
+
return abs;
|
|
49
|
+
}
|
|
50
|
+
verify(token) {
|
|
51
|
+
if (!token)
|
|
52
|
+
return null;
|
|
53
|
+
const dot = token.lastIndexOf('.');
|
|
54
|
+
if (dot < 0)
|
|
55
|
+
return null;
|
|
56
|
+
const body = token.slice(0, dot);
|
|
57
|
+
const mac = token.slice(dot + 1);
|
|
58
|
+
const expected = createHmac('sha256', this.secret).update(body).digest('base64url');
|
|
59
|
+
const a = Buffer.from(mac);
|
|
60
|
+
const b = Buffer.from(expected);
|
|
61
|
+
if (a.length !== b.length || !timingSafeEqual(a, b))
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
const payload = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
|
|
65
|
+
if (payload.exp * 1000 < Date.now())
|
|
66
|
+
return null;
|
|
67
|
+
return payload;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async write(key, bytes, contentType) {
|
|
74
|
+
const path = this.resolvePath(key);
|
|
75
|
+
await mkdir(dirname(path), { recursive: true });
|
|
76
|
+
await writeFile(path, bytes);
|
|
77
|
+
await writeFile(`${path}.ct`, contentType || 'application/octet-stream');
|
|
78
|
+
}
|
|
79
|
+
async read(key) {
|
|
80
|
+
const path = this.resolvePath(key);
|
|
81
|
+
try {
|
|
82
|
+
const bytes = await readFile(path);
|
|
83
|
+
let contentType = 'application/octet-stream';
|
|
84
|
+
try {
|
|
85
|
+
contentType = (await readFile(`${path}.ct`, 'utf8')).trim() || contentType;
|
|
86
|
+
}
|
|
87
|
+
catch { /* no sidecar */ }
|
|
88
|
+
return { bytes, contentType };
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Build a `fetch`-style handler for `${ROUTE_PREFIX}` PUT/GET. The Node
|
|
97
|
+
* entrypoint mounts it so signed upload/download URLs resolve.
|
|
98
|
+
*/
|
|
99
|
+
export function createFileRouteHandler(storage) {
|
|
100
|
+
return async (request) => {
|
|
101
|
+
const url = new URL(request.url);
|
|
102
|
+
const payload = storage.verify(url.searchParams.get('token'));
|
|
103
|
+
if (!payload) {
|
|
104
|
+
return Response.json({ ok: false, error: { code: 'forbidden', message: 'Invalid or expired token' } }, { status: 403 });
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
if (request.method === 'PUT' && payload.op === 'put') {
|
|
108
|
+
const bytes = Buffer.from(await request.arrayBuffer());
|
|
109
|
+
await storage.write(payload.key, bytes, request.headers.get('content-type') ?? 'application/octet-stream');
|
|
110
|
+
return Response.json({ ok: true });
|
|
111
|
+
}
|
|
112
|
+
if (request.method === 'GET' && payload.op === 'get') {
|
|
113
|
+
const file = await storage.read(payload.key);
|
|
114
|
+
if (!file) {
|
|
115
|
+
return Response.json({ ok: false, error: { code: 'not_found', message: 'File not found' } }, { status: 404 });
|
|
116
|
+
}
|
|
117
|
+
return new Response(new Uint8Array(file.bytes), { status: 200, headers: { 'content-type': file.contentType } });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const e = err;
|
|
122
|
+
return Response.json({ ok: false, error: { code: 'file_error', message: e.message ?? 'error' } }, { status: e.status ?? 500 });
|
|
123
|
+
}
|
|
124
|
+
return Response.json({ ok: false, error: { code: 'method_not_allowed', message: 'Token/method mismatch' } }, { status: 405 });
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export const FILE_ROUTE_PREFIX = ROUTE_PREFIX;
|
|
128
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/adapters/node/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { EngineDeps, EngineConfig } from '../../ports/index.js';
|
|
2
|
+
import type { AuthProvider } from '../../ports/auth.js';
|
|
3
|
+
import type { EntitlementsProvider } from '../../ports/entitlements.js';
|
|
4
|
+
import type { TelemetrySink } from '../../ports/telemetry.js';
|
|
5
|
+
import { getSqliteDb, runMigrations, type SqliteDbHandle } from './database.js';
|
|
6
|
+
import { InProcessRealtime } from './realtime.js';
|
|
7
|
+
import { InProcessPresence, type InProcessPresenceOptions } from './presence.js';
|
|
8
|
+
import { InProcessRateLimiter } from './rate-limit.js';
|
|
9
|
+
import { InProcessKeyValueStore } from './kv.js';
|
|
10
|
+
import { InProcessEventQueue } from './event-queue.js';
|
|
11
|
+
import { InProcessMcpSessionHost } from './mcp.js';
|
|
12
|
+
import { LocalFileStorage, createFileRouteHandler, FILE_ROUTE_PREFIX } from './files.js';
|
|
13
|
+
export { InProcessRealtime, InProcessPresence, InProcessRateLimiter, InProcessKeyValueStore, InProcessEventQueue, InProcessMcpSessionHost, LocalFileStorage, createFileRouteHandler, FILE_ROUTE_PREFIX, getSqliteDb, runMigrations, };
|
|
14
|
+
export type { EngineSocket, SocketHandle } from './realtime.js';
|
|
15
|
+
export type { SqliteDbHandle } from './database.js';
|
|
16
|
+
export type { InProcessPresenceOptions } from './presence.js';
|
|
17
|
+
export interface NodeRuntimeOptions {
|
|
18
|
+
/** SQLite file path, or ':memory:' for tests. */
|
|
19
|
+
dbPath: string;
|
|
20
|
+
/** This server's own origin, used for signed file URLs and the MCP base URL. */
|
|
21
|
+
baseUrl: string;
|
|
22
|
+
/** Directory blobs are written to. Default: `<cwd>/relaycast-files`. */
|
|
23
|
+
fileDir?: string;
|
|
24
|
+
/** HMAC secret for signed file URLs. Default: a random per-process secret. */
|
|
25
|
+
fileSecret?: string;
|
|
26
|
+
/** Run migrations on startup. Default: true. */
|
|
27
|
+
migrate?: boolean;
|
|
28
|
+
/** Override the auth provider (default: built-in API-key auth). */
|
|
29
|
+
auth?: AuthProvider;
|
|
30
|
+
/** Override the entitlements provider (default: static, kv-backed usage). */
|
|
31
|
+
entitlements?: EntitlementsProvider;
|
|
32
|
+
/** Override the telemetry sink (default: no-op). */
|
|
33
|
+
telemetry?: TelemetrySink;
|
|
34
|
+
/** Engine config (environment, version, workspace-stream default, etc.). */
|
|
35
|
+
config?: EngineConfig;
|
|
36
|
+
/** Presence TTL / sweep tuning (tests use short windows). */
|
|
37
|
+
presence?: InProcessPresenceOptions;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The assembled Node runtime: the {@link EngineDeps} to pass to `createEngine`,
|
|
41
|
+
* plus the concrete adapters the entrypoint needs to wire WebSocket upgrades,
|
|
42
|
+
* serve files, and shut down cleanly.
|
|
43
|
+
*/
|
|
44
|
+
export interface NodeRuntime {
|
|
45
|
+
deps: EngineDeps;
|
|
46
|
+
realtime: InProcessRealtime;
|
|
47
|
+
presence: InProcessPresence;
|
|
48
|
+
/** `fetch`-style handler for the `${FILE_ROUTE_PREFIX}` upload/download routes. */
|
|
49
|
+
fileHandler: (request: Request) => Promise<Response>;
|
|
50
|
+
handle: SqliteDbHandle;
|
|
51
|
+
/** Release timers + the database connection. */
|
|
52
|
+
close(): void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Construct the in-process Node + SQLite runtime. Wires the realtime bus to the
|
|
56
|
+
* presence tracker, opens (and optionally migrates) the database, and returns
|
|
57
|
+
* everything `createEngine` and the entrypoint need.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createNodeRuntime(options: NodeRuntimeOptions): NodeRuntime;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzF,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACX,aAAa,GACd,CAAC;AACF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,oDAAoD;IACpD,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,wBAAwB,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,mFAAmF;IACnF,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,EAAE,cAAc,CAAC;IACvB,gDAAgD;IAChD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CA+D1E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { SqliteApiKeyAuthProvider } from '../../auth/index.js';
|
|
3
|
+
import { StaticEntitlementsProvider } from '../../providers/static-entitlements.js';
|
|
4
|
+
import { NoopTelemetrySink } from '../../providers/noop-telemetry.js';
|
|
5
|
+
import { getSqliteDb, runMigrations } from './database.js';
|
|
6
|
+
import { InProcessRealtime } from './realtime.js';
|
|
7
|
+
import { InProcessPresence } from './presence.js';
|
|
8
|
+
import { InProcessRateLimiter } from './rate-limit.js';
|
|
9
|
+
import { InProcessKeyValueStore } from './kv.js';
|
|
10
|
+
import { InProcessEventQueue } from './event-queue.js';
|
|
11
|
+
import { InProcessMcpSessionHost } from './mcp.js';
|
|
12
|
+
import { LocalFileStorage, createFileRouteHandler, FILE_ROUTE_PREFIX } from './files.js';
|
|
13
|
+
export { InProcessRealtime, InProcessPresence, InProcessRateLimiter, InProcessKeyValueStore, InProcessEventQueue, InProcessMcpSessionHost, LocalFileStorage, createFileRouteHandler, FILE_ROUTE_PREFIX, getSqliteDb, runMigrations, };
|
|
14
|
+
/**
|
|
15
|
+
* Construct the in-process Node + SQLite runtime. Wires the realtime bus to the
|
|
16
|
+
* presence tracker, opens (and optionally migrates) the database, and returns
|
|
17
|
+
* everything `createEngine` and the entrypoint need.
|
|
18
|
+
*/
|
|
19
|
+
export function createNodeRuntime(options) {
|
|
20
|
+
const handle = getSqliteDb(options.dbPath);
|
|
21
|
+
if (options.migrate !== false) {
|
|
22
|
+
try {
|
|
23
|
+
runMigrations(handle);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
// Don't leak the open file handle if startup migrations fail.
|
|
27
|
+
try {
|
|
28
|
+
handle.sqlite.close();
|
|
29
|
+
}
|
|
30
|
+
catch { /* ignore */ }
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const db = handle.db;
|
|
35
|
+
const telemetry = options.telemetry ?? new NoopTelemetrySink();
|
|
36
|
+
const realtime = new InProcessRealtime(db);
|
|
37
|
+
const presence = new InProcessPresence(realtime, options.presence);
|
|
38
|
+
realtime.setPresence(presence);
|
|
39
|
+
const rateLimiter = new InProcessRateLimiter();
|
|
40
|
+
const kv = new InProcessKeyValueStore();
|
|
41
|
+
const fileStorage = new LocalFileStorage(options.fileDir ?? `${process.cwd()}/relaycast-files`, options.baseUrl, options.fileSecret ?? randomBytes(32).toString('hex'));
|
|
42
|
+
const webhookQueue = new InProcessEventQueue(db, (err, ctx) => telemetry.captureException(err, ctx));
|
|
43
|
+
const mcp = new InProcessMcpSessionHost({ baseUrl: options.baseUrl });
|
|
44
|
+
const auth = options.auth ?? new SqliteApiKeyAuthProvider();
|
|
45
|
+
const entitlements = options.entitlements ?? new StaticEntitlementsProvider(kv);
|
|
46
|
+
const deps = {
|
|
47
|
+
db,
|
|
48
|
+
realtime,
|
|
49
|
+
connections: realtime,
|
|
50
|
+
presence,
|
|
51
|
+
rateLimiter,
|
|
52
|
+
mcp,
|
|
53
|
+
files: fileStorage,
|
|
54
|
+
kv,
|
|
55
|
+
webhookQueue,
|
|
56
|
+
auth,
|
|
57
|
+
entitlements,
|
|
58
|
+
telemetry,
|
|
59
|
+
config: options.config ?? {},
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
deps,
|
|
63
|
+
realtime,
|
|
64
|
+
presence,
|
|
65
|
+
fileHandler: createFileRouteHandler(fileStorage),
|
|
66
|
+
handle,
|
|
67
|
+
close() {
|
|
68
|
+
presence.stop();
|
|
69
|
+
kv.dispose();
|
|
70
|
+
try {
|
|
71
|
+
handle.sqlite.close();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// already closed
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/node/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { KeyValueStore } from '../../ports/kv.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory key/value store with TTL, replacing the Cloudflare KV namespace for
|
|
4
|
+
* idempotency records/locks and usage counters. Single-process; values are lost
|
|
5
|
+
* on restart (idempotency windows and usage counters reset — acceptable for
|
|
6
|
+
* self-host). A SQLite-backed variant could persist these behind the same port.
|
|
7
|
+
*
|
|
8
|
+
* A periodic sweep reclaims expired entries that are never read again, so the
|
|
9
|
+
* map can't grow unbounded from one-shot keys (e.g. idempotency locks).
|
|
10
|
+
*/
|
|
11
|
+
export declare class InProcessKeyValueStore implements KeyValueStore {
|
|
12
|
+
private readonly store;
|
|
13
|
+
private timer;
|
|
14
|
+
constructor(pruneIntervalMs?: number);
|
|
15
|
+
/** Drop all expired entries. Runs periodically and is safe to call manually. */
|
|
16
|
+
prune(): void;
|
|
17
|
+
/** Stop the prune timer (server shutdown / test teardown). */
|
|
18
|
+
dispose(): void;
|
|
19
|
+
private live;
|
|
20
|
+
get(key: string): Promise<string | null>;
|
|
21
|
+
put(key: string, value: string, options?: {
|
|
22
|
+
expirationTtl?: number;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
delete(key: string): Promise<void>;
|
|
25
|
+
increment(key: string, delta: number): Promise<number>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkE;IACxF,OAAO,CAAC,KAAK,CAA6C;gBAE9C,eAAe,GAAE,MAAkC;IAO/D,gFAAgF;IAChF,KAAK,IAAI,IAAI;IAOb,8DAA8D;IAC9D,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,IAAI;IAUN,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAY7D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const DEFAULT_PRUNE_INTERVAL_MS = 60_000;
|
|
2
|
+
/**
|
|
3
|
+
* In-memory key/value store with TTL, replacing the Cloudflare KV namespace for
|
|
4
|
+
* idempotency records/locks and usage counters. Single-process; values are lost
|
|
5
|
+
* on restart (idempotency windows and usage counters reset — acceptable for
|
|
6
|
+
* self-host). A SQLite-backed variant could persist these behind the same port.
|
|
7
|
+
*
|
|
8
|
+
* A periodic sweep reclaims expired entries that are never read again, so the
|
|
9
|
+
* map can't grow unbounded from one-shot keys (e.g. idempotency locks).
|
|
10
|
+
*/
|
|
11
|
+
export class InProcessKeyValueStore {
|
|
12
|
+
store = new Map();
|
|
13
|
+
timer;
|
|
14
|
+
constructor(pruneIntervalMs = DEFAULT_PRUNE_INTERVAL_MS) {
|
|
15
|
+
if (pruneIntervalMs > 0) {
|
|
16
|
+
this.timer = setInterval(() => this.prune(), pruneIntervalMs);
|
|
17
|
+
this.timer.unref?.();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Drop all expired entries. Runs periodically and is safe to call manually. */
|
|
21
|
+
prune() {
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
for (const [key, entry] of this.store) {
|
|
24
|
+
if (entry.expiresAt !== null && entry.expiresAt <= now)
|
|
25
|
+
this.store.delete(key);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Stop the prune timer (server shutdown / test teardown). */
|
|
29
|
+
dispose() {
|
|
30
|
+
if (this.timer)
|
|
31
|
+
clearInterval(this.timer);
|
|
32
|
+
this.timer = undefined;
|
|
33
|
+
}
|
|
34
|
+
live(key) {
|
|
35
|
+
const entry = this.store.get(key);
|
|
36
|
+
if (!entry)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (entry.expiresAt !== null && entry.expiresAt <= Date.now()) {
|
|
39
|
+
this.store.delete(key);
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return entry;
|
|
43
|
+
}
|
|
44
|
+
async get(key) {
|
|
45
|
+
return this.live(key)?.value ?? null;
|
|
46
|
+
}
|
|
47
|
+
async put(key, value, options) {
|
|
48
|
+
const expiresAt = options?.expirationTtl ? Date.now() + options.expirationTtl * 1000 : null;
|
|
49
|
+
this.store.set(key, { value, expiresAt });
|
|
50
|
+
}
|
|
51
|
+
async delete(key) {
|
|
52
|
+
this.store.delete(key);
|
|
53
|
+
}
|
|
54
|
+
async increment(key, delta) {
|
|
55
|
+
// Single-process: there is no await between read and write, so this is
|
|
56
|
+
// atomic with respect to other JS turns — no lost-update window.
|
|
57
|
+
const raw = this.live(key)?.value;
|
|
58
|
+
// Treat missing or non-integer values as 0 (avoid parseInt's partial parse
|
|
59
|
+
// of e.g. "12abc" → 12).
|
|
60
|
+
const current = raw !== undefined && /^-?\d+$/.test(raw) ? parseInt(raw, 10) : 0;
|
|
61
|
+
const next = current + delta;
|
|
62
|
+
const existing = this.store.get(key);
|
|
63
|
+
this.store.set(key, { value: String(next), expiresAt: existing?.expiresAt ?? null });
|
|
64
|
+
return next;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=kv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../../../src/adapters/node/kv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpSessionHost } from '../../ports/mcp.js';
|
|
2
|
+
export interface InProcessMcpOptions {
|
|
3
|
+
/** Base URL the MCP server's tools call back into (this server's own origin). */
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* In-process MCP Streamable-HTTP session host, replacing McpSessionDO. Sessions
|
|
8
|
+
* are held in a `Map` keyed by a generated UUID; an unknown/closed session id
|
|
9
|
+
* returns the same 404 a hosted (evicted-DO) session would, so clients
|
|
10
|
+
* re-initialize identically.
|
|
11
|
+
*/
|
|
12
|
+
export declare class InProcessMcpSessionHost implements McpSessionHost {
|
|
13
|
+
private readonly options;
|
|
14
|
+
private readonly sessions;
|
|
15
|
+
constructor(options?: InProcessMcpOptions);
|
|
16
|
+
handle(request: Request, sessionId: string | undefined): Promise<Response>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/mcp.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOzD,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,cAAc;IAGhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;gBAE1B,OAAO,GAAE,mBAAwB;IAExD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;CA4CjF"}
|