@code-yeongyu/senpi 2026.9.23-2 → 2026.9.23-4
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 +45 -0
- package/dist/bundle/chunks/{app-server-command-UO3ODP6D.js → app-server-command-QRBQLEXY.js} +1 -1
- package/dist/bundle/chunks/{chunk-UCTYTLP3.js → chunk-3RN6BFG2.js} +2 -2
- package/dist/bundle/chunks/{chunk-OLJ7LQJY.js → chunk-BBOQ5H4W.js} +1 -1
- package/dist/bundle/chunks/{chunk-XTXBPXZZ.js → chunk-EN6KDFY2.js} +1 -1
- package/dist/bundle/chunks/{chunk-2NFHX2FJ.js → chunk-J3QXPP4T.js} +1 -1
- package/dist/bundle/chunks/chunk-KBG7BJIL.js +8 -0
- package/dist/bundle/chunks/{chunk-LMO3WYKH.js → chunk-N46LNXHU.js} +156 -167
- package/dist/bundle/chunks/{chunk-7EH64T6E.js → chunk-ORCF262V.js} +2 -2
- package/dist/bundle/chunks/{chunk-67Z5WNA4.js → chunk-PSMTQDII.js} +1 -1
- package/dist/bundle/chunks/{chunk-IDJUNOOR.js → chunk-WUYBEF7C.js} +2 -2
- package/dist/bundle/chunks/{chunk-IDSOMHWS.js → chunk-WXIRFRXY.js} +1 -1
- package/dist/bundle/chunks/{chunk-BPHXJ4N2.js → chunk-XDSQYM4F.js} +1 -1
- package/dist/bundle/chunks/{chunk-IBHBWRC4.js → chunk-ZEFQYQOU.js} +3 -3
- package/dist/bundle/chunks/{cli-main-LUQZADLN.js → cli-main-ROBDBYAB.js} +1 -1
- package/dist/bundle/chunks/cursor-agent.js +1 -1
- package/dist/bundle/chunks/{help-fast-path-VXAZDQ3Z.js → help-fast-path-QXVCHTP3.js} +1 -1
- package/dist/bundle/chunks/{host-command-5PEFD4N6.js → host-command-3PUZYQOK.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-BXW5C4JT.js → host-lifecycle-OHPSU5VU.js} +1 -1
- package/dist/bundle/chunks/{interactive-host-runtime-A6PM52FT.js → interactive-host-runtime-57LEAJPU.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-VR7QYMAE.js → interactive-mode-SLPAGRHH.js} +1 -1
- package/dist/bundle/chunks/{list-tips-VGOIMT6W.js → list-tips-Z62FXPOJ.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-LYOVVA75.js → multi-session-host-3PACMEHC.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-OMEJACX6.js → package-manager-cli-6UIUSRQO.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-B6RSUQKL.js → pi-messages-CAS467IY.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-ZIYWOB2N.js → rotation-stream-CZT4TRPD.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-AKGJA73P.js → rpc-mode-47EVLL6X.js} +1 -1
- package/dist/bundle/chunks/{session-picker-UE5LOM6W.js → session-picker-ZIBANFBQ.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +235 -246
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.d.ts +19 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.js +76 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.d.ts +7 -2
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.js +28 -3
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable.d.ts +11 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable.js +31 -10
- package/dist/core/extensions/builtin/anthropic-subscription/executable.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.d.ts +2 -1
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.js +18 -2
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.d.ts +2 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.js +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream.js +5 -3
- package/dist/core/extensions/builtin/anthropic-subscription/stream.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +43 -26
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +8 -0
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +4 -2
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +3 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +32 -10
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/parked-wait.d.ts +16 -0
- package/dist/core/extensions/builtin/goal/parked-wait.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/parked-wait.js +54 -0
- package/dist/core/extensions/builtin/goal/parked-wait.js.map +1 -0
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.d.ts +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.js +8 -2
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth.js +15 -4
- package/dist/core/extensions/builtin/mcp/auth/commands-auth.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/commands.js +2 -0
- package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +5 -5
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +16 -11
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +5 -5
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +9 -6
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/test-decision.d.ts +2 -0
- package/dist/core/extensions/builtin/prompt-preset/test-decision.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/test-decision.js +5 -0
- package/dist/core/extensions/builtin/prompt-preset/test-decision.js.map +1 -0
- package/dist/core/extensions/builtin/rule-activation/types.d.ts +2 -0
- package/dist/core/extensions/builtin/rule-activation/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rule-activation/types.js +7 -1
- package/dist/core/extensions/builtin/rule-activation/types.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +2 -1
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +3 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +9 -3
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +5 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +10 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-config.d.ts +1 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +26 -20
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +87 -14
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-json-migration.d.ts +30 -0
- package/dist/core/models-json-migration.d.ts.map +1 -0
- package/dist/core/models-json-migration.js +257 -0
- package/dist/core/models-json-migration.js.map +1 -0
- package/dist/core/output-guard.d.ts +2 -0
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js +31 -0
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +16 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-overrides.d.ts +8 -0
- package/dist/core/settings-overrides.d.ts.map +1 -0
- package/dist/core/settings-overrides.js +28 -0
- package/dist/core/settings-overrides.js.map +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +12 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +9 -6
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep/format.d.ts +3 -2
- package/dist/core/tools/grep/format.d.ts.map +1 -1
- package/dist/core/tools/grep/format.js +5 -3
- package/dist/core/tools/grep/format.js.map +1 -1
- package/dist/core/tools/grep/index.js +2 -2
- package/dist/core/tools/grep/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -3
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/model-only-text.d.ts +4 -0
- package/dist/core/tools/model-only-text.d.ts.map +1 -0
- package/dist/core/tools/model-only-text.js +12 -0
- package/dist/core/tools/model-only-text.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +15 -5
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +2 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +1 -25
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/grep.d.ts.map +1 -1
- package/dist/core/tools/renderers/grep.js +0 -25
- package/dist/core/tools/renderers/grep.js.map +1 -1
- package/dist/core/tools/renderers/read.d.ts +8 -0
- package/dist/core/tools/renderers/read.d.ts.map +1 -1
- package/dist/core/tools/renderers/read.js +2 -14
- package/dist/core/tools/renderers/read.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +4 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +10 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +22 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/exploration-call.d.ts +15 -0
- package/dist/modes/interactive/components/exploration-call.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-call.js +56 -0
- package/dist/modes/interactive/components/exploration-call.js.map +1 -0
- package/dist/modes/interactive/components/exploration-group.d.ts +21 -0
- package/dist/modes/interactive/components/exploration-group.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-group.js +95 -0
- package/dist/modes/interactive/components/exploration-group.js.map +1 -0
- package/dist/modes/interactive/components/exploration-rules.d.ts +5 -0
- package/dist/modes/interactive/components/exploration-rules.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-rules.js +15 -0
- package/dist/modes/interactive/components/exploration-rules.js.map +1 -0
- package/dist/modes/interactive/components/exploration-transcript-container.d.ts +18 -0
- package/dist/modes/interactive/components/exploration-transcript-container.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-transcript-container.js +76 -0
- package/dist/modes/interactive/components/exploration-transcript-container.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +7 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +8 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +24 -35
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/replay-assistant-tools.d.ts +14 -0
- package/dist/modes/interactive/replay-assistant-tools.d.ts.map +1 -0
- package/dist/modes/interactive/replay-assistant-tools.js +33 -0
- package/dist/modes/interactive/replay-assistant-tools.js.map +1 -0
- package/dist/modes/interactive/tool-progress.d.ts +2 -0
- package/dist/modes/interactive/tool-progress.d.ts.map +1 -1
- package/dist/modes/interactive/tool-progress.js +5 -2
- package/dist/modes/interactive/tool-progress.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/tui-renderer.js +6 -1
- package/dist/modes/interactive/tui-renderer.js.map +1 -1
- package/docs/extensions.md +8 -0
- package/docs/mcp.md +9 -6
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +30 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +10 -8
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/display-code.ts +145 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +7 -12
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +38 -35
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +1 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +17 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts +18 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js +103 -3
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js +15 -3
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts +7 -2
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +92 -20
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +9 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.d.ts +3 -0
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.js +14 -0
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +8 -12
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-WJ2BGYFK.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-grouping.js","sourceRoot":"","sources":["../../src/cursor/catalog-grouping.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ModelThinkingLevel, ThinkingLevelMap } from \"../types.ts\";\nimport {\n\tCURSOR_MODEL_CAPABILITIES,\n\ttype CursorModelCapability,\n\ttype CursorVariantAlias,\n\tgetCursorVariantAlias,\n\tparseCursorVariantId,\n} from \"./model-capabilities.ts\";\n\nexport { parseCursorVariantId } from \"./model-capabilities.ts\";\n\nexport interface CursorCatalogRawEntry {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly input: readonly (\"text\" | \"image\")[];\n\treadonly cursorMaxMode: boolean;\n}\n\nexport interface CursorCatalogEntry {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly reasoning: boolean;\n\treadonly thinkingLevelMap?: ThinkingLevelMap;\n\treadonly window: number;\n\treadonly maxWindow?: number;\n\treadonly input: (\"text\" | \"image\")[];\n\treadonly cursorMaxMode: boolean;\n\treadonly capabilityId?: string;\n\treadonly thinkingMode?: boolean;\n\treadonly representativeVariantId?: string;\n\treadonly legacyAliases: readonly string[];\n}\n\nconst ALL_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst FALLBACK_WINDOW = 200000;\n\ninterface GroupMember {\n\treadonly raw: CursorCatalogRawEntry;\n\treadonly alias: CursorVariantAlias;\n\treadonly level: string | undefined;\n\treadonly thinking: boolean | undefined;\n\treadonly fast: boolean;\n}\n\nfunction isClaude(baseId: string): boolean {\n\treturn baseId.startsWith(\"claude-\");\n}\n\nfunction cleanName(members: readonly GroupMember[], baseId: string, thinkingMode: boolean | undefined): string {\n\tconst levelWords = /(Minimal|Low|Medium|High|Extra High|XHigh|Max|None)/g;\n\tconst representative =\n\t\tmembers.find((member) => member.level === \"high\") ??\n\t\tmembers.find((member) => member.level === \"medium\") ??\n\t\tmembers.find((member) => member.level === \"low\") ??\n\t\tmembers[0];\n\tlet name = representative.raw.name;\n\tname = name.replace(/\\s*\\(NO ZDR\\)\\s*/g, \" \\u0001\").trim();\n\tname = name.replace(new RegExp(`\\\\s+${levelWords.source}\\\\b`, \"g\"), \"\");\n\tname = name.replace(/\\s+Fast\\b/g, \"\");\n\tif (thinkingMode !== true) name = name.replace(/\\s+Thinking\\b/g, \"\");\n\tname = name\n\t\t.replace(/\\u0001/g, \"(NO ZDR)\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tif (name.length === 0) name = baseId;\n\treturn name;\n}\n\nfunction buildLevelMap(\n\tmembers: readonly GroupMember[],\n\tcapability: CursorModelCapability | undefined,\n): ThinkingLevelMap {\n\tconst observed = new Set(\n\t\tmembers.map((member) => member.level).filter((level): level is string => level !== undefined),\n\t);\n\tconst map = {} as Record<ModelThinkingLevel, string | null>;\n\tfor (const level of ALL_LEVELS) {\n\t\tif (level === \"off\") {\n\t\t\tconst offSpec = capability?.levels.off;\n\t\t\tmap.off = offSpec !== undefined && observed.has(\"none\") ? offSpec.value : null;\n\t\t\tcontinue;\n\t\t}\n\t\tconst spec = capability?.levels[level];\n\t\tmap[level] = spec !== undefined && (observed.has(level) || observed.has(spec.value)) ? spec.value : null;\n\t}\n\treturn map;\n}\n\nfunction pickRepresentative(members: readonly GroupMember[]): string {\n\tconst withLevels = members.filter((member) => member.level !== undefined && member.level !== \"none\");\n\tconst pool = withLevels.length > 0 ? withLevels : members;\n\tconst order = [\"medium\", \"low\", \"minimal\", \"high\", \"xhigh\", \"extra-high\", \"max\", \"none\"];\n\tconst sorted = [...pool].sort((a, b) => {\n\t\tconst ai = order.indexOf(a.level ?? \"none\");\n\t\tconst bi = order.indexOf(b.level ?? \"none\");\n\t\tif (ai !== bi) return ai - bi;\n\t\treturn a.alias.legacyVariantId.localeCompare(b.alias.legacyVariantId);\n\t});\n\treturn sorted[0].alias.legacyVariantId;\n}\n\n/** Normalize a raw Cursor catalog (live discovery, CLI scrape, or stored cache) into selectable identities. */\nexport function normalizeCursorCatalog(rawEntries: readonly CursorCatalogRawEntry[]): CursorCatalogEntry[] {\n\tconst groups = new Map<string, GroupMember[]>();\n\tconst order: string[] = [];\n\tfor (const raw of rawEntries) {\n\t\tconst alias = getCursorVariantAlias(raw.id);\n\t\tif (!alias) {\n\t\t\tconst parsed = parseCursorVariantId(raw.id);\n\t\t\tconst key = `unknown${parsed.baseId}${raw.id}`;\n\t\t\tif (!groups.has(key)) order.push(key);\n\t\t\tconst member: GroupMember = {\n\t\t\t\traw,\n\t\t\t\talias: { targetId: raw.id, legacyVariantId: raw.id, encoding: \"legacy-variant\" },\n\t\t\t\tlevel: parsed.level,\n\t\t\t\tthinking: parsed.thinking,\n\t\t\t\tfast: parsed.fast,\n\t\t\t};\n\t\t\tgroups.set(key, [member]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsed = parseCursorVariantId(raw.id);\n\t\tconst key = `${alias.targetId}${parsed.fast}`;\n\t\tif (!groups.has(key)) {\n\t\t\torder.push(key);\n\t\t\tgroups.set(key, []);\n\t\t}\n\t\t(groups.get(key) as GroupMember[]).push({\n\t\t\traw,\n\t\t\talias,\n\t\t\tlevel: parsed.level,\n\t\t\tthinking: parsed.thinking,\n\t\t\tfast: parsed.fast,\n\t\t});\n\t}\n\n\tconst out: CursorCatalogEntry[] = [];\n\tfor (const key of order) {\n\t\tconst members = groups.get(key) as GroupMember[];\n\t\tconst first = members[0];\n\t\tconst baseParsed = parseCursorVariantId(first.alias.targetId);\n\t\tconst baseId = baseParsed.baseId;\n\t\tconst capability = CURSOR_MODEL_CAPABILITIES[baseId];\n\t\tconst isGrouped = members.length > 1 || first.alias.targetId !== first.raw.id;\n\t\tconst efforts = members.filter((member) => member.level !== undefined && member.level !== \"none\");\n\n\t\tif (isGrouped && efforts.length > 0 && !first.fast) {\n\t\t\tconst thinkingMode = isClaude(baseId) ? first.thinking === true : undefined;\n\t\t\tout.push({\n\t\t\t\tid: first.alias.targetId,\n\t\t\t\tname: cleanName(members, baseId, thinkingMode),\n\t\t\t\treasoning: true,\n\t\t\t\tthinkingLevelMap: buildLevelMap(members, capability),\n\t\t\t\twindow: capability?.window ?? FALLBACK_WINDOW,\n\t\t\t\t...(capability?.maxWindow !== undefined ? { maxWindow: capability.maxWindow } : {}),\n\t\t\t\tinput: [...new Set(members.flatMap((member) => member.raw.input))],\n\t\t\t\tcursorMaxMode: members.some((member) => member.raw.cursorMaxMode),\n\t\t\t\tcapabilityId: baseId,\n\t\t\t\t...(thinkingMode !== undefined ? { thinkingMode } : {}),\n\t\t\t\trepresentativeVariantId: pickRepresentative(members),\n\t\t\t\tlegacyAliases: members.map((member) => member.alias.legacyVariantId).sort(),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const member of members) {\n\t\t\tconst memberBase = parseCursorVariantId(member.raw.id).baseId;\n\t\t\tconst memberCapability = CURSOR_MODEL_CAPABILITIES[memberBase];\n\t\t\tout.push({\n\t\t\t\tid: member.raw.id,\n\t\t\t\tname: member.raw.name,\n\t\t\t\treasoning: false,\n\t\t\t\twindow: memberCapability?.window ?? FALLBACK_WINDOW,\n\t\t\t\t...(memberCapability?.maxWindow !== undefined ? { maxWindow: memberCapability.maxWindow } : {}),\n\t\t\t\tinput: [...member.raw.input],\n\t\t\t\tcursorMaxMode: member.raw.cursorMaxMode,\n\t\t\t\tlegacyAliases: [member.alias.legacyVariantId],\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"catalog-grouping.js","sourceRoot":"","sources":["../../src/cursor/catalog-grouping.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ModelThinkingLevel, ThinkingLevelMap } from \"../types.ts\";\nimport aliasData from \"./cursor-variant-aliases.json\" with { type: \"json\" };\nimport {\n\tCURSOR_MODEL_CAPABILITIES,\n\ttype CursorModelCapability,\n\ttype CursorVariantAlias,\n\tgetCursorVariantAlias,\n\tparseCursorVariantId,\n} from \"./model-capabilities.ts\";\n\nexport { parseCursorVariantId } from \"./model-capabilities.ts\";\n\nexport interface CursorCatalogRawEntry {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly input: readonly (\"text\" | \"image\")[];\n\treadonly cursorMaxMode: boolean;\n}\n\nexport interface CursorCatalogEntry {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly reasoning: boolean;\n\treadonly thinkingLevelMap?: ThinkingLevelMap;\n\treadonly window: number;\n\treadonly maxWindow?: number;\n\treadonly input: (\"text\" | \"image\")[];\n\treadonly cursorMaxMode: boolean;\n\treadonly capabilityId?: string;\n\treadonly thinkingMode?: boolean;\n\treadonly representativeVariantId?: string;\n\treadonly legacyAliases: readonly string[];\n\t/**\n\t * Derived-group variant ids: normalized thinking level -> the exact server-listed\n\t * variant id the live catalog serves. Present only on identities derived at\n\t * runtime from ids the static alias table does not list (senpi#2038).\n\t */\n\treadonly variantIds?: Readonly<Partial<Record<ModelThinkingLevel, string>>>;\n}\n\nconst ALL_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst FALLBACK_WINDOW = 200000;\nconst STATIC_TARGETS = new Set(Object.values(aliasData.aliases).map((alias) => alias.targetId));\n\ninterface GroupMember {\n\treadonly raw: CursorCatalogRawEntry;\n\treadonly alias: CursorVariantAlias;\n\treadonly level: string | undefined;\n\treadonly thinking: boolean | undefined;\n\treadonly fast: boolean;\n}\n\nfunction isClaude(baseId: string): boolean {\n\treturn baseId.startsWith(\"claude-\");\n}\n\nfunction cleanName(members: readonly GroupMember[], baseId: string, thinkingMode: boolean | undefined): string {\n\tconst levelWords = /(Minimal|Low|Medium|High|Extra High|XHigh|Max|None)/g;\n\tconst representative =\n\t\tmembers.find((member) => member.level === \"high\") ??\n\t\tmembers.find((member) => member.level === \"medium\") ??\n\t\tmembers.find((member) => member.level === \"low\") ??\n\t\tmembers[0];\n\tlet name = representative.raw.name;\n\tname = name.replace(/\\s*\\(NO ZDR\\)\\s*/g, \" \\u0001\").trim();\n\tname = name.replace(new RegExp(`\\\\s+${levelWords.source}\\\\b`, \"g\"), \"\");\n\tname = name.replace(/\\s+Fast\\b/g, \"\");\n\tif (thinkingMode !== true) name = name.replace(/\\s+Thinking\\b/g, \"\");\n\tname = name\n\t\t.replace(/\\u0001/g, \"(NO ZDR)\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tif (name.length === 0) name = baseId;\n\treturn name;\n}\n\nfunction buildLevelMap(\n\tmembers: readonly GroupMember[],\n\tcapability: CursorModelCapability | undefined,\n): ThinkingLevelMap {\n\tconst observed = new Set(\n\t\tmembers.map((member) => member.level).filter((level): level is string => level !== undefined),\n\t);\n\tconst map = {} as Record<ModelThinkingLevel, string | null>;\n\tfor (const level of ALL_LEVELS) {\n\t\tif (level === \"off\") {\n\t\t\tconst offSpec = capability?.levels.off;\n\t\t\tmap.off = offSpec !== undefined && observed.has(\"none\") ? offSpec.value : null;\n\t\t\tcontinue;\n\t\t}\n\t\tconst spec = capability?.levels[level];\n\t\tmap[level] = spec !== undefined && (observed.has(level) || observed.has(spec.value)) ? spec.value : null;\n\t}\n\treturn map;\n}\n\nfunction pickRepresentative(members: readonly GroupMember[]): string {\n\tconst withLevels = members.filter((member) => member.level !== undefined && member.level !== \"none\");\n\tconst pool = withLevels.length > 0 ? withLevels : members;\n\tconst order = [\"medium\", \"low\", \"minimal\", \"high\", \"xhigh\", \"extra-high\", \"max\", \"none\"];\n\tconst sorted = [...pool].sort((a, b) => {\n\t\tconst ai = order.indexOf(a.level ?? \"none\");\n\t\tconst bi = order.indexOf(b.level ?? \"none\");\n\t\tif (ai !== bi) return ai - bi;\n\t\treturn a.alias.legacyVariantId.localeCompare(b.alias.legacyVariantId);\n\t});\n\treturn sorted[0].alias.legacyVariantId;\n}\n\nfunction normalizeDerivedLevel(token: string): ModelThinkingLevel | undefined {\n\tswitch (token) {\n\t\tcase \"none\":\n\t\t\treturn \"off\";\n\t\tcase \"extra-high\":\n\t\t\treturn \"xhigh\";\n\t\tcase \"minimal\":\n\t\tcase \"low\":\n\t\tcase \"medium\":\n\t\tcase \"high\":\n\t\tcase \"xhigh\":\n\t\tcase \"max\":\n\t\t\treturn token;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Every level is explicit: an unobserved level maps to `null` (unsupported), because the\n * shared model contract treats an absent ordinary level as supported and would otherwise\n * offer levels the server never listed.\n */\nfunction buildDerivedLevelMap(members: readonly GroupMember[]): ThinkingLevelMap {\n\tconst map = Object.fromEntries(ALL_LEVELS.map((level) => [level, null])) as Record<\n\t\tModelThinkingLevel,\n\t\tstring | null\n\t>;\n\tfor (const member of members) {\n\t\tconst level = member.alias.level;\n\t\tif (level !== undefined && member.level !== undefined && map[level] === null) {\n\t\t\tmap[level] = member.level;\n\t\t}\n\t}\n\treturn map;\n}\n\nfunction buildDerivedVariantIds(\n\tmembers: readonly GroupMember[],\n): Readonly<Partial<Record<ModelThinkingLevel, string>>> {\n\tconst map: Partial<Record<ModelThinkingLevel, string>> = {};\n\tfor (const member of members) {\n\t\tconst level = member.alias.level;\n\t\tif (level !== undefined && map[level] === undefined) map[level] = member.raw.id;\n\t}\n\treturn map;\n}\n\n/**\n * Derive variant-group aliases for raw ids the static alias table does not list.\n * A family (shared base id, with the `-thinking` infix as a separate identity for\n * Claude-style ids) is derived only when at least two distinct levels are observed\n * among its unlisted non-fast members in the same batch; `-fast` variants,\n * single-level families, and level-less ids stay flat exactly as today. Ids the\n * static table already covers are never re-derived, so static output stays\n * byte-identical (senpi#2038).\n */\nexport function deriveCursorVariantAliases(ids: readonly string[]): ReadonlyMap<string, CursorVariantAlias> {\n\tconst families = new Map<\n\t\tstring,\n\t\t{ targetId: string; levels: Set<ModelThinkingLevel>; members: [string, ModelThinkingLevel, string][] }\n\t>();\n\tconst rawIds = new Set(ids);\n\tfor (const id of ids) {\n\t\tif (getCursorVariantAlias(id) !== undefined) continue;\n\t\tconst parsed = parseCursorVariantId(id);\n\t\tif (parsed.fast || parsed.level === undefined || parsed.baseId === \"\") continue;\n\t\tconst level = normalizeDerivedLevel(parsed.level);\n\t\tif (level === undefined) continue;\n\t\tconst targetId = parsed.thinking === true ? `${parsed.baseId}-thinking` : parsed.baseId;\n\t\tconst family = families.get(targetId) ?? { targetId, levels: new Set(), members: [] };\n\t\tfamily.levels.add(level);\n\t\tfamily.members.push([id, level, parsed.level]);\n\t\tfamilies.set(targetId, family);\n\t}\n\tconst derived = new Map<string, CursorVariantAlias>();\n\tfor (const family of families.values()) {\n\t\t// A derived target must not shadow a static identity, a static alias key, or a raw id.\n\t\tif (\n\t\t\tfamily.levels.size < 2 ||\n\t\t\tSTATIC_TARGETS.has(family.targetId) ||\n\t\t\tgetCursorVariantAlias(family.targetId) !== undefined ||\n\t\t\trawIds.has(family.targetId)\n\t\t)\n\t\t\tcontinue;\n\t\tconst chosen = new Map<ModelThinkingLevel, string>();\n\t\tfor (const [id, level, suffix] of family.members) {\n\t\t\tconst previous = chosen.get(level);\n\t\t\tif (previous === undefined) {\n\t\t\t\tchosen.set(level, id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst previousSuffix = parseCursorVariantId(previous).level;\n\t\t\tif (\n\t\t\t\t(suffix === level && previousSuffix !== level) ||\n\t\t\t\t((suffix === level) === (previousSuffix === level) && id < previous)\n\t\t\t) {\n\t\t\t\tchosen.set(level, id);\n\t\t\t}\n\t\t}\n\t\tfor (const [level, id] of chosen) {\n\t\t\tderived.set(id, { targetId: family.targetId, legacyVariantId: id, encoding: \"legacy-variant\", level });\n\t\t}\n\t}\n\treturn derived;\n}\n\n/** Normalize a raw Cursor catalog (live discovery, CLI scrape, or stored cache) into selectable identities. */\nexport function normalizeCursorCatalog(rawEntries: readonly CursorCatalogRawEntry[]): CursorCatalogEntry[] {\n\tconst derived = deriveCursorVariantAliases(rawEntries.map((raw) => raw.id));\n\tconst groups = new Map<string, GroupMember[]>();\n\tconst order: string[] = [];\n\tfor (const raw of rawEntries) {\n\t\tconst alias = getCursorVariantAlias(raw.id) ?? derived.get(raw.id);\n\t\tif (!alias) {\n\t\t\tconst parsed = parseCursorVariantId(raw.id);\n\t\t\tconst key = `unknown${parsed.baseId}${raw.id}`;\n\t\t\tif (!groups.has(key)) order.push(key);\n\t\t\tconst member: GroupMember = {\n\t\t\t\traw,\n\t\t\t\talias: { targetId: raw.id, legacyVariantId: raw.id, encoding: \"legacy-variant\" },\n\t\t\t\tlevel: parsed.level,\n\t\t\t\tthinking: parsed.thinking,\n\t\t\t\tfast: parsed.fast,\n\t\t\t};\n\t\t\tgroups.set(key, [member]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsed = parseCursorVariantId(raw.id);\n\t\tconst key = `${alias.targetId}${parsed.fast}`;\n\t\tif (!groups.has(key)) {\n\t\t\torder.push(key);\n\t\t\tgroups.set(key, []);\n\t\t}\n\t\t(groups.get(key) as GroupMember[]).push({\n\t\t\traw,\n\t\t\talias,\n\t\t\tlevel: parsed.level,\n\t\t\tthinking: parsed.thinking,\n\t\t\tfast: parsed.fast,\n\t\t});\n\t}\n\n\tconst out: CursorCatalogEntry[] = [];\n\tfor (const key of order) {\n\t\tconst members = groups.get(key) as GroupMember[];\n\t\tconst first = members[0];\n\t\tconst baseParsed = parseCursorVariantId(first.alias.targetId);\n\t\tconst derivedGroup = members.every((member) => derived.has(member.raw.id));\n\t\tconst baseId = derivedGroup ? parseCursorVariantId(first.raw.id).baseId : baseParsed.baseId;\n\t\tconst capability = CURSOR_MODEL_CAPABILITIES[baseId];\n\t\tconst isGrouped = members.length > 1 || first.alias.targetId !== first.raw.id;\n\t\tconst efforts = members.filter((member) => member.level !== undefined && member.level !== \"none\");\n\n\t\tif (isGrouped && efforts.length > 0 && !first.fast) {\n\t\t\tconst thinkingMode = isClaude(baseId) ? first.thinking === true : undefined;\n\t\t\tout.push({\n\t\t\t\tid: first.alias.targetId,\n\t\t\t\tname: cleanName(members, baseId, thinkingMode),\n\t\t\t\treasoning: true,\n\t\t\t\tthinkingLevelMap: derivedGroup ? buildDerivedLevelMap(members) : buildLevelMap(members, capability),\n\t\t\t\twindow: capability?.window ?? FALLBACK_WINDOW,\n\t\t\t\t...(capability?.maxWindow !== undefined ? { maxWindow: capability.maxWindow } : {}),\n\t\t\t\tinput: [...new Set(members.flatMap((member) => member.raw.input))],\n\t\t\t\tcursorMaxMode: members.some((member) => member.raw.cursorMaxMode),\n\t\t\t\tcapabilityId: baseId,\n\t\t\t\t...(thinkingMode !== undefined ? { thinkingMode } : {}),\n\t\t\t\trepresentativeVariantId: pickRepresentative(members),\n\t\t\t\tlegacyAliases: members.map((member) => member.alias.legacyVariantId).sort(),\n\t\t\t\t...(derivedGroup ? { variantIds: buildDerivedVariantIds(members) } : {}),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const member of members) {\n\t\t\tconst memberBase = parseCursorVariantId(member.raw.id).baseId;\n\t\t\tconst memberCapability = CURSOR_MODEL_CAPABILITIES[memberBase];\n\t\t\tout.push({\n\t\t\t\tid: member.raw.id,\n\t\t\t\tname: member.raw.name,\n\t\t\t\treasoning: false,\n\t\t\t\twindow: memberCapability?.window ?? FALLBACK_WINDOW,\n\t\t\t\t...(memberCapability?.maxWindow !== undefined ? { maxWindow: memberCapability.maxWindow } : {}),\n\t\t\t\tinput: [...member.raw.input],\n\t\t\t\tcursorMaxMode: member.raw.cursorMaxMode,\n\t\t\t\tlegacyAliases: [member.alias.legacyVariantId],\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n"]}
|
|
@@ -13,7 +13,9 @@ export interface CursorResolvedSelection {
|
|
|
13
13
|
* model id plus ordered parameters. Both Cursor transports consume this; the
|
|
14
14
|
* native lane renders parameters into protobuf, the CLI lane renders a model
|
|
15
15
|
* string. Absent/unsupported selections return the representative or upstream
|
|
16
|
-
* id with zero parameters.
|
|
16
|
+
* id with zero parameters. Identities derived from unlisted suffix variants
|
|
17
|
+
* resolve each level through `cursorReasoning.variantIds` before any capability
|
|
18
|
+
* lookup (senpi#2038).
|
|
17
19
|
*/
|
|
18
20
|
export declare function resolveCursorSelectionDescriptor(model: Model<"cursor-agent">, selection: ThinkingSelection | undefined): CursorResolvedSelection;
|
|
19
21
|
/** Render the resolved descriptor as one CLI `--model` argv element (bracket or suffix form). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-descriptor.d.ts","sourceRoot":"","sources":["../../src/cursor/selection-descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAGN,KAAK,iBAAiB,EAEtB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3F;AAiED
|
|
1
|
+
{"version":3,"file":"selection-descriptor.d.ts","sourceRoot":"","sources":["../../src/cursor/selection-descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAGN,KAAK,iBAAiB,EAEtB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3F;AAiED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC/C,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,EAC5B,SAAS,EAAE,iBAAiB,GAAG,SAAS,GACtC,uBAAuB,CA6CzB;AAED,iGAAiG;AACjG,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,EAC5B,SAAS,EAAE,iBAAiB,GAAG,SAAS,GACtC,MAAM,CAKR"}
|
|
@@ -56,7 +56,9 @@ function buildParameters(capabilityId, value, thinkingMode) {
|
|
|
56
56
|
* model id plus ordered parameters. Both Cursor transports consume this; the
|
|
57
57
|
* native lane renders parameters into protobuf, the CLI lane renders a model
|
|
58
58
|
* string. Absent/unsupported selections return the representative or upstream
|
|
59
|
-
* id with zero parameters.
|
|
59
|
+
* id with zero parameters. Identities derived from unlisted suffix variants
|
|
60
|
+
* resolve each level through `cursorReasoning.variantIds` before any capability
|
|
61
|
+
* lookup (senpi#2038).
|
|
60
62
|
*/
|
|
61
63
|
export function resolveCursorSelectionDescriptor(model, selection) {
|
|
62
64
|
const compat = identityCompat(model);
|
|
@@ -67,10 +69,20 @@ export function resolveCursorSelectionDescriptor(model, selection) {
|
|
|
67
69
|
return { modelId: compat.representativeVariantId, parameters: [] };
|
|
68
70
|
}
|
|
69
71
|
if (selection.source === "legacy-variant") {
|
|
70
|
-
|
|
72
|
+
const legacyId = selection.legacyVariantId;
|
|
73
|
+
const allowlisted = legacyId !== undefined &&
|
|
74
|
+
(getCursorVariantAlias(legacyId) !== undefined || Object.values(compat.variantIds ?? {}).includes(legacyId));
|
|
75
|
+
if (!allowlisted) {
|
|
71
76
|
return { modelId: compat.representativeVariantId, parameters: [] };
|
|
72
77
|
}
|
|
73
|
-
return { modelId:
|
|
78
|
+
return { modelId: legacyId, parameters: [] };
|
|
79
|
+
}
|
|
80
|
+
const derivedVariantId = compat.variantIds?.[selection.level];
|
|
81
|
+
if (derivedVariantId !== undefined) {
|
|
82
|
+
return { modelId: derivedVariantId, parameters: [] };
|
|
83
|
+
}
|
|
84
|
+
if (compat.variantIds !== undefined) {
|
|
85
|
+
return { modelId: compat.representativeVariantId, parameters: [] };
|
|
74
86
|
}
|
|
75
87
|
const capability = CURSOR_MODEL_CAPABILITIES[compat.capabilityId];
|
|
76
88
|
const spec = capability?.levels[selection.level];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-descriptor.js","sourceRoot":"","sources":["../../src/cursor/selection-descriptor.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,yBAAyB,EAGzB,qBAAqB,GACrB,MAAM,yBAAyB,CAAC;AAOjC,SAAS,cAAc,CAAC,KAA4B;IACnD,OAAO,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC;AACtC,CAAC;AAID;;;;;;;GAOG;AACH,SAAS,aAAa,CACrB,MAA+B,EAC/B,KAAyB,EACzB,IAAqB;IAErB,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxG,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,UAAU,GACf,MAAM,CAAC,YAAY,KAAK,IAAI;YAC3B,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,aAAa,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,WAAW,CAAC;YAC5F,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,eAAe,CAAC;QACzC,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CACvB,YAAoB,EACpB,KAAa,EACb,YAAiC;IAEjC,MAAM,UAAU,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,GAAG,GAA+C,EAAE,CAAC;IAC3D,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5C,QAAQ,EAAE,EAAE,CAAC;YACZ,KAAK,UAAU;gBACd,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClE,MAAM;YACP,KAAK,SAAS,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,cAAc,CAAC;gBACvE,IAAI,OAAO,KAAK,SAAS;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5D,MAAM;YACP,CAAC;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,WAAW;gBACf,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxB,MAAM;YACP,KAAK,MAAM;gBACV,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBACjC,MAAM;QACR,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"selection-descriptor.js","sourceRoot":"","sources":["../../src/cursor/selection-descriptor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CursorAgentCompat, Model } from \"../model.ts\";\nimport type { ModelThinkingLevel, ThinkingSelection } from \"../types.ts\";\nimport {\n\tCURSOR_MODEL_CAPABILITIES,\n\ttype CursorLevelSpec,\n\ttype CursorParameterId,\n\tgetCursorVariantAlias,\n} from \"./model-capabilities.ts\";\n\nexport interface CursorResolvedSelection {\n\treadonly modelId: string;\n\treadonly parameters: readonly { readonly id: CursorParameterId; readonly value: string }[];\n}\n\nfunction identityCompat(model: Model<\"cursor-agent\">): CursorAgentCompat[\"cursorReasoning\"] {\n\treturn model.compat?.cursorReasoning;\n}\n\ntype CursorReasoningIdentity = NonNullable<CursorAgentCompat[\"cursorReasoning\"]>;\n\n/**\n * Catalog-guaranteed suffix alias for a base + level, or undefined. Cursor Run\n * rejects bare capability ids with Connect `not_found` (issue #1008; live\n * probes 2026-08-20), so every resolvable level prefers the suffix variant id\n * the `GetUsableModels` catalog actually serves. Candidates try the level's\n * wire value first, then the level token itself (`extra-high` vs `xhigh`),\n * with thinking-infixed forms for thinking Claude identities.\n */\nfunction suffixAliasId(\n\tcompat: CursorReasoningIdentity,\n\tlevel: ModelThinkingLevel,\n\tspec: CursorLevelSpec,\n): string | undefined {\n\tconst suffixes = level === \"off\" ? [\"none\"] : spec.value === level ? [spec.value] : [spec.value, level];\n\tfor (const suffix of suffixes) {\n\t\tconst candidates =\n\t\t\tcompat.thinkingMode === true\n\t\t\t\t? [`${compat.capabilityId}-thinking-${suffix}`, `${compat.capabilityId}-${suffix}-thinking`]\n\t\t\t\t: [`${compat.capabilityId}-${suffix}`];\n\t\tfor (const candidate of candidates) {\n\t\t\tconst alias = getCursorVariantAlias(candidate);\n\t\t\tif (alias) return alias.legacyVariantId;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction buildParameters(\n\tcapabilityId: string,\n\tvalue: string,\n\tthinkingMode: boolean | undefined,\n): { id: CursorParameterId; value: string }[] {\n\tconst capability = CURSOR_MODEL_CAPABILITIES[capabilityId];\n\tif (!capability) return [];\n\tconst out: { id: CursorParameterId; value: string }[] = [];\n\tfor (const id of capability.parameterOrder) {\n\t\tswitch (id) {\n\t\t\tcase \"thinking\":\n\t\t\t\tout.push({ id, value: thinkingMode === true ? \"true\" : \"false\" });\n\t\t\t\tbreak;\n\t\t\tcase \"context\": {\n\t\t\t\tconst context = capability.requestContext ?? capability.defaultContext;\n\t\t\t\tif (context !== undefined) out.push({ id, value: context });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"effort\":\n\t\t\tcase \"reasoning\":\n\t\t\t\tout.push({ id, value });\n\t\t\t\tbreak;\n\t\t\tcase \"fast\":\n\t\t\t\tout.push({ id, value: \"false\" });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * Resolve a Cursor model + thinking selection to its wire descriptor: the exact\n * model id plus ordered parameters. Both Cursor transports consume this; the\n * native lane renders parameters into protobuf, the CLI lane renders a model\n * string. Absent/unsupported selections return the representative or upstream\n * id with zero parameters. Identities derived from unlisted suffix variants\n * resolve each level through `cursorReasoning.variantIds` before any capability\n * lookup (senpi#2038).\n */\nexport function resolveCursorSelectionDescriptor(\n\tmodel: Model<\"cursor-agent\">,\n\tselection: ThinkingSelection | undefined,\n): CursorResolvedSelection {\n\tconst compat = identityCompat(model);\n\tconst fallback: CursorResolvedSelection = { modelId: model.upstreamModelId ?? model.id, parameters: [] };\n\tif (!compat) return fallback;\n\n\tif (selection === undefined) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tif (selection.source === \"legacy-variant\") {\n\t\tconst legacyId = selection.legacyVariantId;\n\t\tconst allowlisted =\n\t\t\tlegacyId !== undefined &&\n\t\t\t(getCursorVariantAlias(legacyId) !== undefined || Object.values(compat.variantIds ?? {}).includes(legacyId));\n\t\tif (!allowlisted) {\n\t\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t\t}\n\t\treturn { modelId: legacyId, parameters: [] };\n\t}\n\n\tconst derivedVariantId = compat.variantIds?.[selection.level];\n\tif (derivedVariantId !== undefined) {\n\t\treturn { modelId: derivedVariantId, parameters: [] };\n\t}\n\tif (compat.variantIds !== undefined) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tconst capability = CURSOR_MODEL_CAPABILITIES[compat.capabilityId];\n\tconst spec = capability?.levels[selection.level];\n\tif (!capability || !spec) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tconst suffixId = suffixAliasId(compat, selection.level, spec);\n\tif (suffixId !== undefined) return { modelId: suffixId, parameters: [] };\n\n\tif (spec.encoding === \"variant-id\") {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\treturn {\n\t\tmodelId: compat.capabilityId,\n\t\tparameters: buildParameters(compat.capabilityId, spec.value, compat.thinkingMode),\n\t};\n}\n\n/** Render the resolved descriptor as one CLI `--model` argv element (bracket or suffix form). */\nexport function renderCursorCliModelString(\n\tmodel: Model<\"cursor-agent\">,\n\tselection: ThinkingSelection | undefined,\n): string {\n\tconst resolved = resolveCursorSelectionDescriptor(model, selection);\n\tif (resolved.parameters.length === 0) return resolved.modelId;\n\tconst args = resolved.parameters.map((parameter) => `${parameter.id}=${parameter.value}`).join(\",\");\n\treturn `${resolved.modelId}[${args}]`;\n}\n"]}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { Model } from "../types.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Idempotent stored-catalog transform: pre-grouping 204-variant cursor entries
|
|
4
|
-
* are regrouped into selectable identities
|
|
5
|
-
*
|
|
4
|
+
* are regrouped into selectable identities, including families the static
|
|
5
|
+
* alias table does not list yet, which are derived over the stored batch
|
|
6
|
+
* (senpi#2038). An already-grouped identity (static or derived) always wins
|
|
7
|
+
* over flat rows aliasing it, regardless of input order, and absorbs their
|
|
8
|
+
* levels without losing its own metadata; conflicting derived variants stay
|
|
9
|
+
* flat, and duplicate identities coalesce at their first position in stable
|
|
10
|
+
* input order.
|
|
6
11
|
*/
|
|
7
12
|
export declare function regroupStoredCursorModels(models: readonly Model<"cursor-agent">[]): Model<"cursor-agent">[];
|
|
8
13
|
//# sourceMappingURL=store-migration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-migration.d.ts","sourceRoot":"","sources":["../../src/cursor/store-migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"store-migration.d.ts","sourceRoot":"","sources":["../../src/cursor/store-migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAsB,MAAM,aAAa,CAAC;AAsD7D;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CA8F3G"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { normalizeCursorCatalog } from "./catalog-grouping.js";
|
|
1
|
+
import { deriveCursorVariantAliases, normalizeCursorCatalog } from "./catalog-grouping.js";
|
|
2
2
|
import { resolveCursorContextWindow } from "./context-limit-store.js";
|
|
3
|
-
import { getCursorVariantAlias } from "./model-capabilities.js";
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { getCursorVariantAlias, parseCursorVariantId } from "./model-capabilities.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fill levels a stored static group lacks from flat alias rows regrouped beside it;
|
|
6
|
+
* the group's own levels, representative, and compat metadata are never replaced.
|
|
7
|
+
*/
|
|
8
|
+
function absorbStaticLevels(current, flatGroup) {
|
|
9
|
+
const additions = Object.entries(flatGroup?.thinkingLevelMap ?? {}).filter(([level, value]) => value != null && current.thinkingLevelMap?.[level] == null);
|
|
10
|
+
if (additions.length === 0)
|
|
11
|
+
return current;
|
|
12
|
+
return { ...current, thinkingLevelMap: { ...current.thinkingLevelMap, ...Object.fromEntries(additions) } };
|
|
6
13
|
}
|
|
7
14
|
function entryToModel(entry, maxTokensById) {
|
|
8
15
|
const representative = entry.representativeVariantId ?? entry.legacyAliases[0] ?? entry.id;
|
|
@@ -30,6 +37,7 @@ function entryToModel(entry, maxTokensById) {
|
|
|
30
37
|
capabilityId: entry.capabilityId,
|
|
31
38
|
...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),
|
|
32
39
|
representativeVariantId: entry.representativeVariantId,
|
|
40
|
+
...(entry.variantIds !== undefined ? { variantIds: entry.variantIds } : {}),
|
|
33
41
|
},
|
|
34
42
|
}
|
|
35
43
|
: {}),
|
|
@@ -38,13 +46,36 @@ function entryToModel(entry, maxTokensById) {
|
|
|
38
46
|
}
|
|
39
47
|
/**
|
|
40
48
|
* Idempotent stored-catalog transform: pre-grouping 204-variant cursor entries
|
|
41
|
-
* are regrouped into selectable identities
|
|
42
|
-
*
|
|
49
|
+
* are regrouped into selectable identities, including families the static
|
|
50
|
+
* alias table does not list yet, which are derived over the stored batch
|
|
51
|
+
* (senpi#2038). An already-grouped identity (static or derived) always wins
|
|
52
|
+
* over flat rows aliasing it, regardless of input order, and absorbs their
|
|
53
|
+
* levels without losing its own metadata; conflicting derived variants stay
|
|
54
|
+
* flat, and duplicate identities coalesce at their first position in stable
|
|
55
|
+
* input order.
|
|
43
56
|
*/
|
|
44
57
|
export function regroupStoredCursorModels(models) {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
58
|
+
const existingGroups = new Map();
|
|
59
|
+
const existingDerived = new Map();
|
|
60
|
+
const representedTargetById = new Map();
|
|
61
|
+
for (const model of models) {
|
|
62
|
+
const reasoning = model.compat?.cursorReasoning;
|
|
63
|
+
if (reasoning === undefined || existingGroups.has(model.id))
|
|
64
|
+
continue;
|
|
65
|
+
existingGroups.set(model.id, model);
|
|
66
|
+
if (reasoning.variantIds === undefined)
|
|
67
|
+
continue;
|
|
68
|
+
existingDerived.set(model.id, model);
|
|
69
|
+
for (const id of Object.values(reasoning.variantIds))
|
|
70
|
+
representedTargetById.set(id, model.id);
|
|
71
|
+
}
|
|
72
|
+
const derived = deriveCursorVariantAliases([
|
|
73
|
+
...models.filter((model) => model.compat?.cursorReasoning === undefined).map((model) => model.id),
|
|
74
|
+
...[...existingDerived.values()].flatMap((model) => Object.values(model.compat?.cursorReasoning?.variantIds ?? {})),
|
|
75
|
+
]);
|
|
76
|
+
const isLegacy = (model) => model.compat?.cursorReasoning === undefined &&
|
|
77
|
+
(getCursorVariantAlias(model.id) !== undefined || derived.has(model.id) || representedTargetById.has(model.id));
|
|
78
|
+
const legacy = models.filter(isLegacy);
|
|
48
79
|
const maxTokensById = new Map(models.map((model) => [model.id, model.maxTokens]));
|
|
49
80
|
const regrouped = new Map(normalizeCursorCatalog(legacy.map((model) => ({
|
|
50
81
|
id: model.id,
|
|
@@ -52,25 +83,66 @@ export function regroupStoredCursorModels(models) {
|
|
|
52
83
|
input: model.input.filter((modality) => modality !== "video"),
|
|
53
84
|
cursorMaxMode: model.compat?.cursorMaxMode === true,
|
|
54
85
|
}))).map((entry) => [entry.id, entryToModel(entry, maxTokensById)]));
|
|
86
|
+
const merged = new Map();
|
|
87
|
+
for (const [targetId, current] of existingGroups) {
|
|
88
|
+
const kept = current.compat?.cursorReasoning;
|
|
89
|
+
if (kept?.variantIds === undefined) {
|
|
90
|
+
merged.set(targetId, absorbStaticLevels(current, regrouped.get(targetId)));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const variantIds = { ...kept.variantIds };
|
|
94
|
+
const thinkingLevelMap = { ...current.thinkingLevelMap };
|
|
95
|
+
let changed = false;
|
|
96
|
+
for (const model of legacy) {
|
|
97
|
+
const alias = derived.get(model.id);
|
|
98
|
+
if (alias?.targetId !== targetId || alias.level === undefined)
|
|
99
|
+
continue;
|
|
100
|
+
if (variantIds[alias.level] !== undefined && variantIds[alias.level] !== model.id)
|
|
101
|
+
continue;
|
|
102
|
+
variantIds[alias.level] = model.id;
|
|
103
|
+
thinkingLevelMap[alias.level] = parseCursorVariantId(model.id).level;
|
|
104
|
+
changed = true;
|
|
105
|
+
}
|
|
106
|
+
merged.set(targetId, changed
|
|
107
|
+
? {
|
|
108
|
+
...current,
|
|
109
|
+
thinkingLevelMap,
|
|
110
|
+
compat: { ...current.compat, cursorReasoning: { ...kept, variantIds } },
|
|
111
|
+
}
|
|
112
|
+
: current);
|
|
113
|
+
}
|
|
55
114
|
const seen = new Set();
|
|
56
115
|
const out = [];
|
|
57
116
|
for (const model of models) {
|
|
58
|
-
|
|
59
|
-
|
|
117
|
+
const alias = isLegacy(model) ? (getCursorVariantAlias(model.id) ?? derived.get(model.id)) : undefined;
|
|
118
|
+
const targetId = alias?.targetId ?? (isLegacy(model) ? representedTargetById.get(model.id) : undefined) ?? model.id;
|
|
119
|
+
const coalesced = merged.get(targetId);
|
|
120
|
+
if (coalesced !== undefined) {
|
|
121
|
+
const retainedIds = coalesced.compat?.cursorReasoning?.variantIds;
|
|
122
|
+
// Static groups absorb every flat alias row; derived groups keep conflicting variants flat.
|
|
123
|
+
const absorbed = model.id === targetId ||
|
|
124
|
+
(retainedIds === undefined ? isLegacy(model) : Object.values(retainedIds).includes(model.id));
|
|
125
|
+
if (!absorbed) {
|
|
126
|
+
if (!seen.has(model.id))
|
|
127
|
+
out.push(model);
|
|
128
|
+
seen.add(model.id);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!seen.has(targetId))
|
|
132
|
+
out.push(coalesced);
|
|
133
|
+
seen.add(targetId);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (!isLegacy(model)) {
|
|
137
|
+
if (!seen.has(model.id))
|
|
138
|
+
out.push(model);
|
|
139
|
+
seen.add(model.id);
|
|
60
140
|
continue;
|
|
61
141
|
}
|
|
62
|
-
const alias = getCursorVariantAlias(model.id);
|
|
63
|
-
const targetId = alias?.targetId ?? model.id;
|
|
64
142
|
if (seen.has(targetId))
|
|
65
143
|
continue;
|
|
66
144
|
seen.add(targetId);
|
|
67
|
-
|
|
68
|
-
if (transformed !== undefined) {
|
|
69
|
-
out.push(transformed);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
out.push(model);
|
|
73
|
-
}
|
|
145
|
+
out.push(regrouped.get(targetId) ?? model);
|
|
74
146
|
}
|
|
75
147
|
return out;
|
|
76
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-migration.js","sourceRoot":"","sources":["../../src/cursor/store-migration.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Model } from \"../types.ts\";\nimport { type CursorCatalogEntry, normalizeCursorCatalog } from \"./catalog-grouping.ts\";\nimport { resolveCursorContextWindow } from \"./context-limit-store.ts\";\nimport { getCursorVariantAlias } from \"./model-capabilities.ts\";\n\nfunction isGroupedShape(model: Model<\"cursor-agent\">): boolean {\n\treturn model.compat?.cursorReasoning !== undefined || getCursorVariantAlias(model.id) === undefined;\n}\n\nfunction entryToModel(entry: CursorCatalogEntry, maxTokensById: ReadonlyMap<string, number>): Model<\"cursor-agent\"> {\n\tconst representative = entry.representativeVariantId ?? entry.legacyAliases[0] ?? entry.id;\n\tconst maxTokens = maxTokensById.get(representative) ?? maxTokensById.get(entry.id) ?? 64000;\n\treturn {\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\tapi: \"cursor-agent\",\n\t\tprovider: \"cursor\",\n\t\tbaseUrl: \"https://api2.cursor.sh\",\n\t\treasoning: entry.reasoning,\n\t\t...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),\n\t\tinput: entry.input,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: resolveCursorContextWindow(entry.id, entry.window),\n\t\tmaxTokens,\n\t\t...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id\n\t\t\t? { upstreamModelId: entry.representativeVariantId }\n\t\t\t: {}),\n\t\tcompat: {\n\t\t\t...(entry.cursorMaxMode ? { cursorMaxMode: true } : {}),\n\t\t\t...(entry.capabilityId !== undefined && entry.representativeVariantId !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcursorReasoning: {\n\t\t\t\t\t\t\tcapabilityId: entry.capabilityId,\n\t\t\t\t\t\t\t...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),\n\t\t\t\t\t\t\trepresentativeVariantId: entry.representativeVariantId,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t},\n\t};\n}\n\n/**\n * Idempotent stored-catalog transform: pre-grouping 204-variant cursor entries\n * are regrouped into selectable identities; already-grouped, unknown, and\n * malformed entries pass through unchanged in stable input order.\n */\nexport function regroupStoredCursorModels(models: readonly Model<\"cursor-agent\">[]): Model<\"cursor-agent\">[] {\n\tconst legacy = models.filter((model) => !isGroupedShape(model));\n\tif (legacy.length === 0) return [...models];\n\tconst maxTokensById = new Map(models.map((model) => [model.id, model.maxTokens]));\n\tconst regrouped = new Map(\n\t\tnormalizeCursorCatalog(\n\t\t\tlegacy.map((model) => ({\n\t\t\t\tid: model.id,\n\t\t\t\tname: model.name,\n\t\t\t\tinput: model.input.filter((modality): modality is \"text\" | \"image\" => modality !== \"video\"),\n\t\t\t\tcursorMaxMode: model.compat?.cursorMaxMode === true,\n\t\t\t})),\n\t\t).map((entry) => [entry.id, entryToModel(entry, maxTokensById)] as const),\n\t);\n\tconst seen = new Set<string>();\n\tconst out: Model<\"cursor-agent\">[] = [];\n\tfor (const model of models) {\n\t\tif (isGroupedShape(model)) {\n\t\t\tout.push(model);\n\t\t\tcontinue;\n\t\t}\n\t\tconst alias = getCursorVariantAlias(model.id);\n\t\tconst targetId = alias?.targetId ?? model.id;\n\t\tif (seen.has(targetId)) continue;\n\t\tseen.add(targetId);\n\t\tconst transformed = regrouped.get(targetId);\n\t\tif (transformed !== undefined) {\n\t\t\tout.push(transformed);\n\t\t} else {\n\t\t\tout.push(model);\n\t\t}\n\t}\n\treturn out;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store-migration.js","sourceRoot":"","sources":["../../src/cursor/store-migration.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Model, ModelThinkingLevel } from \"../types.ts\";\nimport { type CursorCatalogEntry, deriveCursorVariantAliases, normalizeCursorCatalog } from \"./catalog-grouping.ts\";\nimport { resolveCursorContextWindow } from \"./context-limit-store.ts\";\nimport { getCursorVariantAlias, parseCursorVariantId } from \"./model-capabilities.ts\";\n\n/**\n * Fill levels a stored static group lacks from flat alias rows regrouped beside it;\n * the group's own levels, representative, and compat metadata are never replaced.\n */\nfunction absorbStaticLevels(\n\tcurrent: Model<\"cursor-agent\">,\n\tflatGroup: Model<\"cursor-agent\"> | undefined,\n): Model<\"cursor-agent\"> {\n\tconst additions = Object.entries(flatGroup?.thinkingLevelMap ?? {}).filter(\n\t\t([level, value]) => value != null && current.thinkingLevelMap?.[level as ModelThinkingLevel] == null,\n\t);\n\tif (additions.length === 0) return current;\n\treturn { ...current, thinkingLevelMap: { ...current.thinkingLevelMap, ...Object.fromEntries(additions) } };\n}\n\nfunction entryToModel(entry: CursorCatalogEntry, maxTokensById: ReadonlyMap<string, number>): Model<\"cursor-agent\"> {\n\tconst representative = entry.representativeVariantId ?? entry.legacyAliases[0] ?? entry.id;\n\tconst maxTokens = maxTokensById.get(representative) ?? maxTokensById.get(entry.id) ?? 64000;\n\treturn {\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\tapi: \"cursor-agent\",\n\t\tprovider: \"cursor\",\n\t\tbaseUrl: \"https://api2.cursor.sh\",\n\t\treasoning: entry.reasoning,\n\t\t...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),\n\t\tinput: entry.input,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: resolveCursorContextWindow(entry.id, entry.window),\n\t\tmaxTokens,\n\t\t...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id\n\t\t\t? { upstreamModelId: entry.representativeVariantId }\n\t\t\t: {}),\n\t\tcompat: {\n\t\t\t...(entry.cursorMaxMode ? { cursorMaxMode: true } : {}),\n\t\t\t...(entry.capabilityId !== undefined && entry.representativeVariantId !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcursorReasoning: {\n\t\t\t\t\t\t\tcapabilityId: entry.capabilityId,\n\t\t\t\t\t\t\t...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),\n\t\t\t\t\t\t\trepresentativeVariantId: entry.representativeVariantId,\n\t\t\t\t\t\t\t...(entry.variantIds !== undefined ? { variantIds: entry.variantIds } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t},\n\t};\n}\n\n/**\n * Idempotent stored-catalog transform: pre-grouping 204-variant cursor entries\n * are regrouped into selectable identities, including families the static\n * alias table does not list yet, which are derived over the stored batch\n * (senpi#2038). An already-grouped identity (static or derived) always wins\n * over flat rows aliasing it, regardless of input order, and absorbs their\n * levels without losing its own metadata; conflicting derived variants stay\n * flat, and duplicate identities coalesce at their first position in stable\n * input order.\n */\nexport function regroupStoredCursorModels(models: readonly Model<\"cursor-agent\">[]): Model<\"cursor-agent\">[] {\n\tconst existingGroups = new Map<string, Model<\"cursor-agent\">>();\n\tconst existingDerived = new Map<string, Model<\"cursor-agent\">>();\n\tconst representedTargetById = new Map<string, string>();\n\tfor (const model of models) {\n\t\tconst reasoning = model.compat?.cursorReasoning;\n\t\tif (reasoning === undefined || existingGroups.has(model.id)) continue;\n\t\texistingGroups.set(model.id, model);\n\t\tif (reasoning.variantIds === undefined) continue;\n\t\texistingDerived.set(model.id, model);\n\t\tfor (const id of Object.values(reasoning.variantIds)) representedTargetById.set(id, model.id);\n\t}\n\tconst derived = deriveCursorVariantAliases([\n\t\t...models.filter((model) => model.compat?.cursorReasoning === undefined).map((model) => model.id),\n\t\t...[...existingDerived.values()].flatMap((model) =>\n\t\t\tObject.values(model.compat?.cursorReasoning?.variantIds ?? {}),\n\t\t),\n\t]);\n\tconst isLegacy = (model: Model<\"cursor-agent\">): boolean =>\n\t\tmodel.compat?.cursorReasoning === undefined &&\n\t\t(getCursorVariantAlias(model.id) !== undefined || derived.has(model.id) || representedTargetById.has(model.id));\n\tconst legacy = models.filter(isLegacy);\n\tconst maxTokensById = new Map(models.map((model) => [model.id, model.maxTokens]));\n\tconst regrouped = new Map(\n\t\tnormalizeCursorCatalog(\n\t\t\tlegacy.map((model) => ({\n\t\t\t\tid: model.id,\n\t\t\t\tname: model.name,\n\t\t\t\tinput: model.input.filter((modality): modality is \"text\" | \"image\" => modality !== \"video\"),\n\t\t\t\tcursorMaxMode: model.compat?.cursorMaxMode === true,\n\t\t\t})),\n\t\t).map((entry) => [entry.id, entryToModel(entry, maxTokensById)] as const),\n\t);\n\tconst merged = new Map<string, Model<\"cursor-agent\">>();\n\tfor (const [targetId, current] of existingGroups) {\n\t\tconst kept = current.compat?.cursorReasoning;\n\t\tif (kept?.variantIds === undefined) {\n\t\t\tmerged.set(targetId, absorbStaticLevels(current, regrouped.get(targetId)));\n\t\t\tcontinue;\n\t\t}\n\t\tconst variantIds = { ...kept.variantIds };\n\t\tconst thinkingLevelMap = { ...current.thinkingLevelMap };\n\t\tlet changed = false;\n\t\tfor (const model of legacy) {\n\t\t\tconst alias = derived.get(model.id);\n\t\t\tif (alias?.targetId !== targetId || alias.level === undefined) continue;\n\t\t\tif (variantIds[alias.level] !== undefined && variantIds[alias.level] !== model.id) continue;\n\t\t\tvariantIds[alias.level] = model.id;\n\t\t\tthinkingLevelMap[alias.level] = parseCursorVariantId(model.id).level;\n\t\t\tchanged = true;\n\t\t}\n\t\tmerged.set(\n\t\t\ttargetId,\n\t\t\tchanged\n\t\t\t\t? {\n\t\t\t\t\t\t...current,\n\t\t\t\t\t\tthinkingLevelMap,\n\t\t\t\t\t\tcompat: { ...current.compat, cursorReasoning: { ...kept, variantIds } },\n\t\t\t\t\t}\n\t\t\t\t: current,\n\t\t);\n\t}\n\tconst seen = new Set<string>();\n\tconst out: Model<\"cursor-agent\">[] = [];\n\tfor (const model of models) {\n\t\tconst alias = isLegacy(model) ? (getCursorVariantAlias(model.id) ?? derived.get(model.id)) : undefined;\n\t\tconst targetId =\n\t\t\talias?.targetId ?? (isLegacy(model) ? representedTargetById.get(model.id) : undefined) ?? model.id;\n\t\tconst coalesced = merged.get(targetId);\n\t\tif (coalesced !== undefined) {\n\t\t\tconst retainedIds = coalesced.compat?.cursorReasoning?.variantIds;\n\t\t\t// Static groups absorb every flat alias row; derived groups keep conflicting variants flat.\n\t\t\tconst absorbed =\n\t\t\t\tmodel.id === targetId ||\n\t\t\t\t(retainedIds === undefined ? isLegacy(model) : Object.values(retainedIds).includes(model.id));\n\t\t\tif (!absorbed) {\n\t\t\t\tif (!seen.has(model.id)) out.push(model);\n\t\t\t\tseen.add(model.id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!seen.has(targetId)) out.push(coalesced);\n\t\t\tseen.add(targetId);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isLegacy(model)) {\n\t\t\tif (!seen.has(model.id)) out.push(model);\n\t\t\tseen.add(model.id);\n\t\t\tcontinue;\n\t\t}\n\t\tif (seen.has(targetId)) continue;\n\t\tseen.add(targetId);\n\t\tout.push(regrouped.get(targetId) ?? model);\n\t}\n\treturn out;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AnthropicMessagesCompat, Api, BedrockCompat, CacheRetention, ModelCost, OpenAICompletionsCompat, OpenAIResponsesCompat, ProviderId, ThinkingLevelMap } from "./types.ts";
|
|
1
|
+
import type { AnthropicMessagesCompat, Api, BedrockCompat, CacheRetention, ModelCost, ModelThinkingLevel, OpenAICompletionsCompat, OpenAIResponsesCompat, ProviderId, ThinkingLevelMap } from "./types.ts";
|
|
2
2
|
/** Model interface for the unified model system. */
|
|
3
3
|
export interface Model<TApi extends Api> {
|
|
4
4
|
id: string;
|
|
@@ -60,6 +60,14 @@ export interface CursorAgentCompat {
|
|
|
60
60
|
thinkingMode?: boolean;
|
|
61
61
|
/** Exact catalog variant sent when no explicit selection exists. */
|
|
62
62
|
representativeVariantId: string;
|
|
63
|
+
/**
|
|
64
|
+
* Derived-group variant ids: normalized thinking level -> the exact
|
|
65
|
+
* server-listed variant id observed in the live catalog. Present only on
|
|
66
|
+
* identities derived at runtime from ids the static alias table does not
|
|
67
|
+
* list; explicit selections resolve through it before any capability
|
|
68
|
+
* lookup (senpi#2038).
|
|
69
|
+
*/
|
|
70
|
+
variantIds?: Readonly<Partial<Record<ModelThinkingLevel, string>>>;
|
|
63
71
|
};
|
|
64
72
|
}
|
|
65
73
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,uBAAuB,EACvB,GAAG,EACH,aAAa,EACb,cAAc,EACd,SAAS,EACT,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAEpB,oDAAoD;AACpD,MAAM,WAAW,KAAK,CAAC,IAAI,SAAS,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4EAA4E;IAC5E,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IAC3C,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kGAAkG;IAClG,MAAM,CAAC,EAAE,IAAI,SAAS,oBAAoB,GACvC,uBAAuB,GACvB,IAAI,SAAS,kBAAkB,GAAG,wBAAwB,GAAG,wBAAwB,GACpF,qBAAqB,GACrB,IAAI,SAAS,oBAAoB,GAChC,uBAAuB,GACvB,IAAI,SAAS,yBAAyB,GACrC,aAAa,GACb,IAAI,SAAS,cAAc,GAC1B,iBAAiB,GACjB,IAAI,SAAS,aAAa,GACzB,gBAAgB,GAChB,KAAK,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IACjC,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE;QACjB,uDAAuD;QACvD,YAAY,EAAE,MAAM,CAAC;QACrB,kEAAkE;QAClE,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,oEAAoE;QACpE,uBAAuB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,uBAAuB,EACvB,GAAG,EACH,aAAa,EACb,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAEpB,oDAAoD;AACpD,MAAM,WAAW,KAAK,CAAC,IAAI,SAAS,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,IAAI,CAAC;IACV,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4EAA4E;IAC5E,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IAC3C,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kGAAkG;IAClG,MAAM,CAAC,EAAE,IAAI,SAAS,oBAAoB,GACvC,uBAAuB,GACvB,IAAI,SAAS,kBAAkB,GAAG,wBAAwB,GAAG,wBAAwB,GACpF,qBAAqB,GACrB,IAAI,SAAS,oBAAoB,GAChC,uBAAuB,GACvB,IAAI,SAAS,yBAAyB,GACrC,aAAa,GACb,IAAI,SAAS,cAAc,GAC1B,iBAAiB,GACjB,IAAI,SAAS,aAAa,GACzB,gBAAgB,GAChB,KAAK,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IACjC,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE;QACjB,uDAAuD;QACvD,YAAY,EAAE,MAAM,CAAC;QACrB,kEAAkE;QAClE,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,oEAAoE;QACpE,uBAAuB,EAAE,MAAM,CAAC;QAChC;;;;;;WAMG;QACH,UAAU,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KACnE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n\tAnthropicMessagesCompat,\n\tApi,\n\tBedrockCompat,\n\tCacheRetention,\n\tModelCost,\n\tOpenAICompletionsCompat,\n\tOpenAIResponsesCompat,\n\tProviderId,\n\tThinkingLevelMap,\n} from \"./types.ts\";\n\n/** Model interface for the unified model system. */\nexport interface Model<TApi extends Api> {\n\tid: string;\n\tname: string;\n\tapi: TApi;\n\tprovider: ProviderId;\n\tbaseUrl: string;\n\treasoning: boolean;\n\t/**\n\t * Maps pi thinking levels to provider/model-specific values.\n\t * In a present map, omitting `xhigh` or `max` disables that extended tier; ordinary missing levels\n\t * use provider defaults. null marks any level as unsupported.\n\t */\n\tthinkingLevelMap?: ThinkingLevelMap;\n\tinput: (\"text\" | \"image\" | \"video\")[];\n\tcost: ModelCost;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\t/** Default sampling parameters; per-request values override these by key. */\n\tsamplingParams?: Record<string, unknown>;\n\theaders?: Record<string, string>;\n\t/** Default prompt-cache retention preference when the request omits one. */\n\tcacheRetention?: CacheRetention;\n\t/**\n\t * Upstream model id sent on the wire when it differs from the catalog id\n\t * (for example `-fast` priority-tier variants aliasing their base model).\n\t */\n\tupstreamModelId?: string;\n\t/** Service tier requested by default for this model (for example `-fast` variants). */\n\tserviceTier?: \"auto\" | \"flex\" | \"priority\";\n\t/** Whether to recover supported text-encoded tool calls from assistant text. */\n\trecoverTextToolCalls?: boolean;\n\t/** Compatibility overrides for OpenAI-compatible APIs. If not set, auto-detected from baseUrl. */\n\tcompat?: TApi extends \"openai-completions\"\n\t\t? OpenAICompletionsCompat\n\t\t: TApi extends \"openai-responses\" | \"openai-codex-responses\" | \"azure-openai-responses\"\n\t\t\t? OpenAIResponsesCompat\n\t\t\t: TApi extends \"anthropic-messages\"\n\t\t\t\t? AnthropicMessagesCompat\n\t\t\t\t: TApi extends \"bedrock-converse-stream\"\n\t\t\t\t\t? BedrockCompat\n\t\t\t\t\t: TApi extends \"cursor-agent\"\n\t\t\t\t\t\t? CursorAgentCompat\n\t\t\t\t\t\t: TApi extends \"devin-agent\"\n\t\t\t\t\t\t\t? DevinAgentCompat\n\t\t\t\t\t\t\t: never;\n}\n\n/** Devin (Cascade) model metadata the transport branches on. */\nexport interface DevinAgentCompat {\n\t/**\n\t * Server-side router (`adaptive`): its uid is never a legal chat model uid, so\n\t * the transport resolves it through `AssignModel` before every turn.\n\t */\n\tmodelRouter?: boolean;\n\t/** The lane accepts several tool calls per turn; absent means one at a time. */\n\tsupportsParallelToolCalls?: boolean;\n}\n\n/** Cursor agent protocol model metadata. */\nexport interface CursorAgentCompat {\n\t/** Request Cursor's max-mode (1M-context) variant of the model. */\n\tcursorMaxMode?: boolean;\n\t/**\n\t * Wire-reasoning capability for grouped Cursor catalog identities.\n\t * Presence is the capability gate: models without it never emit reasoning\n\t * parameters on the wire.\n\t */\n\tcursorReasoning?: {\n\t\t/** Base id into the static cursor capability table. */\n\t\tcapabilityId: string;\n\t\t/** Fixed Claude thinking boolean for this selectable identity. */\n\t\tthinkingMode?: boolean;\n\t\t/** Exact catalog variant sent when no explicit selection exists. */\n\t\trepresentativeVariantId: string;\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n\tAnthropicMessagesCompat,\n\tApi,\n\tBedrockCompat,\n\tCacheRetention,\n\tModelCost,\n\tModelThinkingLevel,\n\tOpenAICompletionsCompat,\n\tOpenAIResponsesCompat,\n\tProviderId,\n\tThinkingLevelMap,\n} from \"./types.ts\";\n\n/** Model interface for the unified model system. */\nexport interface Model<TApi extends Api> {\n\tid: string;\n\tname: string;\n\tapi: TApi;\n\tprovider: ProviderId;\n\tbaseUrl: string;\n\treasoning: boolean;\n\t/**\n\t * Maps pi thinking levels to provider/model-specific values.\n\t * In a present map, omitting `xhigh` or `max` disables that extended tier; ordinary missing levels\n\t * use provider defaults. null marks any level as unsupported.\n\t */\n\tthinkingLevelMap?: ThinkingLevelMap;\n\tinput: (\"text\" | \"image\" | \"video\")[];\n\tcost: ModelCost;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\t/** Default sampling parameters; per-request values override these by key. */\n\tsamplingParams?: Record<string, unknown>;\n\theaders?: Record<string, string>;\n\t/** Default prompt-cache retention preference when the request omits one. */\n\tcacheRetention?: CacheRetention;\n\t/**\n\t * Upstream model id sent on the wire when it differs from the catalog id\n\t * (for example `-fast` priority-tier variants aliasing their base model).\n\t */\n\tupstreamModelId?: string;\n\t/** Service tier requested by default for this model (for example `-fast` variants). */\n\tserviceTier?: \"auto\" | \"flex\" | \"priority\";\n\t/** Whether to recover supported text-encoded tool calls from assistant text. */\n\trecoverTextToolCalls?: boolean;\n\t/** Compatibility overrides for OpenAI-compatible APIs. If not set, auto-detected from baseUrl. */\n\tcompat?: TApi extends \"openai-completions\"\n\t\t? OpenAICompletionsCompat\n\t\t: TApi extends \"openai-responses\" | \"openai-codex-responses\" | \"azure-openai-responses\"\n\t\t\t? OpenAIResponsesCompat\n\t\t\t: TApi extends \"anthropic-messages\"\n\t\t\t\t? AnthropicMessagesCompat\n\t\t\t\t: TApi extends \"bedrock-converse-stream\"\n\t\t\t\t\t? BedrockCompat\n\t\t\t\t\t: TApi extends \"cursor-agent\"\n\t\t\t\t\t\t? CursorAgentCompat\n\t\t\t\t\t\t: TApi extends \"devin-agent\"\n\t\t\t\t\t\t\t? DevinAgentCompat\n\t\t\t\t\t\t\t: never;\n}\n\n/** Devin (Cascade) model metadata the transport branches on. */\nexport interface DevinAgentCompat {\n\t/**\n\t * Server-side router (`adaptive`): its uid is never a legal chat model uid, so\n\t * the transport resolves it through `AssignModel` before every turn.\n\t */\n\tmodelRouter?: boolean;\n\t/** The lane accepts several tool calls per turn; absent means one at a time. */\n\tsupportsParallelToolCalls?: boolean;\n}\n\n/** Cursor agent protocol model metadata. */\nexport interface CursorAgentCompat {\n\t/** Request Cursor's max-mode (1M-context) variant of the model. */\n\tcursorMaxMode?: boolean;\n\t/**\n\t * Wire-reasoning capability for grouped Cursor catalog identities.\n\t * Presence is the capability gate: models without it never emit reasoning\n\t * parameters on the wire.\n\t */\n\tcursorReasoning?: {\n\t\t/** Base id into the static cursor capability table. */\n\t\tcapabilityId: string;\n\t\t/** Fixed Claude thinking boolean for this selectable identity. */\n\t\tthinkingMode?: boolean;\n\t\t/** Exact catalog variant sent when no explicit selection exists. */\n\t\trepresentativeVariantId: string;\n\t\t/**\n\t\t * Derived-group variant ids: normalized thinking level -> the exact\n\t\t * server-listed variant id observed in the live catalog. Present only on\n\t\t * identities derived at runtime from ids the static alias table does not\n\t\t * list; explicit selections resolve through it before any capability\n\t\t * lookup (senpi#2038).\n\t\t */\n\t\tvariantIds?: Readonly<Partial<Record<ModelThinkingLevel, string>>>;\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/providers/cursor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,QAAQ,EAA6B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/providers/cursor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,QAAQ,EAA6B,MAAM,cAAc,CAAC;AAkExF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAAC,cAAc,CAAC,CAkBzD"}
|
|
@@ -57,6 +57,7 @@ async function fetchCursorModels(context) {
|
|
|
57
57
|
capabilityId: entry.capabilityId,
|
|
58
58
|
...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),
|
|
59
59
|
representativeVariantId: entry.representativeVariantId,
|
|
60
|
+
...(entry.variantIds !== undefined ? { variantIds: entry.variantIds } : {}),
|
|
60
61
|
},
|
|
61
62
|
}
|
|
62
63
|
: {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/providers/cursor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/providers/cursor.ts"],"names":[],"mappings":"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","sourcesContent":["import { cursorAgentApi, loadCursorAgentModule } from \"../api/cursor-agent.lazy.ts\";\nimport { lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadCursorOAuth } from \"../auth/oauth/load.ts\";\nimport { normalizeCursorCatalog } from \"../cursor/catalog-grouping.ts\";\nimport { resolveCursorContextWindow } from \"../cursor/context-limit-store.ts\";\nimport { regroupStoredCursorModels } from \"../cursor/store-migration.ts\";\nimport { createProvider, type Provider, type RefreshModelsContext } from \"../models.ts\";\nimport type { Model } from \"../types.ts\";\n\nconst CURSOR_BASE_URL = \"https://api2.cursor.sh\";\n\n/**\n * Cursor's catalog is fully dynamic: `GetUsableModels` requires an\n * authenticated access token and reports the account's usable models, so the\n * provider ships no static baseline. The discovery call lives in the\n * Node-only `cursor-agent` API module, loaded through the bundler-opaque\n * lazy boundary so the provider factory stays browser-safe.\n */\nasync function fetchCursorModels(context: RefreshModelsContext): Promise<Model<\"cursor-agent\">[]> {\n\tconst credential = context.credential;\n\tconst accessToken = credential?.type === \"oauth\" ? credential.access : credential?.key;\n\tif (!accessToken) return [];\n\tconst { fetchCursorUsableModels } = await loadCursorAgentModule();\n\tconst discovered = await fetchCursorUsableModels({ apiKey: accessToken, signal: context.signal });\n\tif (discovered === null) {\n\t\tthrow new Error(\"Could not load Cursor model catalog from GetUsableModels\");\n\t}\n\tconst normalized = normalizeCursorCatalog(\n\t\tdiscovered.map((model) => ({\n\t\t\tid: model.id,\n\t\t\tname: model.name,\n\t\t\tinput: model.input,\n\t\t\tcursorMaxMode: model.cursorMaxMode,\n\t\t})),\n\t);\n\tconst maxTokensByVariant = new Map(discovered.map((model) => [model.id, model.maxTokens]));\n\treturn normalized.map((entry): Model<\"cursor-agent\"> => {\n\t\tconst representative = entry.representativeVariantId ?? entry.legacyAliases[0] ?? entry.id;\n\t\tconst maxTokens = maxTokensByVariant.get(representative) ?? maxTokensByVariant.get(entry.id) ?? 64000;\n\t\treturn {\n\t\t\tid: entry.id,\n\t\t\tname: entry.name,\n\t\t\tapi: \"cursor-agent\",\n\t\t\tprovider: \"cursor\",\n\t\t\tbaseUrl: CURSOR_BASE_URL,\n\t\t\treasoning: entry.reasoning,\n\t\t\t...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),\n\t\t\tinput: entry.input,\n\t\t\t// Subscription-billed: Cursor reports no per-token pricing here.\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\t\tcontextWindow: resolveCursorContextWindow(entry.id, entry.window),\n\t\t\tmaxTokens,\n\t\t\t...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id\n\t\t\t\t? { upstreamModelId: entry.representativeVariantId }\n\t\t\t\t: {}),\n\t\t\tcompat: {\n\t\t\t\t...(entry.cursorMaxMode ? { cursorMaxMode: true } : {}),\n\t\t\t\t...(entry.capabilityId !== undefined && entry.representativeVariantId !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tcursorReasoning: {\n\t\t\t\t\t\t\t\tcapabilityId: entry.capabilityId,\n\t\t\t\t\t\t\t\t...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),\n\t\t\t\t\t\t\t\trepresentativeVariantId: entry.representativeVariantId,\n\t\t\t\t\t\t\t\t...(entry.variantIds !== undefined ? { variantIds: entry.variantIds } : {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t};\n\t});\n}\n\n/**\n * Cursor subscription provider (OAuth only).\n *\n * Chat runs on Cursor's protobuf Connect-RPC agent protocol\n * (`agent.v1.AgentService/Run` on `api2.cursor.sh`), implemented by the\n * `cursor-agent` API. The model catalog is discovered per account through\n * `GetUsableModels` after login (`Models.refresh` runs automatically after a\n * successful `/login cursor`).\n */\nexport function cursorProvider(): Provider<\"cursor-agent\"> {\n\treturn createProvider({\n\t\tid: \"cursor\",\n\t\tname: \"Cursor\",\n\t\tbaseUrl: CURSOR_BASE_URL,\n\t\trestoreModels: (models) => regroupStoredCursorModels(models),\n\t\tauth: {\n\t\t\toauth: lazyOAuth({\n\t\t\t\tname: \"Cursor (Pro/Ultra/Teams)\",\n\t\t\t\tisSubscription: true,\n\t\t\t\tloginLabel: \"Sign in with Cursor\",\n\t\t\t\tload: loadCursorOAuth,\n\t\t\t}),\n\t\t},\n\t\tmodels: [],\n\t\tfetchModels: fetchCursorModels,\n\t\tapi: cursorAgentApi(),\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"schemaVersion":3,"generatedAt":"2026-09-
|
|
1
|
+
{"schemaVersion":3,"generatedAt":"2026-09-23T10:04:49.117Z","structureHash":"08c36e7cab8b6a38f3baae6c7d97294e83c7fb660bcad404a164544e0ebdab22","files":{"alibaba-token-plan.json":"3a9c1be76d47459371e9fa2feeffc31e7edbbfec65fa9cc41236988efc4cf6d9","amazon-bedrock.json":"576881d1e56bec98f8a608bab9e654718dedaaa07bcd60d36afc4b65cc028aba","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"f9db437d92449fb860a2d457a6019cdfd51c11180c08df2b5f14d75ade773953","azure-openai-responses.json":"d70ff10410e6dd8eacb4a53b9fe887be836562cbb4b74eaee4f28bdbc4ac0732","bai.json":"2b12b15bd43462e60711944dd7283db8676611d9d76c82c2a01f64913e16a67e","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","chatgpt-subscription.json":"57d1c9c6e1394549ad2e7c2170770463bb13009c060acddf23b65e41b6ba251b","cloudflare-ai-gateway.json":"a2b9fa9b7bc78df3459a9c53282a9c2f715b7ce703ae0d09c59bec0a6841af49","cloudflare-workers-ai.json":"8ee15540a01cf79d0e4063c493ae3c436af2fc1d456f9faf1b066418247183e9","deepseek.json":"b5f9693ec641e9a957dc5f7a22042b3bb928bac3d7268406619b6f18e21c4b83","fireworks.json":"6283651d25a8861e7d42fe2bdb1cb7dd80802811dfaf61e40c11cc813408c294","github-copilot.json":"5c9fc5b1b553a26aa7bc843a3e36fa14cf220d528ecd89528c601c5090c88a2d","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"2f93082144a7b2a1cbf79148244ce7559e0428d6310c5eb0648bca89b15a8b4b","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"be522597b22bceeb0bb9a0ba1781647649ffd19637d0c8e67b056d7b0ec33d52","moonshotai-cn.json":"c4e1801b5dfd61bebcaa33cbfc5ed0c69df14a3bee37da218a558668d817864e","moonshotai.json":"3dab637e7e2648792c786157f85f29026b93393f7098b77593c1180928d371c9","nvidia.json":"6493e09b5db8b8fe9c8fae5bc15dc287645f37f83a4ed3a1ad1181e5830b5ff7","openai.json":"c53d456ff9e0dfd17c936e11b6fe8b86ecad12bc47430596b381ada9be0a3cdb","opencode-go.json":"64ea73012b153ef5d618663b6b542d527e43383e63b6b49f5961b310508c41cd","opencode.json":"56af2b79a8fdf7f911737c2d3426c17c6ae84f40873c54a30a00530d30bbb740","opengateway.json":"0c36520bba5118b12aafa0fb367c8c57a57d1a2c859f4b4c39f1ef051c0648c3","openrouter.json":"f02fdcfa0d18156bf768157623bfedcd5294d056522808af6e7c5e14822b8288","qwen-token-plan-cn.json":"4bf520ed38e5c3045680d2ec2816fa8a69079dbe97f7b929767a63172288da6b","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"a5c67213745329ec3ba79f712f31c1c32a781d7ffb8c04f9819f36c27672531f","together.json":"927c707d06f2236cdab13f14c870fb58bce0614ba7287bbcd57cc9fd66d191ed","venice.json":"b58d7e9dca552c1df17f8c2b0da71fd81e0bc5abdccde1393dcf37c4909076fb","vercel-ai-gateway.json":"5caa8135a9a4da65265729ff3a9f33ef2ea17cf4f8e33d7ce43f3ba03c10de96","xai.json":"9b23faa5218e966a17108c05d2498a617ade1eae9b0d0684284c77d67949a3f1","xiaomi-token-plan-ams.json":"7df74a255259fc1d5be8e682c3ffb0908eaaf0af711f6433dedcf345ce3e8393","xiaomi-token-plan-cn.json":"7dc672723d5b37e5b92605752f74f46f44eba10be2b0cb959790260b9e0c2a4e","xiaomi-token-plan-sgp.json":"69b333b158be038459a511a673f4536a5b03d4931c3119339f1ac741bc03d502","xiaomi.json":"333299657f211ad9edac0f3d4298b7e5776626914c9c80e22305a87533f23966","zai-coding-cn.json":"69c572aa75104f16ccbddbaace60c267f4bcc74f86d34891ca43110d312fb1ad","zai.json":"15c8182a88e58bdc1b1c3eb0603c690475342c8a826ceddfe9af1b36b28345ee"}}
|