@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,80 @@
|
|
|
1
|
+
import { normalizeTelemetryOrigin } from '@relaycast/types';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP header used by harnesses (Claude Code, Cursor, etc.) to identify
|
|
4
|
+
* themselves to the relaycast server. See relay#881.
|
|
5
|
+
*/
|
|
6
|
+
export const HARNESS_HEADER = 'X-Relaycast-Harness';
|
|
7
|
+
/** Fallback value when the header is missing or invalid. */
|
|
8
|
+
export const UNKNOWN_HARNESS = 'unknown';
|
|
9
|
+
/** Sanity-cap on the header value — long enough for any reasonable identifier. */
|
|
10
|
+
const HARNESS_MAX_LENGTH = 40;
|
|
11
|
+
/**
|
|
12
|
+
* Read and sanitize the `X-Relaycast-Harness` header from a request.
|
|
13
|
+
*
|
|
14
|
+
* Returns a lowercase identifier (kebab-case by convention, e.g. `claude-code`,
|
|
15
|
+
* `cursor`, `codex`). We intentionally do NOT enforce an enum here — accepting
|
|
16
|
+
* any well-formed value lets us discover new harnesses without shipping a
|
|
17
|
+
* relaycast release first. Segmentation/normalization happens downstream in
|
|
18
|
+
* the analytics layer.
|
|
19
|
+
*
|
|
20
|
+
* Drops empty, oversized, or non-ASCII values to `'unknown'`.
|
|
21
|
+
*/
|
|
22
|
+
export function extractHarness(headers) {
|
|
23
|
+
const raw = headers.get(HARNESS_HEADER);
|
|
24
|
+
if (!raw)
|
|
25
|
+
return UNKNOWN_HARNESS;
|
|
26
|
+
const trimmed = raw.trim();
|
|
27
|
+
if (!trimmed)
|
|
28
|
+
return UNKNOWN_HARNESS;
|
|
29
|
+
if (trimmed.length > HARNESS_MAX_LENGTH)
|
|
30
|
+
return UNKNOWN_HARNESS;
|
|
31
|
+
// Restrict to printable ASCII to keep PostHog property values clean. Allow
|
|
32
|
+
// letters, digits, and the small set of separators harness names tend to
|
|
33
|
+
// use. Anything else falls back to `unknown`.
|
|
34
|
+
if (!/^[a-zA-Z0-9._-]+$/.test(trimmed))
|
|
35
|
+
return UNKNOWN_HARNESS;
|
|
36
|
+
return trimmed.toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
function sanitizeOriginPart(value, maxLen) {
|
|
39
|
+
if (!value)
|
|
40
|
+
return undefined;
|
|
41
|
+
const normalized = value.trim();
|
|
42
|
+
if (!normalized)
|
|
43
|
+
return undefined;
|
|
44
|
+
return normalized.slice(0, maxLen);
|
|
45
|
+
}
|
|
46
|
+
export function deriveClientName(headers) {
|
|
47
|
+
const explicit = headers.get('x-client-name') ?? headers.get('x-relaycast-client');
|
|
48
|
+
if (explicit)
|
|
49
|
+
return explicit.trim().slice(0, 80);
|
|
50
|
+
const ua = headers.get('user-agent');
|
|
51
|
+
if (!ua)
|
|
52
|
+
return undefined;
|
|
53
|
+
const family = ua.split(/[\/\s;]/)[0];
|
|
54
|
+
return family ? family.trim().slice(0, 80) : undefined;
|
|
55
|
+
}
|
|
56
|
+
export function extractOriginInfo(request, fallbackClientName) {
|
|
57
|
+
const headers = request.headers;
|
|
58
|
+
const url = new URL(request.url);
|
|
59
|
+
const querySurface = url.searchParams.get('origin_surface');
|
|
60
|
+
const queryClient = url.searchParams.get('origin_client');
|
|
61
|
+
const queryVersion = url.searchParams.get('origin_version');
|
|
62
|
+
const originSurface = sanitizeOriginPart(headers.get('x-relaycast-origin-surface') ?? headers.get('x-origin-surface') ?? querySurface, 32);
|
|
63
|
+
const originClient = sanitizeOriginPart(headers.get('x-relaycast-origin-client')
|
|
64
|
+
?? headers.get('x-origin-client')
|
|
65
|
+
?? queryClient
|
|
66
|
+
?? fallbackClientName, 80);
|
|
67
|
+
const originVersion = sanitizeOriginPart(headers.get('x-relaycast-origin-version')
|
|
68
|
+
?? headers.get('x-origin-version')
|
|
69
|
+
?? queryVersion
|
|
70
|
+
?? headers.get('x-sdk-version'), 48);
|
|
71
|
+
return {
|
|
72
|
+
...(originSurface ? { origin_surface: originSurface } : {}),
|
|
73
|
+
...(originClient ? { origin_client: originClient } : {}),
|
|
74
|
+
...(originVersion ? { origin_version: originVersion } : {}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function requiredOriginInfo(request, fallbackClientName) {
|
|
78
|
+
return normalizeTelemetryOrigin(extractOriginInfo(request, fallbackClientName));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=origin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
import type { AppEnv } from '../env.js';
|
|
3
|
+
type ServerEvent = `relaycast_server_${string}`;
|
|
4
|
+
export declare function normalizeRoutePathForTelemetry(value: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Emit a server-side product-telemetry event through the injected
|
|
7
|
+
* {@link TelemetrySink}. Self-host's default sink is a no-op; cloud injects
|
|
8
|
+
* PostHog. The sink owns batching/background-flush, so this returns immediately.
|
|
9
|
+
*/
|
|
10
|
+
export declare function emitServerEvent(c: Context<AppEnv>, workspaceId: string, event: ServerEvent, properties: Record<string, unknown>): void;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=serverTelemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverTelemetry.d.ts","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,KAAK,WAAW,GAAG,oBAAoB,MAAM,EAAE,CAAC;AAEhD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI,CAyBN"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { extractHarness, requiredOriginInfo, UNKNOWN_HARNESS } from './origin.js';
|
|
2
|
+
export function normalizeRoutePathForTelemetry(value) {
|
|
3
|
+
const withoutQuery = value.split(/[?#]/)[0] ?? value;
|
|
4
|
+
const compact = withoutQuery.replace(/\/+/g, '/').trim();
|
|
5
|
+
const withLeadingSlash = compact.startsWith('/') ? compact : `/${compact}`;
|
|
6
|
+
const segments = withLeadingSlash.split('/').filter(Boolean).map((segment) => {
|
|
7
|
+
if (/^\d{6,}$/.test(segment))
|
|
8
|
+
return ':id';
|
|
9
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(segment))
|
|
10
|
+
return ':id';
|
|
11
|
+
if (/^(dm|dmch|cmd|sub|wh)_[a-zA-Z0-9_-]{8,}$/.test(segment))
|
|
12
|
+
return ':id';
|
|
13
|
+
return segment;
|
|
14
|
+
});
|
|
15
|
+
return `/${segments.join('/')}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Emit a server-side product-telemetry event through the injected
|
|
19
|
+
* {@link TelemetrySink}. Self-host's default sink is a no-op; cloud injects
|
|
20
|
+
* PostHog. The sink owns batching/background-flush, so this returns immediately.
|
|
21
|
+
*/
|
|
22
|
+
export function emitServerEvent(c, workspaceId, event, properties) {
|
|
23
|
+
const normalizedProperties = { ...properties };
|
|
24
|
+
if (typeof normalizedProperties.route_path === 'string') {
|
|
25
|
+
normalizedProperties.route_path = normalizeRoutePathForTelemetry(normalizedProperties.route_path);
|
|
26
|
+
}
|
|
27
|
+
// Prefer the value stashed by the logger middleware. Fall back to reading the
|
|
28
|
+
// header directly so emitters that bypass middleware still get a sane value.
|
|
29
|
+
const harness = c.get('harness')
|
|
30
|
+
?? extractHarness(c.req.raw.headers)
|
|
31
|
+
?? UNKNOWN_HARNESS;
|
|
32
|
+
const origin = requiredOriginInfo(c.req.raw);
|
|
33
|
+
c.get('engine').telemetry.capture({
|
|
34
|
+
name: event,
|
|
35
|
+
distinctId: workspaceId,
|
|
36
|
+
properties: {
|
|
37
|
+
workspace_id: workspaceId,
|
|
38
|
+
harness,
|
|
39
|
+
origin_surface: origin.origin_surface,
|
|
40
|
+
origin_client: origin.origin_client,
|
|
41
|
+
origin_version: origin.origin_version,
|
|
42
|
+
...normalizedProperties,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=serverTelemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverTelemetry.js","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIlF,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3E,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IAAI,4EAA4E,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7G,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAkB,EAClB,WAAmB,EACnB,KAAkB,EAClB,UAAmC;IAEnC,MAAM,oBAAoB,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IAC/C,IAAI,OAAO,oBAAoB,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,oBAAoB,CAAC,UAAU,GAAG,8BAA8B,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpG,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;WAC3B,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;WACjC,eAAe,CAAC;IAErB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,WAAW;QACvB,UAAU,EAAE;YACV,YAAY,EAAE,WAAW;YACzB,OAAO;YACP,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG,oBAAoB;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface SafeUrlOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Reject loopback / link-local / private (RFC-1918, unique-local) hosts.
|
|
4
|
+
*
|
|
5
|
+
* Default `false` (permissive): the engine's primary consumer is single-tenant
|
|
6
|
+
* self-host, where the operator legitimately points A2A at LAN/localhost
|
|
7
|
+
* agents — so only the scheme is enforced. A multi-tenant hosted deployment
|
|
8
|
+
* should pass `strict: true` so an untrusted tenant can't aim the server at
|
|
9
|
+
* internal infrastructure (e.g. `169.254.169.254` cloud metadata).
|
|
10
|
+
*/
|
|
11
|
+
strict?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Guard for outbound fetches to operator/tenant-supplied URLs (A2A external
|
|
15
|
+
* agent URLs, agent-card URLs). Always rejects non-http(s) schemes; in `strict`
|
|
16
|
+
* mode additionally rejects loopback/link-local/private hosts.
|
|
17
|
+
*
|
|
18
|
+
* The strict host check is literal (no DNS resolution), so it does not defend
|
|
19
|
+
* against DNS-rebinding; a hardened deployment should also validate the resolved
|
|
20
|
+
* address at connect time.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isSafeExternalUrl(rawUrl: string, options?: SafeUrlOptions): boolean;
|
|
23
|
+
//# sourceMappingURL=ssrf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf.d.ts","sourceRoot":"","sources":["../../src/lib/ssrf.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CA6CvF"}
|
package/dist/lib/ssrf.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guard for outbound fetches to operator/tenant-supplied URLs (A2A external
|
|
3
|
+
* agent URLs, agent-card URLs). Always rejects non-http(s) schemes; in `strict`
|
|
4
|
+
* mode additionally rejects loopback/link-local/private hosts.
|
|
5
|
+
*
|
|
6
|
+
* The strict host check is literal (no DNS resolution), so it does not defend
|
|
7
|
+
* against DNS-rebinding; a hardened deployment should also validate the resolved
|
|
8
|
+
* address at connect time.
|
|
9
|
+
*/
|
|
10
|
+
export function isSafeExternalUrl(rawUrl, options = {}) {
|
|
11
|
+
let url;
|
|
12
|
+
try {
|
|
13
|
+
url = new URL(rawUrl);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
19
|
+
return false;
|
|
20
|
+
if (!options.strict)
|
|
21
|
+
return true;
|
|
22
|
+
const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, ''); // strip IPv6 brackets
|
|
23
|
+
if (host === 'localhost' ||
|
|
24
|
+
host === '0.0.0.0' ||
|
|
25
|
+
host === '::' ||
|
|
26
|
+
host === '::1' ||
|
|
27
|
+
host.endsWith('.localhost') ||
|
|
28
|
+
host.endsWith('.local') ||
|
|
29
|
+
host.endsWith('.internal')) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
// IPv4 literal → check private/loopback/link-local ranges.
|
|
33
|
+
const v4 = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
|
|
34
|
+
if (v4) {
|
|
35
|
+
const [a, b] = [Number(v4[1]), Number(v4[2])];
|
|
36
|
+
if (a === 10)
|
|
37
|
+
return false; // 10.0.0.0/8
|
|
38
|
+
if (a === 127)
|
|
39
|
+
return false; // loopback
|
|
40
|
+
if (a === 0)
|
|
41
|
+
return false; // "this host"
|
|
42
|
+
if (a === 169 && b === 254)
|
|
43
|
+
return false; // link-local (incl. cloud metadata)
|
|
44
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
45
|
+
return false; // 172.16.0.0/12
|
|
46
|
+
if (a === 192 && b === 168)
|
|
47
|
+
return false; // 192.168.0.0/16
|
|
48
|
+
if (a >= 224)
|
|
49
|
+
return false; // multicast / reserved
|
|
50
|
+
}
|
|
51
|
+
// IPv6 unique-local (fc00::/7) and link-local (fe80::/10).
|
|
52
|
+
if (host.includes(':') && (host.startsWith('fc') || host.startsWith('fd') || host.startsWith('fe8') || host.startsWith('fe9') || host.startsWith('fea') || host.startsWith('feb'))) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ssrf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf.js","sourceRoot":"","sources":["../../src/lib/ssrf.ts"],"names":[],"mappings":"AAaA;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,UAA0B,EAAE;IAC5E,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAExE,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;IAEvF,IACE,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,IAAI;QACb,IAAI,KAAK,KAAK;QACd,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2DAA2D;IAC3D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACtE,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC,CAAC,aAAa;QACzC,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,WAAW;QACxC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,oCAAoC;QAC9E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC,CAAC,gBAAgB;QACnE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,iBAAiB;QAC3D,IAAI,CAAC,IAAI,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,uBAAuB;IACrD,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnL,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { KeyValueStore } from '../ports/kv.js';
|
|
2
|
+
export declare function getWorkspaceStreamConfig(kv: KeyValueStore, workspaceId: string, defaultEnabled?: boolean): Promise<{
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
defaultEnabled: boolean;
|
|
5
|
+
override: boolean | null;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function isWorkspaceStreamEnabled(kv: KeyValueStore, workspaceId: string, defaultEnabled?: boolean): Promise<boolean>;
|
|
8
|
+
export declare function setWorkspaceStreamOverride(kv: KeyValueStore, workspaceId: string, override: boolean | null): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=workspaceStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceStream.d.ts","sourceRoot":"","sources":["../../src/lib/workspaceStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2BpD,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,aAAa,EACjB,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,OAAyB,GACxC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,CAAC,CAuBlF;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,aAAa,EACjB,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,OAAyB,GACxC,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,aAAa,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const KEY_PREFIX = 'workspace-stream:';
|
|
2
|
+
const CACHE_TTL_MS = 10_000;
|
|
3
|
+
const DEFAULT_ENABLED = false;
|
|
4
|
+
const cache = new Map();
|
|
5
|
+
function parseBool(value) {
|
|
6
|
+
if (value == null)
|
|
7
|
+
return null;
|
|
8
|
+
const normalized = value.trim().toLowerCase();
|
|
9
|
+
if (['1', 'true', 'yes', 'on'].includes(normalized))
|
|
10
|
+
return true;
|
|
11
|
+
if (['0', 'false', 'no', 'off'].includes(normalized))
|
|
12
|
+
return false;
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
function getKey(workspaceId) {
|
|
16
|
+
return `${KEY_PREFIX}${workspaceId}`;
|
|
17
|
+
}
|
|
18
|
+
export async function getWorkspaceStreamConfig(kv, workspaceId, defaultEnabled = DEFAULT_ENABLED) {
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
const cached = cache.get(workspaceId);
|
|
21
|
+
if (cached && cached.expiresAt > now) {
|
|
22
|
+
return {
|
|
23
|
+
enabled: cached.enabled,
|
|
24
|
+
defaultEnabled: cached.defaultEnabled,
|
|
25
|
+
override: cached.override,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const raw = await kv.get(getKey(workspaceId));
|
|
29
|
+
const override = parseBool(raw);
|
|
30
|
+
const enabled = override ?? defaultEnabled;
|
|
31
|
+
cache.set(workspaceId, {
|
|
32
|
+
enabled,
|
|
33
|
+
defaultEnabled,
|
|
34
|
+
override,
|
|
35
|
+
expiresAt: now + CACHE_TTL_MS,
|
|
36
|
+
});
|
|
37
|
+
return { enabled, defaultEnabled, override };
|
|
38
|
+
}
|
|
39
|
+
export async function isWorkspaceStreamEnabled(kv, workspaceId, defaultEnabled = DEFAULT_ENABLED) {
|
|
40
|
+
const cfg = await getWorkspaceStreamConfig(kv, workspaceId, defaultEnabled);
|
|
41
|
+
return cfg.enabled;
|
|
42
|
+
}
|
|
43
|
+
export async function setWorkspaceStreamOverride(kv, workspaceId, override) {
|
|
44
|
+
const key = getKey(workspaceId);
|
|
45
|
+
if (override === null) {
|
|
46
|
+
await kv.delete(key);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
await kv.put(key, override ? 'true' : 'false');
|
|
50
|
+
}
|
|
51
|
+
cache.delete(workspaceId);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=workspaceStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceStream.js","sourceRoot":"","sources":["../../src/lib/workspaceStream.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,eAAe,GAAG,KAAK,CAAC;AAS9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C,SAAS,SAAS,CAAC,KAAgC;IACjD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,WAAmB;IACjC,OAAO,GAAG,UAAU,GAAG,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAiB,EACjB,WAAmB,EACnB,iBAA0B,eAAe;IAEzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,IAAI,cAAc,CAAC;IAE3C,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;QACrB,OAAO;QACP,cAAc;QACd,QAAQ;QACR,SAAS,EAAE,GAAG,GAAG,YAAY;KAC9B,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,EAAiB,EACjB,WAAmB,EACnB,iBAA0B,eAAe;IAEzC,MAAM,GAAG,GAAG,MAAM,wBAAwB,CAAC,EAAE,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,EAAiB,EACjB,WAAmB,EACnB,QAAwB;IAExB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AppEnv } from '../env.js';
|
|
2
|
+
export { hashToken } from '../auth/index.js';
|
|
3
|
+
/** Requires a workspace key (`rk_live_...`). */
|
|
4
|
+
export declare const requireWorkspaceKey: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
|
|
5
|
+
/** Accepts either a workspace key or an agent token. */
|
|
6
|
+
export declare const requireAuth: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
|
|
7
|
+
/** Requires an agent token (`at_live_...`). */
|
|
8
|
+
export declare const requireAgentToken: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
|
|
9
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAKxC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAyC7C,gDAAgD;AAChD,eAAO,MAAM,mBAAmB,gEAAkC,CAAC;AAEnE,wDAAwD;AACxD,eAAO,MAAM,WAAW,gEAA4B,CAAC;AAErD,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,gEAA8B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
import { touchLastSeen } from '../engine/agent.js';
|
|
3
|
+
// Re-exported for the WS upgrade + MCP key handling, which look tokens up
|
|
4
|
+
// directly. The active provider's `hashToken` is preferred at those call sites.
|
|
5
|
+
export { hashToken } from '../auth/index.js';
|
|
6
|
+
const LAST_SEEN_DEBOUNCE_MS = 30_000; // 30 seconds
|
|
7
|
+
function extractToken(authHeader) {
|
|
8
|
+
if (!authHeader?.startsWith('Bearer '))
|
|
9
|
+
return null;
|
|
10
|
+
return authHeader.slice(7);
|
|
11
|
+
}
|
|
12
|
+
function makeAuthMiddleware(require) {
|
|
13
|
+
return createMiddleware(async (c, next) => {
|
|
14
|
+
const token = extractToken(c.req.header('Authorization'));
|
|
15
|
+
if (!token) {
|
|
16
|
+
return c.json({ ok: false, error: { code: 'unauthorized', message: 'Missing or invalid Authorization header' } }, 401);
|
|
17
|
+
}
|
|
18
|
+
const db = c.get('db');
|
|
19
|
+
const result = await c.get('engine').auth.authenticate({ token, require, db });
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
return c.json({ ok: false, error: { code: result.code, message: result.message } }, result.status);
|
|
22
|
+
}
|
|
23
|
+
c.set('workspace', result.workspace);
|
|
24
|
+
if (result.agent) {
|
|
25
|
+
c.set('agent', result.agent);
|
|
26
|
+
// Touch lastSeen (debounced, fire-and-forget)
|
|
27
|
+
if (Date.now() - result.agent.lastSeen.getTime() > LAST_SEEN_DEBOUNCE_MS) {
|
|
28
|
+
touchLastSeen(db, result.agent.id).catch(() => { });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
await next();
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Requires a workspace key (`rk_live_...`). */
|
|
35
|
+
export const requireWorkspaceKey = makeAuthMiddleware('workspace');
|
|
36
|
+
/** Accepts either a workspace key or an agent token. */
|
|
37
|
+
export const requireAuth = makeAuthMiddleware('any');
|
|
38
|
+
/** Requires an agent token (`at_live_...`). */
|
|
39
|
+
export const requireAgentToken = makeAuthMiddleware('agent');
|
|
40
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,0EAA0E;AAC1E,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,qBAAqB,GAAG,MAAM,CAAC,CAAC,aAAa;AAEnD,SAAS,YAAY,CAAC,UAA8B;IAClD,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAoB;IAC9C,OAAO,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yCAAyC,EAAE,EAAE,EAClG,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EACpE,MAAM,CAAC,MAA8B,CACtC,CAAC;QACJ,CAAC;QAED,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,8CAA8C;YAC9C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;gBACzE,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAEnE,wDAAwD;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAErD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AppEnv, EngineRuntime } from '../env.js';
|
|
2
|
+
/**
|
|
3
|
+
* Injects the deployment's {@link EngineRuntime} (ports + providers + config)
|
|
4
|
+
* onto every request, plus the convenience `db` variable. Mounted first by
|
|
5
|
+
* `createEngine`, so all downstream engine code reads infrastructure off
|
|
6
|
+
* `c.get('engine')` / `c.get('db')` rather than Cloudflare `c.env` bindings.
|
|
7
|
+
*/
|
|
8
|
+
export declare function engineContext(runtime: EngineRuntime): import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
|
|
9
|
+
//# sourceMappingURL=engine-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-context.d.ts","sourceRoot":"","sources":["../../src/middleware/engine-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,kEAMnD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
/**
|
|
3
|
+
* Injects the deployment's {@link EngineRuntime} (ports + providers + config)
|
|
4
|
+
* onto every request, plus the convenience `db` variable. Mounted first by
|
|
5
|
+
* `createEngine`, so all downstream engine code reads infrastructure off
|
|
6
|
+
* `c.get('engine')` / `c.get('db')` rather than Cloudflare `c.env` bindings.
|
|
7
|
+
*/
|
|
8
|
+
export function engineContext(runtime) {
|
|
9
|
+
return createMiddleware(async (c, next) => {
|
|
10
|
+
c.set('engine', runtime);
|
|
11
|
+
c.set('db', runtime.db);
|
|
12
|
+
await next();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=engine-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-context.js","sourceRoot":"","sources":["../../src/middleware/engine-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,OAAO,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAChD,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzB,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { KeyValueStore } from '../ports/kv.js';
|
|
2
|
+
export interface IdempotentResult<T> {
|
|
3
|
+
status: number;
|
|
4
|
+
data: T;
|
|
5
|
+
replayed: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface RunIdempotentOptions<T> {
|
|
8
|
+
workspaceId: string;
|
|
9
|
+
actorId: string;
|
|
10
|
+
scope: string;
|
|
11
|
+
key?: string;
|
|
12
|
+
status?: number;
|
|
13
|
+
fingerprint?: string;
|
|
14
|
+
ttlSeconds?: number;
|
|
15
|
+
kv?: KeyValueStore;
|
|
16
|
+
operation: () => Promise<T>;
|
|
17
|
+
}
|
|
18
|
+
export declare function parseIdempotencyKey(headerValue: string | undefined): {
|
|
19
|
+
key?: string;
|
|
20
|
+
error?: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function runIdempotent<T>(options: RunIdempotentOptions<T>): Promise<IdempotentResult<T>>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/middleware/idempotency.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAYpD,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,oBAAoB,CAAC,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;CAC7B;AAQD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBrG;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAiI9B"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const IDEMPOTENCY_TTL_SECONDS = 24 * 60 * 60;
|
|
3
|
+
const IDEMPOTENCY_LOCK_TTL_SECONDS = 30;
|
|
4
|
+
const IDEMPOTENCY_KEY_MAX_LENGTH = 255;
|
|
5
|
+
function buildKey(workspaceId, actorId, scope, key) {
|
|
6
|
+
const digest = createHash('sha256').update(key).digest('hex');
|
|
7
|
+
const scopeDigest = createHash('sha256').update(scope).digest('hex').slice(0, 16);
|
|
8
|
+
return `idem:v1:${workspaceId}:${actorId}:${scopeDigest}:${digest}`;
|
|
9
|
+
}
|
|
10
|
+
export function parseIdempotencyKey(headerValue) {
|
|
11
|
+
if (headerValue === undefined) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
const key = headerValue.trim();
|
|
15
|
+
if (!key) {
|
|
16
|
+
return { error: 'Idempotency-Key cannot be empty' };
|
|
17
|
+
}
|
|
18
|
+
if (key.length > IDEMPOTENCY_KEY_MAX_LENGTH) {
|
|
19
|
+
return {
|
|
20
|
+
error: `Idempotency-Key must be ${IDEMPOTENCY_KEY_MAX_LENGTH} characters or fewer`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Restrict to visible ASCII (no whitespace/control chars)
|
|
24
|
+
if (/[^\x21-\x7E]/.test(key)) {
|
|
25
|
+
return {
|
|
26
|
+
error: 'Idempotency-Key must contain only visible ASCII characters',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return { key };
|
|
30
|
+
}
|
|
31
|
+
export async function runIdempotent(options) {
|
|
32
|
+
const { workspaceId, actorId, scope, key, fingerprint, operation, status = 201, ttlSeconds = IDEMPOTENCY_TTL_SECONDS, kv, } = options;
|
|
33
|
+
if (!key) {
|
|
34
|
+
const data = await operation();
|
|
35
|
+
return { status, data, replayed: false };
|
|
36
|
+
}
|
|
37
|
+
let kvStore = kv ?? null;
|
|
38
|
+
let kvKey = null;
|
|
39
|
+
let lockKey = null;
|
|
40
|
+
let lockAcquired = false;
|
|
41
|
+
if (kvStore) {
|
|
42
|
+
kvKey = buildKey(workspaceId, actorId, scope, key);
|
|
43
|
+
lockKey = `${kvKey}:lock`;
|
|
44
|
+
try {
|
|
45
|
+
const existingRaw = await kvStore.get(kvKey);
|
|
46
|
+
if (existingRaw) {
|
|
47
|
+
const parsed = JSON.parse(existingRaw);
|
|
48
|
+
if (fingerprint && parsed.fingerprint && parsed.fingerprint !== fingerprint) {
|
|
49
|
+
const err = new Error('Idempotency-Key was reused with a different request payload');
|
|
50
|
+
Object.assign(err, { code: 'idempotency_key_reused', status: 409 });
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
status: parsed.status || status,
|
|
55
|
+
data: parsed.data,
|
|
56
|
+
replayed: true,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// KV doesn't support atomic NX-style set, so we do a read-then-write for the lock.
|
|
60
|
+
// This is best-effort; in rare race conditions, duplicate operations may run.
|
|
61
|
+
const existingLock = await kvStore.get(lockKey);
|
|
62
|
+
if (existingLock) {
|
|
63
|
+
// Another request may be processing. Check if result is now available.
|
|
64
|
+
const concurrentRaw = await kvStore.get(kvKey);
|
|
65
|
+
if (concurrentRaw) {
|
|
66
|
+
const parsed = JSON.parse(concurrentRaw);
|
|
67
|
+
if (fingerprint && parsed.fingerprint && parsed.fingerprint !== fingerprint) {
|
|
68
|
+
const err = new Error('Idempotency-Key was reused with a different request payload');
|
|
69
|
+
Object.assign(err, { code: 'idempotency_key_reused', status: 409 });
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
status: parsed.status || status,
|
|
74
|
+
data: parsed.data,
|
|
75
|
+
replayed: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const err = new Error('Another request with this Idempotency-Key is still processing');
|
|
79
|
+
Object.assign(err, { code: 'idempotency_in_progress', status: 409 });
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
// Acquire lock
|
|
83
|
+
await kvStore.put(lockKey, '1', { expirationTtl: IDEMPOTENCY_LOCK_TTL_SECONDS });
|
|
84
|
+
lockAcquired = true;
|
|
85
|
+
// Re-check record after acquiring lock to handle race with completed request
|
|
86
|
+
const recheckRaw = await kvStore.get(kvKey);
|
|
87
|
+
if (recheckRaw) {
|
|
88
|
+
await kvStore.delete(lockKey);
|
|
89
|
+
const parsed = JSON.parse(recheckRaw);
|
|
90
|
+
if (fingerprint && parsed.fingerprint && parsed.fingerprint !== fingerprint) {
|
|
91
|
+
const err = new Error('Idempotency-Key was reused with a different request payload');
|
|
92
|
+
Object.assign(err, { code: 'idempotency_key_reused', status: 409 });
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
status: parsed.status || status,
|
|
97
|
+
data: parsed.data,
|
|
98
|
+
replayed: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err instanceof Error && ['idempotency_key_reused', 'idempotency_in_progress'].includes(err.code ?? '')) {
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
// KV unavailable or decode failure: proceed without idempotency.
|
|
107
|
+
kvStore = null;
|
|
108
|
+
kvKey = null;
|
|
109
|
+
lockKey = null;
|
|
110
|
+
lockAcquired = false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const data = await operation();
|
|
115
|
+
if (kvStore && kvKey && lockAcquired) {
|
|
116
|
+
const record = {
|
|
117
|
+
status,
|
|
118
|
+
data,
|
|
119
|
+
fingerprint,
|
|
120
|
+
};
|
|
121
|
+
try {
|
|
122
|
+
await kvStore.put(kvKey, JSON.stringify(record), { expirationTtl: ttlSeconds });
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// KV failure during record storage — proceed without idempotency record.
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
if (lockKey) {
|
|
129
|
+
try {
|
|
130
|
+
await kvStore.delete(lockKey);
|
|
131
|
+
}
|
|
132
|
+
catch { /* ignore */ }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { status, data, replayed: false };
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
if (kvStore && lockKey && lockAcquired) {
|
|
140
|
+
try {
|
|
141
|
+
await kvStore.delete(lockKey);
|
|
142
|
+
}
|
|
143
|
+
catch { /* ignore */ }
|
|
144
|
+
}
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/middleware/idempotency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAwGxC,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,CAAC,MAAM,CA+DtD,CAAC"}
|