opencode-anthropic-multi-account 0.2.102 → 0.2.103

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.
@@ -180,6 +180,11 @@ function scrubTemplate(data, options) {
180
180
  agent_identity: scrubText(data.agent_identity),
181
181
  system_prompt: systemPrompt,
182
182
  ...typeof data.system_prompt_fable === "string" ? { system_prompt_fable: scrubSystemPrompt(data.system_prompt_fable) } : {},
183
+ ...data.system_prompt_variants ? {
184
+ system_prompt_variants: Object.fromEntries(
185
+ Object.entries(data.system_prompt_variants).map(([key, prompt]) => [key, scrubSystemPrompt(prompt)])
186
+ )
187
+ } : {},
183
188
  tools,
184
189
  tool_names: tools.map((tool) => tool.name),
185
190
  header_order: data.header_order ? [...data.header_order] : void 0,
@@ -195,4 +200,4 @@ export {
195
200
  scrubObjectStrings,
196
201
  scrubTemplate
197
202
  };
198
- //# sourceMappingURL=chunk-FQBFDF73.js.map
203
+ //# sourceMappingURL=chunk-QTHKVNEI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../providers/claude-code/src/scrub-template.ts"],"sourcesContent":["interface ScrubTemplateOptions {\n dropMcpTools?: boolean;\n}\n\ninterface TemplateToolLike {\n name: string;\n [key: string]: unknown;\n}\n\ninterface TemplateLike {\n agent_identity: string;\n system_prompt: string;\n system_prompt_fable?: string;\n system_prompt_variants?: Record<string, string>;\n tools: TemplateToolLike[];\n tool_names: string[];\n header_order?: string[];\n header_values?: Record<string, string>;\n}\n\nconst HOST_CONTEXT_SECTION_NAMES = new Set([\n \"environment\",\n \"automemory\",\n \"claudemd\",\n \"useremail\",\n \"currentdate\",\n \"gitstatus\",\n \"language\",\n]);\n\nconst USER_PATH_REPLACEMENTS = [\n {\n pattern: /\\/Users\\/(?!user(?:\\/|$))[A-Za-z0-9._-]+/g,\n replacement: \"/Users/user\",\n },\n {\n pattern: /\\/home\\/(?!user(?:\\/|$))[A-Za-z0-9._-]+/g,\n replacement: \"/home/user\",\n },\n {\n pattern: /([A-Za-z]:\\\\Users\\\\)(?!user(?:\\\\|$))[A-Za-z0-9._-]+/g,\n replacement: \"$1user\",\n },\n {\n pattern: /([A-Za-z])--Users-[^\\s\\\\`'\")\\]]+/g,\n replacement: \"$1--Users-user-project\",\n },\n {\n pattern: /(\\/\\.claude\\/projects\\/)-[A-Za-z0-9._-]+(?=\\/|$)/g,\n replacement: \"$1project\",\n },\n] as const;\n\nconst USER_PATH_HIT_PATTERNS = [\n /\\/Users\\/(?!user(?:\\/|$))[A-Za-z0-9._-]+(?:\\/[^\\s\"'`<>)]*)?/g,\n /\\/home\\/(?!user(?:\\/|$))[A-Za-z0-9._-]+(?:\\/[^\\s\"'`<>)]*)?/g,\n /[A-Za-z]:\\\\Users\\\\(?!user(?:\\\\|$))[A-Za-z0-9._-]+(?:\\\\[^\\s\"'`<>)]*)?/g,\n /[A-Za-z]--Users-(?!user-project\\b)[^\\s\\\\`'\")\\]]+/g,\n /\\/\\.claude\\/projects\\/-[A-Za-z0-9._-]+(?:\\/[^\\s\"'`<>)]*)?/g,\n] as const;\n\nconst GIT_METADATA_REPLACEMENTS = [\n {\n pattern: /^Current branch: .+$/gm,\n replacement: \"Current branch: (dynamic)\",\n },\n {\n pattern: /^Main branch \\(you will usually use this for PRs\\): .+$/gm,\n replacement: \"Main branch (you will usually use this for PRs): (dynamic)\",\n },\n {\n pattern: /^Git user: .+$/gm,\n replacement: \"Git user: (dynamic)\",\n },\n] as const;\n\nfunction normalizeSectionName(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction cleanupRemovedSections(text: string): string {\n const lines = text.split(\"\\n\");\n const cleaned: string[] = [];\n let previousBlank = true;\n\n for (const line of lines) {\n const blank = line.trim().length === 0;\n if (blank && previousBlank) continue;\n cleaned.push(line);\n previousBlank = blank;\n }\n\n while (cleaned.length > 0 && cleaned[cleaned.length - 1]!.trim().length === 0) {\n cleaned.pop();\n }\n\n return cleaned.join(\"\\n\");\n}\n\nfunction removeDynamicStatusBlock(text: string): string {\n const statusStart = \"\\n\\nStatus:\\n\";\n const recentStart = \"\\n\\nRecent commits:\\n\";\n let scrubbed = text;\n let searchFrom = 0;\n\n while (true) {\n const start = scrubbed.indexOf(statusStart, searchFrom);\n if (start === -1) return scrubbed;\n\n const contentStart = start + statusStart.length;\n const end = scrubbed.indexOf(recentStart, contentStart);\n if (end === -1) return scrubbed;\n\n scrubbed = `${scrubbed.slice(0, contentStart)}(dynamic)${scrubbed.slice(end)}`;\n searchFrom = contentStart + \"(dynamic)\".length + recentStart.length;\n }\n}\n\nfunction removeDynamicRecentCommits(text: string): string {\n return text.replace(\n /(\\n\\nRecent commits:\\n)(?:[0-9a-f]{7,}\\s.*\\n?)+/g,\n \"$1(dynamic)\\n\",\n );\n}\n\nfunction removeDynamicGitMetadata(text: string): string {\n let scrubbed = text;\n\n for (const { pattern, replacement } of GIT_METADATA_REPLACEMENTS) {\n scrubbed = scrubbed.replace(pattern, replacement);\n }\n\n return scrubbed;\n}\n\nexport function scrubText(text: string): string {\n let scrubbed = text;\n\n for (const { pattern, replacement } of USER_PATH_REPLACEMENTS) {\n scrubbed = scrubbed.replace(pattern, replacement);\n }\n\n return removeDynamicGitMetadata(scrubbed);\n}\n\nexport function findUserPathHits(text: string): string[] {\n const hits = USER_PATH_HIT_PATTERNS.flatMap((pattern) => text.match(pattern) ?? []);\n return [...new Set(hits)];\n}\n\nexport function removeHostContextSections(systemPrompt: string): string {\n const lines = systemPrompt.split(\"\\n\");\n const keptLines: string[] = [];\n let skippedHeadingDepth: number | null = null;\n\n for (const line of lines) {\n const headingMatch = parseMarkdownHeading(line);\n\n if (headingMatch) {\n const headingDepth = headingMatch.depth;\n const sectionName = normalizeSectionName(headingMatch.title);\n const startsSkippedSection = HOST_CONTEXT_SECTION_NAMES.has(sectionName);\n\n if (startsSkippedSection) {\n skippedHeadingDepth = headingDepth;\n continue;\n }\n\n if (skippedHeadingDepth !== null && headingDepth > skippedHeadingDepth) {\n continue;\n }\n\n skippedHeadingDepth = null;\n keptLines.push(line);\n continue;\n }\n\n if (skippedHeadingDepth !== null) {\n continue;\n }\n\n keptLines.push(line);\n }\n\n return cleanupRemovedSections(removeDynamicGitMetadata(removeDynamicRecentCommits(removeDynamicStatusBlock(keptLines.join(\"\\n\")))));\n}\n\nexport function scrubSystemPrompt(systemPrompt: string): string {\n return scrubText(removeHostContextSections(systemPrompt));\n}\n\nfunction parseMarkdownHeading(line: string): { depth: number; title: string } | null {\n const trimmedStart = line.trimStart();\n if (line.length - trimmedStart.length > 3 || !trimmedStart.startsWith(\"#\")) {\n return null;\n }\n\n let depth = 0;\n while (depth < trimmedStart.length && trimmedStart[depth] === \"#\") {\n depth += 1;\n }\n\n if (depth < 1 || depth > 6 || trimmedStart[depth] !== \" \") {\n return null;\n }\n\n const title = trimmedStart.slice(depth + 1).trim();\n return title ? { depth, title } : null;\n}\n\nexport function scrubObjectStrings(value: unknown): unknown {\n if (typeof value === \"string\") {\n return scrubText(value);\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => scrubObjectStrings(entry));\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, scrubObjectStrings(entry)]),\n );\n }\n\n return value;\n}\n\nexport function scrubTemplate<T extends TemplateLike>(data: T, options?: ScrubTemplateOptions): T {\n const systemPrompt = scrubSystemPrompt(data.system_prompt);\n const dropMcpTools = options?.dropMcpTools ?? true;\n const tools = data.tools\n .filter((tool) => !dropMcpTools || !tool.name.startsWith(\"mcp__\"))\n .map((tool) => scrubObjectStrings(tool) as T[\"tools\"][number]);\n\n return {\n ...data,\n agent_identity: scrubText(data.agent_identity),\n system_prompt: systemPrompt,\n ...(typeof data.system_prompt_fable === \"string\"\n ? { system_prompt_fable: scrubSystemPrompt(data.system_prompt_fable) }\n : {}),\n ...(data.system_prompt_variants\n ? {\n system_prompt_variants: Object.fromEntries(\n Object.entries(data.system_prompt_variants)\n .map(([key, prompt]) => [key, scrubSystemPrompt(prompt)]),\n ),\n }\n : {}),\n tools,\n tool_names: tools.map((tool) => tool.name),\n header_order: data.header_order ? [...data.header_order] : undefined,\n header_values: data.header_values\n ? scrubObjectStrings(data.header_values) as Record<string, string>\n : undefined,\n } as T;\n}\n"],"mappings":"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","names":[]}
@@ -16,6 +16,7 @@ interface TemplateData {
16
16
  agent_identity: string;
17
17
  system_prompt: string;
18
18
  system_prompt_fable?: string;
19
+ system_prompt_variants?: Record<string, string>;
19
20
  tools: TemplateTool[];
20
21
  tool_names: string[];
21
22
  anthropic_beta?: string;
@@ -12,8 +12,8 @@ import {
12
12
  refreshLiveFingerprintAsync,
13
13
  resetFingerprintCaptureForTest,
14
14
  setFingerprintCaptureTestOverridesForTest
15
- } from "./chunk-Z4CX5QR6.js";
16
- import "./chunk-FQBFDF73.js";
15
+ } from "./chunk-DF7WSI6F.js";
16
+ import "./chunk-QTHKVNEI.js";
17
17
  export {
18
18
  LIVE_TTL_MS,
19
19
  SUPPORTED_CC_RANGE,
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  detectCliVersion,
11
11
  detectDrift,
12
12
  fingerprint_data_default,
13
+ getClaudeCodeSystemPromptVariants,
13
14
  isClaudeCode1mModelLabel,
14
15
  isClaudeFableModel,
15
16
  loadClaudeCodeSharedRequestProfile,
@@ -19,11 +20,12 @@ import {
19
20
  refreshLiveFingerprintAsync,
20
21
  resolveClaudeCodeCacheControl,
21
22
  resolveClaudeCodeModelAlias,
23
+ selectClaudeCodeSystemPrompt,
22
24
  stampClaudeCodeCch,
23
25
  toClaudeCodeWireModelId
24
- } from "./chunk-Z4CX5QR6.js";
26
+ } from "./chunk-DF7WSI6F.js";
25
27
  import "./chunk-ITZJ5FTB.js";
26
- import "./chunk-FQBFDF73.js";
28
+ import "./chunk-QTHKVNEI.js";
27
29
 
28
30
  // src/index.ts
29
31
  import {
@@ -1992,7 +1994,7 @@ import { TokenRefreshError } from "opencode-multi-account-core";
1992
1994
  import { randomUUID as randomUUID4 } from "crypto";
1993
1995
 
1994
1996
  // src/model/config.ts
1995
- var FABLE_FALLBACK_CREDIT_BETA = "fallback-credit-2026-06-01";
1997
+ var FALLBACK_CREDIT_BETA = "fallback-credit-2026-06-01";
1996
1998
  var MID_CONVERSATION_SYSTEM_BETA = "mid-conversation-system-2026-04-07";
1997
1999
  var EFFORT_BETA = "effort-2025-11-24";
1998
2000
  function splitBetaFlags(value) {
@@ -2003,7 +2005,10 @@ var config = {
2003
2005
  longContextBetas: ["context-1m-2025-08-07", "context-management-2025-06-27"],
2004
2006
  modelOverrides: {
2005
2007
  fable: {
2006
- add: [FABLE_FALLBACK_CREDIT_BETA]
2008
+ add: [FALLBACK_CREDIT_BETA]
2009
+ },
2010
+ "opus-5": {
2011
+ add: [FALLBACK_CREDIT_BETA]
2007
2012
  },
2008
2013
  "sonnet-5": {
2009
2014
  add: [EFFORT_BETA]
@@ -2589,9 +2594,6 @@ function resolveOutputEffort(inputBody, configuredEffort = getConfiguredOutputEf
2589
2594
  function isHaikuModel(modelId) {
2590
2595
  return resolveClaudeCodeModelAlias(modelId).toLowerCase().includes("haiku");
2591
2596
  }
2592
- function getSystemPromptForModel(template, modelId) {
2593
- return modelId.toLowerCase().includes("fable") && template.system_prompt_fable ? template.system_prompt_fable : template.system_prompt;
2594
- }
2595
2597
  function collectToolUseIds(message) {
2596
2598
  if (!Array.isArray(message.content)) {
2597
2599
  return [];
@@ -2633,6 +2635,7 @@ var ADAPTIVE_THINKING_MODEL_MATCHERS = [
2633
2635
  (modelId) => modelId.includes("claude-sonnet-4-6") || modelId.includes("claude-sonnet-4.6"),
2634
2636
  (modelId) => modelId.includes("claude-opus-4-6") || modelId.includes("claude-opus-4.6"),
2635
2637
  (modelId) => /claude-opus-4[-._]([7-9]|\d{2,})/.test(modelId),
2638
+ (modelId) => /claude-opus-(?:[5-9]|\d{2,})(?:[-._]\d+)?(?:\[1m\])?$/.test(modelId),
2636
2639
  (modelId) => /claude-fable-(?:[5-9]|\d{2,})(?:[-._]\d+)?(?:\[1m\])?$/.test(modelId)
2637
2640
  ];
2638
2641
  var DEFAULT_MAX_OUTPUT_TOKENS = 32e3;
@@ -2658,7 +2661,8 @@ function resolveMaxTokens(requestedMaxTokens) {
2658
2661
  return Math.min(normalized, DEFAULT_MAX_OUTPUT_TOKENS);
2659
2662
  }
2660
2663
  function filterInjectedSystemTexts(systemTexts, template, billingHeader) {
2661
- return systemTexts.filter((entry) => entry !== billingHeader && entry !== template.agent_identity && entry !== template.system_prompt && !entry.startsWith("x-anthropic-billing-header:"));
2664
+ const promptVariants = new Set(Object.values(getClaudeCodeSystemPromptVariants(template)));
2665
+ return systemTexts.filter((entry) => entry !== billingHeader && entry !== template.agent_identity && entry !== template.system_prompt && !promptVariants.has(entry) && !entry.startsWith("x-anthropic-billing-header:"));
2662
2666
  }
2663
2667
  function getCcVersion(template) {
2664
2668
  return template?.cc_version ?? claudeCodeIntegration.detectCliVersion();
@@ -2744,7 +2748,7 @@ function buildUpstreamRequest(inputBody, identity, template, options) {
2744
2748
  deviceId: identity.deviceId
2745
2749
  },
2746
2750
  sessionId: activeSessionId,
2747
- systemPrompt: getSystemPromptForModel(template, modelId),
2751
+ systemPrompt: selectClaudeCodeSystemPrompt(template, modelId),
2748
2752
  systemTexts: filterInjectedSystemTexts(
2749
2753
  systemTexts,
2750
2754
  template,