@agentuity/runtime 2.0.11 → 3.0.0-alpha.1
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/index.d.ts +37 -65
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -61
- package/dist/index.js.map +1 -1
- package/package.json +9 -38
- package/src/index.ts +58 -259
- package/AGENTS.md +0 -116
- package/dist/_config.d.ts +0 -100
- package/dist/_config.d.ts.map +0 -1
- package/dist/_config.js +0 -147
- package/dist/_config.js.map +0 -1
- package/dist/_context.d.ts +0 -80
- package/dist/_context.d.ts.map +0 -1
- package/dist/_context.js +0 -160
- package/dist/_context.js.map +0 -1
- package/dist/_events.d.ts +0 -64
- package/dist/_events.d.ts.map +0 -1
- package/dist/_events.js +0 -92
- package/dist/_events.js.map +0 -1
- package/dist/_globals.d.ts +0 -58
- package/dist/_globals.d.ts.map +0 -1
- package/dist/_globals.js +0 -71
- package/dist/_globals.js.map +0 -1
- package/dist/_idle.d.ts +0 -7
- package/dist/_idle.d.ts.map +0 -1
- package/dist/_idle.js +0 -10
- package/dist/_idle.js.map +0 -1
- package/dist/_metadata.d.ts +0 -117
- package/dist/_metadata.d.ts.map +0 -1
- package/dist/_metadata.js +0 -268
- package/dist/_metadata.js.map +0 -1
- package/dist/_process-protection.d.ts +0 -27
- package/dist/_process-protection.d.ts.map +0 -1
- package/dist/_process-protection.js +0 -56
- package/dist/_process-protection.js.map +0 -1
- package/dist/_server.d.ts +0 -50
- package/dist/_server.d.ts.map +0 -1
- package/dist/_server.js +0 -89
- package/dist/_server.js.map +0 -1
- package/dist/_services.d.ts +0 -25
- package/dist/_services.d.ts.map +0 -1
- package/dist/_services.js +0 -286
- package/dist/_services.js.map +0 -1
- package/dist/_standalone.d.ts +0 -212
- package/dist/_standalone.d.ts.map +0 -1
- package/dist/_standalone.js +0 -556
- package/dist/_standalone.js.map +0 -1
- package/dist/_tokens.d.ts +0 -12
- package/dist/_tokens.d.ts.map +0 -1
- package/dist/_tokens.js +0 -97
- package/dist/_tokens.js.map +0 -1
- package/dist/_util.d.ts +0 -16
- package/dist/_util.d.ts.map +0 -1
- package/dist/_util.js +0 -54
- package/dist/_util.js.map +0 -1
- package/dist/_validation.d.ts +0 -89
- package/dist/_validation.d.ts.map +0 -1
- package/dist/_validation.js +0 -29
- package/dist/_validation.js.map +0 -1
- package/dist/_waituntil.d.ts +0 -32
- package/dist/_waituntil.d.ts.map +0 -1
- package/dist/_waituntil.js +0 -156
- package/dist/_waituntil.js.map +0 -1
- package/dist/agent.d.ts +0 -1262
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -981
- package/dist/agent.js.map +0 -1
- package/dist/app.d.ts +0 -514
- package/dist/app.d.ts.map +0 -1
- package/dist/app.js +0 -228
- package/dist/app.js.map +0 -1
- package/dist/bootstrap.d.ts +0 -44
- package/dist/bootstrap.d.ts.map +0 -1
- package/dist/bootstrap.js +0 -259
- package/dist/bootstrap.js.map +0 -1
- package/dist/bun-s3-patch.d.ts +0 -37
- package/dist/bun-s3-patch.d.ts.map +0 -1
- package/dist/bun-s3-patch.js +0 -142
- package/dist/bun-s3-patch.js.map +0 -1
- package/dist/cors.d.ts +0 -42
- package/dist/cors.d.ts.map +0 -1
- package/dist/cors.js +0 -117
- package/dist/cors.js.map +0 -1
- package/dist/dev-patches/aisdk.d.ts +0 -17
- package/dist/dev-patches/aisdk.d.ts.map +0 -1
- package/dist/dev-patches/aisdk.js +0 -160
- package/dist/dev-patches/aisdk.js.map +0 -1
- package/dist/dev-patches/gateway.d.ts +0 -16
- package/dist/dev-patches/gateway.d.ts.map +0 -1
- package/dist/dev-patches/gateway.js +0 -54
- package/dist/dev-patches/gateway.js.map +0 -1
- package/dist/dev-patches/index.d.ts +0 -21
- package/dist/dev-patches/index.d.ts.map +0 -1
- package/dist/dev-patches/index.js +0 -33
- package/dist/dev-patches/index.js.map +0 -1
- package/dist/dev-patches/otel-llm.d.ts +0 -12
- package/dist/dev-patches/otel-llm.d.ts.map +0 -1
- package/dist/dev-patches/otel-llm.js +0 -352
- package/dist/dev-patches/otel-llm.js.map +0 -1
- package/dist/devmode.d.ts +0 -3
- package/dist/devmode.d.ts.map +0 -1
- package/dist/devmode.js +0 -167
- package/dist/devmode.js.map +0 -1
- package/dist/eval.d.ts +0 -91
- package/dist/eval.d.ts.map +0 -1
- package/dist/eval.js +0 -16
- package/dist/eval.js.map +0 -1
- package/dist/handlers/_route-meta.d.ts +0 -22
- package/dist/handlers/_route-meta.d.ts.map +0 -1
- package/dist/handlers/_route-meta.js +0 -25
- package/dist/handlers/_route-meta.js.map +0 -1
- package/dist/handlers/cron.d.ts +0 -73
- package/dist/handlers/cron.d.ts.map +0 -1
- package/dist/handlers/cron.js +0 -43
- package/dist/handlers/cron.js.map +0 -1
- package/dist/handlers/index.d.ts +0 -6
- package/dist/handlers/index.d.ts.map +0 -1
- package/dist/handlers/index.js +0 -6
- package/dist/handlers/index.js.map +0 -1
- package/dist/handlers/sse.d.ts +0 -163
- package/dist/handlers/sse.d.ts.map +0 -1
- package/dist/handlers/sse.js +0 -175
- package/dist/handlers/sse.js.map +0 -1
- package/dist/handlers/stream.d.ts +0 -52
- package/dist/handlers/stream.d.ts.map +0 -1
- package/dist/handlers/stream.js +0 -108
- package/dist/handlers/stream.js.map +0 -1
- package/dist/handlers/webrtc.d.ts +0 -49
- package/dist/handlers/webrtc.d.ts.map +0 -1
- package/dist/handlers/webrtc.js +0 -109
- package/dist/handlers/webrtc.js.map +0 -1
- package/dist/handlers/websocket.d.ts +0 -88
- package/dist/handlers/websocket.d.ts.map +0 -1
- package/dist/handlers/websocket.js +0 -161
- package/dist/handlers/websocket.js.map +0 -1
- package/dist/logger/console.d.ts +0 -70
- package/dist/logger/console.d.ts.map +0 -1
- package/dist/logger/console.js +0 -278
- package/dist/logger/console.js.map +0 -1
- package/dist/logger/index.d.ts +0 -3
- package/dist/logger/index.d.ts.map +0 -1
- package/dist/logger/index.js +0 -3
- package/dist/logger/index.js.map +0 -1
- package/dist/logger/internal.d.ts +0 -79
- package/dist/logger/internal.d.ts.map +0 -1
- package/dist/logger/internal.js +0 -133
- package/dist/logger/internal.js.map +0 -1
- package/dist/logger/logger.d.ts +0 -41
- package/dist/logger/logger.d.ts.map +0 -1
- package/dist/logger/logger.js +0 -2
- package/dist/logger/logger.js.map +0 -1
- package/dist/logger/user.d.ts +0 -8
- package/dist/logger/user.d.ts.map +0 -1
- package/dist/logger/user.js +0 -7
- package/dist/logger/user.js.map +0 -1
- package/dist/logger/util.d.ts +0 -11
- package/dist/logger/util.d.ts.map +0 -1
- package/dist/logger/util.js +0 -77
- package/dist/logger/util.js.map +0 -1
- package/dist/middleware.d.ts +0 -105
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -763
- package/dist/middleware.js.map +0 -1
- package/dist/otel/config.d.ts +0 -19
- package/dist/otel/config.d.ts.map +0 -1
- package/dist/otel/config.js +0 -26
- package/dist/otel/config.js.map +0 -1
- package/dist/otel/console.d.ts +0 -33
- package/dist/otel/console.d.ts.map +0 -1
- package/dist/otel/console.js +0 -86
- package/dist/otel/console.js.map +0 -1
- package/dist/otel/exporters/index.d.ts +0 -4
- package/dist/otel/exporters/index.d.ts.map +0 -1
- package/dist/otel/exporters/index.js +0 -4
- package/dist/otel/exporters/index.js.map +0 -1
- package/dist/otel/exporters/jsonl-log-exporter.d.ts +0 -36
- package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +0 -1
- package/dist/otel/exporters/jsonl-log-exporter.js +0 -103
- package/dist/otel/exporters/jsonl-log-exporter.js.map +0 -1
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts +0 -40
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +0 -1
- package/dist/otel/exporters/jsonl-metric-exporter.js +0 -104
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +0 -1
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts +0 -36
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +0 -1
- package/dist/otel/exporters/jsonl-trace-exporter.js +0 -111
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +0 -1
- package/dist/otel/fetch.d.ts +0 -12
- package/dist/otel/fetch.d.ts.map +0 -1
- package/dist/otel/fetch.js +0 -82
- package/dist/otel/fetch.js.map +0 -1
- package/dist/otel/http.d.ts +0 -16
- package/dist/otel/http.d.ts.map +0 -1
- package/dist/otel/http.js +0 -44
- package/dist/otel/http.js.map +0 -1
- package/dist/otel/logger.d.ts +0 -37
- package/dist/otel/logger.d.ts.map +0 -1
- package/dist/otel/logger.js +0 -265
- package/dist/otel/logger.js.map +0 -1
- package/dist/otel/otel.d.ts +0 -68
- package/dist/otel/otel.d.ts.map +0 -1
- package/dist/otel/otel.js +0 -245
- package/dist/otel/otel.js.map +0 -1
- package/dist/otel/tracestate.d.ts +0 -44
- package/dist/otel/tracestate.d.ts.map +0 -1
- package/dist/otel/tracestate.js +0 -84
- package/dist/otel/tracestate.js.map +0 -1
- package/dist/router.d.ts +0 -66
- package/dist/router.d.ts.map +0 -1
- package/dist/router.js +0 -44
- package/dist/router.js.map +0 -1
- package/dist/services/evalrun/composite.d.ts +0 -21
- package/dist/services/evalrun/composite.d.ts.map +0 -1
- package/dist/services/evalrun/composite.js +0 -26
- package/dist/services/evalrun/composite.js.map +0 -1
- package/dist/services/evalrun/http.d.ts +0 -24
- package/dist/services/evalrun/http.d.ts.map +0 -1
- package/dist/services/evalrun/http.js +0 -115
- package/dist/services/evalrun/http.js.map +0 -1
- package/dist/services/evalrun/index.d.ts +0 -5
- package/dist/services/evalrun/index.d.ts.map +0 -1
- package/dist/services/evalrun/index.js +0 -5
- package/dist/services/evalrun/index.js.map +0 -1
- package/dist/services/evalrun/json.d.ts +0 -21
- package/dist/services/evalrun/json.d.ts.map +0 -1
- package/dist/services/evalrun/json.js +0 -38
- package/dist/services/evalrun/json.js.map +0 -1
- package/dist/services/evalrun/local.d.ts +0 -19
- package/dist/services/evalrun/local.d.ts.map +0 -1
- package/dist/services/evalrun/local.js +0 -22
- package/dist/services/evalrun/local.js.map +0 -1
- package/dist/services/local/_db.d.ts +0 -4
- package/dist/services/local/_db.d.ts.map +0 -1
- package/dist/services/local/_db.js +0 -281
- package/dist/services/local/_db.js.map +0 -1
- package/dist/services/local/_router.d.ts +0 -3
- package/dist/services/local/_router.d.ts.map +0 -1
- package/dist/services/local/_router.js +0 -28
- package/dist/services/local/_router.js.map +0 -1
- package/dist/services/local/_util.d.ts +0 -18
- package/dist/services/local/_util.d.ts.map +0 -1
- package/dist/services/local/_util.js +0 -44
- package/dist/services/local/_util.js.map +0 -1
- package/dist/services/local/email.d.ts +0 -24
- package/dist/services/local/email.d.ts.map +0 -1
- package/dist/services/local/email.js +0 -58
- package/dist/services/local/email.js.map +0 -1
- package/dist/services/local/index.d.ts +0 -10
- package/dist/services/local/index.d.ts.map +0 -1
- package/dist/services/local/index.js +0 -10
- package/dist/services/local/index.js.map +0 -1
- package/dist/services/local/keyvalue.d.ts +0 -17
- package/dist/services/local/keyvalue.d.ts.map +0 -1
- package/dist/services/local/keyvalue.js +0 -133
- package/dist/services/local/keyvalue.js.map +0 -1
- package/dist/services/local/queue.d.ts +0 -10
- package/dist/services/local/queue.d.ts.map +0 -1
- package/dist/services/local/queue.js +0 -96
- package/dist/services/local/queue.js.map +0 -1
- package/dist/services/local/stream.d.ts +0 -12
- package/dist/services/local/stream.d.ts.map +0 -1
- package/dist/services/local/stream.js +0 -266
- package/dist/services/local/stream.js.map +0 -1
- package/dist/services/local/task.d.ts +0 -55
- package/dist/services/local/task.d.ts.map +0 -1
- package/dist/services/local/task.js +0 -1248
- package/dist/services/local/task.js.map +0 -1
- package/dist/services/local/vector.d.ts +0 -17
- package/dist/services/local/vector.d.ts.map +0 -1
- package/dist/services/local/vector.js +0 -303
- package/dist/services/local/vector.js.map +0 -1
- package/dist/services/sandbox/http.d.ts +0 -23
- package/dist/services/sandbox/http.d.ts.map +0 -1
- package/dist/services/sandbox/http.js +0 -327
- package/dist/services/sandbox/http.js.map +0 -1
- package/dist/services/sandbox/index.d.ts +0 -2
- package/dist/services/sandbox/index.d.ts.map +0 -1
- package/dist/services/sandbox/index.js +0 -2
- package/dist/services/sandbox/index.js.map +0 -1
- package/dist/services/session/composite.d.ts +0 -21
- package/dist/services/session/composite.d.ts.map +0 -1
- package/dist/services/session/composite.js +0 -26
- package/dist/services/session/composite.js.map +0 -1
- package/dist/services/session/http.d.ts +0 -34
- package/dist/services/session/http.d.ts.map +0 -1
- package/dist/services/session/http.js +0 -124
- package/dist/services/session/http.js.map +0 -1
- package/dist/services/session/index.d.ts +0 -5
- package/dist/services/session/index.d.ts.map +0 -1
- package/dist/services/session/index.js +0 -5
- package/dist/services/session/index.js.map +0 -1
- package/dist/services/session/json.d.ts +0 -22
- package/dist/services/session/json.d.ts.map +0 -1
- package/dist/services/session/json.js +0 -35
- package/dist/services/session/json.js.map +0 -1
- package/dist/services/session/local.d.ts +0 -19
- package/dist/services/session/local.d.ts.map +0 -1
- package/dist/services/session/local.js +0 -23
- package/dist/services/session/local.js.map +0 -1
- package/dist/services/thread/local.d.ts +0 -20
- package/dist/services/thread/local.d.ts.map +0 -1
- package/dist/services/thread/local.js +0 -158
- package/dist/services/thread/local.js.map +0 -1
- package/dist/session.d.ts +0 -734
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -1140
- package/dist/session.js.map +0 -1
- package/dist/signature.d.ts +0 -22
- package/dist/signature.d.ts.map +0 -1
- package/dist/signature.js +0 -63
- package/dist/signature.js.map +0 -1
- package/dist/validator.d.ts +0 -142
- package/dist/validator.d.ts.map +0 -1
- package/dist/validator.js +0 -149
- package/dist/validator.js.map +0 -1
- package/dist/version-check.d.ts +0 -20
- package/dist/version-check.d.ts.map +0 -1
- package/dist/version-check.js +0 -157
- package/dist/version-check.js.map +0 -1
- package/dist/web.d.ts +0 -8
- package/dist/web.d.ts.map +0 -1
- package/dist/web.js +0 -67
- package/dist/web.js.map +0 -1
- package/dist/webrtc-signaling.d.ts +0 -80
- package/dist/webrtc-signaling.d.ts.map +0 -1
- package/dist/webrtc-signaling.js +0 -237
- package/dist/webrtc-signaling.js.map +0 -1
- package/dist/workbench.d.ts +0 -17
- package/dist/workbench.d.ts.map +0 -1
- package/dist/workbench.js +0 -605
- package/dist/workbench.js.map +0 -1
- package/src/_config.ts +0 -163
- package/src/_context.ts +0 -240
- package/src/_events.ts +0 -142
- package/src/_globals.ts +0 -92
- package/src/_idle.ts +0 -10
- package/src/_metadata.ts +0 -407
- package/src/_process-protection.ts +0 -71
- package/src/_server.ts +0 -109
- package/src/_services.ts +0 -379
- package/src/_standalone.ts +0 -710
- package/src/_tokens.ts +0 -114
- package/src/_util.ts +0 -62
- package/src/_validation.ts +0 -119
- package/src/_waituntil.ts +0 -188
- package/src/agent.ts +0 -2739
- package/src/app.ts +0 -769
- package/src/bootstrap.ts +0 -321
- package/src/bun-s3-patch.ts +0 -224
- package/src/cors.ts +0 -137
- package/src/dev-patches/aisdk.ts +0 -169
- package/src/dev-patches/gateway.ts +0 -68
- package/src/dev-patches/index.ts +0 -37
- package/src/dev-patches/otel-llm.ts +0 -405
- package/src/devmode.ts +0 -171
- package/src/eval.ts +0 -109
- package/src/globals.d.ts +0 -28
- package/src/handlers/_route-meta.ts +0 -33
- package/src/handlers/cron.ts +0 -141
- package/src/handlers/index.ts +0 -18
- package/src/handlers/sse.ts +0 -358
- package/src/handlers/stream.ts +0 -121
- package/src/handlers/webrtc.ts +0 -125
- package/src/handlers/websocket.ts +0 -203
- package/src/logger/console.ts +0 -323
- package/src/logger/index.ts +0 -2
- package/src/logger/internal.ts +0 -165
- package/src/logger/logger.ts +0 -44
- package/src/logger/user.ts +0 -15
- package/src/logger/util.ts +0 -80
- package/src/middleware.ts +0 -1095
- package/src/otel/config.ts +0 -47
- package/src/otel/console.ts +0 -91
- package/src/otel/exporters/README.md +0 -217
- package/src/otel/exporters/index.ts +0 -3
- package/src/otel/exporters/jsonl-log-exporter.ts +0 -113
- package/src/otel/exporters/jsonl-metric-exporter.ts +0 -120
- package/src/otel/exporters/jsonl-trace-exporter.ts +0 -121
- package/src/otel/fetch.ts +0 -105
- package/src/otel/http.ts +0 -53
- package/src/otel/logger.ts +0 -293
- package/src/otel/otel.ts +0 -354
- package/src/otel/tracestate.ts +0 -108
- package/src/router.ts +0 -75
- package/src/services/evalrun/composite.ts +0 -34
- package/src/services/evalrun/http.ts +0 -167
- package/src/services/evalrun/index.ts +0 -4
- package/src/services/evalrun/json.ts +0 -46
- package/src/services/evalrun/local.ts +0 -28
- package/src/services/local/README.md +0 -1576
- package/src/services/local/_db.ts +0 -353
- package/src/services/local/_router.ts +0 -40
- package/src/services/local/_util.ts +0 -55
- package/src/services/local/email.ts +0 -91
- package/src/services/local/index.ts +0 -9
- package/src/services/local/keyvalue.ts +0 -174
- package/src/services/local/queue.ts +0 -145
- package/src/services/local/stream.ts +0 -358
- package/src/services/local/task.ts +0 -1711
- package/src/services/local/vector.ts +0 -438
- package/src/services/sandbox/http.ts +0 -522
- package/src/services/sandbox/index.ts +0 -1
- package/src/services/session/composite.ts +0 -33
- package/src/services/session/http.ts +0 -167
- package/src/services/session/index.ts +0 -4
- package/src/services/session/json.ts +0 -42
- package/src/services/session/local.ts +0 -33
- package/src/services/thread/local.ts +0 -199
- package/src/session.ts +0 -1960
- package/src/signature.ts +0 -82
- package/src/validator.ts +0 -283
- package/src/version-check.ts +0 -184
- package/src/web.ts +0 -76
- package/src/webrtc-signaling.ts +0 -288
- package/src/workbench.ts +0 -725
package/src/bootstrap.ts
DELETED
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Server lifecycle helpers.
|
|
3
|
-
*
|
|
4
|
-
* These functions are called by createApp() to set up routes, middleware,
|
|
5
|
-
* and the Bun HTTP server. They're kept separate to keep createApp() focused
|
|
6
|
-
* on orchestration while these handle the details.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { Context } from 'hono';
|
|
10
|
-
import { websocket, serveStatic } from 'hono/bun';
|
|
11
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
12
|
-
import { join } from 'node:path';
|
|
13
|
-
import { mimeTypes } from '@agentuity/server';
|
|
14
|
-
|
|
15
|
-
import { runShutdown } from './app';
|
|
16
|
-
import type { AnalyticsOptions, WorkbenchOptions } from './app';
|
|
17
|
-
import { createRouter } from './router';
|
|
18
|
-
import { createWebSessionMiddleware } from './middleware';
|
|
19
|
-
import { enableProcessExitProtection } from './_process-protection';
|
|
20
|
-
import { hasWaitUntilPending } from './_waituntil';
|
|
21
|
-
import { getOrganizationId, getProjectId, isDevMode as runtimeIsDevMode } from './_config';
|
|
22
|
-
import { BEACON_SCRIPT } from '@agentuity/frontend';
|
|
23
|
-
|
|
24
|
-
// ============================================================================
|
|
25
|
-
// Mode detection
|
|
26
|
-
// ============================================================================
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Runtime mode detection.
|
|
30
|
-
* Dynamic string concatenation prevents Bun.build from inlining NODE_ENV.
|
|
31
|
-
* @see https://github.com/oven-sh/bun/issues/20183
|
|
32
|
-
*/
|
|
33
|
-
const getEnv = (key: string) => process.env[key];
|
|
34
|
-
/**
|
|
35
|
-
* Check if running in development mode.
|
|
36
|
-
*
|
|
37
|
-
* The CLI dev server explicitly sets NODE_ENV='development'. In production
|
|
38
|
-
* (cloud deployment, CI integration test running a built app.js), NODE_ENV
|
|
39
|
-
* may be 'production' or unset entirely. When unset, we assume production
|
|
40
|
-
* — the dev server always sets it, so absence means production.
|
|
41
|
-
*/
|
|
42
|
-
export const isDevelopment = () => getEnv('NODE' + '_' + 'ENV') === 'development';
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// Analytics helpers
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
/** Resolve analytics config with defaults */
|
|
49
|
-
export function resolveAnalyticsConfig(
|
|
50
|
-
analytics: boolean | AnalyticsOptions | undefined
|
|
51
|
-
): AnalyticsOptions & { enabled: boolean } {
|
|
52
|
-
if (analytics === false) {
|
|
53
|
-
return { enabled: false };
|
|
54
|
-
}
|
|
55
|
-
const opts = typeof analytics === 'object' ? analytics : {};
|
|
56
|
-
return {
|
|
57
|
-
enabled: opts.enabled !== false,
|
|
58
|
-
requireConsent: opts.requireConsent ?? false,
|
|
59
|
-
trackClicks: opts.trackClicks ?? true,
|
|
60
|
-
trackScroll: opts.trackScroll ?? true,
|
|
61
|
-
trackOutboundLinks: opts.trackOutboundLinks ?? true,
|
|
62
|
-
trackForms: opts.trackForms ?? false,
|
|
63
|
-
trackWebVitals: opts.trackWebVitals ?? true,
|
|
64
|
-
trackErrors: opts.trackErrors ?? true,
|
|
65
|
-
trackSPANavigation: opts.trackSPANavigation ?? true,
|
|
66
|
-
sampleRate: opts.sampleRate ?? 1,
|
|
67
|
-
excludePatterns: opts.excludePatterns ?? [],
|
|
68
|
-
globalProperties: opts.globalProperties ?? {},
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** Resolve workbench config */
|
|
73
|
-
export function resolveWorkbenchConfig(
|
|
74
|
-
workbench: boolean | string | WorkbenchOptions | undefined
|
|
75
|
-
): { enabled: boolean; route: string; headers: Record<string, string> } {
|
|
76
|
-
if (!workbench) {
|
|
77
|
-
return { enabled: false, route: '/workbench', headers: {} };
|
|
78
|
-
}
|
|
79
|
-
if (workbench === true) {
|
|
80
|
-
return { enabled: true, route: '/workbench', headers: {} };
|
|
81
|
-
}
|
|
82
|
-
if (typeof workbench === 'string') {
|
|
83
|
-
return { enabled: true, route: workbench, headers: {} };
|
|
84
|
-
}
|
|
85
|
-
return {
|
|
86
|
-
enabled: true,
|
|
87
|
-
route: workbench.route ?? '/workbench',
|
|
88
|
-
headers: workbench.headers ?? {},
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/** Inject analytics scripts into HTML */
|
|
93
|
-
function injectAnalytics(
|
|
94
|
-
html: string,
|
|
95
|
-
analyticsConfig: AnalyticsOptions & { enabled: boolean }
|
|
96
|
-
): string {
|
|
97
|
-
if (!analyticsConfig.enabled) return html;
|
|
98
|
-
|
|
99
|
-
const orgId = getOrganizationId() || '';
|
|
100
|
-
const projectId = getProjectId() || '';
|
|
101
|
-
const isDevmode = runtimeIsDevMode();
|
|
102
|
-
|
|
103
|
-
const pageConfig = {
|
|
104
|
-
...analyticsConfig,
|
|
105
|
-
orgId,
|
|
106
|
-
projectId,
|
|
107
|
-
isDevmode,
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const configScript = `<script>window.__AGENTUITY_ANALYTICS__=${JSON.stringify(pageConfig)};</script>`;
|
|
111
|
-
const sessionScript = '<script src="/_agentuity/webanalytics/session.js" async></script>';
|
|
112
|
-
|
|
113
|
-
// In production, the beacon is already in HTML as a CDN asset (data-agentuity-beacon marker)
|
|
114
|
-
const beaconMarker = '<script data-agentuity-beacon';
|
|
115
|
-
if (html.includes(beaconMarker)) {
|
|
116
|
-
const injection = configScript + sessionScript;
|
|
117
|
-
return html.replace(beaconMarker, injection + beaconMarker);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Development: beacon served from local route
|
|
121
|
-
const beaconScript = '<script src="/_agentuity/webanalytics/analytics.js"></script>';
|
|
122
|
-
const injection = configScript + sessionScript + beaconScript;
|
|
123
|
-
|
|
124
|
-
if (html.includes('</head>')) {
|
|
125
|
-
return html.replace('</head>', injection + '</head>');
|
|
126
|
-
}
|
|
127
|
-
if (html.includes('<body')) {
|
|
128
|
-
return html.replace(/<body([^>]*)>/, `<body$1>${injection}`);
|
|
129
|
-
}
|
|
130
|
-
return injection + html;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** Register analytics routes on the app */
|
|
134
|
-
export function registerAnalyticsRoutes(
|
|
135
|
-
app: ReturnType<typeof createRouter>,
|
|
136
|
-
_analyticsConfig: AnalyticsOptions & { enabled: boolean }
|
|
137
|
-
): void {
|
|
138
|
-
app.get(
|
|
139
|
-
'/_agentuity/webanalytics/session.js',
|
|
140
|
-
createWebSessionMiddleware(),
|
|
141
|
-
async (c: Context) => {
|
|
142
|
-
const threadId = c.get('_webThreadId') || '';
|
|
143
|
-
const sessionData = JSON.stringify({ threadId });
|
|
144
|
-
const sessionScript = `window.__AGENTUITY_SESSION__=${sessionData};`;
|
|
145
|
-
return new Response(sessionScript, {
|
|
146
|
-
headers: {
|
|
147
|
-
'Content-Type': 'application/javascript; charset=utf-8',
|
|
148
|
-
'Cache-Control': 'no-store, no-cache, must-revalidate',
|
|
149
|
-
},
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
if (isDevelopment()) {
|
|
155
|
-
app.get('/_agentuity/webanalytics/analytics.js', async () => {
|
|
156
|
-
return new Response(BEACON_SCRIPT, {
|
|
157
|
-
headers: {
|
|
158
|
-
'Content-Type': 'application/javascript; charset=utf-8',
|
|
159
|
-
'Cache-Control': 'no-store, no-cache, must-revalidate',
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// ============================================================================
|
|
167
|
-
// Health routes
|
|
168
|
-
// ============================================================================
|
|
169
|
-
|
|
170
|
-
export function registerHealthRoutes(app: ReturnType<typeof createRouter>): void {
|
|
171
|
-
if (!isDevelopment()) {
|
|
172
|
-
const healthHandler = (c: Context) => {
|
|
173
|
-
return c.text('OK', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
174
|
-
};
|
|
175
|
-
const idleHandler = (c: Context) => {
|
|
176
|
-
const server = globalThis.__AGENTUITY_SERVER__;
|
|
177
|
-
if (!server) return c.text('NO', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
178
|
-
if (hasWaitUntilPending())
|
|
179
|
-
return c.text('NO', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
180
|
-
if (server.pendingRequests > 1)
|
|
181
|
-
return c.text('NO', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
182
|
-
if (server.pendingWebSockets > 0)
|
|
183
|
-
return c.text('NO', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
184
|
-
return c.text('OK', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
185
|
-
};
|
|
186
|
-
app.get('/_agentuity/health', healthHandler);
|
|
187
|
-
app.get('/_health', healthHandler);
|
|
188
|
-
app.get('/_agentuity/idle', idleHandler);
|
|
189
|
-
app.get('/_idle', idleHandler);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (isDevelopment()) {
|
|
193
|
-
app.get('/_agentuity/ready', (c: Context) => {
|
|
194
|
-
return c.text('OK', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// ============================================================================
|
|
200
|
-
// Web routes (production static serving)
|
|
201
|
-
// ============================================================================
|
|
202
|
-
|
|
203
|
-
export function registerWebRoutes(
|
|
204
|
-
app: ReturnType<typeof createRouter>,
|
|
205
|
-
analyticsConfig: AnalyticsOptions & { enabled: boolean }
|
|
206
|
-
): void {
|
|
207
|
-
if (isDevelopment()) return;
|
|
208
|
-
|
|
209
|
-
// Resolve client dir relative to the built app.js location (import.meta.dir)
|
|
210
|
-
// The app runs from .agentuity/ and the client output is at .agentuity/client/
|
|
211
|
-
const appDir = typeof import.meta.dir === 'string' ? import.meta.dir : process.cwd();
|
|
212
|
-
const clientDir = join(appDir, 'client');
|
|
213
|
-
|
|
214
|
-
// Vite may output index.html at either:
|
|
215
|
-
// 1. client/index.html (when input is just index.html at root)
|
|
216
|
-
// 2. client/src/web/index.html (when input is src/web/index.html with root='.')
|
|
217
|
-
// Check both locations to support different vite.config.ts setups
|
|
218
|
-
let indexHtmlPath = join(clientDir, 'index.html');
|
|
219
|
-
if (!existsSync(indexHtmlPath)) {
|
|
220
|
-
indexHtmlPath = join(clientDir, 'src', 'web', 'index.html');
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
const baseIndexHtml = existsSync(indexHtmlPath) ? readFileSync(indexHtmlPath, 'utf-8') : '';
|
|
224
|
-
|
|
225
|
-
if (!baseIndexHtml) return;
|
|
226
|
-
|
|
227
|
-
const prodHtmlHandler = (c: Context) => {
|
|
228
|
-
if (analyticsConfig.enabled) {
|
|
229
|
-
const html = injectAnalytics(baseIndexHtml, analyticsConfig);
|
|
230
|
-
return c.html(html);
|
|
231
|
-
}
|
|
232
|
-
return c.html(baseIndexHtml);
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
app.get('/', prodHtmlHandler);
|
|
236
|
-
app.use('/assets/*', serveStatic({ root: clientDir, mimes: mimeTypes }));
|
|
237
|
-
app.use(
|
|
238
|
-
'/*',
|
|
239
|
-
serveStatic({
|
|
240
|
-
root: clientDir,
|
|
241
|
-
rewriteRequestPath: (path: string) => path,
|
|
242
|
-
mimes: mimeTypes,
|
|
243
|
-
})
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
app.all('/_agentuity/*', (c: Context) => c.notFound());
|
|
247
|
-
app.all('/api/*', (c: Context) => c.notFound());
|
|
248
|
-
|
|
249
|
-
app.get('*', (c: Context) => {
|
|
250
|
-
const path = c.req.path;
|
|
251
|
-
if (/\.[a-zA-Z0-9]+$/.test(path)) {
|
|
252
|
-
return c.notFound();
|
|
253
|
-
}
|
|
254
|
-
return prodHtmlHandler(c);
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// ============================================================================
|
|
259
|
-
// Workbench UI route (dev only)
|
|
260
|
-
// ============================================================================
|
|
261
|
-
|
|
262
|
-
export function registerWorkbenchUI(
|
|
263
|
-
app: ReturnType<typeof createRouter>,
|
|
264
|
-
workbenchConfig: { enabled: boolean; route: string }
|
|
265
|
-
): void {
|
|
266
|
-
if (!workbenchConfig.enabled || !isDevelopment()) return;
|
|
267
|
-
|
|
268
|
-
const workbenchSrcDir = join(process.cwd(), '.agentuity', 'workbench-src');
|
|
269
|
-
const workbenchIndexPath = join(workbenchSrcDir, 'index.html');
|
|
270
|
-
|
|
271
|
-
app.get(workbenchConfig.route, async (c: Context) => {
|
|
272
|
-
const html = await Bun.file(workbenchIndexPath).text();
|
|
273
|
-
const withVite = html
|
|
274
|
-
.replace('src="./main.tsx"', `src="/@fs${workbenchSrcDir}/main.tsx"`)
|
|
275
|
-
.replace('href="./styles.css"', `href="/@fs${workbenchSrcDir}/styles.css"`);
|
|
276
|
-
return c.html(withVite);
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// ============================================================================
|
|
281
|
-
// Server startup
|
|
282
|
-
// ============================================================================
|
|
283
|
-
|
|
284
|
-
export function startServer(
|
|
285
|
-
app: ReturnType<typeof createRouter>,
|
|
286
|
-
options?: { requestTimeout?: number }
|
|
287
|
-
): void {
|
|
288
|
-
if (typeof Bun === 'undefined') return;
|
|
289
|
-
|
|
290
|
-
enableProcessExitProtection();
|
|
291
|
-
|
|
292
|
-
const port = parseInt(process.env.PORT || '3500', 10);
|
|
293
|
-
const requestTimeout = options?.requestTimeout ?? 0;
|
|
294
|
-
|
|
295
|
-
const server = Bun.serve({
|
|
296
|
-
fetch: (req, server) => {
|
|
297
|
-
server.timeout(req, requestTimeout);
|
|
298
|
-
return app.fetch(req, server);
|
|
299
|
-
},
|
|
300
|
-
websocket,
|
|
301
|
-
port,
|
|
302
|
-
hostname: '127.0.0.1',
|
|
303
|
-
development: isDevelopment(),
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
globalThis.__AGENTUITY_SERVER__ = server;
|
|
307
|
-
|
|
308
|
-
if (!isDevelopment()) {
|
|
309
|
-
const handleShutdown = async (_signal: string) => {
|
|
310
|
-
try {
|
|
311
|
-
await runShutdown();
|
|
312
|
-
} catch {
|
|
313
|
-
// Ignore shutdown errors
|
|
314
|
-
}
|
|
315
|
-
process.exit(0);
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
process.once('SIGTERM', () => handleShutdown('SIGTERM'));
|
|
319
|
-
process.once('SIGINT', () => handleShutdown('SIGINT'));
|
|
320
|
-
}
|
|
321
|
-
}
|
package/src/bun-s3-patch.ts
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bun S3 monkey-patch for Agentuity storage endpoints
|
|
3
|
-
*
|
|
4
|
-
* Agentuity storage uses virtual-hosted-style URLs (e.g., ag-{id}.t3.storageapi.dev).
|
|
5
|
-
* Bun's default s3 export uses path-style addressing, causing bucket path mismatch.
|
|
6
|
-
*
|
|
7
|
-
* This module patches Bun.S3Client.prototype methods to automatically set
|
|
8
|
-
* virtualHostedStyle: true when S3_ENDPOINT matches *.storage.dev
|
|
9
|
-
*
|
|
10
|
-
* Patched methods:
|
|
11
|
-
* - file(path, options?) - S3Options
|
|
12
|
-
* - presign(path, options?) - S3FilePresignOptions
|
|
13
|
-
* - write(path, data, options?) - S3Options
|
|
14
|
-
* - delete(path, options?) - S3Options
|
|
15
|
-
* - exists(path, options?) - S3Options
|
|
16
|
-
* - stat(path, options?) - S3Options
|
|
17
|
-
* - size(path, options?) - S3Options
|
|
18
|
-
* - unlink(path, options?) - S3Options
|
|
19
|
-
* - list(input?, options?) - options type doesn't include virtualHostedStyle but we inject it anyway
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
const PATCHED_SYMBOL = Symbol.for('agentuity.s3.patched');
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Check if an endpoint is an Agentuity storage endpoint (*.storage.dev or *.storageapi.dev)
|
|
26
|
-
*/
|
|
27
|
-
export function isAgentuityStorageEndpoint(raw: string): boolean {
|
|
28
|
-
let host = raw.trim();
|
|
29
|
-
if (!host) return false;
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
const url = new URL(host.includes('://') ? host : `https://${host}`);
|
|
33
|
-
host = url.hostname;
|
|
34
|
-
} catch {
|
|
35
|
-
// raw value wasn't a URL string; treat it as host already
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
host === 'storage.dev' ||
|
|
40
|
-
host.endsWith('.storage.dev') ||
|
|
41
|
-
host === 'storageapi.dev' ||
|
|
42
|
-
host.endsWith('.storageapi.dev')
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Helper to inject virtualHostedStyle into options if not already set
|
|
48
|
-
*/
|
|
49
|
-
function injectVirtualHostedStyle(options?: Record<string, unknown>): Record<string, unknown> {
|
|
50
|
-
if (!options || typeof options.virtualHostedStyle === 'undefined') {
|
|
51
|
-
return { ...options, virtualHostedStyle: true };
|
|
52
|
-
}
|
|
53
|
-
return options;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Patch Bun's S3Client to automatically use virtualHostedStyle for storage.dev endpoints
|
|
58
|
-
*
|
|
59
|
-
* This function:
|
|
60
|
-
* 1. Checks if we're running in Bun with S3 support
|
|
61
|
-
* 2. Checks if S3_ENDPOINT (or AWS_ENDPOINT) points to *.storage.dev
|
|
62
|
-
* 3. Patches S3Client.prototype methods to inject virtualHostedStyle: true
|
|
63
|
-
*
|
|
64
|
-
* Safe to call in non-Bun environments (will no-op).
|
|
65
|
-
* Idempotent (safe to call multiple times).
|
|
66
|
-
*/
|
|
67
|
-
export function patchBunS3ForStorageDev(): void {
|
|
68
|
-
const bun = (globalThis as Record<string, unknown>).Bun as
|
|
69
|
-
| {
|
|
70
|
-
s3?: unknown;
|
|
71
|
-
S3Client?: {
|
|
72
|
-
prototype: {
|
|
73
|
-
file?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
74
|
-
presign?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
75
|
-
write?: (
|
|
76
|
-
path: string,
|
|
77
|
-
data: unknown,
|
|
78
|
-
options?: Record<string, unknown>
|
|
79
|
-
) => unknown;
|
|
80
|
-
delete?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
81
|
-
exists?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
82
|
-
stat?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
83
|
-
size?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
84
|
-
unlink?: (path: string, options?: Record<string, unknown>) => unknown;
|
|
85
|
-
list?: (
|
|
86
|
-
input?: Record<string, unknown> | null,
|
|
87
|
-
options?: Record<string, unknown>
|
|
88
|
-
) => unknown;
|
|
89
|
-
[PATCHED_SYMBOL]?: boolean;
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
| undefined;
|
|
94
|
-
|
|
95
|
-
if (!bun?.s3 || !bun.S3Client?.prototype?.file) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const endpointEnv = process.env.S3_ENDPOINT ?? process.env.AWS_ENDPOINT;
|
|
100
|
-
if (!endpointEnv) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (!isAgentuityStorageEndpoint(endpointEnv)) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const S3ClientProto = bun.S3Client.prototype;
|
|
109
|
-
|
|
110
|
-
if (S3ClientProto[PATCHED_SYMBOL]) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Patch file(path, options?)
|
|
115
|
-
const originalFile = S3ClientProto.file!;
|
|
116
|
-
S3ClientProto.file = function patchedFile(
|
|
117
|
-
this: unknown,
|
|
118
|
-
path: string,
|
|
119
|
-
options?: Record<string, unknown>
|
|
120
|
-
): unknown {
|
|
121
|
-
return originalFile.call(this, path, injectVirtualHostedStyle(options));
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
// Patch presign(path, options?)
|
|
125
|
-
if (S3ClientProto.presign) {
|
|
126
|
-
const originalPresign = S3ClientProto.presign;
|
|
127
|
-
S3ClientProto.presign = function patchedPresign(
|
|
128
|
-
this: unknown,
|
|
129
|
-
path: string,
|
|
130
|
-
options?: Record<string, unknown>
|
|
131
|
-
): unknown {
|
|
132
|
-
return originalPresign.call(this, path, injectVirtualHostedStyle(options));
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Patch write(path, data, options?)
|
|
137
|
-
if (S3ClientProto.write) {
|
|
138
|
-
const originalWrite = S3ClientProto.write;
|
|
139
|
-
S3ClientProto.write = function patchedWrite(
|
|
140
|
-
this: unknown,
|
|
141
|
-
path: string,
|
|
142
|
-
data: unknown,
|
|
143
|
-
options?: Record<string, unknown>
|
|
144
|
-
): unknown {
|
|
145
|
-
return originalWrite.call(this, path, data, injectVirtualHostedStyle(options));
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Patch delete(path, options?)
|
|
150
|
-
if (S3ClientProto.delete) {
|
|
151
|
-
const originalDelete = S3ClientProto.delete;
|
|
152
|
-
S3ClientProto.delete = function patchedDelete(
|
|
153
|
-
this: unknown,
|
|
154
|
-
path: string,
|
|
155
|
-
options?: Record<string, unknown>
|
|
156
|
-
): unknown {
|
|
157
|
-
return originalDelete.call(this, path, injectVirtualHostedStyle(options));
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Patch exists(path, options?)
|
|
162
|
-
if (S3ClientProto.exists) {
|
|
163
|
-
const originalExists = S3ClientProto.exists;
|
|
164
|
-
S3ClientProto.exists = function patchedExists(
|
|
165
|
-
this: unknown,
|
|
166
|
-
path: string,
|
|
167
|
-
options?: Record<string, unknown>
|
|
168
|
-
): unknown {
|
|
169
|
-
return originalExists.call(this, path, injectVirtualHostedStyle(options));
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Patch stat(path, options?)
|
|
174
|
-
if (S3ClientProto.stat) {
|
|
175
|
-
const originalStat = S3ClientProto.stat;
|
|
176
|
-
S3ClientProto.stat = function patchedStat(
|
|
177
|
-
this: unknown,
|
|
178
|
-
path: string,
|
|
179
|
-
options?: Record<string, unknown>
|
|
180
|
-
): unknown {
|
|
181
|
-
return originalStat.call(this, path, injectVirtualHostedStyle(options));
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Patch size(path, options?)
|
|
186
|
-
if (S3ClientProto.size) {
|
|
187
|
-
const originalSize = S3ClientProto.size;
|
|
188
|
-
S3ClientProto.size = function patchedSize(
|
|
189
|
-
this: unknown,
|
|
190
|
-
path: string,
|
|
191
|
-
options?: Record<string, unknown>
|
|
192
|
-
): unknown {
|
|
193
|
-
return originalSize.call(this, path, injectVirtualHostedStyle(options));
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Patch unlink(path, options?)
|
|
198
|
-
if (S3ClientProto.unlink) {
|
|
199
|
-
const originalUnlink = S3ClientProto.unlink;
|
|
200
|
-
S3ClientProto.unlink = function patchedUnlink(
|
|
201
|
-
this: unknown,
|
|
202
|
-
path: string,
|
|
203
|
-
options?: Record<string, unknown>
|
|
204
|
-
): unknown {
|
|
205
|
-
return originalUnlink.call(this, path, injectVirtualHostedStyle(options));
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Patch list(input?, options?)
|
|
210
|
-
// Note: The TypeScript type for list's options doesn't include virtualHostedStyle,
|
|
211
|
-
// but we inject it anyway as the underlying implementation may still use it
|
|
212
|
-
if (S3ClientProto.list) {
|
|
213
|
-
const originalList = S3ClientProto.list;
|
|
214
|
-
S3ClientProto.list = function patchedList(
|
|
215
|
-
this: unknown,
|
|
216
|
-
input?: Record<string, unknown> | null,
|
|
217
|
-
options?: Record<string, unknown>
|
|
218
|
-
): unknown {
|
|
219
|
-
return originalList.call(this, input, injectVirtualHostedStyle(options));
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
S3ClientProto[PATCHED_SYMBOL] = true;
|
|
224
|
-
}
|
package/src/cors.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CORS trusted origin helpers for same-origin configuration.
|
|
3
|
-
*
|
|
4
|
-
* Provides the same trusted-origin logic as @agentuity/auth,
|
|
5
|
-
* allowing CORS to be restricted to platform-trusted domains.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { Context } from 'hono';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Safely extract origin from a URL string.
|
|
12
|
-
* Returns undefined if the URL is invalid.
|
|
13
|
-
*/
|
|
14
|
-
function safeOrigin(url: string | undefined): string | undefined {
|
|
15
|
-
if (!url) return undefined;
|
|
16
|
-
try {
|
|
17
|
-
return new URL(url).origin;
|
|
18
|
-
} catch {
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Parse an origin-like value (URL or bare domain) into a normalized origin.
|
|
25
|
-
*
|
|
26
|
-
* - Full URLs (http://... or https://...) are parsed as-is
|
|
27
|
-
* - Bare domains (example.com) are treated as https://
|
|
28
|
-
* - Invalid values return undefined
|
|
29
|
-
*/
|
|
30
|
-
function parseOriginLike(value: string): string | undefined {
|
|
31
|
-
const trimmed = value.trim();
|
|
32
|
-
if (!trimmed) return undefined;
|
|
33
|
-
|
|
34
|
-
// If it looks like a URL (has a scheme), parse directly
|
|
35
|
-
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(trimmed)) {
|
|
36
|
-
return safeOrigin(trimmed);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Otherwise, treat as host[:port] and assume https
|
|
40
|
-
return safeOrigin(`https://${trimmed}`);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Build the static trusted origins set from environment variables.
|
|
45
|
-
*
|
|
46
|
-
* Reads from:
|
|
47
|
-
* - AGENTUITY_BASE_URL - The base URL for the deployment
|
|
48
|
-
* - AGENTUITY_CLOUD_DOMAINS - Platform-set domains (comma-separated)
|
|
49
|
-
* - AUTH_TRUSTED_DOMAINS - Developer-set additional domains (comma-separated)
|
|
50
|
-
*/
|
|
51
|
-
function buildEnvTrustedOrigins(): Set<string> {
|
|
52
|
-
const agentuityURL = process.env.AGENTUITY_BASE_URL;
|
|
53
|
-
const cloudDomains = process.env.AGENTUITY_CLOUD_DOMAINS;
|
|
54
|
-
const devTrustedDomains = process.env.AUTH_TRUSTED_DOMAINS;
|
|
55
|
-
|
|
56
|
-
const origins = new Set<string>();
|
|
57
|
-
|
|
58
|
-
const agentuityOrigin = safeOrigin(agentuityURL);
|
|
59
|
-
if (agentuityOrigin) origins.add(agentuityOrigin);
|
|
60
|
-
|
|
61
|
-
// Platform-set cloud domains (deployment, project, PR, custom domains, tunnels)
|
|
62
|
-
if (cloudDomains) {
|
|
63
|
-
for (const raw of cloudDomains.split(',')) {
|
|
64
|
-
const origin = parseOriginLike(raw);
|
|
65
|
-
if (origin) origins.add(origin);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Developer-set additional trusted domains
|
|
70
|
-
if (devTrustedDomains) {
|
|
71
|
-
for (const raw of devTrustedDomains.split(',')) {
|
|
72
|
-
const origin = parseOriginLike(raw);
|
|
73
|
-
if (origin) origins.add(origin);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return origins;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Options for createTrustedCorsOrigin.
|
|
82
|
-
*/
|
|
83
|
-
export interface TrustedCorsOriginOptions {
|
|
84
|
-
/**
|
|
85
|
-
* Additional origins to allow on top of environment-derived ones.
|
|
86
|
-
* Can be full URLs (https://example.com) or bare domains (example.com).
|
|
87
|
-
*/
|
|
88
|
-
allowedOrigins?: string[];
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Create a Hono CORS origin callback that only allows trusted origins.
|
|
93
|
-
*
|
|
94
|
-
* Trusted origins are derived from:
|
|
95
|
-
* - AGENTUITY_BASE_URL environment variable
|
|
96
|
-
* - AGENTUITY_CLOUD_DOMAINS environment variable (comma-separated)
|
|
97
|
-
* - AUTH_TRUSTED_DOMAINS environment variable (comma-separated)
|
|
98
|
-
* - The same-origin of the incoming request URL
|
|
99
|
-
* - Any additional origins specified in allowedOrigins option
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```typescript
|
|
103
|
-
* import { createApp, createTrustedCorsOrigin } from '@agentuity/runtime';
|
|
104
|
-
*
|
|
105
|
-
* await createApp({
|
|
106
|
-
* cors: {
|
|
107
|
-
* origin: createTrustedCorsOrigin({
|
|
108
|
-
* allowedOrigins: ['https://admin.myapp.com'],
|
|
109
|
-
* }),
|
|
110
|
-
* },
|
|
111
|
-
* });
|
|
112
|
-
* ```
|
|
113
|
-
*/
|
|
114
|
-
export function createTrustedCorsOrigin(
|
|
115
|
-
options?: TrustedCorsOriginOptions
|
|
116
|
-
): (origin: string, c: Context) => string | undefined {
|
|
117
|
-
// Build static origins from env vars at creation time
|
|
118
|
-
const baseOrigins = buildEnvTrustedOrigins();
|
|
119
|
-
|
|
120
|
-
// Add any extra origins from options
|
|
121
|
-
if (options?.allowedOrigins) {
|
|
122
|
-
for (const raw of options.allowedOrigins) {
|
|
123
|
-
const origin = parseOriginLike(raw);
|
|
124
|
-
if (origin) baseOrigins.add(origin);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return (origin: string, c: Context): string | undefined => {
|
|
129
|
-
// Build allowed set per-request to include same-origin of the server
|
|
130
|
-
const allowed = new Set(baseOrigins);
|
|
131
|
-
const requestOrigin = safeOrigin(c.req.url);
|
|
132
|
-
if (requestOrigin) allowed.add(requestOrigin);
|
|
133
|
-
|
|
134
|
-
// Only echo back if trusted; otherwise return undefined (no CORS header)
|
|
135
|
-
return allowed.has(origin) ? origin : undefined;
|
|
136
|
-
};
|
|
137
|
-
}
|