pi-cursor-sdk 0.5.0 → 0.5.3
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/CHANGELOG.md +76 -0
- package/README.md +135 -34
- package/dist/context.js +55 -36
- package/dist/cursor-api-key.js +34 -19
- package/dist/cursor-cloud-options.js +1 -0
- package/dist/cursor-config.js +59 -0
- package/dist/cursor-custom-store-path.js +177 -0
- package/dist/cursor-custom-subagent-definitions.js +14 -0
- package/dist/cursor-fallback-models.generated.js +402 -1
- package/dist/cursor-fallback-warning.js +8 -2
- package/dist/cursor-live-run-coordinator.js +22 -2
- package/dist/cursor-local-agent-ownership.js +17 -0
- package/dist/cursor-mcp-timeout-override.js +3 -1
- package/dist/cursor-pi-tool-bridge-diagnostics.js +4 -0
- package/dist/cursor-pi-tool-bridge-run.js +31 -3
- package/dist/cursor-pi-tool-bridge-server.js +1 -1
- package/dist/cursor-provider-binding.js +70 -10
- package/dist/cursor-provider-errors.js +33 -26
- package/dist/cursor-provider-live-run-drain.js +10 -4
- package/dist/cursor-provider-run-finalizer.js +2 -1
- package/dist/cursor-provider-turn-prepare.js +25 -9
- package/dist/cursor-provider-turn-summary.js +1 -1
- package/dist/cursor-provider-turn-tool-ledger.js +13 -7
- package/dist/cursor-provider.js +2 -1
- package/dist/cursor-question-tool.js +5 -5
- package/dist/cursor-request-provenance.js +13 -2
- package/dist/cursor-sdk-output-filter.js +1 -1
- package/dist/cursor-sdk-process-error-guard.js +1 -3
- package/dist/cursor-sdk-runtime.js +13 -14
- package/dist/cursor-sdk-vendor-env.js +20 -0
- package/dist/cursor-session-agent-cleanup.js +38 -26
- package/dist/cursor-session-agent-lifecycle.js +2 -2
- package/dist/cursor-session-agent-lineage.js +11 -7
- package/dist/cursor-session-agent-resume.js +15 -9
- package/dist/cursor-session-agent.js +60 -23
- package/dist/cursor-session-scope.js +27 -14
- package/dist/cursor-session-send-policy.js +2 -2
- package/dist/cursor-session-settings.js +3 -3
- package/dist/cursor-session-store.js +235 -45
- package/dist/cursor-state.js +23 -9
- package/dist/cursor-tool-manifest.js +1 -1
- package/dist/index.js +21 -19
- package/dist/model-discovery.js +58 -26
- package/dist/model-list-cache.js +12 -1
- package/docs/cursor-live-smoke-checklist.md +2 -2
- package/docs/cursor-model-ux-spec.md +83 -30
- package/docs/cursor-native-tool-replay.md +16 -5
- package/docs/cursor-native-tool-visual-audit.md +1 -1
- package/docs/cursor-testing-lessons.md +63 -7
- package/docs/cursor-tool-surfaces.md +19 -4
- package/node_modules/@hono/node-server/README.md +21 -10
- package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
- package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
- package/node_modules/@hono/node-server/dist/index.cjs +41 -19
- package/node_modules/@hono/node-server/dist/index.mjs +42 -20
- package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
- package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
- package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
- package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
- package/node_modules/@hono/node-server/package.json +3 -2
- package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts → auth-Anm-lwWi.d.mts} +9 -8
- package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts.map → auth-Anm-lwWi.d.mts.map} +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs → auth-BNDyLTqp.mjs} +5 -3
- package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs.map → auth-BNDyLTqp.mjs.map} +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs → auth-D1CeV_Jr.cjs} +5 -3
- package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs.map → auth-D1CeV_Jr.cjs.map} +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts → auth-V9XJSCfa.d.cts} +9 -8
- package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts.map → auth-V9XJSCfa.d.cts.map} +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
- package/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
- package/node_modules/@modelcontextprotocol/core/package.json +2 -2
- package/node_modules/@modelcontextprotocol/hono/README.md +7 -5
- package/node_modules/@modelcontextprotocol/hono/dist/index.cjs.map +1 -1
- package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts +5 -0
- package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts.map +1 -1
- package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts +5 -0
- package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts.map +1 -1
- package/node_modules/@modelcontextprotocol/hono/dist/index.mjs.map +1 -1
- package/node_modules/@modelcontextprotocol/hono/package.json +4 -4
- package/node_modules/@modelcontextprotocol/server/README.md +1 -7
- package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-Bt6U_Fqb.d.mts → createMcpHandler-D4NN8WsG.d.mts} +35 -13
- package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts.map +1 -0
- package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-BLVe3qmU.d.cts → createMcpHandler-DZmmlN8e.d.cts} +35 -13
- package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DZmmlN8e.d.cts.map +1 -0
- package/node_modules/@modelcontextprotocol/server/dist/index.cjs +32 -5
- package/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/index.d.cts +41 -5
- package/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/index.d.mts +41 -5
- package/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/index.mjs +32 -5
- package/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/{mcp-DUcCQSTW.cjs → mcp-BumlNux0.cjs} +73 -23
- package/node_modules/@modelcontextprotocol/server/dist/mcp-BumlNux0.cjs.map +1 -0
- package/node_modules/@modelcontextprotocol/server/dist/{mcp-Dw2OlZ1f.mjs → mcp-DIH4cS6P.mjs} +73 -23
- package/node_modules/@modelcontextprotocol/server/dist/mcp-DIH4cS6P.mjs.map +1 -0
- package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/{src-CgFsfg3E.cjs → src-BhnGYybN.cjs} +29 -11
- package/node_modules/@modelcontextprotocol/server/dist/src-BhnGYybN.cjs.map +1 -0
- package/node_modules/@modelcontextprotocol/server/dist/{src-D-y6h4N7.mjs → src-Cqbh3MYc.mjs} +29 -11
- package/node_modules/@modelcontextprotocol/server/dist/src-Cqbh3MYc.mjs.map +1 -0
- package/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +2 -2
- package/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +1 -1
- package/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +2 -2
- package/node_modules/@modelcontextprotocol/server/package.json +4 -4
- package/node_modules/hono/dist/_virtual/_rolldown/runtime.js +13 -0
- package/node_modules/hono/dist/adapter/aws-lambda/conninfo.js +42 -23
- package/node_modules/hono/dist/adapter/aws-lambda/handler.js +318 -344
- package/node_modules/hono/dist/adapter/aws-lambda/index.js +2 -8
- package/node_modules/hono/dist/adapter/aws-lambda/types.js +1 -0
- package/node_modules/hono/dist/adapter/bun/conninfo.js +20 -25
- package/node_modules/hono/dist/adapter/bun/index.js +3 -13
- package/node_modules/hono/dist/adapter/bun/serve-static.js +27 -27
- package/node_modules/hono/dist/adapter/bun/server.js +11 -5
- package/node_modules/hono/dist/adapter/bun/ssg.js +25 -15
- package/node_modules/hono/dist/adapter/bun/websocket.js +61 -68
- package/node_modules/hono/dist/adapter/cloudflare-pages/conninfo.js +24 -9
- package/node_modules/hono/dist/adapter/cloudflare-pages/handler.js +59 -62
- package/node_modules/hono/dist/adapter/cloudflare-pages/index.js +2 -8
- package/node_modules/hono/dist/adapter/cloudflare-workers/conninfo.js +7 -9
- package/node_modules/hono/dist/adapter/cloudflare-workers/index.js +3 -8
- package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static-module.js +5 -6
- package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static.js +26 -20
- package/node_modules/hono/dist/adapter/cloudflare-workers/utils.js +21 -34
- package/node_modules/hono/dist/adapter/cloudflare-workers/websocket.js +31 -39
- package/node_modules/hono/dist/adapter/deno/conninfo.js +16 -13
- package/node_modules/hono/dist/adapter/deno/deno.d.js +1 -0
- package/node_modules/hono/dist/adapter/deno/index.js +3 -10
- package/node_modules/hono/dist/adapter/deno/serve-static.js +33 -38
- package/node_modules/hono/dist/adapter/deno/ssg.js +27 -16
- package/node_modules/hono/dist/adapter/deno/websocket.js +30 -30
- package/node_modules/hono/dist/adapter/lambda-edge/conninfo.js +7 -9
- package/node_modules/hono/dist/adapter/lambda-edge/handler.js +102 -101
- package/node_modules/hono/dist/adapter/lambda-edge/index.js +2 -6
- package/node_modules/hono/dist/adapter/netlify/conninfo.js +24 -9
- package/node_modules/hono/dist/adapter/netlify/handler.js +10 -8
- package/node_modules/hono/dist/adapter/netlify/index.js +3 -2
- package/node_modules/hono/dist/adapter/netlify/mod.js +2 -6
- package/node_modules/hono/dist/adapter/service-worker/handler.js +15 -19
- package/node_modules/hono/dist/adapter/service-worker/index.js +23 -7
- package/node_modules/hono/dist/adapter/service-worker/types.js +1 -0
- package/node_modules/hono/dist/adapter/vercel/conninfo.js +7 -10
- package/node_modules/hono/dist/adapter/vercel/handler.js +8 -6
- package/node_modules/hono/dist/adapter/vercel/index.js +2 -6
- package/node_modules/hono/dist/cjs/_virtual/_rolldown/runtime.js +33 -0
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/conninfo.js +42 -44
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +326 -373
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/index.js +7 -34
- package/node_modules/hono/dist/cjs/adapter/aws-lambda/types.js +0 -15
- package/node_modules/hono/dist/cjs/adapter/bun/conninfo.js +21 -47
- package/node_modules/hono/dist/cjs/adapter/bun/index.js +14 -45
- package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +29 -50
- package/node_modules/hono/dist/cjs/adapter/bun/server.js +11 -26
- package/node_modules/hono/dist/cjs/adapter/bun/ssg.js +24 -35
- package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +63 -91
- package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/conninfo.js +25 -31
- package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/handler.js +61 -85
- package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/index.js +7 -34
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/conninfo.js +8 -31
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/index.js +7 -33
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static-module.js +7 -29
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static.js +27 -42
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/utils.js +21 -55
- package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/websocket.js +33 -62
- package/node_modules/hono/dist/cjs/adapter/deno/conninfo.js +16 -34
- package/node_modules/hono/dist/cjs/adapter/deno/index.js +10 -38
- package/node_modules/hono/dist/cjs/adapter/deno/serve-static.js +33 -59
- package/node_modules/hono/dist/cjs/adapter/deno/ssg.js +27 -37
- package/node_modules/hono/dist/cjs/adapter/deno/websocket.js +32 -53
- package/node_modules/hono/dist/cjs/adapter/lambda-edge/conninfo.js +8 -31
- package/node_modules/hono/dist/cjs/adapter/lambda-edge/handler.js +102 -130
- package/node_modules/hono/dist/cjs/adapter/lambda-edge/index.js +5 -30
- package/node_modules/hono/dist/cjs/adapter/netlify/conninfo.js +25 -31
- package/node_modules/hono/dist/cjs/adapter/netlify/handler.js +10 -29
- package/node_modules/hono/dist/cjs/adapter/netlify/index.js +5 -21
- package/node_modules/hono/dist/cjs/adapter/netlify/mod.js +5 -30
- package/node_modules/hono/dist/cjs/adapter/service-worker/handler.js +16 -41
- package/node_modules/hono/dist/cjs/adapter/service-worker/index.js +25 -30
- package/node_modules/hono/dist/cjs/adapter/service-worker/types.js +0 -15
- package/node_modules/hono/dist/cjs/adapter/vercel/conninfo.js +8 -32
- package/node_modules/hono/dist/cjs/adapter/vercel/handler.js +8 -27
- package/node_modules/hono/dist/cjs/adapter/vercel/index.js +5 -30
- package/node_modules/hono/dist/cjs/client/client.js +139 -212
- package/node_modules/hono/dist/cjs/client/fetch-result-please.js +62 -80
- package/node_modules/hono/dist/cjs/client/index.js +7 -32
- package/node_modules/hono/dist/cjs/client/types.js +0 -15
- package/node_modules/hono/dist/cjs/client/utils.js +54 -92
- package/node_modules/hono/dist/cjs/compose.js +49 -66
- package/node_modules/hono/dist/cjs/context.js +379 -450
- package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +47 -72
- package/node_modules/hono/dist/cjs/helper/accepts/index.js +3 -27
- package/node_modules/hono/dist/cjs/helper/adapter/index.js +33 -73
- package/node_modules/hono/dist/cjs/helper/conninfo/index.js +0 -15
- package/node_modules/hono/dist/cjs/helper/conninfo/types.js +0 -15
- package/node_modules/hono/dist/cjs/helper/cookie/index.js +75 -116
- package/node_modules/hono/dist/cjs/helper/css/common.js +165 -244
- package/node_modules/hono/dist/cjs/helper/css/index.js +136 -151
- package/node_modules/hono/dist/cjs/helper/dev/index.js +45 -71
- package/node_modules/hono/dist/cjs/helper/factory/index.js +30 -51
- package/node_modules/hono/dist/cjs/helper/html/index.js +32 -62
- package/node_modules/hono/dist/cjs/helper/proxy/index.js +113 -106
- package/node_modules/hono/dist/cjs/helper/route/index.js +123 -66
- package/node_modules/hono/dist/cjs/helper/ssg/index.js +19 -43
- package/node_modules/hono/dist/cjs/helper/ssg/middleware.js +56 -64
- package/node_modules/hono/dist/cjs/helper/ssg/plugins.js +55 -57
- package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +196 -296
- package/node_modules/hono/dist/cjs/helper/ssg/utils.js +47 -90
- package/node_modules/hono/dist/cjs/helper/streaming/index.js +8 -35
- package/node_modules/hono/dist/cjs/helper/streaming/sse.js +53 -85
- package/node_modules/hono/dist/cjs/helper/streaming/stream.js +23 -53
- package/node_modules/hono/dist/cjs/helper/streaming/text.js +10 -32
- package/node_modules/hono/dist/cjs/helper/streaming/utils.js +13 -32
- package/node_modules/hono/dist/cjs/helper/testing/index.js +16 -31
- package/node_modules/hono/dist/cjs/helper/websocket/index.js +51 -76
- package/node_modules/hono/dist/cjs/hono-base.js +347 -403
- package/node_modules/hono/dist/cjs/hono.js +28 -42
- package/node_modules/hono/dist/cjs/http-exception.js +55 -56
- package/node_modules/hono/dist/cjs/index.js +22 -30
- package/node_modules/hono/dist/cjs/jsx/base.js +237 -366
- package/node_modules/hono/dist/cjs/jsx/children.js +16 -41
- package/node_modules/hono/dist/cjs/jsx/components.js +119 -192
- package/node_modules/hono/dist/cjs/jsx/constants.js +15 -42
- package/node_modules/hono/dist/cjs/jsx/context.js +144 -162
- package/node_modules/hono/dist/cjs/jsx/dom/client.js +49 -69
- package/node_modules/hono/dist/cjs/jsx/dom/components.js +23 -52
- package/node_modules/hono/dist/cjs/jsx/dom/context.js +39 -67
- package/node_modules/hono/dist/cjs/jsx/dom/css.js +143 -158
- package/node_modules/hono/dist/cjs/jsx/dom/hooks/index.js +55 -64
- package/node_modules/hono/dist/cjs/jsx/dom/index.js +114 -173
- package/node_modules/hono/dist/cjs/jsx/dom/intrinsic-element/components.js +282 -375
- package/node_modules/hono/dist/cjs/jsx/dom/jsx-dev-runtime.js +14 -49
- package/node_modules/hono/dist/cjs/jsx/dom/jsx-runtime.js +5 -32
- package/node_modules/hono/dist/cjs/jsx/dom/render.js +469 -623
- package/node_modules/hono/dist/cjs/jsx/dom/server.js +37 -64
- package/node_modules/hono/dist/cjs/jsx/dom/utils.js +7 -30
- package/node_modules/hono/dist/cjs/jsx/hooks/index.js +225 -318
- package/node_modules/hono/dist/cjs/jsx/index.js +86 -135
- package/node_modules/hono/dist/cjs/jsx/intrinsic-element/common.js +20 -43
- package/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +117 -168
- package/node_modules/hono/dist/cjs/jsx/intrinsic-elements.js +0 -15
- package/node_modules/hono/dist/cjs/jsx/jsx-dev-runtime.js +14 -39
- package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +34 -68
- package/node_modules/hono/dist/cjs/jsx/streaming.js +123 -166
- package/node_modules/hono/dist/cjs/jsx/types.js +0 -15
- package/node_modules/hono/dist/cjs/jsx/utils.js +91 -175
- package/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +98 -86
- package/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +92 -109
- package/node_modules/hono/dist/cjs/middleware/body-limit/index.js +66 -72
- package/node_modules/hono/dist/cjs/middleware/cache/index.js +153 -199
- package/node_modules/hono/dist/cjs/middleware/combine/index.js +135 -95
- package/node_modules/hono/dist/cjs/middleware/compress/index.js +73 -88
- package/node_modules/hono/dist/cjs/middleware/context-storage/index.js +49 -41
- package/node_modules/hono/dist/cjs/middleware/cors/index.js +107 -107
- package/node_modules/hono/dist/cjs/middleware/csrf/index.js +101 -72
- package/node_modules/hono/dist/cjs/middleware/etag/digest.js +58 -97
- package/node_modules/hono/dist/cjs/middleware/etag/index.js +71 -91
- package/node_modules/hono/dist/cjs/middleware/ip-restriction/index.js +161 -169
- package/node_modules/hono/dist/cjs/middleware/jsx-renderer/index.js +99 -77
- package/node_modules/hono/dist/cjs/middleware/jwk/index.js +3 -27
- package/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +118 -135
- package/node_modules/hono/dist/cjs/middleware/jwt/index.js +9 -38
- package/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +120 -141
- package/node_modules/hono/dist/cjs/middleware/language/index.js +7 -35
- package/node_modules/hono/dist/cjs/middleware/language/language.js +184 -182
- package/node_modules/hono/dist/cjs/middleware/logger/index.js +41 -62
- package/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +82 -88
- package/node_modules/hono/dist/cjs/middleware/method-override/index.js +101 -102
- package/node_modules/hono/dist/cjs/middleware/mount/index.js +71 -0
- package/node_modules/hono/dist/cjs/middleware/powered-by/index.js +23 -30
- package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +38 -42
- package/node_modules/hono/dist/cjs/middleware/request-id/index.js +3 -27
- package/node_modules/hono/dist/cjs/middleware/request-id/request-id.js +34 -42
- package/node_modules/hono/dist/cjs/middleware/secure-headers/index.js +4 -29
- package/node_modules/hono/dist/cjs/middleware/secure-headers/permissions-policy.js +0 -15
- package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +142 -174
- package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +56 -93
- package/node_modules/hono/dist/cjs/middleware/serve-static/path.js +15 -38
- package/node_modules/hono/dist/cjs/middleware/timeout/index.js +40 -45
- package/node_modules/hono/dist/cjs/middleware/timing/index.js +7 -35
- package/node_modules/hono/dist/cjs/middleware/timing/timing.js +177 -118
- package/node_modules/hono/dist/cjs/middleware/trailing-slash/index.js +85 -58
- package/node_modules/hono/dist/cjs/preset/quick.js +18 -37
- package/node_modules/hono/dist/cjs/preset/tiny.js +15 -33
- package/node_modules/hono/dist/cjs/request/constants.js +5 -27
- package/node_modules/hono/dist/cjs/request.js +334 -346
- package/node_modules/hono/dist/cjs/router/linear-router/index.js +3 -27
- package/node_modules/hono/dist/cjs/router/linear-router/router.js +95 -143
- package/node_modules/hono/dist/cjs/router/pattern-router/index.js +3 -27
- package/node_modules/hono/dist/cjs/router/pattern-router/router.js +41 -63
- package/node_modules/hono/dist/cjs/router/reg-exp-router/index.js +7 -34
- package/node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js +18 -45
- package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +91 -135
- package/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +92 -161
- package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +98 -147
- package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +73 -89
- package/node_modules/hono/dist/cjs/router/smart-router/index.js +3 -27
- package/node_modules/hono/dist/cjs/router/smart-router/router.js +49 -79
- package/node_modules/hono/dist/cjs/router/trie-router/index.js +3 -27
- package/node_modules/hono/dist/cjs/router/trie-router/node.js +134 -186
- package/node_modules/hono/dist/cjs/router/trie-router/router.js +15 -39
- package/node_modules/hono/dist/cjs/router/utils.js +5 -27
- package/node_modules/hono/dist/cjs/router.js +37 -37
- package/node_modules/hono/dist/cjs/types.js +5 -28
- package/node_modules/hono/dist/cjs/utils/accept.js +177 -225
- package/node_modules/hono/dist/cjs/utils/basic-auth.js +16 -40
- package/node_modules/hono/dist/cjs/utils/body.js +84 -110
- package/node_modules/hono/dist/cjs/utils/buffer.js +43 -91
- package/node_modules/hono/dist/cjs/utils/color.js +35 -44
- package/node_modules/hono/dist/cjs/utils/compress.js +11 -26
- package/node_modules/hono/dist/cjs/utils/concurrent.js +29 -59
- package/node_modules/hono/dist/cjs/utils/constants.js +7 -26
- package/node_modules/hono/dist/cjs/utils/cookie.js +107 -177
- package/node_modules/hono/dist/cjs/utils/crypto.js +30 -61
- package/node_modules/hono/dist/cjs/utils/encode.js +31 -48
- package/node_modules/hono/dist/cjs/utils/filepath.js +23 -54
- package/node_modules/hono/dist/cjs/utils/handler.js +11 -33
- package/node_modules/hono/dist/cjs/utils/headers.js +0 -15
- package/node_modules/hono/dist/cjs/utils/html.js +96 -137
- package/node_modules/hono/dist/cjs/utils/http-status.js +0 -15
- package/node_modules/hono/dist/cjs/utils/ipaddr.js +213 -286
- package/node_modules/hono/dist/cjs/utils/jwt/index.js +14 -27
- package/node_modules/hono/dist/cjs/utils/jwt/jwa.js +25 -42
- package/node_modules/hono/dist/cjs/utils/jwt/jws.js +119 -199
- package/node_modules/hono/dist/cjs/utils/jwt/jwt.js +122 -206
- package/node_modules/hono/dist/cjs/utils/jwt/types.js +122 -159
- package/node_modules/hono/dist/cjs/utils/jwt/utf8.js +9 -28
- package/node_modules/hono/dist/cjs/utils/mime.js +75 -101
- package/node_modules/hono/dist/cjs/utils/stream.js +88 -111
- package/node_modules/hono/dist/cjs/utils/types.js +0 -15
- package/node_modules/hono/dist/cjs/utils/url.js +185 -234
- package/node_modules/hono/dist/cjs/validator/index.js +3 -27
- package/node_modules/hono/dist/cjs/validator/utils.js +0 -15
- package/node_modules/hono/dist/cjs/validator/validator.js +60 -103
- package/node_modules/hono/dist/client/client.js +138 -197
- package/node_modules/hono/dist/client/fetch-result-please.js +59 -56
- package/node_modules/hono/dist/client/index.js +3 -7
- package/node_modules/hono/dist/client/types.js +1 -0
- package/node_modules/hono/dist/client/utils.js +51 -68
- package/node_modules/hono/dist/compose.js +49 -45
- package/node_modules/hono/dist/context.js +376 -426
- package/node_modules/hono/dist/helper/accepts/accepts.js +47 -51
- package/node_modules/hono/dist/helper/accepts/index.js +1 -4
- package/node_modules/hono/dist/helper/adapter/index.js +33 -52
- package/node_modules/hono/dist/helper/conninfo/index.js +1 -0
- package/node_modules/hono/dist/helper/conninfo/types.js +1 -0
- package/node_modules/hono/dist/helper/cookie/index.js +74 -94
- package/node_modules/hono/dist/helper/css/common.js +167 -225
- package/node_modules/hono/dist/helper/css/index.js +132 -137
- package/node_modules/hono/dist/helper/dev/index.js +44 -49
- package/node_modules/hono/dist/helper/factory/index.js +27 -27
- package/node_modules/hono/dist/helper/html/index.js +30 -39
- package/node_modules/hono/dist/helper/proxy/index.js +116 -88
- package/node_modules/hono/dist/helper/route/index.js +121 -43
- package/node_modules/hono/dist/helper/ssg/index.js +3 -18
- package/node_modules/hono/dist/helper/ssg/middleware.js +53 -40
- package/node_modules/hono/dist/helper/ssg/plugins.js +55 -36
- package/node_modules/hono/dist/helper/ssg/ssg.js +198 -283
- package/node_modules/hono/dist/helper/ssg/utils.js +53 -75
- package/node_modules/hono/dist/helper/streaming/index.js +2 -8
- package/node_modules/hono/dist/helper/streaming/sse.js +50 -61
- package/node_modules/hono/dist/helper/streaming/stream.js +22 -31
- package/node_modules/hono/dist/helper/streaming/text.js +9 -10
- package/node_modules/hono/dist/helper/streaming/utils.js +9 -12
- package/node_modules/hono/dist/helper/testing/index.js +16 -10
- package/node_modules/hono/dist/helper/websocket/index.js +49 -53
- package/node_modules/hono/dist/hono-base.js +344 -379
- package/node_modules/hono/dist/hono.js +27 -20
- package/node_modules/hono/dist/http-exception.js +53 -33
- package/node_modules/hono/dist/index.js +19 -6
- package/node_modules/hono/dist/jsx/base.js +231 -340
- package/node_modules/hono/dist/jsx/children.js +16 -20
- package/node_modules/hono/dist/jsx/components.js +118 -170
- package/node_modules/hono/dist/jsx/constants.js +9 -15
- package/node_modules/hono/dist/jsx/context.js +153 -150
- package/node_modules/hono/dist/jsx/dom/client.js +45 -48
- package/node_modules/hono/dist/jsx/dom/components.js +21 -29
- package/node_modules/hono/dist/jsx/dom/context.js +37 -44
- package/node_modules/hono/dist/jsx/dom/css.js +142 -147
- package/node_modules/hono/dist/jsx/dom/hooks/index.js +52 -40
- package/node_modules/hono/dist/jsx/dom/index.js +71 -134
- package/node_modules/hono/dist/jsx/dom/intrinsic-element/components.js +275 -359
- package/node_modules/hono/dist/jsx/dom/jsx-dev-runtime.js +14 -18
- package/node_modules/hono/dist/jsx/dom/jsx-runtime.js +2 -8
- package/node_modules/hono/dist/jsx/dom/render.js +492 -631
- package/node_modules/hono/dist/jsx/dom/server.js +32 -32
- package/node_modules/hono/dist/jsx/dom/utils.js +6 -8
- package/node_modules/hono/dist/jsx/hooks/index.js +236 -308
- package/node_modules/hono/dist/jsx/index.js +45 -98
- package/node_modules/hono/dist/jsx/intrinsic-element/common.js +20 -22
- package/node_modules/hono/dist/jsx/intrinsic-element/components.js +113 -154
- package/node_modules/hono/dist/jsx/intrinsic-elements.js +1 -0
- package/node_modules/hono/dist/jsx/jsx-dev-runtime.js +12 -16
- package/node_modules/hono/dist/jsx/jsx-runtime.js +29 -42
- package/node_modules/hono/dist/jsx/streaming.js +120 -142
- package/node_modules/hono/dist/jsx/types.js +1 -0
- package/node_modules/hono/dist/jsx/utils.js +105 -168
- package/node_modules/hono/dist/middleware/basic-auth/index.js +96 -63
- package/node_modules/hono/dist/middleware/bearer-auth/index.js +93 -89
- package/node_modules/hono/dist/middleware/body-limit/index.js +66 -51
- package/node_modules/hono/dist/middleware/cache/index.js +165 -190
- package/node_modules/hono/dist/middleware/combine/index.js +134 -73
- package/node_modules/hono/dist/middleware/compress/index.js +75 -69
- package/node_modules/hono/dist/middleware/context-storage/index.js +49 -19
- package/node_modules/hono/dist/middleware/cors/index.js +107 -86
- package/node_modules/hono/dist/middleware/csrf/index.js +103 -53
- package/node_modules/hono/dist/middleware/etag/digest.js +59 -77
- package/node_modules/hono/dist/middleware/etag/index.js +71 -70
- package/node_modules/hono/dist/middleware/ip-restriction/index.js +163 -158
- package/node_modules/hono/dist/middleware/jsx-renderer/index.js +97 -54
- package/node_modules/hono/dist/middleware/jwk/index.js +1 -4
- package/node_modules/hono/dist/middleware/jwk/jwk.js +116 -112
- package/node_modules/hono/dist/middleware/jwt/index.js +2 -10
- package/node_modules/hono/dist/middleware/jwt/jwt.js +114 -114
- package/node_modules/hono/dist/middleware/language/index.js +2 -15
- package/node_modules/hono/dist/middleware/language/language.js +180 -157
- package/node_modules/hono/dist/middleware/logger/index.js +43 -37
- package/node_modules/hono/dist/middleware/method-not-allowed/index.js +81 -66
- package/node_modules/hono/dist/middleware/method-override/index.js +101 -81
- package/node_modules/hono/dist/middleware/mount/index.js +70 -0
- package/node_modules/hono/dist/middleware/powered-by/index.js +23 -9
- package/node_modules/hono/dist/middleware/pretty-json/index.js +39 -22
- package/node_modules/hono/dist/middleware/request-id/index.js +1 -4
- package/node_modules/hono/dist/middleware/request-id/request-id.js +33 -20
- package/node_modules/hono/dist/middleware/secure-headers/index.js +1 -5
- package/node_modules/hono/dist/middleware/secure-headers/permissions-policy.js +1 -0
- package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +144 -155
- package/node_modules/hono/dist/middleware/serve-static/index.js +56 -72
- package/node_modules/hono/dist/middleware/serve-static/path.js +15 -17
- package/node_modules/hono/dist/middleware/timeout/index.js +40 -23
- package/node_modules/hono/dist/middleware/timing/index.js +2 -9
- package/node_modules/hono/dist/middleware/timing/timing.js +177 -97
- package/node_modules/hono/dist/middleware/trailing-slash/index.js +85 -37
- package/node_modules/hono/dist/preset/quick.js +17 -15
- package/node_modules/hono/dist/preset/tiny.js +14 -11
- package/node_modules/hono/dist/request/constants.js +4 -5
- package/node_modules/hono/dist/request.js +328 -319
- package/node_modules/hono/dist/router/linear-router/index.js +1 -4
- package/node_modules/hono/dist/router/linear-router/router.js +93 -120
- package/node_modules/hono/dist/router/pattern-router/index.js +1 -4
- package/node_modules/hono/dist/router/pattern-router/router.js +39 -40
- package/node_modules/hono/dist/router/reg-exp-router/index.js +1 -7
- package/node_modules/hono/dist/router/reg-exp-router/matcher.js +17 -23
- package/node_modules/hono/dist/router/reg-exp-router/node.js +87 -110
- package/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +89 -137
- package/node_modules/hono/dist/router/reg-exp-router/router.js +92 -129
- package/node_modules/hono/dist/router/reg-exp-router/trie.js +69 -64
- package/node_modules/hono/dist/router/smart-router/index.js +1 -4
- package/node_modules/hono/dist/router/smart-router/router.js +46 -55
- package/node_modules/hono/dist/router/trie-router/index.js +1 -4
- package/node_modules/hono/dist/router/trie-router/node.js +131 -162
- package/node_modules/hono/dist/router/trie-router/router.js +11 -14
- package/node_modules/hono/dist/router/utils.js +4 -5
- package/node_modules/hono/dist/router.js +35 -14
- package/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +4 -1
- package/node_modules/hono/dist/types/adapter/aws-lambda/handler.d.ts +150 -104
- package/node_modules/hono/dist/types/adapter/aws-lambda/index.d.ts +4 -8
- package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +152 -122
- package/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +4 -1
- package/node_modules/hono/dist/types/adapter/bun/index.d.ts +6 -10
- package/node_modules/hono/dist/types/adapter/bun/serve-static.d.ts +7 -2
- package/node_modules/hono/dist/types/adapter/bun/server.d.ts +4 -5
- package/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +5 -1
- package/node_modules/hono/dist/types/adapter/bun/websocket.d.ts +31 -16
- package/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +4 -1
- package/node_modules/hono/dist/types/adapter/cloudflare-pages/handler.d.ts +29 -17
- package/node_modules/hono/dist/types/adapter/cloudflare-pages/index.d.ts +3 -7
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/index.d.ts +4 -7
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static-module.d.ts +5 -2
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static.d.ts +10 -5
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/utils.d.ts +10 -2
- package/node_modules/hono/dist/types/adapter/cloudflare-workers/websocket.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +4 -1
- package/node_modules/hono/dist/types/adapter/deno/deno.d.ts +1 -0
- package/node_modules/hono/dist/types/adapter/deno/index.d.ts +5 -8
- package/node_modules/hono/dist/types/adapter/deno/serve-static.d.ts +7 -2
- package/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +5 -1
- package/node_modules/hono/dist/types/adapter/deno/websocket.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/lambda-edge/handler.d.ts +83 -57
- package/node_modules/hono/dist/types/adapter/lambda-edge/index.d.ts +3 -7
- package/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +4 -1
- package/node_modules/hono/dist/types/adapter/netlify/handler.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/netlify/index.d.ts +3 -5
- package/node_modules/hono/dist/types/adapter/netlify/mod.d.ts +3 -2
- package/node_modules/hono/dist/types/adapter/service-worker/handler.d.ts +9 -7
- package/node_modules/hono/dist/types/adapter/service-worker/index.d.ts +7 -9
- package/node_modules/hono/dist/types/adapter/service-worker/types.d.ts +12 -7
- package/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/vercel/handler.d.ts +6 -1
- package/node_modules/hono/dist/types/adapter/vercel/index.d.ts +3 -6
- package/node_modules/hono/dist/types/client/client.d.ts +5 -3
- package/node_modules/hono/dist/types/client/fetch-result-please.d.ts +21 -19
- package/node_modules/hono/dist/types/client/index.d.ts +5 -7
- package/node_modules/hono/dist/types/client/types.d.ts +134 -159
- package/node_modules/hono/dist/types/client/utils.d.ts +6 -4
- package/node_modules/hono/dist/types/compose.d.ts +4 -2
- package/node_modules/hono/dist/types/context.d.ts +335 -335
- package/node_modules/hono/dist/types/helper/accepts/accepts.d.ts +11 -9
- package/node_modules/hono/dist/types/helper/accepts/index.d.ts +2 -5
- package/node_modules/hono/dist/types/helper/adapter/index.d.ts +4 -6
- package/node_modules/hono/dist/types/helper/conninfo/index.d.ts +2 -5
- package/node_modules/hono/dist/types/helper/conninfo/types.d.ts +25 -23
- package/node_modules/hono/dist/types/helper/cookie/index.d.ts +10 -12
- package/node_modules/hono/dist/types/helper/css/common.d.ts +11 -9
- package/node_modules/hono/dist/types/helper/css/index.d.ts +26 -28
- package/node_modules/hono/dist/types/helper/dev/index.d.ts +10 -12
- package/node_modules/hono/dist/types/helper/factory/index.d.ts +26 -73
- package/node_modules/hono/dist/types/helper/html/index.d.ts +4 -7
- package/node_modules/hono/dist/types/helper/proxy/index.d.ts +19 -21
- package/node_modules/hono/dist/types/helper/route/index.d.ts +4 -2
- package/node_modules/hono/dist/types/helper/ssg/index.d.ts +4 -7
- package/node_modules/hono/dist/types/helper/ssg/middleware.d.ts +8 -6
- package/node_modules/hono/dist/types/helper/ssg/plugins.d.ts +3 -1
- package/node_modules/hono/dist/types/helper/ssg/ssg.d.ts +38 -36
- package/node_modules/hono/dist/types/helper/ssg/utils.d.ts +5 -3
- package/node_modules/hono/dist/types/helper/streaming/index.d.ts +4 -8
- package/node_modules/hono/dist/types/helper/streaming/sse.d.ts +10 -8
- package/node_modules/hono/dist/types/helper/streaming/stream.d.ts +4 -2
- package/node_modules/hono/dist/types/helper/streaming/text.d.ts +4 -2
- package/node_modules/hono/dist/types/helper/streaming/utils.d.ts +2 -0
- package/node_modules/hono/dist/types/helper/testing/index.d.ts +7 -9
- package/node_modules/hono/dist/types/helper/websocket/index.d.ts +30 -33
- package/node_modules/hono/dist/types/hono-base.d.ts +210 -210
- package/node_modules/hono/dist/types/hono.d.ts +11 -10
- package/node_modules/hono/dist/types/http-exception.d.ts +20 -22
- package/node_modules/hono/dist/types/index.d.ts +6 -37
- package/node_modules/hono/dist/types/jsx/base.d.ts +37 -35
- package/node_modules/hono/dist/types/jsx/children.d.ts +8 -6
- package/node_modules/hono/dist/types/jsx/components.d.ts +8 -5
- package/node_modules/hono/dist/types/jsx/constants.d.ts +2 -0
- package/node_modules/hono/dist/types/jsx/context.d.ts +9 -6
- package/node_modules/hono/dist/types/jsx/dom/client.d.ts +9 -10
- package/node_modules/hono/dist/types/jsx/dom/components.d.ts +9 -6
- package/node_modules/hono/dist/types/jsx/dom/context.d.ts +3 -1
- package/node_modules/hono/dist/types/jsx/dom/css.d.ts +27 -30
- package/node_modules/hono/dist/types/jsx/dom/hooks/index.d.ts +11 -12
- package/node_modules/hono/dist/types/jsx/dom/index.d.ts +79 -83
- package/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +9 -5
- package/node_modules/hono/dist/types/jsx/dom/jsx-dev-runtime.d.ts +4 -6
- package/node_modules/hono/dist/types/jsx/dom/jsx-runtime.d.ts +3 -7
- package/node_modules/hono/dist/types/jsx/dom/render.d.ts +32 -50
- package/node_modules/hono/dist/types/jsx/dom/server.d.ts +87 -85
- package/node_modules/hono/dist/types/jsx/dom/utils.d.ts +2 -0
- package/node_modules/hono/dist/types/jsx/hooks/index.d.ts +16 -16
- package/node_modules/hono/dist/types/jsx/index.d.ts +71 -73
- package/node_modules/hono/dist/types/jsx/intrinsic-element/common.d.ts +3 -1
- package/node_modules/hono/dist/types/jsx/intrinsic-element/components.d.ts +7 -4
- package/node_modules/hono/dist/types/jsx/intrinsic-elements.d.ts +708 -708
- package/node_modules/hono/dist/types/jsx/jsx-dev-runtime.d.ts +4 -7
- package/node_modules/hono/dist/types/jsx/jsx-runtime.d.ts +7 -10
- package/node_modules/hono/dist/types/jsx/streaming.d.ts +9 -10
- package/node_modules/hono/dist/types/jsx/types.d.ts +12 -13
- package/node_modules/hono/dist/types/jsx/utils.d.ts +2 -0
- package/node_modules/hono/dist/types/middleware/basic-auth/index.d.ts +17 -19
- package/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +46 -48
- package/node_modules/hono/dist/types/middleware/body-limit/index.d.ts +6 -8
- package/node_modules/hono/dist/types/middleware/cache/index.d.ts +13 -15
- package/node_modules/hono/dist/types/middleware/combine/index.d.ts +4 -6
- package/node_modules/hono/dist/types/middleware/compress/index.d.ts +9 -10
- package/node_modules/hono/dist/types/middleware/context-storage/index.d.ts +4 -6
- package/node_modules/hono/dist/types/middleware/cors/index.d.ts +10 -12
- package/node_modules/hono/dist/types/middleware/csrf/index.d.ts +6 -8
- package/node_modules/hono/dist/types/middleware/etag/digest.d.ts +2 -0
- package/node_modules/hono/dist/types/middleware/etag/index.d.ts +6 -8
- package/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +11 -12
- package/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +11 -11
- package/node_modules/hono/dist/types/middleware/jwk/index.d.ts +2 -1
- package/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +20 -23
- package/node_modules/hono/dist/types/middleware/jwt/index.d.ts +7 -6
- package/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +28 -30
- package/node_modules/hono/dist/types/middleware/language/index.d.ts +6 -5
- package/node_modules/hono/dist/types/middleware/language/language.d.ts +42 -44
- package/node_modules/hono/dist/types/middleware/logger/index.d.ts +3 -5
- package/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +7 -9
- package/node_modules/hono/dist/types/middleware/method-override/index.d.ts +14 -16
- package/node_modules/hono/dist/types/middleware/mount/index.d.ts +46 -0
- package/node_modules/hono/dist/types/middleware/powered-by/index.d.ts +8 -10
- package/node_modules/hono/dist/types/middleware/pretty-json/index.d.ts +18 -20
- package/node_modules/hono/dist/types/middleware/request-id/index.d.ts +6 -5
- package/node_modules/hono/dist/types/middleware/request-id/request-id.d.ts +9 -11
- package/node_modules/hono/dist/types/middleware/secure-headers/index.d.ts +6 -6
- package/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +2 -0
- package/node_modules/hono/dist/types/middleware/secure-headers/secure-headers.d.ts +55 -57
- package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +24 -24
- package/node_modules/hono/dist/types/middleware/serve-static/path.d.ts +2 -0
- package/node_modules/hono/dist/types/middleware/timeout/index.d.ts +5 -7
- package/node_modules/hono/dist/types/middleware/timing/index.d.ts +6 -5
- package/node_modules/hono/dist/types/middleware/timing/timing.d.ts +17 -20
- package/node_modules/hono/dist/types/middleware/trailing-slash/index.d.ts +35 -37
- package/node_modules/hono/dist/types/preset/quick.d.ts +6 -9
- package/node_modules/hono/dist/types/preset/tiny.d.ts +6 -9
- package/node_modules/hono/dist/types/request/constants.d.ts +2 -0
- package/node_modules/hono/dist/types/request.d.ts +288 -286
- package/node_modules/hono/dist/types/router/linear-router/index.d.ts +2 -5
- package/node_modules/hono/dist/types/router/linear-router/router.d.ts +7 -5
- package/node_modules/hono/dist/types/router/pattern-router/index.d.ts +2 -5
- package/node_modules/hono/dist/types/router/pattern-router/router.d.ts +7 -5
- package/node_modules/hono/dist/types/router/reg-exp-router/index.d.ts +3 -6
- package/node_modules/hono/dist/types/router/reg-exp-router/matcher.d.ts +3 -1
- package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +6 -4
- package/node_modules/hono/dist/types/router/reg-exp-router/prepared-router.d.ts +11 -10
- package/node_modules/hono/dist/types/router/reg-exp-router/router.d.ts +10 -9
- package/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +7 -5
- package/node_modules/hono/dist/types/router/smart-router/index.d.ts +2 -5
- package/node_modules/hono/dist/types/router/smart-router/router.d.ts +11 -9
- package/node_modules/hono/dist/types/router/trie-router/index.d.ts +2 -5
- package/node_modules/hono/dist/types/router/trie-router/node.d.ts +6 -4
- package/node_modules/hono/dist/types/router/trie-router/router.d.ts +7 -5
- package/node_modules/hono/dist/types/router/utils.d.ts +2 -0
- package/node_modules/hono/dist/types/router.d.ts +23 -22
- package/node_modules/hono/dist/types/types.d.ts +146 -505
- package/node_modules/hono/dist/types/utils/accept.d.ts +5 -3
- package/node_modules/hono/dist/types/utils/basic-auth.d.ts +4 -2
- package/node_modules/hono/dist/types/utils/body.d.ts +46 -50
- package/node_modules/hono/dist/types/utils/buffer.d.ts +7 -5
- package/node_modules/hono/dist/types/utils/color.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/compress.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/concurrent.d.ts +6 -4
- package/node_modules/hono/dist/types/utils/constants.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/cookie.d.ts +20 -18
- package/node_modules/hono/dist/types/utils/crypto.d.ts +5 -7
- package/node_modules/hono/dist/types/utils/encode.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/filepath.d.ts +5 -3
- package/node_modules/hono/dist/types/utils/handler.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/headers.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/html.d.ts +11 -9
- package/node_modules/hono/dist/types/utils/http-status.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/ipaddr.d.ts +4 -6
- package/node_modules/hono/dist/types/utils/jwt/index.d.ts +18 -12
- package/node_modules/hono/dist/types/utils/jwt/jwa.d.ts +15 -13
- package/node_modules/hono/dist/types/utils/jwt/jws.d.ts +4 -7
- package/node_modules/hono/dist/types/utils/jwt/jwt.d.ts +26 -29
- package/node_modules/hono/dist/types/utils/jwt/types.d.ts +48 -45
- package/node_modules/hono/dist/types/utils/jwt/utf8.d.ts +2 -0
- package/node_modules/hono/dist/types/utils/mime.d.ts +60 -57
- package/node_modules/hono/dist/types/utils/stream.d.ts +27 -25
- package/node_modules/hono/dist/types/utils/types.d.ts +14 -26
- package/node_modules/hono/dist/types/utils/url.d.ts +2 -0
- package/node_modules/hono/dist/types/validator/index.d.ts +3 -7
- package/node_modules/hono/dist/types/validator/utils.d.ts +6 -8
- package/node_modules/hono/dist/types/validator/validator.d.ts +11 -9
- package/node_modules/hono/dist/types.js +4 -6
- package/node_modules/hono/dist/utils/accept.js +185 -212
- package/node_modules/hono/dist/utils/basic-auth.js +18 -21
- package/node_modules/hono/dist/utils/body.js +87 -92
- package/node_modules/hono/dist/utils/buffer.js +44 -71
- package/node_modules/hono/dist/utils/color.js +33 -21
- package/node_modules/hono/dist/utils/compress.js +11 -5
- package/node_modules/hono/dist/utils/concurrent.js +29 -38
- package/node_modules/hono/dist/utils/constants.js +7 -5
- package/node_modules/hono/dist/utils/cookie.js +114 -163
- package/node_modules/hono/dist/utils/crypto.js +30 -40
- package/node_modules/hono/dist/utils/encode.js +30 -26
- package/node_modules/hono/dist/utils/filepath.js +23 -33
- package/node_modules/hono/dist/utils/handler.js +10 -11
- package/node_modules/hono/dist/utils/headers.js +1 -0
- package/node_modules/hono/dist/utils/html.js +97 -117
- package/node_modules/hono/dist/utils/http-status.js +1 -0
- package/node_modules/hono/dist/utils/ipaddr.js +227 -279
- package/node_modules/hono/dist/utils/jwt/index.js +12 -4
- package/node_modules/hono/dist/utils/jwt/jwa.js +24 -20
- package/node_modules/hono/dist/utils/jwt/jws.js +115 -174
- package/node_modules/hono/dist/utils/jwt/jwt.js +120 -198
- package/node_modules/hono/dist/utils/jwt/types.js +79 -95
- package/node_modules/hono/dist/utils/jwt/utf8.js +9 -7
- package/node_modules/hono/dist/utils/mime.js +74 -79
- package/node_modules/hono/dist/utils/stream.js +86 -88
- package/node_modules/hono/dist/utils/types.js +1 -0
- package/node_modules/hono/dist/utils/url.js +187 -215
- package/node_modules/hono/dist/validator/index.js +1 -4
- package/node_modules/hono/dist/validator/utils.js +1 -0
- package/node_modules/hono/dist/validator/validator.js +61 -83
- package/node_modules/hono/package.json +35 -27
- package/package.json +20 -18
- package/scripts/lib/cursor-sdk-output-filter.d.mts +1 -0
- package/scripts/lib/cursor-sdk-output-filter.mjs +1 -0
- package/scripts/platform-smoke/artifacts.mjs +7 -1
- package/shared/cursor-sdk-output-filter.d.mts +3 -0
- package/shared/cursor-sdk-output-filter.mjs +117 -44
- package/src/context.ts +59 -35
- package/src/cursor-api-key.ts +37 -17
- package/src/cursor-cloud-options.ts +2 -0
- package/src/cursor-config.ts +76 -0
- package/src/cursor-custom-store-path.ts +151 -0
- package/src/cursor-custom-subagent-definitions.ts +21 -0
- package/src/cursor-fallback-models.generated.ts +402 -1
- package/src/cursor-fallback-warning.ts +7 -3
- package/src/cursor-live-run-coordinator.ts +21 -2
- package/src/cursor-local-agent-ownership.ts +18 -0
- package/src/cursor-mcp-timeout-override.ts +3 -1
- package/src/cursor-pi-tool-bridge-diagnostics.ts +17 -0
- package/src/cursor-pi-tool-bridge-run.ts +31 -3
- package/src/cursor-pi-tool-bridge-server.ts +1 -2
- package/src/cursor-pi-tool-bridge-types.ts +3 -0
- package/src/cursor-provider-binding.ts +70 -11
- package/src/cursor-provider-errors.ts +32 -28
- package/src/cursor-provider-live-run-drain.ts +9 -4
- package/src/cursor-provider-run-finalizer.ts +2 -1
- package/src/cursor-provider-turn-prepare.ts +28 -13
- package/src/cursor-provider-turn-summary.ts +1 -1
- package/src/cursor-provider-turn-tool-ledger.ts +12 -7
- package/src/cursor-provider.ts +3 -1
- package/src/cursor-question-tool.ts +5 -5
- package/src/cursor-request-provenance.ts +18 -3
- package/src/cursor-sdk-output-filter.ts +2 -0
- package/src/cursor-sdk-process-error-guard.ts +1 -2
- package/src/cursor-sdk-runtime.ts +14 -15
- package/src/cursor-sdk-vendor-env.ts +22 -0
- package/src/cursor-session-agent-cleanup.ts +33 -27
- package/src/cursor-session-agent-lifecycle.ts +2 -2
- package/src/cursor-session-agent-lineage.ts +10 -5
- package/src/cursor-session-agent-resume.ts +14 -7
- package/src/cursor-session-agent.ts +67 -24
- package/src/cursor-session-scope.ts +33 -11
- package/src/cursor-session-send-policy.ts +2 -2
- package/src/cursor-session-settings.ts +3 -3
- package/src/cursor-session-store.ts +259 -53
- package/src/cursor-state.ts +32 -7
- package/src/cursor-tool-manifest.ts +1 -1
- package/src/index.ts +19 -19
- package/src/model-discovery.ts +68 -30
- package/src/model-list-cache.ts +11 -1
- package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +0 -1
- package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +0 -1
- package/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +0 -1
- package/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +0 -1
- package/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +0 -1
- package/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +0 -1
package/src/context.ts
CHANGED
|
@@ -12,6 +12,8 @@ export interface CursorPrompt {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export interface CursorPromptOptions {
|
|
15
|
+
/** From the consumed native receipt; absent for requests that differ from the canonical projection. */
|
|
16
|
+
nativeSourceRoles?: readonly string[];
|
|
15
17
|
maxInputTokens?: number;
|
|
16
18
|
charsPerToken?: number;
|
|
17
19
|
imageTokenEstimate?: number;
|
|
@@ -50,6 +52,7 @@ export function getCursorToolTailGuardText(
|
|
|
50
52
|
: getCursorPlanModeToolGuidanceText(options.agentMode, { includePiBridgeGuidance: options.includePiBridgeGuidance }),
|
|
51
53
|
"Exact-output requests: output exactly the requested text; no preamble or checks unless asked.",
|
|
52
54
|
"Tools: call available Cursor SDK/MCP tools; never print tool cards as assistant text.",
|
|
55
|
+
"Do not comment on GitHub issues or PRs unless the user asked.",
|
|
53
56
|
options.includePiBridgeGuidance === false ? undefined : CURSOR_PI_BRIDGE_PREFERENCE_TEXT,
|
|
54
57
|
].filter((line): line is string => line !== undefined).join("\n");
|
|
55
58
|
}
|
|
@@ -58,7 +61,7 @@ function getCursorToolBoundaryText(
|
|
|
58
61
|
options: Pick<CursorPromptOptions, "agentMode" | "includePiAskQuestionGuidance"> & { hasToolManifest?: boolean; includePiBridgeGuidance?: boolean } = {},
|
|
59
62
|
): string {
|
|
60
63
|
const includePiBridgeGuidance = options.includePiBridgeGuidance !== false;
|
|
61
|
-
const includePiAskQuestionGuidance = includePiBridgeGuidance && options.includePiAskQuestionGuidance
|
|
64
|
+
const includePiAskQuestionGuidance = includePiBridgeGuidance && options.includePiAskQuestionGuidance === true;
|
|
62
65
|
const lines = [
|
|
63
66
|
"Cursor SDK tool boundary:",
|
|
64
67
|
"Call only Cursor SDK/MCP tools exposed in this run; pi history names, replay labels, and transcript names are not callable.",
|
|
@@ -66,7 +69,7 @@ function getCursorToolBoundaryText(
|
|
|
66
69
|
? "For exposed pi bridge tools, call pi__* MCP names, not pi card/history names."
|
|
67
70
|
: undefined,
|
|
68
71
|
"Do not claim pi-side or WebSearch/WebFetch tools unless Cursor ran an equivalent tool.",
|
|
69
|
-
includePiAskQuestionGuidance ? "Use pi__cursor_ask_question
|
|
72
|
+
includePiAskQuestionGuidance ? "Use pi__cursor_ask_question only if the user asked to be prompted." : undefined,
|
|
70
73
|
getCursorPlanModeToolGuidanceText(options.agentMode, { includePiBridgeGuidance }),
|
|
71
74
|
"Images: only latest user images are sent; ask to reattach prior images.",
|
|
72
75
|
].filter((line): line is string => line !== undefined);
|
|
@@ -77,10 +80,13 @@ function getCursorToolBoundaryText(
|
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
function getCursorBootstrapTailSections(
|
|
80
|
-
options: Pick<CursorPromptOptions, "agentMode" | "includePiBridgeGuidance"
|
|
83
|
+
options: Pick<CursorPromptOptions, "agentMode" | "includePiBridgeGuidance">,
|
|
84
|
+
hasNewNativeUser = true,
|
|
81
85
|
): string[] {
|
|
82
86
|
return [
|
|
83
|
-
|
|
87
|
+
hasNewNativeUser
|
|
88
|
+
? "Answer the latest user request above using the instructions and Cursor SDK capabilities available in this run."
|
|
89
|
+
: "Continue from the pending background context above using Cursor SDK capabilities. No new user request was submitted; earlier user requests are history, not new instructions.",
|
|
84
90
|
getCursorToolTailGuardText({ ...options, includePlanModeGuidance: false }),
|
|
85
91
|
];
|
|
86
92
|
}
|
|
@@ -101,22 +107,11 @@ function isToolCallBlock(block: { type: string }): block is ToolCall {
|
|
|
101
107
|
return block.type === "toolCall";
|
|
102
108
|
}
|
|
103
109
|
|
|
104
|
-
function extractLatestImages(messages: Message[]): SDKImage[] {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (typeof msg.content === "string") return [];
|
|
110
|
-
|
|
111
|
-
const images: SDKImage[] = [];
|
|
112
|
-
for (const block of msg.content) {
|
|
113
|
-
if (isImageBlock(block) && block.data && block.mimeType) {
|
|
114
|
-
images.push({ data: block.data, mimeType: block.mimeType });
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return images;
|
|
118
|
-
}
|
|
119
|
-
return [];
|
|
110
|
+
function extractLatestImages(messages: Message[], latestUserIndex = getLatestUserMessageIndex(messages)): SDKImage[] {
|
|
111
|
+
const message = messages[latestUserIndex];
|
|
112
|
+
if (!message || message.role !== "user" || typeof message.content === "string") return [];
|
|
113
|
+
return message.content.flatMap((block) =>
|
|
114
|
+
isImageBlock(block) && block.data && block.mimeType ? [{ data: block.data, mimeType: block.mimeType }] : []);
|
|
120
115
|
}
|
|
121
116
|
|
|
122
117
|
function formatContentBlocks(content: string | { type: string; text?: string; data?: string; mimeType?: string }[]): string {
|
|
@@ -133,7 +128,7 @@ function formatContentBlocks(content: string | { type: string; text?: string; da
|
|
|
133
128
|
|
|
134
129
|
function formatToolCall(toolCall: ToolCall): string {
|
|
135
130
|
const args = JSON.stringify(toolCall.arguments) ?? "";
|
|
136
|
-
return `
|
|
131
|
+
return `Historical tool request (${getCursorReplayPromptLabel(toolCall.name)}, call ${toolCall.id}): ${args}`;
|
|
137
132
|
}
|
|
138
133
|
|
|
139
134
|
function sanitizeSystemPromptForCursor(systemPrompt: string): string {
|
|
@@ -182,7 +177,7 @@ function formatMessage(msg: Message): string | undefined {
|
|
|
182
177
|
}
|
|
183
178
|
case "toolResult": {
|
|
184
179
|
const text = formatContentBlocks(msg.content);
|
|
185
|
-
const label = msg.isError ? "
|
|
180
|
+
const label = msg.isError ? "Historical tool error" : "Historical tool result";
|
|
186
181
|
return `${label} (${getCursorReplayPromptLabel(msg.toolName)}, call ${msg.toolCallId}): ${text}`;
|
|
187
182
|
}
|
|
188
183
|
}
|
|
@@ -195,6 +190,20 @@ function getLatestUserMessageIndex(messages: Message[]): number {
|
|
|
195
190
|
return -1;
|
|
196
191
|
}
|
|
197
192
|
|
|
193
|
+
export function getCursorPendingInput(messages: Message[], nativeSourceRoles: readonly string[]) {
|
|
194
|
+
const start = messages.findLastIndex((message) => message.role === "assistant") + 1;
|
|
195
|
+
const latestUserIndex = nativeSourceRoles.findLastIndex((role, index) => index >= start && role === "user");
|
|
196
|
+
return { start, latestUserIndex };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function formatPromptMessage(message: Message, index: number, nativeSourceRoles?: readonly string[]): string | undefined {
|
|
200
|
+
if (message.role === "user" && nativeSourceRoles && nativeSourceRoles[index] !== "user") {
|
|
201
|
+
const text = formatContentBlocks(message.content);
|
|
202
|
+
return text ? `Background context: ${text}` : undefined;
|
|
203
|
+
}
|
|
204
|
+
return formatMessage(message);
|
|
205
|
+
}
|
|
206
|
+
|
|
198
207
|
function getSectionCost(section: string): number {
|
|
199
208
|
return section.length + SECTION_SEPARATOR.length;
|
|
200
209
|
}
|
|
@@ -203,7 +212,7 @@ function applyPromptBudget(
|
|
|
203
212
|
sectionsBeforeMessages: string[],
|
|
204
213
|
messageSections: Array<{ index: number; text: string }>,
|
|
205
214
|
sectionsAfterMessages: string[],
|
|
206
|
-
|
|
215
|
+
requiredMessageIndexes: readonly number[],
|
|
207
216
|
options: CursorPromptOptions,
|
|
208
217
|
): string[] {
|
|
209
218
|
const maxInputTokens = options.maxInputTokens;
|
|
@@ -213,7 +222,7 @@ function applyPromptBudget(
|
|
|
213
222
|
|
|
214
223
|
const charsPerToken = options.charsPerToken ?? CURSOR_APPROX_CHARS_PER_TOKEN;
|
|
215
224
|
const maxChars = Math.max(1, Math.floor(maxInputTokens * charsPerToken));
|
|
216
|
-
const requiredMessageSections = messageSections.filter((section) => section.index
|
|
225
|
+
const requiredMessageSections = messageSections.filter((section) => requiredMessageIndexes.includes(section.index));
|
|
217
226
|
const requiredCost = [...sectionsBeforeMessages, ...requiredMessageSections.map((section) => section.text), ...sectionsAfterMessages].reduce(
|
|
218
227
|
(total, section) => total + getSectionCost(section),
|
|
219
228
|
0,
|
|
@@ -368,6 +377,7 @@ export function computeCursorContextFingerprint(context: Context): string {
|
|
|
368
377
|
export function shouldBootstrapCursorContext(
|
|
369
378
|
sendState: { bootstrapped: boolean; contextFingerprint: string },
|
|
370
379
|
context: Context,
|
|
380
|
+
nativeSourceRoles?: readonly string[],
|
|
371
381
|
): boolean {
|
|
372
382
|
if (!sendState.bootstrapped) return true;
|
|
373
383
|
const previous = parseCursorContextFingerprint(sendState.contextFingerprint);
|
|
@@ -385,9 +395,16 @@ export function shouldBootstrapCursorContext(
|
|
|
385
395
|
for (let index = 0; index < previous.messageHashes.length; index += 1) {
|
|
386
396
|
if (current.messageHashes[index] !== previous.messageHashes[index]) return true;
|
|
387
397
|
}
|
|
388
|
-
// An incremental prompt carries only the latest new user message. Rebootstrap
|
|
389
|
-
// if additional model-visible input (such as ! shell output) would be lost.
|
|
390
398
|
const appended = normalizePiContextMessages(context.messages.slice(previous.messageHashes.length));
|
|
399
|
+
if (nativeSourceRoles) {
|
|
400
|
+
const messages = normalizePiContextMessages(context.messages);
|
|
401
|
+
const offset = messages.length - appended.length;
|
|
402
|
+
// Native summaries invalidate the pool; other pending input travels together.
|
|
403
|
+
if (nativeSourceRoles.slice(offset).some((role) => role === "branchSummary" || role === "compactionSummary")) return true;
|
|
404
|
+
const { start } = getCursorPendingInput(messages, nativeSourceRoles);
|
|
405
|
+
return appended.some((message, index) => message.role === "user" && offset + index < start);
|
|
406
|
+
}
|
|
407
|
+
// Without native origin, an incremental prompt carries only the final user.
|
|
391
408
|
const appendedUsers = appended.filter((message) => message.role === "user");
|
|
392
409
|
return appended.length > 0 && (appendedUsers.length !== 1 || appended.at(-1)?.role !== "user");
|
|
393
410
|
}
|
|
@@ -403,15 +420,20 @@ export function shouldBootstrapCursorSend(
|
|
|
403
420
|
export function buildCursorIncrementalPrompt(context: Context, options: CursorPromptOptions = {}): CursorPrompt {
|
|
404
421
|
// Incremental sends omit Pi system instructions and the full tool boundary; the session agent retains both from bootstrap.
|
|
405
422
|
const messages = normalizePiContextMessages(context.messages);
|
|
406
|
-
const
|
|
423
|
+
const pending = options.nativeSourceRoles && getCursorPendingInput(messages, options.nativeSourceRoles);
|
|
424
|
+
const latestUserMessageIndex = pending ? pending.latestUserIndex : getLatestUserMessageIndex(messages);
|
|
407
425
|
const latestUserMessage = latestUserMessageIndex >= 0 ? messages[latestUserMessageIndex] : undefined;
|
|
408
426
|
const latestUserText = latestUserMessage ? formatMessage(latestUserMessage) : undefined;
|
|
409
427
|
const sectionsBeforeMessages = [
|
|
410
428
|
"Continue the conversation using Cursor SDK capabilities only. Do not list, promise, or call pi-only tools from earlier context as if they were available.",
|
|
411
429
|
];
|
|
412
|
-
const latestUserMessageSections =
|
|
413
|
-
|
|
414
|
-
|
|
430
|
+
const latestUserMessageSections = pending
|
|
431
|
+
? messages.flatMap((message, index) => {
|
|
432
|
+
const text = index >= pending.start ? formatPromptMessage(message, index, options.nativeSourceRoles) : undefined;
|
|
433
|
+
return text ? [{ index, text }] : [];
|
|
434
|
+
})
|
|
435
|
+
: latestUserText && latestUserMessageIndex >= 0 ? [{ index: latestUserMessageIndex, text: latestUserText }] : [];
|
|
436
|
+
const images = extractLatestImages(messages, latestUserMessageIndex);
|
|
415
437
|
const imageTokenReserve = images.length * (options.imageTokenEstimate ?? 0);
|
|
416
438
|
const budgetOptions =
|
|
417
439
|
options.maxInputTokens === undefined
|
|
@@ -421,7 +443,7 @@ export function buildCursorIncrementalPrompt(context: Context, options: CursorPr
|
|
|
421
443
|
sectionsBeforeMessages,
|
|
422
444
|
latestUserMessageSections,
|
|
423
445
|
[getCursorToolTailGuardText(options)],
|
|
424
|
-
|
|
446
|
+
latestUserMessageSections.map((section) => section.index),
|
|
425
447
|
budgetOptions,
|
|
426
448
|
);
|
|
427
449
|
return { text: parts.join(SECTION_SEPARATOR), images };
|
|
@@ -454,12 +476,13 @@ export function buildCursorPrompt(context: Context, options: CursorPromptOptions
|
|
|
454
476
|
const messages = normalizePiContextMessages(context.messages);
|
|
455
477
|
const messageSections = messages
|
|
456
478
|
.map((msg, index) => {
|
|
457
|
-
const text =
|
|
479
|
+
const text = formatPromptMessage(msg, index, options.nativeSourceRoles);
|
|
458
480
|
return text ? { index, text } : undefined;
|
|
459
481
|
})
|
|
460
482
|
.filter((section): section is { index: number; text: string } => section !== undefined);
|
|
461
|
-
const
|
|
462
|
-
const
|
|
483
|
+
const pending = options.nativeSourceRoles && getCursorPendingInput(messages, options.nativeSourceRoles);
|
|
484
|
+
const sectionsAfterMessages = getCursorBootstrapTailSections(options, !pending || pending.latestUserIndex >= 0);
|
|
485
|
+
const images = extractLatestImages(messages, pending ? pending.latestUserIndex : getLatestUserMessageIndex(messages));
|
|
463
486
|
const imageTokenReserve = images.length * (options.imageTokenEstimate ?? 0);
|
|
464
487
|
const budgetOptions =
|
|
465
488
|
options.maxInputTokens === undefined
|
|
@@ -469,7 +492,8 @@ export function buildCursorPrompt(context: Context, options: CursorPromptOptions
|
|
|
469
492
|
sectionsBeforeMessages,
|
|
470
493
|
messageSections,
|
|
471
494
|
sectionsAfterMessages,
|
|
472
|
-
|
|
495
|
+
pending ? messageSections.filter((section) => section.index >= pending.start).map((section) => section.index)
|
|
496
|
+
: [getLatestUserMessageIndex(messages)],
|
|
473
497
|
budgetOptions,
|
|
474
498
|
);
|
|
475
499
|
const text = parts.join(SECTION_SEPARATOR);
|
package/src/cursor-api-key.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { envApiKeyAuth, type ApiKeyAuth, type ApiKeyCredential } from "@earendil-works/pi-ai";
|
|
2
|
+
import { parseEnvBoolean } from "./cursor-env-boolean.js";
|
|
2
3
|
|
|
3
4
|
export const CURSOR_API_KEY_ENV_VAR = "CURSOR_API_KEY";
|
|
4
|
-
const CURSOR_PROVIDER_ID = "cursor";
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
// values as unconfigured when the env var is absent, which hides fallback models
|
|
8
|
-
// before `/login`. Keep the provider available and resolve the real key in the
|
|
9
|
-
// Cursor provider turn path from pi auth or CURSOR_API_KEY.
|
|
6
|
+
// Legacy no-auth availability policy only; never a configured models.json key.
|
|
10
7
|
export const CURSOR_API_KEY_CONFIG_VALUE = "pi-cursor-sdk-cursor-api-key-placeholder";
|
|
11
8
|
|
|
12
9
|
const CURSOR_API_KEY_PLACEHOLDERS = new Set([
|
|
@@ -17,21 +14,44 @@ const CURSOR_API_KEY_PLACEHOLDERS = new Set([
|
|
|
17
14
|
]);
|
|
18
15
|
|
|
19
16
|
export function resolveCursorApiKey(apiKey?: string): string | undefined {
|
|
17
|
+
return normalizeCursorApiKey(apiKey) ?? (apiKey && CURSOR_API_KEY_PLACEHOLDERS.has(apiKey.trim())
|
|
18
|
+
? normalizeCursorApiKey(process.env.CURSOR_API_KEY) : undefined);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function normalizeCursorApiKey(apiKey?: string): string | undefined {
|
|
20
22
|
const trimmed = apiKey?.trim();
|
|
21
|
-
if (!trimmed) return undefined;
|
|
22
|
-
if (CURSOR_API_KEY_PLACEHOLDERS.has(trimmed)) return process.env.CURSOR_API_KEY?.trim() || undefined;
|
|
23
|
+
if (!trimmed || CURSOR_API_KEY_PLACEHOLDERS.has(trimmed)) return undefined;
|
|
23
24
|
return trimmed;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
export async function resolveCursorCredentialApiKey(
|
|
28
|
+
credential: ApiKeyCredential | undefined,
|
|
29
|
+
environment: () => Promise<string | undefined>,
|
|
30
|
+
): Promise<string | undefined> {
|
|
31
|
+
return normalizeCursorApiKey(credential?.key)
|
|
32
|
+
?? normalizeCursorApiKey(credential?.env?.CURSOR_API_KEY)
|
|
33
|
+
?? normalizeCursorApiKey(await environment());
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
export function
|
|
36
|
-
|
|
36
|
+
export function cursorApiKeyAuth(): ApiKeyAuth {
|
|
37
|
+
const standard = envApiKeyAuth("Cursor API key", [CURSOR_API_KEY_ENV_VAR]);
|
|
38
|
+
const auth: ApiKeyAuth = {
|
|
39
|
+
name: standard.name,
|
|
40
|
+
login: standard.login,
|
|
41
|
+
async check(input) {
|
|
42
|
+
const resolved = await auth.resolve(input);
|
|
43
|
+
return resolved ? { type: "api_key", source: resolved.source } : undefined;
|
|
44
|
+
},
|
|
45
|
+
async resolve({ ctx, credential, signal }) {
|
|
46
|
+
signal.throwIfAborted();
|
|
47
|
+
const key = await resolveCursorCredentialApiKey(credential, () => ctx.env(CURSOR_API_KEY_ENV_VAR));
|
|
48
|
+
signal.throwIfAborted();
|
|
49
|
+
if (key) return { auth: { apiKey: key }, env: credential?.env, source: credential ? "stored credential" : CURSOR_API_KEY_ENV_VAR };
|
|
50
|
+
if (!parseEnvBoolean(process.env.PI_CURSOR_HIDE_MODELS_WHEN_LOGGED_OUT, false)) {
|
|
51
|
+
return { auth: { apiKey: CURSOR_API_KEY_CONFIG_VALUE }, source: "fallback" };
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
return auth;
|
|
37
57
|
}
|
|
@@ -49,6 +49,7 @@ export function buildCursorCloudAgentOptions(options: {
|
|
|
49
49
|
agentMode: AgentModeOption;
|
|
50
50
|
resolvedConfig: CursorResolvedSdkConfig;
|
|
51
51
|
name?: string;
|
|
52
|
+
agents?: AgentOptions["agents"];
|
|
52
53
|
}): AgentOptions {
|
|
53
54
|
const { resolvedConfig } = options;
|
|
54
55
|
const environment = resolvedConfig.cloud.environment.value;
|
|
@@ -91,6 +92,7 @@ export function buildCursorCloudAgentOptions(options: {
|
|
|
91
92
|
model: options.modelSelection,
|
|
92
93
|
mode: options.agentMode,
|
|
93
94
|
...(options.name ? { name: options.name } : {}),
|
|
95
|
+
...(options.agents && Object.keys(options.agents).length ? { agents: options.agents } : {}),
|
|
94
96
|
cloud,
|
|
95
97
|
};
|
|
96
98
|
}
|
package/src/cursor-config.ts
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from "node:fs";
|
|
14
14
|
import { dirname, join } from "node:path";
|
|
15
15
|
import { CONFIG_DIR_NAME, getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
16
|
+
import type { ModelThinkingLevel } from "@earendil-works/pi-ai";
|
|
16
17
|
import { parseOptionalEnvBoolean } from "./cursor-env-boolean.js";
|
|
17
18
|
import { asRecord } from "./cursor-record-utils.js";
|
|
18
19
|
|
|
@@ -36,6 +37,7 @@ export const CURSOR_SANDBOX_ENV = "PI_CURSOR_SANDBOX";
|
|
|
36
37
|
export const CURSOR_LOCAL_FORCE_ENV = "PI_CURSOR_LOCAL_FORCE";
|
|
37
38
|
export const CURSOR_LOCAL_RESUME_ENV = "PI_CURSOR_LOCAL_RESUME";
|
|
38
39
|
export const CURSOR_HTTP1_ENV = "PI_CURSOR_HTTP_1_1";
|
|
40
|
+
export const CURSOR_STATE_ROOT_ENV = "PI_CURSOR_SDK_STATE_ROOT";
|
|
39
41
|
|
|
40
42
|
export type CursorConfigSource = "cli" | "environment" | "project" | "user" | "session" | "model-alias" | "builtin";
|
|
41
43
|
export type CursorConfigTrustLevel = "one-shot" | "environment" | "trusted-project" | "user" | "session" | "model-catalog" | "builtin";
|
|
@@ -48,9 +50,20 @@ export interface CursorCloudEnvironmentConfig {
|
|
|
48
50
|
name?: string;
|
|
49
51
|
}
|
|
50
52
|
|
|
53
|
+
export interface CursorCustomSubagentConfig {
|
|
54
|
+
description: string;
|
|
55
|
+
prompt: string;
|
|
56
|
+
model?: string;
|
|
57
|
+
thinking?: ModelThinkingLevel;
|
|
58
|
+
fast?: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type CursorCustomSubagentsConfig = Record<string, CursorCustomSubagentConfig>;
|
|
62
|
+
|
|
51
63
|
export interface CursorSdkConfig {
|
|
52
64
|
fastDefaults?: Record<string, boolean>;
|
|
53
65
|
runtime?: CursorRuntime;
|
|
66
|
+
subagents?: CursorCustomSubagentsConfig;
|
|
54
67
|
cloud?: {
|
|
55
68
|
repo?: string;
|
|
56
69
|
branch?: string;
|
|
@@ -73,6 +86,7 @@ export interface CursorSdkConfig {
|
|
|
73
86
|
force?: boolean;
|
|
74
87
|
resume?: boolean;
|
|
75
88
|
useHttp1ForAgent?: boolean;
|
|
89
|
+
storeRoot?: string;
|
|
76
90
|
};
|
|
77
91
|
}
|
|
78
92
|
|
|
@@ -94,6 +108,7 @@ export interface CursorResolvedSetting<T> {
|
|
|
94
108
|
|
|
95
109
|
export interface CursorResolvedSdkConfig {
|
|
96
110
|
runtime: CursorResolvedSetting<CursorRuntime>;
|
|
111
|
+
subagents: CursorResolvedSetting<CursorCustomSubagentsConfig | undefined>;
|
|
97
112
|
cloud: {
|
|
98
113
|
repo: CursorResolvedSetting<string | undefined>;
|
|
99
114
|
branch: CursorResolvedSetting<string | undefined>;
|
|
@@ -113,6 +128,7 @@ export interface CursorResolvedSdkConfig {
|
|
|
113
128
|
force: CursorResolvedSetting<boolean>;
|
|
114
129
|
resume: CursorResolvedSetting<boolean>;
|
|
115
130
|
useHttp1ForAgent: CursorResolvedSetting<boolean>;
|
|
131
|
+
storeRoot: CursorResolvedSetting<string | undefined>;
|
|
116
132
|
};
|
|
117
133
|
}
|
|
118
134
|
|
|
@@ -237,6 +253,44 @@ function parseCloudEnvironment(value: unknown): CursorCloudEnvironmentConfig | u
|
|
|
237
253
|
return Object.keys(parsed).length > 0 ? parsed : undefined;
|
|
238
254
|
}
|
|
239
255
|
|
|
256
|
+
const THINKING_LEVELS = {
|
|
257
|
+
off: true,
|
|
258
|
+
minimal: true,
|
|
259
|
+
low: true,
|
|
260
|
+
medium: true,
|
|
261
|
+
high: true,
|
|
262
|
+
xhigh: true,
|
|
263
|
+
max: true,
|
|
264
|
+
} satisfies Record<ModelThinkingLevel, true>;
|
|
265
|
+
|
|
266
|
+
function isCursorSubagentThinkingLevel(value: unknown): value is ModelThinkingLevel {
|
|
267
|
+
return typeof value === "string" && Object.hasOwn(THINKING_LEVELS, value);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function parseCustomSubagents(value: unknown): CursorCustomSubagentsConfig | undefined {
|
|
271
|
+
const record = asRecord(value);
|
|
272
|
+
if (!record) return undefined;
|
|
273
|
+
const entries: Array<[string, CursorCustomSubagentConfig]> = [];
|
|
274
|
+
for (const [name, raw] of Object.entries(record)) {
|
|
275
|
+
// Extension config policy, not an upstream SDK naming restriction.
|
|
276
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]{0,63}$/.test(name)) continue;
|
|
277
|
+
const entry = asRecord(raw);
|
|
278
|
+
const description = parseNonEmptyString(entry?.description);
|
|
279
|
+
const prompt = parseNonEmptyString(entry?.prompt);
|
|
280
|
+
if (!entry || !description || !prompt) continue;
|
|
281
|
+
const model = parseNonEmptyString(entry.model);
|
|
282
|
+
const thinking = entry.thinking;
|
|
283
|
+
entries.push([name, {
|
|
284
|
+
description,
|
|
285
|
+
prompt,
|
|
286
|
+
...(model ? { model } : {}),
|
|
287
|
+
...(isCursorSubagentThinkingLevel(thinking) ? { thinking } : {}),
|
|
288
|
+
...(typeof entry.fast === "boolean" ? { fast: entry.fast } : {}),
|
|
289
|
+
}]);
|
|
290
|
+
}
|
|
291
|
+
return entries.length ? Object.fromEntries(entries) : undefined;
|
|
292
|
+
}
|
|
293
|
+
|
|
240
294
|
export function parseCursorSdkConfig(value: unknown): CursorSdkConfig | undefined {
|
|
241
295
|
const record = asRecord(value);
|
|
242
296
|
if (!record) return undefined;
|
|
@@ -244,6 +298,9 @@ export function parseCursorSdkConfig(value: unknown): CursorSdkConfig | undefine
|
|
|
244
298
|
|
|
245
299
|
if (isCursorRuntime(record.runtime)) config.runtime = record.runtime;
|
|
246
300
|
|
|
301
|
+
const subagents = parseCustomSubagents(record.subagents);
|
|
302
|
+
if (subagents) config.subagents = subagents;
|
|
303
|
+
|
|
247
304
|
const fastDefaults = asRecord(record.fastDefaults);
|
|
248
305
|
if (fastDefaults) {
|
|
249
306
|
config.fastDefaults = Object.fromEntries(
|
|
@@ -275,6 +332,7 @@ export function parseCursorSdkConfig(value: unknown): CursorSdkConfig | undefine
|
|
|
275
332
|
const local = asRecord(record.local);
|
|
276
333
|
if (local) {
|
|
277
334
|
const parsedLocal: NonNullable<CursorSdkConfig["local"]> = {};
|
|
335
|
+
if (typeof local.storeRoot === "string" && local.storeRoot.trim()) parsedLocal.storeRoot = local.storeRoot;
|
|
278
336
|
if (typeof local.autoReview === "boolean") parsedLocal.autoReview = local.autoReview;
|
|
279
337
|
if (typeof local.sandbox === "boolean") parsedLocal.sandbox = local.sandbox;
|
|
280
338
|
if (typeof local.force === "boolean") parsedLocal.force = local.force;
|
|
@@ -533,6 +591,8 @@ const CLOUD_ORDER: CursorFieldSource[] = ["cli", "environment", "session", "user
|
|
|
533
591
|
const LOCAL_ORDER: CursorFieldSource[] = ["cli", "environment", "project", "user", "builtin"];
|
|
534
592
|
const LOCAL_FORCE_ORDER: CursorFieldSource[] = ["cli", "environment", "builtin"];
|
|
535
593
|
const HTTP1_ORDER: CursorFieldSource[] = ["session", "environment", "user", "builtin"];
|
|
594
|
+
const SUBAGENTS_ORDER: CursorFieldSource[] = ["project", "user", "builtin"];
|
|
595
|
+
const STORE_ROOT_ORDER: CursorFieldSource[] = ["environment", "user", "builtin"];
|
|
536
596
|
|
|
537
597
|
function buildFieldLayers<T>(order: CursorFieldSource[], values: CursorFieldValues<T>): Array<CursorResolvedSetting<T> | undefined> {
|
|
538
598
|
return order.map((source) => (source === "builtin" ? resolved("builtin", values.builtin as T) : valueFrom(source, values[source])));
|
|
@@ -550,6 +610,16 @@ function resolveEnvNamesSafetyField(order: CursorFieldSource[], values: CursorFi
|
|
|
550
610
|
return resolveWithCap(buildFieldLayers(order, values), valueFrom("user", values.user), envNamesCap);
|
|
551
611
|
}
|
|
552
612
|
|
|
613
|
+
export function resolveCursorLocalStoreRoot(
|
|
614
|
+
{ env = process.env, user }: Pick<ResolveCursorSdkConfigOptions, "env" | "user"> = {},
|
|
615
|
+
): CursorResolvedSetting<string | undefined> {
|
|
616
|
+
return resolveOrdinaryField(STORE_ROOT_ORDER, {
|
|
617
|
+
environment: env[CURSOR_STATE_ROOT_ENV]?.trim() ? env[CURSOR_STATE_ROOT_ENV] : undefined,
|
|
618
|
+
user: user?.local?.storeRoot?.trim() ? user.local.storeRoot : undefined,
|
|
619
|
+
builtin: undefined,
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
|
|
553
623
|
export function cursorSdkConfigFromEnv(env: Record<string, string | undefined> = process.env): CursorSdkConfig {
|
|
554
624
|
const config: CursorSdkConfig = {};
|
|
555
625
|
const runtime = validateExplicitValue(env[CURSOR_RUNTIME_ENV], CURSOR_RUNTIME_ENV, isCursorRuntime, '"local" or "cloud"');
|
|
@@ -648,6 +718,11 @@ export function resolveCursorSdkConfig(options: ResolveCursorSdkConfigOptions =
|
|
|
648
718
|
},
|
|
649
719
|
(value) => (value === "cloud" ? 1 : 0),
|
|
650
720
|
),
|
|
721
|
+
subagents: resolveOrdinaryField(SUBAGENTS_ORDER, {
|
|
722
|
+
project: parseCustomSubagents(project?.subagents),
|
|
723
|
+
user: parseCustomSubagents(user?.subagents),
|
|
724
|
+
builtin: undefined,
|
|
725
|
+
}),
|
|
651
726
|
cloud: {
|
|
652
727
|
repo: resolveOrdinaryField(CLOUD_ORDER, {
|
|
653
728
|
cli: cli?.cloud?.repo,
|
|
@@ -752,6 +827,7 @@ export function resolveCursorSdkConfig(options: ResolveCursorSdkConfigOptions =
|
|
|
752
827
|
}),
|
|
753
828
|
},
|
|
754
829
|
local: {
|
|
830
|
+
storeRoot: resolveCursorLocalStoreRoot({ env: options.env, user }),
|
|
755
831
|
autoReview: resolveOrdinaryField(LOCAL_ORDER, {
|
|
756
832
|
cli: cli?.local?.autoReview,
|
|
757
833
|
environment: env.local?.autoReview,
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
accessSync, closeSync, constants, fchmodSync, fstatSync, lstatSync, mkdirSync,
|
|
3
|
+
openSync, realpathSync, type Stats,
|
|
4
|
+
} from "node:fs";
|
|
5
|
+
import { isAbsolute, join, parse, resolve, sep } from "node:path";
|
|
6
|
+
import { noFollowFlag, openExistingRegularFileNoFollow, sameFileIdentity } from "./cursor-durable-fs.js";
|
|
7
|
+
|
|
8
|
+
/** Lexical only: capture selection before acquisition awaits; fileless callers skip it. */
|
|
9
|
+
export function normalizeCursorCustomStoreRoot(value: string): string {
|
|
10
|
+
const root = parse(value).root;
|
|
11
|
+
const components = value.slice(root.length).split(process.platform === "win32" ? /[\\/]/ : sep);
|
|
12
|
+
if (!isAbsolute(value) || !root || value.includes("\0") || components.some(part => part === "." || part === "..") ||
|
|
13
|
+
(process.platform === "win32" && (!/^(?:[A-Za-z]:[\\/]|[\\/]{2}[^\\/]+[\\/][^\\/]+[\\/]?)$/.test(root) ||
|
|
14
|
+
/^[\\/]{2}[?.][\\/]/.test(value)))) {
|
|
15
|
+
throw new Error("Cursor local storeRoot must be a native fully qualified absolute path without dot components or device prefixes");
|
|
16
|
+
}
|
|
17
|
+
const normalized = resolve(value);
|
|
18
|
+
if (normalized === resolve(root)) throw new Error("Cursor local storeRoot must not be a filesystem or share root");
|
|
19
|
+
return normalized;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function invalid(path: string, reason: string): never {
|
|
23
|
+
throw new Error(`Cursor custom local store path ${reason}: ${path}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function statIfPresent(path: string): Stats | undefined {
|
|
27
|
+
try { return lstatSync(path); }
|
|
28
|
+
catch (error) { if ((error as NodeJS.ErrnoException).code === "ENOENT") return undefined; throw error; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function assertDirectory(path: string, stat: Stats, privateDirectory: boolean, afterShared: boolean): void {
|
|
32
|
+
if (!stat.isDirectory()) invalid(path, "contains a link or non-directory");
|
|
33
|
+
if (process.platform === "win32") return;
|
|
34
|
+
const uid = process.getuid!();
|
|
35
|
+
if (privateDirectory || afterShared) {
|
|
36
|
+
if (stat.uid !== uid) invalid(path, "is not owned by the current user");
|
|
37
|
+
} else if (stat.uid !== 0 && stat.uid !== uid) invalid(path, "has an untrusted owner");
|
|
38
|
+
const trustedShared = !privateDirectory && !afterShared && stat.uid === 0 && (stat.mode & 0o1000) !== 0;
|
|
39
|
+
if ((stat.mode & 0o022) !== 0 && !trustedShared) invalid(path, "is group or other writable");
|
|
40
|
+
if (privateDirectory && (stat.mode & 0o300) !== 0o300) invalid(path, "is not owner writable/searchable");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function restrictPrivateDirectory(path: string, before: Stats): void {
|
|
44
|
+
if (process.platform !== "win32") {
|
|
45
|
+
const fd = openSync(path, constants.O_RDONLY | noFollowFlag());
|
|
46
|
+
try {
|
|
47
|
+
const opened = fstatSync(fd);
|
|
48
|
+
if (!opened.isDirectory() || !sameFileIdentity(before, opened) || !sameFileIdentity(opened, lstatSync(path))) {
|
|
49
|
+
invalid(path, "changed while opening");
|
|
50
|
+
}
|
|
51
|
+
fchmodSync(fd, 0o700);
|
|
52
|
+
const after = lstatSync(path);
|
|
53
|
+
if (!after.isDirectory() || !sameFileIdentity(opened, after)) invalid(path, "changed while restricting permissions");
|
|
54
|
+
} finally { closeSync(fd); }
|
|
55
|
+
}
|
|
56
|
+
accessSync(path, constants.W_OK | constants.X_OK);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function assertTrustedSystemTarget(target: string): void {
|
|
60
|
+
let path = parse(target).root;
|
|
61
|
+
for (const part of ["", ...target.slice(path.length).split(sep).filter(Boolean)]) {
|
|
62
|
+
path = join(path, part);
|
|
63
|
+
const stat = lstatSync(path);
|
|
64
|
+
if (!stat.isDirectory() || stat.uid !== 0 || ((stat.mode & 0o022) !== 0 && !(stat.mode & 0o1000))) {
|
|
65
|
+
invalid(path, "has an untrusted system-link target");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Verify ancestors before individually creating components; never realpath an arbitrary user tree. */
|
|
71
|
+
export function prepareCursorCustomStoreRoot(selectedRoot: string): string {
|
|
72
|
+
const normalized = normalizeCursorCustomStoreRoot(selectedRoot);
|
|
73
|
+
let path = parse(normalized).root;
|
|
74
|
+
let afterShared = false;
|
|
75
|
+
const components = normalized.slice(path.length).split(sep).filter(Boolean);
|
|
76
|
+
assertDirectory(path, lstatSync(path), false, false);
|
|
77
|
+
for (const [index, part] of components.entries()) {
|
|
78
|
+
path = join(path, part);
|
|
79
|
+
const leaf = index === components.length - 1;
|
|
80
|
+
let stat = statIfPresent(path);
|
|
81
|
+
if (stat?.isSymbolicLink()) {
|
|
82
|
+
if (process.platform === "win32" || leaf || afterShared || stat.uid !== 0) invalid(path, "contains a link or non-directory");
|
|
83
|
+
const target = realpathSync(path);
|
|
84
|
+
assertTrustedSystemTarget(target);
|
|
85
|
+
path = target;
|
|
86
|
+
stat = lstatSync(path);
|
|
87
|
+
}
|
|
88
|
+
if (!stat) {
|
|
89
|
+
try { mkdirSync(path, { mode: 0o700 }); }
|
|
90
|
+
catch (error) { if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error; }
|
|
91
|
+
stat = lstatSync(path);
|
|
92
|
+
}
|
|
93
|
+
assertDirectory(path, stat, leaf, afterShared);
|
|
94
|
+
if (leaf) restrictPrivateDirectory(path, stat);
|
|
95
|
+
if (process.platform !== "win32" && stat.uid === 0 && (stat.mode & 0o022) !== 0) afterShared = true;
|
|
96
|
+
}
|
|
97
|
+
return path;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Called after exact admission and again immediately before/after the public pathname-based SDK open. */
|
|
101
|
+
export function guardCursorCustomStorePath(customRoot: string, stateRoot: string): { verify(): void } {
|
|
102
|
+
if (prepareCursorCustomStoreRoot(customRoot) !== customRoot) invalid(customRoot, "changed canonical identity");
|
|
103
|
+
const directories = [{ path: customRoot, stat: lstatSync(customRoot) }];
|
|
104
|
+
let path = customRoot;
|
|
105
|
+
for (const part of stateRoot.slice(customRoot.length + 1).split(sep)) {
|
|
106
|
+
path = join(path, part);
|
|
107
|
+
if (!statIfPresent(path)) {
|
|
108
|
+
try { mkdirSync(path, { mode: 0o700 }); }
|
|
109
|
+
catch (error) { if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error; }
|
|
110
|
+
}
|
|
111
|
+
const stat = lstatSync(path);
|
|
112
|
+
assertDirectory(path, stat, true, true);
|
|
113
|
+
restrictPrivateDirectory(path, stat);
|
|
114
|
+
directories.push({ path, stat });
|
|
115
|
+
}
|
|
116
|
+
const leaves = ["index.db", "index.db-wal", "index.db-shm", "index.db-journal"];
|
|
117
|
+
const originalLeaves = new Map<string, Stats>();
|
|
118
|
+
const checkLeaves = () => {
|
|
119
|
+
for (const name of leaves) {
|
|
120
|
+
const file = join(stateRoot, name);
|
|
121
|
+
const stat = statIfPresent(file);
|
|
122
|
+
if (!stat) {
|
|
123
|
+
if (name === "index.db" && originalLeaves.has(file)) invalid(file, "disappeared SQLite file");
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (!stat.isFile() || stat.nlink !== 1) invalid(file, "contains a linked or nonregular SQLite file");
|
|
127
|
+
if (process.platform !== "win32" && (stat.uid !== process.getuid!() || (stat.mode & 0o022))) {
|
|
128
|
+
invalid(file, "contains an unowned or shared SQLite file");
|
|
129
|
+
}
|
|
130
|
+
const before = originalLeaves.get(file);
|
|
131
|
+
if (before && !sameFileIdentity(before, stat)) invalid(file, "changed SQLite file identity");
|
|
132
|
+
const fd = openExistingRegularFileNoFollow(file, constants.O_RDWR);
|
|
133
|
+
closeSync(fd);
|
|
134
|
+
originalLeaves.set(file, stat);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
checkLeaves();
|
|
138
|
+
// ponytail: the public SDK uses pathname/lazy checkpoint opens. This guards
|
|
139
|
+
// current-user private contents, not hostile same-user/admin races. Windows
|
|
140
|
+
// rejects Node-visible links/junctions but has no ACL hardening/O_NOFOLLOW
|
|
141
|
+
// equivalent here; use an ACL-protected root. Upgrade with public native APIs.
|
|
142
|
+
return { verify() {
|
|
143
|
+
if (prepareCursorCustomStoreRoot(customRoot) !== customRoot) invalid(customRoot, "changed canonical identity");
|
|
144
|
+
for (const { path, stat } of directories) {
|
|
145
|
+
const after = lstatSync(path);
|
|
146
|
+
assertDirectory(path, after, true, true);
|
|
147
|
+
if (!sameFileIdentity(stat, after)) invalid(path, "changed directory identity");
|
|
148
|
+
}
|
|
149
|
+
checkLeaves();
|
|
150
|
+
} };
|
|
151
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentOptions } from "@cursor/sdk";
|
|
2
|
+
import type { CursorCustomSubagentsConfig } from "./cursor-config.js";
|
|
3
|
+
import { buildCursorModelSelection, getCursorModelMetadata } from "./model-discovery.js";
|
|
4
|
+
|
|
5
|
+
export function buildCursorCustomSubagentDefinitions(config: CursorCustomSubagentsConfig | undefined): AgentOptions["agents"] {
|
|
6
|
+
if (!config || !Object.keys(config).length) return undefined;
|
|
7
|
+
return Object.fromEntries(Object.entries(config).map(([name, entry]) => [name, {
|
|
8
|
+
description: entry.description,
|
|
9
|
+
prompt: entry.prompt,
|
|
10
|
+
...(entry.model === undefined ? {} : {
|
|
11
|
+
model: entry.model === "inherit" ? "inherit" : buildCursorModelSelection(
|
|
12
|
+
entry.model,
|
|
13
|
+
entry.thinking ?? "off",
|
|
14
|
+
getCursorModelMetadata(entry.model)?.fastOverride ?? entry.fast,
|
|
15
|
+
),
|
|
16
|
+
}),
|
|
17
|
+
}]));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ponytail: SDK 1.0.37 LOCAL conversion keeps only model ID/inherit; it drops params.
|
|
21
|
+
// Upgrade this claim only after the installed public converter preserves them.
|