@code-yeongyu/senpi 2026.9.23-3 → 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 +21 -0
- package/dist/bundle/chunks/{app-server-command-U5Y46LHO.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-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-TH4PERSI.js → chunk-N46LNXHU.js} +35 -53
- package/dist/bundle/chunks/{chunk-67Z5WNA4.js → chunk-PSMTQDII.js} +1 -1
- package/dist/bundle/chunks/{chunk-Y4AJLTFT.js → chunk-WUYBEF7C.js} +1 -1
- package/dist/bundle/chunks/{chunk-IDSOMHWS.js → chunk-WXIRFRXY.js} +1 -1
- package/dist/bundle/chunks/{chunk-R6F525XB.js → chunk-XDSQYM4F.js} +1 -1
- package/dist/bundle/chunks/{chunk-TUVSARCZ.js → chunk-ZEFQYQOU.js} +1 -1
- package/dist/bundle/chunks/{cli-main-65WMMIRT.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-DUNYT24Q.js → interactive-host-runtime-57LEAJPU.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-SCG5PQZ6.js → interactive-mode-SLPAGRHH.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-QC6BZZNH.js → multi-session-host-3PACMEHC.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-23GULCVL.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-ZQ4E6FFA.js → rpc-mode-47EVLL6X.js} +1 -1
- package/dist/bundle/chunks/{session-picker-CO2ZK3EC.js → session-picker-ZIBANFBQ.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +40 -58
- 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/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/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/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/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/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/modes/interactive/components/exploration-call.d.ts +4 -1
- package/dist/modes/interactive/components/exploration-call.d.ts.map +1 -1
- package/dist/modes/interactive/components/exploration-call.js +17 -2
- package/dist/modes/interactive/components/exploration-call.js.map +1 -1
- package/dist/modes/interactive/components/exploration-group.d.ts +3 -1
- package/dist/modes/interactive/components/exploration-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/exploration-group.js +7 -1
- package/dist/modes/interactive/components/exploration-group.js.map +1 -1
- 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.map +1 -1
- package/dist/modes/interactive/components/exploration-transcript-container.js +10 -1
- package/dist/modes/interactive/components/exploration-transcript-container.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +4 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +14 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +4 -19
- 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/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-XPDV6SIX.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-messages.js","sourceRoot":"","sources":["../../src/api/pi-messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * pi-messages API implementation.\n *\n * Streams pi's own message protocol directly to a backend: the request is a\n * single POST of `{ model, context, options }` to `<baseUrl>/messages`, the\n * response is an SSE stream of serialized assistant-message events plus a\n * terminal `done`/`error` event. This is the wire protocol spoken by the\n * Radius gateway, but any backend implementing it can be used, e.g. via a\n * models.json custom provider with `\"api\": \"pi-messages\"`.\n */\n\nimport type {\n\tAssistantMessage,\n\tAssistantMessageEvent,\n\tCacheRetention,\n\tContext,\n\tModel,\n\tProviderEnv,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n\tThinkingLevel,\n\tToolCall,\n} from \"../types.ts\";\nimport { appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic } from \"../utils/diagnostics.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { headersToRecord, providerHeadersToRecord } from \"../utils/headers.ts\";\nimport { parseStreamingJson } from \"../utils/json-parse.ts\";\nimport { getProviderEnvValue } from \"../utils/provider-env.ts\";\n\nexport interface PiMessagesOptions extends StreamOptions {\n\treasoning?: ThinkingLevel;\n\ttoolChoice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } };\n\t/** Ask the backend for debug metadata (e.g. routing response headers). */\n\tdebug?: boolean;\n}\n\ntype PiMessagesUsage = AssistantMessage[\"usage\"];\ntype PiMessagesStopReason = AssistantMessage[\"stopReason\"];\n\n/** Impact summary of a server-side message rewrite (e.g. a gateway policy). */\nexport type PiMessagesRewriteImpact = {\n\tpolicyId: string;\n\tpolicyVersion: number;\n\tchanged: boolean;\n\ttokenCountChange: number;\n\tmessageCountChange: number;\n\tsystemPromptChanged: boolean;\n};\n\n/** Serialized assistant-message event as sent by a pi-messages backend. */\nexport type PiMessagesEvent =\n\t| { type: \"start\" }\n\t| { type: \"text_start\"; contentIndex: number }\n\t| { type: \"text_delta\"; contentIndex: number; delta: string }\n\t| { type: \"text_end\"; contentIndex: number; content: string; contentSignature?: string }\n\t| { type: \"thinking_start\"; contentIndex: number }\n\t| { type: \"thinking_delta\"; contentIndex: number; delta: string }\n\t| {\n\t\t\ttype: \"thinking_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tcontentSignature?: string;\n\t\t\tredacted?: boolean;\n\t }\n\t| { type: \"toolcall_start\"; contentIndex: number; id: string; toolName: string }\n\t| { type: \"toolcall_delta\"; contentIndex: number; delta: string }\n\t| { type: \"toolcall_end\"; contentIndex: number; toolCall: ToolCall }\n\t| {\n\t\t\ttype: \"done\";\n\t\t\treason: Extract<PiMessagesStopReason, \"stop\" | \"length\" | \"toolUse\">;\n\t\t\tusage: PiMessagesUsage;\n\t\t\tresponseId?: string;\n\t\t\tproviderThinkingLevel?: string;\n\t\t\trewrite?: PiMessagesRewriteImpact;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\treason: Extract<PiMessagesStopReason, \"aborted\" | \"error\">;\n\t\t\tusage: PiMessagesUsage;\n\t\t\terrorMessage?: string;\n\t\t\tresponseId?: string;\n\t\t\tproviderThinkingLevel?: string;\n\t\t\trewrite?: PiMessagesRewriteImpact;\n\t };\n\ntype PiMessagesErrorBody = {\n\terror?: {\n\t\tmessage?: unknown;\n\t\tcode?: unknown;\n\t\tdetails?: unknown;\n\t\t[key: string]: unknown;\n\t};\n};\n\nexport class PiMessagesResponseError extends Error {\n\tcode?: string;\n\treadonly diagnosticDetails: Record<string, unknown>;\n\n\tconstructor(message: string, code: string | undefined, diagnosticDetails: Record<string, unknown>) {\n\t\tsuper(message);\n\t\tthis.name = \"PiMessagesResponseError\";\n\t\tthis.code = code;\n\t\tthis.diagnosticDetails = diagnosticDetails;\n\t}\n}\n\nfunction parsePiMessagesErrorBody(body: string): PiMessagesErrorBody | undefined {\n\ttry {\n\t\tconst parsed = JSON.parse(body) as PiMessagesErrorBody | null;\n\t\tconst error = parsed?.error;\n\t\treturn parsed && typeof error === \"object\" && error !== null && !Array.isArray(error) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncateDiagnosticString(value: string): string {\n\tconst maxLength = 8192;\n\treturn value.length > maxLength ? `${value.slice(0, maxLength)}…` : value;\n}\n\nfunction formatPiMessagesResponseError(\n\tresponse: Response,\n\tbody: string,\n\terrorBody: PiMessagesErrorBody | undefined,\n): string {\n\tconst message = typeof errorBody?.error?.message === \"string\" ? errorBody.error.message : undefined;\n\tconst code = typeof errorBody?.error?.code === \"string\" ? errorBody.error.code : undefined;\n\tconst suffix = message ?? body;\n\tconst codeSuffix = code ? ` (${code})` : \"\";\n\treturn `${response.status} ${response.statusText}: ${suffix}${codeSuffix}`;\n}\n\nfunction createPiMessagesResponseError(\n\tmodel: Model<\"pi-messages\">,\n\turl: URL,\n\tresponse: Response,\n\tbody: string,\n): PiMessagesResponseError {\n\tconst errorBody = parsePiMessagesErrorBody(body);\n\tconst code = typeof errorBody?.error?.code === \"string\" ? errorBody.error.code : undefined;\n\treturn new PiMessagesResponseError(formatPiMessagesResponseError(response, body, errorBody), code, {\n\t\tversion: 1,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\turl: url.toString(),\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText,\n\t\terror: errorBody?.error,\n\t\tbody: errorBody ? undefined : truncateDiagnosticString(body),\n\t\ttimestampMs: Date.now(),\n\t});\n}\n\nfunction createEmptyUsage(): PiMessagesUsage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n\nfunction appendRewriteDiagnostic(message: AssistantMessage, rewrite: PiMessagesRewriteImpact | undefined): void {\n\tif (!rewrite) {\n\t\treturn;\n\t}\n\tappendAssistantMessageDiagnostic(message, {\n\t\ttype: \"pi_messages_rewrite\",\n\t\ttimestamp: Date.now(),\n\t\tdetails: { ...rewrite },\n\t});\n}\n\nfunction createEventConverter(model: Model<\"pi-messages\">) {\n\tconst partial: AssistantMessage = {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: createEmptyUsage(),\n\t\tstopReason: \"pending\",\n\t\ttimestamp: Date.now(),\n\t};\n\tconst toolJson = new Map<number, string>();\n\n\treturn (event: PiMessagesEvent): AssistantMessageEvent => {\n\t\tswitch (event.type) {\n\t\t\tcase \"done\":\n\t\t\t\tObject.assign(partial, {\n\t\t\t\t\tstopReason: event.reason,\n\t\t\t\t\tusage: event.usage,\n\t\t\t\t\tresponseId: event.responseId,\n\t\t\t\t});\n\t\t\t\tif (event.providerThinkingLevel !== undefined) {\n\t\t\t\t\tpartial.providerThinkingLevel = event.providerThinkingLevel;\n\t\t\t\t}\n\t\t\t\tappendRewriteDiagnostic(partial, event.rewrite);\n\t\t\t\treturn { type: \"done\", reason: event.reason, message: partial };\n\t\t\tcase \"error\":\n\t\t\t\tObject.assign(partial, {\n\t\t\t\t\tstopReason: event.reason,\n\t\t\t\t\tusage: event.usage,\n\t\t\t\t\terrorMessage: event.errorMessage,\n\t\t\t\t\tresponseId: event.responseId,\n\t\t\t\t});\n\t\t\t\tif (event.providerThinkingLevel !== undefined) {\n\t\t\t\t\tpartial.providerThinkingLevel = event.providerThinkingLevel;\n\t\t\t\t}\n\t\t\t\tappendRewriteDiagnostic(partial, event.rewrite);\n\t\t\t\treturn { type: \"error\", reason: event.reason, error: partial };\n\t\t\tcase \"start\":\n\t\t\t\tbreak;\n\t\t\tcase \"text_start\":\n\t\t\t\tpartial.content[event.contentIndex] = { type: \"text\", text: \"\" };\n\t\t\t\tbreak;\n\t\t\tcase \"text_delta\":\n\t\t\t\t(partial.content[event.contentIndex] as { text: string }).text += event.delta;\n\t\t\t\tbreak;\n\t\t\tcase \"text_end\":\n\t\t\t\tObject.assign(partial.content[event.contentIndex]!, {\n\t\t\t\t\ttext: event.content,\n\t\t\t\t\ttextSignature: event.contentSignature,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_start\":\n\t\t\t\tpartial.content[event.contentIndex] = { type: \"thinking\", thinking: \"\" };\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_delta\":\n\t\t\t\t(partial.content[event.contentIndex] as { thinking: string }).thinking += event.delta;\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_end\":\n\t\t\t\tObject.assign(partial.content[event.contentIndex]!, {\n\t\t\t\t\tthinking: event.content,\n\t\t\t\t\tthinkingSignature: event.contentSignature,\n\t\t\t\t\tredacted: event.redacted,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"toolcall_start\":\n\t\t\t\tpartial.content[event.contentIndex] = {\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid: event.id,\n\t\t\t\t\tname: event.toolName,\n\t\t\t\t\targuments: {},\n\t\t\t\t};\n\t\t\t\ttoolJson.set(event.contentIndex, \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"toolcall_delta\": {\n\t\t\t\tconst json = `${toolJson.get(event.contentIndex) ?? \"\"}${event.delta}`;\n\t\t\t\ttoolJson.set(event.contentIndex, json);\n\t\t\t\t(partial.content[event.contentIndex] as ToolCall).arguments =\n\t\t\t\t\tparseStreamingJson<ToolCall[\"arguments\"]>(json);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolcall_end\":\n\t\t\t\tObject.assign(partial.content[event.contentIndex]!, event.toolCall);\n\t\t\t\ttoolJson.delete(event.contentIndex);\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\t\ttoolCall: partial.content[event.contentIndex] as ToolCall,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t}\n\n\t\treturn { ...event, partial } as AssistantMessageEvent;\n\t};\n}\n\nasync function* readPiMessagesEvents(stream: ReadableStream<Uint8Array>): AsyncGenerator<PiMessagesEvent> {\n\tconst decoder = new TextDecoder();\n\tconst reader = stream.getReader();\n\tlet buffer = \"\";\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tbuffer += done ? decoder.decode() : decoder.decode(value, { stream: true });\n\t\t\tbuffer = buffer.replace(/\\r\\n/g, \"\\n\");\n\n\t\t\tlet split = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (split !== -1) {\n\t\t\t\tconst event = parsePiMessagesEvent(buffer.slice(0, split));\n\t\t\t\tif (event) {\n\t\t\t\t\tyield event;\n\t\t\t\t}\n\t\t\t\tbuffer = buffer.slice(split + 2);\n\t\t\t\tsplit = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\n\t\t\tif (done) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (buffer.trim()) {\n\t\t\tconst event = parsePiMessagesEvent(buffer);\n\t\t\tif (event) {\n\t\t\t\tyield event;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\nfunction parsePiMessagesEvent(raw: string): PiMessagesEvent | undefined {\n\tconst data = raw\n\t\t.split(\"\\n\")\n\t\t.find((line) => line.startsWith(\"data:\"))\n\t\t?.slice(5)\n\t\t.trim();\n\n\treturn data && data !== \"[DONE]\" ? (JSON.parse(data) as PiMessagesEvent) : undefined;\n}\n\nfunction createErrorEvent(model: Model<\"pi-messages\">, error: unknown, aborted: boolean): AssistantMessageEvent {\n\tconst reason = aborted ? \"aborted\" : \"error\";\n\tconst assistantMessage: AssistantMessage = {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: createEmptyUsage(),\n\t\tstopReason: reason,\n\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\ttimestamp: Date.now(),\n\t};\n\n\tif (!aborted && error instanceof PiMessagesResponseError) {\n\t\tappendAssistantMessageDiagnostic(\n\t\t\tassistantMessage,\n\t\t\tcreateAssistantMessageDiagnostic(\"pi_messages_response_failure\", error, error.diagnosticDetails),\n\t\t);\n\t}\n\n\treturn { type: \"error\", reason, error: assistantMessage };\n}\n\nfunction resolveCacheRetention(cacheRetention?: CacheRetention, env?: ProviderEnv): CacheRetention | undefined {\n\tif (cacheRetention) {\n\t\treturn cacheRetention;\n\t}\n\t// Backend defaults apply when unset; only the legacy env opt-in is mapped.\n\treturn getProviderEnvValue(\"PI_CACHE_RETENTION\", env) === \"long\" ? \"long\" : undefined;\n}\n\nexport const stream: StreamFunction<\"pi-messages\", PiMessagesOptions> = (\n\tmodel: Model<\"pi-messages\">,\n\tcontext: Context,\n\toptions?: PiMessagesOptions,\n): AssistantMessageEventStream => {\n\tconst eventStream = new AssistantMessageEventStream();\n\tconst convertEvent = createEventConverter(model);\n\n\tvoid (async () => {\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key provided for provider \"${model.provider}\"`);\n\t\t\t}\n\n\t\t\tconst url = new URL(`${model.baseUrl.replace(/\\/+$/u, \"\")}/messages`);\n\t\t\tif (options?.debug) {\n\t\t\t\turl.searchParams.set(\"debug\", \"1\");\n\t\t\t}\n\n\t\t\tlet payload: unknown = {\n\t\t\t\tmodel: model.id,\n\t\t\t\tcontext,\n\t\t\t\toptions: {\n\t\t\t\t\ttemperature: options?.temperature,\n\t\t\t\t\tmaxTokens: options?.maxTokens,\n\t\t\t\t\treasoning: options?.reasoning,\n\t\t\t\t\tcacheRetention: resolveCacheRetention(options?.cacheRetention, options?.env),\n\t\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\t\ttoolChoice: options?.toolChoice,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst nextPayload = await options?.onPayload?.(payload, model);\n\t\t\tif (nextPayload !== undefined) {\n\t\t\t\tpayload = nextPayload;\n\t\t\t}\n\n\t\t\tconst response = await (options?.fetch ?? globalThis.fetch)(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Bearer ${apiKey}`,\n\t\t\t\t\taccept: \"text/event-stream\",\n\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t...providerHeadersToRecord(options?.headers),\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\tsignal: options?.signal,\n\t\t\t});\n\n\t\t\tawait options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst body = await response.text();\n\t\t\t\tthrow createPiMessagesResponseError(model, url, response, body);\n\t\t\t}\n\t\t\tif (!response.body) {\n\t\t\t\tthrow new Error(`${model.provider} response has no body`);\n\t\t\t}\n\n\t\t\tfor await (const piEvent of readPiMessagesEvents(response.body)) {\n\t\t\t\tconst event = convertEvent(piEvent);\n\t\t\t\teventStream.push(event);\n\t\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new Error(`${model.provider} stream ended without a terminal event`);\n\t\t} catch (error) {\n\t\t\teventStream.push(createErrorEvent(model, error, options?.signal?.aborted ?? false));\n\t\t}\n\t})();\n\n\treturn eventStream;\n};\n\nexport const streamSimple: StreamFunction<\"pi-messages\", SimpleStreamOptions> = (\n\tmodel: Model<\"pi-messages\">,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\tconst extra = options as PiMessagesOptions | undefined;\n\treturn stream(model, context, {\n\t\t...options,\n\t\treasoning: options?.reasoning,\n\t\ttoolChoice: options?.toolChoice,\n\t\tdebug: extra?.debug,\n\t});\n};\n"]}
|
|
1
|
+
{"version":3,"file":"pi-messages.js","sourceRoot":"","sources":["../../src/api/pi-messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * pi-messages API implementation.\n *\n * Streams pi's own message protocol directly to a backend: the request is a\n * single POST of `{ model, context, options }` to `<baseUrl>/messages`, the\n * response is an SSE stream of serialized assistant-message events plus a\n * terminal `done`/`error` event. This is the wire protocol spoken by the\n * Radius gateway, but any backend implementing it can be used, e.g. via a\n * models.json custom provider with `\"api\": \"pi-messages\"`.\n */\n\nimport type {\n\tAssistantMessage,\n\tAssistantMessageEvent,\n\tCacheRetention,\n\tContext,\n\tModel,\n\tProviderEnv,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n\tThinkingLevel,\n\tToolCall,\n} from \"../types.ts\";\nimport { appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic } from \"../utils/diagnostics.ts\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { headersToRecord, providerHeadersToRecord } from \"../utils/headers.ts\";\nimport { parseStreamingJson } from \"../utils/json-parse.ts\";\nimport { getProviderEnvValue } from \"../utils/provider-env.ts\";\n\nexport interface PiMessagesOptions extends StreamOptions {\n\treasoning?: ThinkingLevel;\n\ttoolChoice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } };\n\t/** Ask the backend for debug metadata (e.g. routing response headers). */\n\tdebug?: boolean;\n}\n\ntype PiMessagesUsage = AssistantMessage[\"usage\"];\ntype PiMessagesStopReason = AssistantMessage[\"stopReason\"];\n\n/** Impact summary of a server-side message rewrite (e.g. a gateway policy). */\nexport type PiMessagesRewriteImpact = {\n\tpolicyId: string;\n\tpolicyVersion: number;\n\tchanged: boolean;\n\ttokenCountChange: number;\n\tmessageCountChange: number;\n\tsystemPromptChanged: boolean;\n};\n\n/** Serialized assistant-message event as sent by a pi-messages backend. */\nexport type PiMessagesEvent =\n\t| { type: \"start\" }\n\t| { type: \"text_start\"; contentIndex: number }\n\t| { type: \"text_delta\"; contentIndex: number; delta: string }\n\t| { type: \"text_end\"; contentIndex: number; content: string; contentSignature?: string }\n\t| { type: \"thinking_start\"; contentIndex: number }\n\t| { type: \"thinking_delta\"; contentIndex: number; delta: string }\n\t| {\n\t\t\ttype: \"thinking_end\";\n\t\t\tcontentIndex: number;\n\t\t\tcontent: string;\n\t\t\tcontentSignature?: string;\n\t\t\tredacted?: boolean;\n\t }\n\t| { type: \"toolcall_start\"; contentIndex: number; id: string; toolName: string }\n\t| { type: \"toolcall_delta\"; contentIndex: number; delta: string }\n\t| { type: \"toolcall_end\"; contentIndex: number; toolCall: ToolCall }\n\t| {\n\t\t\ttype: \"done\";\n\t\t\treason: Extract<PiMessagesStopReason, \"stop\" | \"length\" | \"toolUse\">;\n\t\t\tusage: PiMessagesUsage;\n\t\t\tresponseId?: string;\n\t\t\tproviderThinkingLevel?: string;\n\t\t\trewrite?: PiMessagesRewriteImpact;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\treason: Extract<PiMessagesStopReason, \"aborted\" | \"error\">;\n\t\t\tusage: PiMessagesUsage;\n\t\t\terrorMessage?: string;\n\t\t\tresponseId?: string;\n\t\t\tproviderThinkingLevel?: string;\n\t\t\trewrite?: PiMessagesRewriteImpact;\n\t };\n\ntype PiMessagesErrorBody = {\n\terror?: {\n\t\tmessage?: unknown;\n\t\tcode?: unknown;\n\t\tdetails?: unknown;\n\t\t[key: string]: unknown;\n\t};\n};\n\nexport class PiMessagesResponseError extends Error {\n\tcode?: string;\n\treadonly diagnosticDetails: Record<string, unknown>;\n\n\tconstructor(message: string, code: string | undefined, diagnosticDetails: Record<string, unknown>) {\n\t\tsuper(message);\n\t\tthis.name = \"PiMessagesResponseError\";\n\t\tthis.code = code;\n\t\tthis.diagnosticDetails = diagnosticDetails;\n\t}\n}\n\nfunction parsePiMessagesErrorBody(body: string): PiMessagesErrorBody | undefined {\n\ttry {\n\t\tconst parsed = JSON.parse(body) as PiMessagesErrorBody | null;\n\t\tconst error = parsed?.error;\n\t\treturn parsed && typeof error === \"object\" && error !== null && !Array.isArray(error) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncateDiagnosticString(value: string): string {\n\tconst maxLength = 8192;\n\treturn value.length > maxLength ? `${value.slice(0, maxLength)}…` : value;\n}\n\nfunction formatPiMessagesResponseError(\n\tresponse: Response,\n\tbody: string,\n\terrorBody: PiMessagesErrorBody | undefined,\n): string {\n\tconst message = typeof errorBody?.error?.message === \"string\" ? errorBody.error.message : undefined;\n\tconst code = typeof errorBody?.error?.code === \"string\" ? errorBody.error.code : undefined;\n\tconst suffix = message ?? body;\n\tconst codeSuffix = code ? ` (${code})` : \"\";\n\treturn `${response.status} ${response.statusText}: ${suffix}${codeSuffix}`;\n}\n\nfunction createPiMessagesResponseError(\n\tmodel: Model<\"pi-messages\">,\n\turl: URL,\n\tresponse: Response,\n\tbody: string,\n): PiMessagesResponseError {\n\tconst errorBody = parsePiMessagesErrorBody(body);\n\tconst code = typeof errorBody?.error?.code === \"string\" ? errorBody.error.code : undefined;\n\treturn new PiMessagesResponseError(formatPiMessagesResponseError(response, body, errorBody), code, {\n\t\tversion: 1,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\turl: url.toString(),\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText,\n\t\terror: errorBody?.error,\n\t\tbody: errorBody ? undefined : truncateDiagnosticString(body),\n\t\ttimestampMs: Date.now(),\n\t});\n}\n\nfunction createEmptyUsage(): PiMessagesUsage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n\nfunction appendRewriteDiagnostic(message: AssistantMessage, rewrite: PiMessagesRewriteImpact | undefined): void {\n\tif (!rewrite) {\n\t\treturn;\n\t}\n\tappendAssistantMessageDiagnostic(message, {\n\t\ttype: \"pi_messages_rewrite\",\n\t\ttimestamp: Date.now(),\n\t\tdetails: { ...rewrite },\n\t});\n}\n\nfunction createEventConverter(model: Model<\"pi-messages\">) {\n\tconst partial: AssistantMessage = {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: createEmptyUsage(),\n\t\tstopReason: \"pending\",\n\t\ttimestamp: Date.now(),\n\t};\n\tconst toolJson = new Map<number, string>();\n\n\treturn (event: PiMessagesEvent): AssistantMessageEvent => {\n\t\tswitch (event.type) {\n\t\t\tcase \"done\":\n\t\t\t\tObject.assign(partial, {\n\t\t\t\t\tstopReason: event.reason,\n\t\t\t\t\tusage: event.usage,\n\t\t\t\t\tresponseId: event.responseId,\n\t\t\t\t});\n\t\t\t\tif (event.providerThinkingLevel !== undefined) {\n\t\t\t\t\tpartial.providerThinkingLevel = event.providerThinkingLevel;\n\t\t\t\t}\n\t\t\t\tappendRewriteDiagnostic(partial, event.rewrite);\n\t\t\t\treturn { type: \"done\", reason: event.reason, message: partial };\n\t\t\tcase \"error\":\n\t\t\t\tObject.assign(partial, {\n\t\t\t\t\tstopReason: event.reason,\n\t\t\t\t\tusage: event.usage,\n\t\t\t\t\terrorMessage: event.errorMessage,\n\t\t\t\t\tresponseId: event.responseId,\n\t\t\t\t});\n\t\t\t\tif (event.providerThinkingLevel !== undefined) {\n\t\t\t\t\tpartial.providerThinkingLevel = event.providerThinkingLevel;\n\t\t\t\t}\n\t\t\t\tappendRewriteDiagnostic(partial, event.rewrite);\n\t\t\t\treturn { type: \"error\", reason: event.reason, error: partial };\n\t\t\tcase \"start\":\n\t\t\t\tbreak;\n\t\t\tcase \"text_start\":\n\t\t\t\tpartial.content[event.contentIndex] = { type: \"text\", text: \"\" };\n\t\t\t\tbreak;\n\t\t\tcase \"text_delta\":\n\t\t\t\t(partial.content[event.contentIndex] as { text: string }).text += event.delta;\n\t\t\t\tbreak;\n\t\t\tcase \"text_end\":\n\t\t\t\tObject.assign(partial.content[event.contentIndex]!, {\n\t\t\t\t\ttext: event.content,\n\t\t\t\t\ttextSignature: event.contentSignature,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_start\":\n\t\t\t\tpartial.content[event.contentIndex] = { type: \"thinking\", thinking: \"\" };\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_delta\":\n\t\t\t\t(partial.content[event.contentIndex] as { thinking: string }).thinking += event.delta;\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_end\":\n\t\t\t\tObject.assign(partial.content[event.contentIndex]!, {\n\t\t\t\t\tthinking: event.content,\n\t\t\t\t\tthinkingSignature: event.contentSignature,\n\t\t\t\t\tredacted: event.redacted,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"toolcall_start\":\n\t\t\t\tpartial.content[event.contentIndex] = {\n\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\tid: event.id,\n\t\t\t\t\tname: event.toolName,\n\t\t\t\t\targuments: {},\n\t\t\t\t};\n\t\t\t\ttoolJson.set(event.contentIndex, \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"toolcall_delta\": {\n\t\t\t\tconst json = `${toolJson.get(event.contentIndex) ?? \"\"}${event.delta}`;\n\t\t\t\ttoolJson.set(event.contentIndex, json);\n\t\t\t\t(partial.content[event.contentIndex] as ToolCall).arguments =\n\t\t\t\t\tparseStreamingJson<ToolCall[\"arguments\"]>(json);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolcall_end\":\n\t\t\t\tObject.assign(partial.content[event.contentIndex]!, event.toolCall);\n\t\t\t\ttoolJson.delete(event.contentIndex);\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\t\ttoolCall: partial.content[event.contentIndex] as ToolCall,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t}\n\n\t\treturn { ...event, partial } as AssistantMessageEvent;\n\t};\n}\n\nasync function* readPiMessagesEvents(stream: ReadableStream<Uint8Array>): AsyncGenerator<PiMessagesEvent> {\n\tconst decoder = new TextDecoder();\n\tconst reader = stream.getReader();\n\tlet buffer = \"\";\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tbuffer += done ? decoder.decode() : decoder.decode(value, { stream: true });\n\t\t\tbuffer = buffer.replace(/\\r\\n/g, \"\\n\");\n\n\t\t\tlet split = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (split !== -1) {\n\t\t\t\tconst event = parsePiMessagesEvent(buffer.slice(0, split));\n\t\t\t\tif (event) {\n\t\t\t\t\tyield event;\n\t\t\t\t}\n\t\t\t\tbuffer = buffer.slice(split + 2);\n\t\t\t\tsplit = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\n\t\t\tif (done) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (buffer.trim()) {\n\t\t\tconst event = parsePiMessagesEvent(buffer);\n\t\t\tif (event) {\n\t\t\t\tyield event;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\nfunction parsePiMessagesEvent(raw: string): PiMessagesEvent | undefined {\n\tconst data = raw\n\t\t.split(\"\\n\")\n\t\t.find((line) => line.startsWith(\"data:\"))\n\t\t?.slice(5)\n\t\t.trim();\n\n\treturn data && data !== \"[DONE]\" ? (JSON.parse(data) as PiMessagesEvent) : undefined;\n}\n\nfunction createErrorEvent(model: Model<\"pi-messages\">, error: unknown, aborted: boolean): AssistantMessageEvent {\n\tconst reason = aborted ? \"aborted\" : \"error\";\n\tconst assistantMessage: AssistantMessage = {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: createEmptyUsage(),\n\t\tstopReason: reason,\n\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\ttimestamp: Date.now(),\n\t};\n\n\tif (!aborted && error instanceof PiMessagesResponseError) {\n\t\tappendAssistantMessageDiagnostic(\n\t\t\tassistantMessage,\n\t\t\tcreateAssistantMessageDiagnostic(\"pi_messages_response_failure\", error, error.diagnosticDetails),\n\t\t);\n\t}\n\n\treturn { type: \"error\", reason, error: assistantMessage };\n}\n\nfunction resolveCacheRetention(cacheRetention?: CacheRetention, env?: ProviderEnv): CacheRetention | undefined {\n\tif (cacheRetention) {\n\t\treturn cacheRetention;\n\t}\n\t// Backend defaults apply when unset; only the legacy env opt-in is mapped.\n\treturn getProviderEnvValue(\"PI_CACHE_RETENTION\", env) === \"long\" ? \"long\" : undefined;\n}\n\nexport const stream: StreamFunction<\"pi-messages\", PiMessagesOptions> = (\n\tmodel: Model<\"pi-messages\">,\n\tcontext: Context,\n\toptions?: PiMessagesOptions,\n): AssistantMessageEventStream => {\n\tconst eventStream = new AssistantMessageEventStream();\n\tconst convertEvent = createEventConverter(model);\n\n\tvoid (async () => {\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key provided for provider \"${model.provider}\"`);\n\t\t\t}\n\n\t\t\tconst url = new URL(`${model.baseUrl.replace(/\\/+$/u, \"\")}/messages`);\n\t\t\tif (options?.debug) {\n\t\t\t\turl.searchParams.set(\"debug\", \"1\");\n\t\t\t}\n\n\t\t\tlet payload: unknown = {\n\t\t\t\tmodel: model.id,\n\t\t\t\tcontext: {\n\t\t\t\t\t...context,\n\t\t\t\t\tmessages: context.messages.map((message) =>\n\t\t\t\t\t\tmessage.role === \"toolResult\"\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\t\t\tcontent: message.content.map((part) =>\n\t\t\t\t\t\t\t\t\t\tpart.type === \"text\"\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype: part.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttext: part.text,\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(part.textSignature === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: { textSignature: part.textSignature }),\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: part,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: message,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttemperature: options?.temperature,\n\t\t\t\t\tmaxTokens: options?.maxTokens,\n\t\t\t\t\treasoning: options?.reasoning,\n\t\t\t\t\tcacheRetention: resolveCacheRetention(options?.cacheRetention, options?.env),\n\t\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\t\ttoolChoice: options?.toolChoice,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst nextPayload = await options?.onPayload?.(payload, model);\n\t\t\tif (nextPayload !== undefined) {\n\t\t\t\tpayload = nextPayload;\n\t\t\t}\n\n\t\t\tconst response = await (options?.fetch ?? globalThis.fetch)(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Bearer ${apiKey}`,\n\t\t\t\t\taccept: \"text/event-stream\",\n\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t...providerHeadersToRecord(options?.headers),\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\tsignal: options?.signal,\n\t\t\t});\n\n\t\t\tawait options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst body = await response.text();\n\t\t\t\tthrow createPiMessagesResponseError(model, url, response, body);\n\t\t\t}\n\t\t\tif (!response.body) {\n\t\t\t\tthrow new Error(`${model.provider} response has no body`);\n\t\t\t}\n\n\t\t\tfor await (const piEvent of readPiMessagesEvents(response.body)) {\n\t\t\t\tconst event = convertEvent(piEvent);\n\t\t\t\teventStream.push(event);\n\t\t\t\tif (event.type === \"done\" || event.type === \"error\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow new Error(`${model.provider} stream ended without a terminal event`);\n\t\t} catch (error) {\n\t\t\teventStream.push(createErrorEvent(model, error, options?.signal?.aborted ?? false));\n\t\t}\n\t})();\n\n\treturn eventStream;\n};\n\nexport const streamSimple: StreamFunction<\"pi-messages\", SimpleStreamOptions> = (\n\tmodel: Model<\"pi-messages\">,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): AssistantMessageEventStream => {\n\tconst extra = options as PiMessagesOptions | undefined;\n\treturn stream(model, context, {\n\t\t...options,\n\t\treasoning: options?.reasoning,\n\t\ttoolChoice: options?.toolChoice,\n\t\tdebug: extra?.debug,\n\t});\n};\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ThinkingLevelMap } from "../types.ts";
|
|
1
|
+
import type { ModelThinkingLevel, ThinkingLevelMap } from "../types.ts";
|
|
2
|
+
import { type CursorVariantAlias } from "./model-capabilities.ts";
|
|
2
3
|
export { parseCursorVariantId } from "./model-capabilities.ts";
|
|
3
4
|
export interface CursorCatalogRawEntry {
|
|
4
5
|
readonly id: string;
|
|
@@ -19,7 +20,23 @@ export interface CursorCatalogEntry {
|
|
|
19
20
|
readonly thinkingMode?: boolean;
|
|
20
21
|
readonly representativeVariantId?: string;
|
|
21
22
|
readonly legacyAliases: readonly string[];
|
|
23
|
+
/**
|
|
24
|
+
* Derived-group variant ids: normalized thinking level -> the exact server-listed
|
|
25
|
+
* variant id the live catalog serves. Present only on identities derived at
|
|
26
|
+
* runtime from ids the static alias table does not list (senpi#2038).
|
|
27
|
+
*/
|
|
28
|
+
readonly variantIds?: Readonly<Partial<Record<ModelThinkingLevel, string>>>;
|
|
22
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Derive variant-group aliases for raw ids the static alias table does not list.
|
|
32
|
+
* A family (shared base id, with the `-thinking` infix as a separate identity for
|
|
33
|
+
* Claude-style ids) is derived only when at least two distinct levels are observed
|
|
34
|
+
* among its unlisted non-fast members in the same batch; `-fast` variants,
|
|
35
|
+
* single-level families, and level-less ids stay flat exactly as today. Ids the
|
|
36
|
+
* static table already covers are never re-derived, so static output stays
|
|
37
|
+
* byte-identical (senpi#2038).
|
|
38
|
+
*/
|
|
39
|
+
export declare function deriveCursorVariantAliases(ids: readonly string[]): ReadonlyMap<string, CursorVariantAlias>;
|
|
23
40
|
/** Normalize a raw Cursor catalog (live discovery, CLI scrape, or stored cache) into selectable identities. */
|
|
24
41
|
export declare function normalizeCursorCatalog(rawEntries: readonly CursorCatalogRawEntry[]): CursorCatalogEntry[];
|
|
25
42
|
//# sourceMappingURL=catalog-grouping.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-grouping.d.ts","sourceRoot":"","sources":["../../src/cursor/catalog-grouping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"catalog-grouping.d.ts","sourceRoot":"","sources":["../../src/cursor/catalog-grouping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAGN,KAAK,kBAAkB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5E;AAuHD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAgD1G;AAED,+GAA+G;AAC/G,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAAG,kBAAkB,EAAE,CAkFzG"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import aliasData from "./cursor-variant-aliases.json" with { type: "json" };
|
|
1
2
|
import { CURSOR_MODEL_CAPABILITIES, getCursorVariantAlias, parseCursorVariantId, } from "./model-capabilities.js";
|
|
2
3
|
export { parseCursorVariantId } from "./model-capabilities.js";
|
|
3
4
|
const ALL_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
4
5
|
const FALLBACK_WINDOW = 200000;
|
|
6
|
+
const STATIC_TARGETS = new Set(Object.values(aliasData.aliases).map((alias) => alias.targetId));
|
|
5
7
|
function isClaude(baseId) {
|
|
6
8
|
return baseId.startsWith("claude-");
|
|
7
9
|
}
|
|
@@ -52,12 +54,108 @@ function pickRepresentative(members) {
|
|
|
52
54
|
});
|
|
53
55
|
return sorted[0].alias.legacyVariantId;
|
|
54
56
|
}
|
|
57
|
+
function normalizeDerivedLevel(token) {
|
|
58
|
+
switch (token) {
|
|
59
|
+
case "none":
|
|
60
|
+
return "off";
|
|
61
|
+
case "extra-high":
|
|
62
|
+
return "xhigh";
|
|
63
|
+
case "minimal":
|
|
64
|
+
case "low":
|
|
65
|
+
case "medium":
|
|
66
|
+
case "high":
|
|
67
|
+
case "xhigh":
|
|
68
|
+
case "max":
|
|
69
|
+
return token;
|
|
70
|
+
default:
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Every level is explicit: an unobserved level maps to `null` (unsupported), because the
|
|
76
|
+
* shared model contract treats an absent ordinary level as supported and would otherwise
|
|
77
|
+
* offer levels the server never listed.
|
|
78
|
+
*/
|
|
79
|
+
function buildDerivedLevelMap(members) {
|
|
80
|
+
const map = Object.fromEntries(ALL_LEVELS.map((level) => [level, null]));
|
|
81
|
+
for (const member of members) {
|
|
82
|
+
const level = member.alias.level;
|
|
83
|
+
if (level !== undefined && member.level !== undefined && map[level] === null) {
|
|
84
|
+
map[level] = member.level;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return map;
|
|
88
|
+
}
|
|
89
|
+
function buildDerivedVariantIds(members) {
|
|
90
|
+
const map = {};
|
|
91
|
+
for (const member of members) {
|
|
92
|
+
const level = member.alias.level;
|
|
93
|
+
if (level !== undefined && map[level] === undefined)
|
|
94
|
+
map[level] = member.raw.id;
|
|
95
|
+
}
|
|
96
|
+
return map;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Derive variant-group aliases for raw ids the static alias table does not list.
|
|
100
|
+
* A family (shared base id, with the `-thinking` infix as a separate identity for
|
|
101
|
+
* Claude-style ids) is derived only when at least two distinct levels are observed
|
|
102
|
+
* among its unlisted non-fast members in the same batch; `-fast` variants,
|
|
103
|
+
* single-level families, and level-less ids stay flat exactly as today. Ids the
|
|
104
|
+
* static table already covers are never re-derived, so static output stays
|
|
105
|
+
* byte-identical (senpi#2038).
|
|
106
|
+
*/
|
|
107
|
+
export function deriveCursorVariantAliases(ids) {
|
|
108
|
+
const families = new Map();
|
|
109
|
+
const rawIds = new Set(ids);
|
|
110
|
+
for (const id of ids) {
|
|
111
|
+
if (getCursorVariantAlias(id) !== undefined)
|
|
112
|
+
continue;
|
|
113
|
+
const parsed = parseCursorVariantId(id);
|
|
114
|
+
if (parsed.fast || parsed.level === undefined || parsed.baseId === "")
|
|
115
|
+
continue;
|
|
116
|
+
const level = normalizeDerivedLevel(parsed.level);
|
|
117
|
+
if (level === undefined)
|
|
118
|
+
continue;
|
|
119
|
+
const targetId = parsed.thinking === true ? `${parsed.baseId}-thinking` : parsed.baseId;
|
|
120
|
+
const family = families.get(targetId) ?? { targetId, levels: new Set(), members: [] };
|
|
121
|
+
family.levels.add(level);
|
|
122
|
+
family.members.push([id, level, parsed.level]);
|
|
123
|
+
families.set(targetId, family);
|
|
124
|
+
}
|
|
125
|
+
const derived = new Map();
|
|
126
|
+
for (const family of families.values()) {
|
|
127
|
+
// A derived target must not shadow a static identity, a static alias key, or a raw id.
|
|
128
|
+
if (family.levels.size < 2 ||
|
|
129
|
+
STATIC_TARGETS.has(family.targetId) ||
|
|
130
|
+
getCursorVariantAlias(family.targetId) !== undefined ||
|
|
131
|
+
rawIds.has(family.targetId))
|
|
132
|
+
continue;
|
|
133
|
+
const chosen = new Map();
|
|
134
|
+
for (const [id, level, suffix] of family.members) {
|
|
135
|
+
const previous = chosen.get(level);
|
|
136
|
+
if (previous === undefined) {
|
|
137
|
+
chosen.set(level, id);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const previousSuffix = parseCursorVariantId(previous).level;
|
|
141
|
+
if ((suffix === level && previousSuffix !== level) ||
|
|
142
|
+
((suffix === level) === (previousSuffix === level) && id < previous)) {
|
|
143
|
+
chosen.set(level, id);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
for (const [level, id] of chosen) {
|
|
147
|
+
derived.set(id, { targetId: family.targetId, legacyVariantId: id, encoding: "legacy-variant", level });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return derived;
|
|
151
|
+
}
|
|
55
152
|
/** Normalize a raw Cursor catalog (live discovery, CLI scrape, or stored cache) into selectable identities. */
|
|
56
153
|
export function normalizeCursorCatalog(rawEntries) {
|
|
154
|
+
const derived = deriveCursorVariantAliases(rawEntries.map((raw) => raw.id));
|
|
57
155
|
const groups = new Map();
|
|
58
156
|
const order = [];
|
|
59
157
|
for (const raw of rawEntries) {
|
|
60
|
-
const alias = getCursorVariantAlias(raw.id);
|
|
158
|
+
const alias = getCursorVariantAlias(raw.id) ?? derived.get(raw.id);
|
|
61
159
|
if (!alias) {
|
|
62
160
|
const parsed = parseCursorVariantId(raw.id);
|
|
63
161
|
const key = `unknown${parsed.baseId}${raw.id}`;
|
|
@@ -92,7 +190,8 @@ export function normalizeCursorCatalog(rawEntries) {
|
|
|
92
190
|
const members = groups.get(key);
|
|
93
191
|
const first = members[0];
|
|
94
192
|
const baseParsed = parseCursorVariantId(first.alias.targetId);
|
|
95
|
-
const
|
|
193
|
+
const derivedGroup = members.every((member) => derived.has(member.raw.id));
|
|
194
|
+
const baseId = derivedGroup ? parseCursorVariantId(first.raw.id).baseId : baseParsed.baseId;
|
|
96
195
|
const capability = CURSOR_MODEL_CAPABILITIES[baseId];
|
|
97
196
|
const isGrouped = members.length > 1 || first.alias.targetId !== first.raw.id;
|
|
98
197
|
const efforts = members.filter((member) => member.level !== undefined && member.level !== "none");
|
|
@@ -102,7 +201,7 @@ export function normalizeCursorCatalog(rawEntries) {
|
|
|
102
201
|
id: first.alias.targetId,
|
|
103
202
|
name: cleanName(members, baseId, thinkingMode),
|
|
104
203
|
reasoning: true,
|
|
105
|
-
thinkingLevelMap: buildLevelMap(members, capability),
|
|
204
|
+
thinkingLevelMap: derivedGroup ? buildDerivedLevelMap(members) : buildLevelMap(members, capability),
|
|
106
205
|
window: capability?.window ?? FALLBACK_WINDOW,
|
|
107
206
|
...(capability?.maxWindow !== undefined ? { maxWindow: capability.maxWindow } : {}),
|
|
108
207
|
input: [...new Set(members.flatMap((member) => member.raw.input))],
|
|
@@ -111,6 +210,7 @@ export function normalizeCursorCatalog(rawEntries) {
|
|
|
111
210
|
...(thinkingMode !== undefined ? { thinkingMode } : {}),
|
|
112
211
|
representativeVariantId: pickRepresentative(members),
|
|
113
212
|
legacyAliases: members.map((member) => member.alias.legacyVariantId).sort(),
|
|
213
|
+
...(derivedGroup ? { variantIds: buildDerivedVariantIds(members) } : {}),
|
|
114
214
|
});
|
|
115
215
|
continue;
|
|
116
216
|
}
|
|
@@ -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":"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;;;;;;;;GAQG;AACH,MAAM,UAAU,gCAAgC,CAC/C,KAA4B,EAC5B,SAAwC;IAExC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,QAAQ,GAA4B,EAAE,OAAO,EAAE,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACzG,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,eAAe,CAAC;QAC3C,MAAM,WAAW,GAChB,QAAQ,KAAK,SAAS;YACtB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9G,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAEzE,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,uBAAuB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,YAAY;QAC5B,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC;KACjF,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,0BAA0B,CACzC,KAA4B,EAC5B,SAAwC;IAExC,MAAM,QAAQ,GAAG,gCAAgC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpG,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC;AACvC,CAAC","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"}
|