opencode-anthropic-multi-account 0.2.80 → 0.2.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-IIROTFG6.js → chunk-DJ5R5DCS.js} +46 -10
- package/dist/chunk-DJ5R5DCS.js.map +1 -0
- package/dist/chunk-ITZJ5FTB.js +1 -0
- package/dist/chunk-ITZJ5FTB.js.map +1 -0
- package/dist/{chunk-SIE5WYMV.js → chunk-UTRR5Y5B.js} +261 -592
- package/dist/chunk-UTRR5Y5B.js.map +1 -0
- package/dist/fingerprint-capture.d.ts +1 -1
- package/dist/fingerprint-capture.js +2 -2
- package/dist/index.js +722 -1636
- package/dist/index.js.map +1 -1
- package/dist/scrub-template.js +2 -1
- package/package.json +3 -3
- package/dist/chunk-IIROTFG6.js.map +0 -1
- package/dist/chunk-SIE5WYMV.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// ../providers/claude-code/src/scrub-template.ts
|
|
2
2
|
var HOST_CONTEXT_SECTION_NAMES = /* @__PURE__ */ new Set([
|
|
3
3
|
"environment",
|
|
4
4
|
"automemory",
|
|
@@ -57,13 +57,34 @@ function isRecord(value) {
|
|
|
57
57
|
return typeof value === "object" && value !== null;
|
|
58
58
|
}
|
|
59
59
|
function cleanupRemovedSections(text) {
|
|
60
|
-
|
|
60
|
+
const lines = text.split("\n");
|
|
61
|
+
const cleaned = [];
|
|
62
|
+
let previousBlank = true;
|
|
63
|
+
for (const line of lines) {
|
|
64
|
+
const blank = line.trim().length === 0;
|
|
65
|
+
if (blank && previousBlank) continue;
|
|
66
|
+
cleaned.push(line);
|
|
67
|
+
previousBlank = blank;
|
|
68
|
+
}
|
|
69
|
+
while (cleaned.length > 0 && cleaned[cleaned.length - 1].trim().length === 0) {
|
|
70
|
+
cleaned.pop();
|
|
71
|
+
}
|
|
72
|
+
return cleaned.join("\n");
|
|
61
73
|
}
|
|
62
74
|
function removeDynamicStatusBlock(text) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
75
|
+
const statusStart = "\n\nStatus:\n";
|
|
76
|
+
const recentStart = "\n\nRecent commits:\n";
|
|
77
|
+
let scrubbed = text;
|
|
78
|
+
let searchFrom = 0;
|
|
79
|
+
while (true) {
|
|
80
|
+
const start = scrubbed.indexOf(statusStart, searchFrom);
|
|
81
|
+
if (start === -1) return scrubbed;
|
|
82
|
+
const contentStart = start + statusStart.length;
|
|
83
|
+
const end = scrubbed.indexOf(recentStart, contentStart);
|
|
84
|
+
if (end === -1) return scrubbed;
|
|
85
|
+
scrubbed = `${scrubbed.slice(0, contentStart)}(dynamic)${scrubbed.slice(end)}`;
|
|
86
|
+
searchFrom = contentStart + "(dynamic)".length + recentStart.length;
|
|
87
|
+
}
|
|
67
88
|
}
|
|
68
89
|
function removeDynamicRecentCommits(text) {
|
|
69
90
|
return text.replace(
|
|
@@ -94,10 +115,10 @@ function removeHostContextSections(systemPrompt) {
|
|
|
94
115
|
const keptLines = [];
|
|
95
116
|
let skippedHeadingDepth = null;
|
|
96
117
|
for (const line of lines) {
|
|
97
|
-
const headingMatch = line
|
|
118
|
+
const headingMatch = parseMarkdownHeading(line);
|
|
98
119
|
if (headingMatch) {
|
|
99
|
-
const headingDepth = headingMatch
|
|
100
|
-
const sectionName = normalizeSectionName(headingMatch
|
|
120
|
+
const headingDepth = headingMatch.depth;
|
|
121
|
+
const sectionName = normalizeSectionName(headingMatch.title);
|
|
101
122
|
const startsSkippedSection = HOST_CONTEXT_SECTION_NAMES.has(sectionName);
|
|
102
123
|
if (startsSkippedSection) {
|
|
103
124
|
skippedHeadingDepth = headingDepth;
|
|
@@ -117,6 +138,21 @@ function removeHostContextSections(systemPrompt) {
|
|
|
117
138
|
}
|
|
118
139
|
return cleanupRemovedSections(removeDynamicGitMetadata(removeDynamicRecentCommits(removeDynamicStatusBlock(keptLines.join("\n")))));
|
|
119
140
|
}
|
|
141
|
+
function parseMarkdownHeading(line) {
|
|
142
|
+
const trimmedStart = line.trimStart();
|
|
143
|
+
if (line.length - trimmedStart.length > 3 || !trimmedStart.startsWith("#")) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
let depth = 0;
|
|
147
|
+
while (depth < trimmedStart.length && trimmedStart[depth] === "#") {
|
|
148
|
+
depth += 1;
|
|
149
|
+
}
|
|
150
|
+
if (depth < 1 || depth > 6 || trimmedStart[depth] !== " ") {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const title = trimmedStart.slice(depth + 1).trim();
|
|
154
|
+
return title ? { depth, title } : null;
|
|
155
|
+
}
|
|
120
156
|
function scrubObjectStrings(value) {
|
|
121
157
|
if (typeof value === "string") {
|
|
122
158
|
return scrubText(value);
|
|
@@ -153,4 +189,4 @@ export {
|
|
|
153
189
|
scrubObjectStrings,
|
|
154
190
|
scrubTemplate
|
|
155
191
|
};
|
|
156
|
-
//# sourceMappingURL=chunk-
|
|
192
|
+
//# sourceMappingURL=chunk-DJ5R5DCS.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 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]);\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\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 = scrubText(removeHostContextSections(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 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":";AAkBA,IAAM,6BAA6B,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,yBAAyB;AAAA,EAC7B;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAEA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,4BAA4B;AAAA,EAChC;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,YAAY,EAAE,QAAQ,eAAe,EAAE;AACtD;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,uBAAuB,MAAsB;AACpD,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,UAAoB,CAAC;AAC3B,MAAI,gBAAgB;AAEpB,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,KAAK,EAAE,WAAW;AACrC,QAAI,SAAS,cAAe;AAC5B,YAAQ,KAAK,IAAI;AACjB,oBAAgB;AAAA,EAClB;AAEA,SAAO,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,CAAC,EAAG,KAAK,EAAE,WAAW,GAAG;AAC7E,YAAQ,IAAI;AAAA,EACd;AAEA,SAAO,QAAQ,KAAK,IAAI;AAC1B;AAEA,SAAS,yBAAyB,MAAsB;AACtD,QAAM,cAAc;AACpB,QAAM,cAAc;AACpB,MAAI,WAAW;AACf,MAAI,aAAa;AAEjB,SAAO,MAAM;AACX,UAAM,QAAQ,SAAS,QAAQ,aAAa,UAAU;AACtD,QAAI,UAAU,GAAI,QAAO;AAEzB,UAAM,eAAe,QAAQ,YAAY;AACzC,UAAM,MAAM,SAAS,QAAQ,aAAa,YAAY;AACtD,QAAI,QAAQ,GAAI,QAAO;AAEvB,eAAW,GAAG,SAAS,MAAM,GAAG,YAAY,CAAC,YAAY,SAAS,MAAM,GAAG,CAAC;AAC5E,iBAAa,eAAe,YAAY,SAAS,YAAY;AAAA,EAC/D;AACF;AAEA,SAAS,2BAA2B,MAAsB;AACxD,SAAO,KAAK;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,MAAsB;AACtD,MAAI,WAAW;AAEf,aAAW,EAAE,SAAS,YAAY,KAAK,2BAA2B;AAChE,eAAW,SAAS,QAAQ,SAAS,WAAW;AAAA,EAClD;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,MAAsB;AAC9C,MAAI,WAAW;AAEf,aAAW,EAAE,SAAS,YAAY,KAAK,wBAAwB;AAC7D,eAAW,SAAS,QAAQ,SAAS,WAAW;AAAA,EAClD;AAEA,SAAO,yBAAyB,QAAQ;AAC1C;AAEO,SAAS,iBAAiB,MAAwB;AACvD,QAAM,OAAO,uBAAuB,QAAQ,CAAC,YAAY,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAClF,SAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAEO,SAAS,0BAA0B,cAA8B;AACtE,QAAM,QAAQ,aAAa,MAAM,IAAI;AACrC,QAAM,YAAsB,CAAC;AAC7B,MAAI,sBAAqC;AAEzC,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAe,qBAAqB,IAAI;AAE9C,QAAI,cAAc;AAChB,YAAM,eAAe,aAAa;AAClC,YAAM,cAAc,qBAAqB,aAAa,KAAK;AAC3D,YAAM,uBAAuB,2BAA2B,IAAI,WAAW;AAEvE,UAAI,sBAAsB;AACxB,8BAAsB;AACtB;AAAA,MACF;AAEA,UAAI,wBAAwB,QAAQ,eAAe,qBAAqB;AACtE;AAAA,MACF;AAEA,4BAAsB;AACtB,gBAAU,KAAK,IAAI;AACnB;AAAA,IACF;AAEA,QAAI,wBAAwB,MAAM;AAChC;AAAA,IACF;AAEA,cAAU,KAAK,IAAI;AAAA,EACrB;AAEA,SAAO,uBAAuB,yBAAyB,2BAA2B,yBAAyB,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACpI;AAEA,SAAS,qBAAqB,MAAuD;AACnF,QAAM,eAAe,KAAK,UAAU;AACpC,MAAI,KAAK,SAAS,aAAa,SAAS,KAAK,CAAC,aAAa,WAAW,GAAG,GAAG;AAC1E,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,SAAO,QAAQ,aAAa,UAAU,aAAa,KAAK,MAAM,KAAK;AACjE,aAAS;AAAA,EACX;AAEA,MAAI,QAAQ,KAAK,QAAQ,KAAK,aAAa,KAAK,MAAM,KAAK;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,aAAa,MAAM,QAAQ,CAAC,EAAE,KAAK;AACjD,SAAO,QAAQ,EAAE,OAAO,MAAM,IAAI;AACpC;AAEO,SAAS,mBAAmB,OAAyB;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,UAAU,KAAK;AAAA,EACxB;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,EACvD;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,mBAAmB,KAAK,CAAC,CAAC;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAsC,MAAS,SAAmC;AAChG,QAAM,eAAe,UAAU,0BAA0B,KAAK,aAAa,CAAC;AAC5E,QAAM,eAAe,SAAS,gBAAgB;AAC9C,QAAM,QAAQ,KAAK,MAChB,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,KAAK,WAAW,OAAO,CAAC,EAChE,IAAI,CAAC,SAAS,mBAAmB,IAAI,CAAuB;AAE/D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,UAAU,KAAK,cAAc;AAAA,IAC7C,eAAe;AAAA,IACf;AAAA,IACA,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IACzC,cAAc,KAAK,eAAe,CAAC,GAAG,KAAK,YAAY,IAAI;AAAA,IAC3D,eAAe,KAAK,gBAChB,mBAAmB,KAAK,aAAa,IACrC;AAAA,EACN;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-ITZJ5FTB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|