@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,163 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { createRequestLogger } from '../lib/logger.js';
|
|
3
|
+
import { deriveClientName, extractHarness, extractOriginInfo } from '../lib/origin.js';
|
|
4
|
+
function getExecutionCtx(c) {
|
|
5
|
+
try {
|
|
6
|
+
const executionCtx = c.executionCtx;
|
|
7
|
+
if (executionCtx && typeof executionCtx.waitUntil === 'function')
|
|
8
|
+
return executionCtx;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
// Hono's test context can throw when executionCtx is accessed.
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
function sanitizeReason(reason) {
|
|
16
|
+
return reason.replace(/\s+/g, ' ').trim().slice(0, 200);
|
|
17
|
+
}
|
|
18
|
+
function parseBearerToken(authorization) {
|
|
19
|
+
if (!authorization)
|
|
20
|
+
return undefined;
|
|
21
|
+
const [scheme, rawToken] = authorization.split(' ');
|
|
22
|
+
if (scheme?.toLowerCase() !== 'bearer' || !rawToken)
|
|
23
|
+
return undefined;
|
|
24
|
+
return rawToken;
|
|
25
|
+
}
|
|
26
|
+
function tokenType(token) {
|
|
27
|
+
if (token.startsWith('at_live_'))
|
|
28
|
+
return 'agent';
|
|
29
|
+
if (token.startsWith('rk_live_'))
|
|
30
|
+
return 'workspace';
|
|
31
|
+
return 'unknown';
|
|
32
|
+
}
|
|
33
|
+
function hashIdentifier(value) {
|
|
34
|
+
return crypto.createHash('sha256').update(value).digest('hex').slice(0, 16);
|
|
35
|
+
}
|
|
36
|
+
function routeGroupForPath(path) {
|
|
37
|
+
if (path === '/v1/ws')
|
|
38
|
+
return 'ws';
|
|
39
|
+
if (path === '/mcp')
|
|
40
|
+
return 'mcp';
|
|
41
|
+
if (path.startsWith('/v1/'))
|
|
42
|
+
return 'api_v1';
|
|
43
|
+
if (path.startsWith('/.well-known/'))
|
|
44
|
+
return 'well_known';
|
|
45
|
+
if (path.startsWith('/health'))
|
|
46
|
+
return 'health';
|
|
47
|
+
return 'other';
|
|
48
|
+
}
|
|
49
|
+
function classifyAuthScheme(authHeader, queryToken) {
|
|
50
|
+
if (authHeader) {
|
|
51
|
+
const bearerToken = parseBearerToken(authHeader);
|
|
52
|
+
if (!bearerToken)
|
|
53
|
+
return 'authorization_other';
|
|
54
|
+
const type = tokenType(bearerToken);
|
|
55
|
+
if (type === 'agent')
|
|
56
|
+
return 'bearer_agent_token';
|
|
57
|
+
if (type === 'workspace')
|
|
58
|
+
return 'bearer_workspace_key';
|
|
59
|
+
return 'bearer_unknown';
|
|
60
|
+
}
|
|
61
|
+
if (queryToken) {
|
|
62
|
+
const type = tokenType(queryToken);
|
|
63
|
+
if (type === 'agent')
|
|
64
|
+
return 'query_agent_token';
|
|
65
|
+
if (type === 'workspace')
|
|
66
|
+
return 'query_workspace_key';
|
|
67
|
+
return 'query_unknown';
|
|
68
|
+
}
|
|
69
|
+
return 'none';
|
|
70
|
+
}
|
|
71
|
+
async function extractErrorInfo(response) {
|
|
72
|
+
const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
|
|
73
|
+
if (!contentType.includes('application/json'))
|
|
74
|
+
return {};
|
|
75
|
+
try {
|
|
76
|
+
const body = await response.clone().json();
|
|
77
|
+
if (!body || typeof body !== 'object')
|
|
78
|
+
return {};
|
|
79
|
+
const maybeError = body.error;
|
|
80
|
+
if (!maybeError || typeof maybeError !== 'object')
|
|
81
|
+
return {};
|
|
82
|
+
const code = maybeError.code;
|
|
83
|
+
const message = maybeError.message;
|
|
84
|
+
return {
|
|
85
|
+
...(typeof code === 'string' ? { error_code: code } : {}),
|
|
86
|
+
...(typeof message === 'string' ? { error_reason: sanitizeReason(message) } : {}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function statusClass(statusCode) {
|
|
94
|
+
if (statusCode >= 500)
|
|
95
|
+
return '5xx';
|
|
96
|
+
if (statusCode >= 400)
|
|
97
|
+
return '4xx';
|
|
98
|
+
if (statusCode >= 300)
|
|
99
|
+
return '3xx';
|
|
100
|
+
if (statusCode >= 200)
|
|
101
|
+
return '2xx';
|
|
102
|
+
return '1xx';
|
|
103
|
+
}
|
|
104
|
+
export const loggerMiddleware = async (c, next) => {
|
|
105
|
+
const requestId = crypto.randomUUID();
|
|
106
|
+
c.set('requestId', requestId);
|
|
107
|
+
const requestHeaders = c.req.raw.headers;
|
|
108
|
+
const clientName = deriveClientName(requestHeaders);
|
|
109
|
+
const originInfo = extractOriginInfo(c.req.raw, clientName);
|
|
110
|
+
const harness = extractHarness(requestHeaders);
|
|
111
|
+
c.set('harness', harness);
|
|
112
|
+
const logger = createRequestLogger(c, 'request', {
|
|
113
|
+
request_id: requestId,
|
|
114
|
+
...(clientName ? { client_name: clientName } : {}),
|
|
115
|
+
...originInfo,
|
|
116
|
+
harness,
|
|
117
|
+
});
|
|
118
|
+
c.set('logger', logger);
|
|
119
|
+
const startedAt = Date.now();
|
|
120
|
+
await next();
|
|
121
|
+
const durationMs = Date.now() - startedAt;
|
|
122
|
+
const statusCode = c.res.status;
|
|
123
|
+
const authHeader = requestHeaders.get('authorization') ?? undefined;
|
|
124
|
+
const queryToken = c.req.query('token');
|
|
125
|
+
const bearerToken = parseBearerToken(authHeader);
|
|
126
|
+
const presentedToken = bearerToken ?? queryToken;
|
|
127
|
+
const authScheme = classifyAuthScheme(authHeader, queryToken);
|
|
128
|
+
const contentType = requestHeaders.get('content-type');
|
|
129
|
+
const accept = requestHeaders.get('accept');
|
|
130
|
+
const connectingIp = requestHeaders.get('cf-connecting-ip');
|
|
131
|
+
const userAgent = requestHeaders.get('user-agent');
|
|
132
|
+
const errorInfo = statusCode >= 400 ? await extractErrorInfo(c.res) : {};
|
|
133
|
+
const metadata = {
|
|
134
|
+
status_code: statusCode,
|
|
135
|
+
status_class: statusClass(statusCode),
|
|
136
|
+
duration_ms: durationMs,
|
|
137
|
+
route_group: routeGroupForPath(c.req.path),
|
|
138
|
+
auth_scheme: authScheme,
|
|
139
|
+
...(contentType ? { content_type: contentType } : {}),
|
|
140
|
+
...(accept ? { accept } : {}),
|
|
141
|
+
...(clientName ? { client_name: clientName } : {}),
|
|
142
|
+
...(presentedToken ? { actor_fingerprint: hashIdentifier(presentedToken) } : {}),
|
|
143
|
+
...(connectingIp ? { ip_hash: hashIdentifier(connectingIp) } : {}),
|
|
144
|
+
...(userAgent ? { ua_hash: hashIdentifier(userAgent) } : {}),
|
|
145
|
+
...originInfo,
|
|
146
|
+
harness,
|
|
147
|
+
...errorInfo,
|
|
148
|
+
};
|
|
149
|
+
if (statusCode >= 500) {
|
|
150
|
+
logger.error('Request failed', metadata);
|
|
151
|
+
}
|
|
152
|
+
else if (statusCode >= 400) {
|
|
153
|
+
logger.warn('Request client error', metadata);
|
|
154
|
+
}
|
|
155
|
+
const flushPromise = logger.flush();
|
|
156
|
+
const executionCtx = getExecutionCtx(c);
|
|
157
|
+
if (executionCtx) {
|
|
158
|
+
executionCtx.waitUntil(flushPromise);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
void flushPromise;
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AppEnv } from '../env.js';
|
|
2
|
+
import type { UsageMetric } from '../ports/entitlements.js';
|
|
3
|
+
export { PLAN_LIMITS } from '../providers/static-entitlements.js';
|
|
4
|
+
export declare function checkPlanLimit(metric: UsageMetric): import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
|
|
5
|
+
//# sourceMappingURL=planLimits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planLimits.d.ts","sourceRoot":"","sources":["../../src/middleware/planLimits.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,kEA6BjD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
// Re-exported for back-compat with callers/tests that imported the table here.
|
|
3
|
+
export { PLAN_LIMITS } from '../providers/static-entitlements.js';
|
|
4
|
+
export function checkPlanLimit(metric) {
|
|
5
|
+
return createMiddleware(async (c, next) => {
|
|
6
|
+
const workspace = c.get('workspace');
|
|
7
|
+
if (!workspace) {
|
|
8
|
+
await next();
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const { entitlements } = c.get('engine');
|
|
12
|
+
const limits = await entitlements.getLimits(workspace);
|
|
13
|
+
const limit = limits[metric];
|
|
14
|
+
if (limit === Infinity) {
|
|
15
|
+
await next();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const current = await entitlements.getUsage(workspace.id, metric);
|
|
20
|
+
if (current >= limit) {
|
|
21
|
+
const plan = workspace.plan || 'free';
|
|
22
|
+
return c.json({
|
|
23
|
+
ok: false,
|
|
24
|
+
error: {
|
|
25
|
+
code: 'plan_limit_exceeded',
|
|
26
|
+
message: `Plan limit exceeded for ${metric}. Current plan: ${plan}. Limit: ${limit}. Current usage: ${current}. Upgrade your plan to increase limits.`,
|
|
27
|
+
},
|
|
28
|
+
}, 429);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch { /* fail open */ }
|
|
32
|
+
await next();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=planLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planLimits.js","sourceRoot":"","sources":["../../src/middleware/planLimits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,OAAO,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAChD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,MAAM,IAAI,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEzC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAAC,MAAM,IAAI,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAClE,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC;gBACtC,OAAO,CAAC,CAAC,IAAI,CACX;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,2BAA2B,MAAM,mBAAmB,IAAI,YAAY,KAAK,oBAAoB,OAAO,yCAAyC;qBACvJ;iBACF,EACD,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;QAE3B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenceRefresh.d.ts","sourceRoot":"","sources":["../../src/middleware/presenceRefresh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,eAAe,gEAc1B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
export const presenceRefresh = createMiddleware(async (c, next) => {
|
|
3
|
+
try {
|
|
4
|
+
const agent = c.get('agent');
|
|
5
|
+
const workspace = c.get('workspace');
|
|
6
|
+
if (agent && workspace) {
|
|
7
|
+
// Fire-and-forget heartbeat via the presence port
|
|
8
|
+
c.get('engine').presence
|
|
9
|
+
.heartbeat(workspace.id, agent.id, agent.name)
|
|
10
|
+
.catch(() => { });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Don't block the request if presence refresh fails
|
|
15
|
+
}
|
|
16
|
+
await next();
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=presenceRefresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenceRefresh.js","sourceRoot":"","sources":["../../src/middleware/presenceRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IACxE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACvB,kDAAkD;YAClD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ;iBACrB,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;iBAC7C,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AA4BxC,eAAO,MAAM,SAAS,gEAkDpB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
// Conservative per-minute ceiling applied when the entitlements lookup fails,
|
|
3
|
+
// so an entitlements outage degrades to a safe default rather than no limit.
|
|
4
|
+
const FALLBACK_RATE_PER_MIN = 300;
|
|
5
|
+
// Per-route rate limit multipliers (fraction of the global per-minute limit).
|
|
6
|
+
// POST endpoints get tighter limits, GET endpoints get looser.
|
|
7
|
+
const ROUTE_MULTIPLIERS = {
|
|
8
|
+
'POST:/channels/*/messages': 0.5, // message send: half the global limit
|
|
9
|
+
'POST:/dm': 0.5,
|
|
10
|
+
'POST:/dm/group': 0.3,
|
|
11
|
+
'POST:/messages/*/reactions': 0.4,
|
|
12
|
+
'GET:/channels/*/messages': 1.0,
|
|
13
|
+
'GET:/agents/presence': 0.3,
|
|
14
|
+
};
|
|
15
|
+
function getRouteKey(method, path) {
|
|
16
|
+
// Normalize path: /v1/channels/foo/messages -> /channels/*/messages
|
|
17
|
+
const normalized = path
|
|
18
|
+
.replace(/^\/v1/, '')
|
|
19
|
+
.replace(/\/[a-zA-Z0-9_-]+\/messages/, '/*/messages')
|
|
20
|
+
.replace(/\/[a-zA-Z0-9_-]+\/reactions/, '/*/reactions')
|
|
21
|
+
.replace(/\/[a-zA-Z0-9_-]+\/replies/, '/*/replies');
|
|
22
|
+
const key = `${method}:${normalized}`;
|
|
23
|
+
return ROUTE_MULTIPLIERS[key] !== undefined ? key : null;
|
|
24
|
+
}
|
|
25
|
+
export const rateLimit = createMiddleware(async (c, next) => {
|
|
26
|
+
const workspace = c.get('workspace');
|
|
27
|
+
if (!workspace) {
|
|
28
|
+
await next();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const { entitlements, rateLimiter } = c.get('engine');
|
|
32
|
+
// Apply route-specific multiplier if applicable
|
|
33
|
+
const routeKey = getRouteKey(c.req.method, c.req.path);
|
|
34
|
+
// The rate limiter port is not workspace-scoped, so the workspace id is part
|
|
35
|
+
// of the bucket key (the Cloudflare adapter previously scoped via the DO id).
|
|
36
|
+
const window = Math.floor(Date.now() / 60000);
|
|
37
|
+
const bucketKey = `${workspace.id}:${routeKey ?? 'global'}:${window}`;
|
|
38
|
+
// Resolve the per-minute limit. If entitlements are unavailable, fall back to
|
|
39
|
+
// a conservative default and still enforce it — an entitlements outage must
|
|
40
|
+
// NOT translate into unlimited throughput.
|
|
41
|
+
let globalLimit;
|
|
42
|
+
try {
|
|
43
|
+
globalLimit = (await entitlements.getLimits(workspace)).rate_per_min;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
globalLimit = FALLBACK_RATE_PER_MIN;
|
|
47
|
+
}
|
|
48
|
+
const limit = routeKey ? Math.ceil(globalLimit * ROUTE_MULTIPLIERS[routeKey]) : globalLimit;
|
|
49
|
+
try {
|
|
50
|
+
const { allowed, count, remaining } = await rateLimiter.check({ bucketKey, limit, windowMs: 60_000 });
|
|
51
|
+
c.header('X-RateLimit-Limit', String(limit));
|
|
52
|
+
c.header('X-RateLimit-Remaining', String(remaining ?? Math.max(0, limit - count)));
|
|
53
|
+
if (!allowed) {
|
|
54
|
+
return c.json({
|
|
55
|
+
ok: false,
|
|
56
|
+
error: {
|
|
57
|
+
code: 'rate_limit_exceeded',
|
|
58
|
+
message: `Rate limit exceeded. ${limit} requests per minute allowed for ${workspace.plan} plan.`,
|
|
59
|
+
},
|
|
60
|
+
}, 429);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Only the limiter backend failing is fail-open — a transient infra hiccup
|
|
65
|
+
// shouldn't 500 the request (the limit was still computed above).
|
|
66
|
+
}
|
|
67
|
+
await next();
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,8EAA8E;AAC9E,+DAA+D;AAC/D,MAAM,iBAAiB,GAA2B;IAChD,2BAA2B,EAAE,GAAG,EAAE,sCAAsC;IACxE,UAAU,EAAE,GAAG;IACf,gBAAgB,EAAE,GAAG;IACrB,4BAA4B,EAAE,GAAG;IACjC,0BAA0B,EAAE,GAAG;IAC/B,sBAAsB,EAAE,GAAG;CAC5B,CAAC;AAEF,SAAS,WAAW,CAAC,MAAc,EAAE,IAAY;IAC/C,oEAAoE;IACpE,MAAM,UAAU,GAAG,IAAI;SACpB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,4BAA4B,EAAE,aAAa,CAAC;SACpD,OAAO,CAAC,6BAA6B,EAAE,cAAc,CAAC;SACtD,OAAO,CAAC,2BAA2B,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;IACtC,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IAClE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEtD,gDAAgD;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvD,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,GAAG,SAAS,CAAC,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;IAEtE,8EAA8E;IAC9E,4EAA4E;IAC5E,2CAA2C;IAC3C,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,qBAAqB,CAAC;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAE5F,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,wBAAwB,KAAK,oCAAoC,SAAS,CAAC,IAAI,QAAQ;iBACjG;aACF,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,kEAAkE;IACpE,CAAC;IAED,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.d.ts","sourceRoot":"","sources":["../../src/middleware/usageTracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,YAAY,gEAOvB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
export const usageTracker = createMiddleware(async (c, next) => {
|
|
3
|
+
const workspace = c.get('workspace');
|
|
4
|
+
if (workspace) {
|
|
5
|
+
// Fire-and-forget atomic usage increment via the key/value port.
|
|
6
|
+
c.get('engine').kv.increment(`usage:${workspace.id}:api_calls`, 1).catch(() => { });
|
|
7
|
+
}
|
|
8
|
+
await next();
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=usageTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.js","sourceRoot":"","sources":["../../src/middleware/usageTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IACrE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACd,iEAAiE;QACjE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { workspaces, agents } from '../db/schema.js';
|
|
2
|
+
import type { EngineDb } from './database.js';
|
|
3
|
+
export type Workspace = typeof workspaces.$inferSelect;
|
|
4
|
+
export type Agent = typeof agents.$inferSelect;
|
|
5
|
+
export type AuthRequire = 'workspace' | 'agent' | 'any';
|
|
6
|
+
export type AuthResult = {
|
|
7
|
+
ok: true;
|
|
8
|
+
workspace: Workspace;
|
|
9
|
+
agent?: Agent;
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
status: number;
|
|
13
|
+
code: string;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Pluggable authentication — the hosting seam.
|
|
18
|
+
*
|
|
19
|
+
* Self-host uses the built-in `SqliteApiKeyAuthProvider` (today's
|
|
20
|
+
* `middleware/auth.ts` logic: SHA-256 hash of `rk_live_`/`at_live_` tokens looked
|
|
21
|
+
* up in the `workspaces`/`agents` tables). The cloud product injects its own
|
|
22
|
+
* provider backed by its accounts/billing system — it may validate against the
|
|
23
|
+
* same gateway D1 or a different identity store entirely. The engine never
|
|
24
|
+
* assumes how a token maps to a workspace/agent.
|
|
25
|
+
*/
|
|
26
|
+
export interface AuthProvider {
|
|
27
|
+
/**
|
|
28
|
+
* Resolve a bearer token to a workspace (and optionally an agent). `require`
|
|
29
|
+
* narrows the acceptable token kind for routes that demand one specifically.
|
|
30
|
+
* The engine passes its `db` handle so the default provider can query without
|
|
31
|
+
* holding its own connection; custom providers may ignore it.
|
|
32
|
+
*/
|
|
33
|
+
authenticate(args: {
|
|
34
|
+
token: string;
|
|
35
|
+
require: AuthRequire;
|
|
36
|
+
db: EngineDb;
|
|
37
|
+
}): Promise<AuthResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Hash a raw token to its stored form. Used by the `/v1/ws` upgrade and MCP
|
|
40
|
+
* key handling, which look tokens up directly. Providers that don't use hashed
|
|
41
|
+
* keys may return the token unchanged.
|
|
42
|
+
*/
|
|
43
|
+
hashToken(token: string): string;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/ports/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,YAAY,CAAC;AACvD,MAAM,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,YAAY,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,WAAW,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/F;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/ports/auth.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core';
|
|
2
|
+
import type * as schema from '../db/schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Driver-agnostic Drizzle handle used by every engine module.
|
|
5
|
+
*
|
|
6
|
+
* Both the Cloudflare D1 driver (`drizzle-orm/d1`, async) and the Node
|
|
7
|
+
* better-sqlite3 driver (`drizzle-orm/better-sqlite3`, sync) produce a
|
|
8
|
+
* `BaseSQLiteDatabase` over the shared schema. Drizzle query builders are
|
|
9
|
+
* thenable, so `await db.select()...` works against both. The engine never
|
|
10
|
+
* imports a concrete driver — adapters construct the handle and inject it.
|
|
11
|
+
*
|
|
12
|
+
* The one place the drivers genuinely diverge is interactive transactions:
|
|
13
|
+
* better-sqlite3 runs them synchronously; D1 has no interactive transactions
|
|
14
|
+
* and relies on `db.batch()`. Engine code that needs atomicity across rows must
|
|
15
|
+
* use a single statement (e.g. a `... SELECT COALESCE(MAX(seq),0)+1 ...`
|
|
16
|
+
* scalar-subquery insert guarded by a UNIQUE index) rather than a multi-step
|
|
17
|
+
* read-modify-write, so the same code is correct on both drivers.
|
|
18
|
+
*/
|
|
19
|
+
export type EngineDb = BaseSQLiteDatabase<'async', any, typeof schema>;
|
|
20
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/ports/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AASH,MAAM,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/ports/database.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Workspace } from './auth.js';
|
|
2
|
+
export type UsageMetric = 'messages' | 'agents' | 'file_bytes';
|
|
3
|
+
export interface PlanLimits {
|
|
4
|
+
messages: number;
|
|
5
|
+
agents: number;
|
|
6
|
+
file_bytes: number;
|
|
7
|
+
/** Global requests-per-minute ceiling, fed into the rate limiter. */
|
|
8
|
+
rate_per_min: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Pluggable plan limits / usage — the billing seam.
|
|
12
|
+
*
|
|
13
|
+
* Self-host uses `StaticEntitlementsProvider`, seeded from today's hardcoded
|
|
14
|
+
* `PLAN_LIMITS` (free/pro/enterprise), defaulting single-tenant deployments to a
|
|
15
|
+
* generous/unlimited tier. The cloud product injects a provider that resolves
|
|
16
|
+
* quotas from its billing system (e.g. a Stripe subscription) per workspace and
|
|
17
|
+
* reports metered usage.
|
|
18
|
+
*/
|
|
19
|
+
export interface EntitlementsProvider {
|
|
20
|
+
/** Resolve the active plan limits for a workspace. */
|
|
21
|
+
getLimits(workspace: Workspace): Promise<PlanLimits>;
|
|
22
|
+
/** Current usage for a metric, compared against the limit before allowing an action. */
|
|
23
|
+
getUsage(workspaceId: string, metric: UsageMetric): Promise<number>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=entitlements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlements.d.ts","sourceRoot":"","sources":["../../src/ports/entitlements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAErD,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlements.js","sourceRoot":"","sources":["../../src/ports/entitlements.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbound event queue port — replaces the Cloudflare `WEBHOOK_QUEUE` binding.
|
|
3
|
+
*
|
|
4
|
+
* After a mutation, routes enqueue a delivery message; the consumer fans it out
|
|
5
|
+
* to the workspace's registered webhook subscribers (`engine/eventDelivery.ts`).
|
|
6
|
+
* On Cloudflare this is a Queue producer + a separate consumer Worker. The Node
|
|
7
|
+
* adapter implements it as an in-process async worker that calls `deliverEvent`
|
|
8
|
+
* directly (best-effort, single process).
|
|
9
|
+
*/
|
|
10
|
+
export interface QueuedEvent {
|
|
11
|
+
type: string;
|
|
12
|
+
workspaceId: string;
|
|
13
|
+
data: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface EventQueue {
|
|
16
|
+
/** Enqueue an event for asynchronous webhook delivery. Returns once accepted. */
|
|
17
|
+
send(message: QueuedEvent): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=event-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/ports/event-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/ports/event-queue.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File storage port — replaces the R2/S3 presigned-URL surface in `engine/file.ts`.
|
|
3
|
+
*
|
|
4
|
+
* The database rows (the `files` table: pending → complete → deleted lifecycle)
|
|
5
|
+
* are portable domain logic and stay in the engine. Only the blob backend is the
|
|
6
|
+
* port: Cloudflare signs R2 (S3-compatible) URLs; the Node adapter stores blobs
|
|
7
|
+
* on local disk and serves them through an engine-mounted download route using a
|
|
8
|
+
* short-lived signed token.
|
|
9
|
+
*/
|
|
10
|
+
export interface FileStorage {
|
|
11
|
+
/**
|
|
12
|
+
* Return a URL the client can `PUT` the file bytes to, valid ~1h.
|
|
13
|
+
* `storageKey` is the engine-assigned object key (`<workspaceId>/<id>/<name>`).
|
|
14
|
+
*/
|
|
15
|
+
createUploadUrl(args: {
|
|
16
|
+
storageKey: string;
|
|
17
|
+
contentType: string;
|
|
18
|
+
sizeBytes: number;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
uploadUrl: string;
|
|
21
|
+
expiresAt: string;
|
|
22
|
+
}>;
|
|
23
|
+
/** Return a URL the client can `GET` the file bytes from, valid ~1h. */
|
|
24
|
+
createDownloadUrl(args: {
|
|
25
|
+
storageKey: string;
|
|
26
|
+
}): Promise<string>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/ports/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEtD,wEAAwE;IACxE,iBAAiB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/ports/files.ts"],"names":[],"mappings":""}
|