@wudao-org/providers 0.0.0-stage → 0.4.21

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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -2
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/anthropic.d.ts +19 -0
  5. package/dist/anthropic.d.ts.map +1 -0
  6. package/dist/anthropic.js +621 -0
  7. package/dist/anthropic.js.map +1 -0
  8. package/dist/balance.d.ts +28 -0
  9. package/dist/balance.d.ts.map +1 -0
  10. package/dist/balance.js +105 -0
  11. package/dist/balance.js.map +1 -0
  12. package/dist/config.d.ts +328 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +623 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/dispatcher.d.ts +5 -0
  17. package/dist/dispatcher.d.ts.map +1 -0
  18. package/dist/dispatcher.js +21 -0
  19. package/dist/dispatcher.js.map +1 -0
  20. package/dist/effort-catalog.d.ts +17 -0
  21. package/dist/effort-catalog.d.ts.map +1 -0
  22. package/dist/effort-catalog.js +73 -0
  23. package/dist/effort-catalog.js.map +1 -0
  24. package/dist/error-body.d.ts +32 -0
  25. package/dist/error-body.d.ts.map +1 -0
  26. package/dist/error-body.js +74 -0
  27. package/dist/error-body.js.map +1 -0
  28. package/dist/header-validation.d.ts +57 -0
  29. package/dist/header-validation.d.ts.map +1 -0
  30. package/dist/header-validation.js +130 -0
  31. package/dist/header-validation.js.map +1 -0
  32. package/dist/index.d.ts +42 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +110 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/json-arguments.d.ts +17 -0
  37. package/dist/json-arguments.d.ts.map +1 -0
  38. package/dist/json-arguments.js +227 -0
  39. package/dist/json-arguments.js.map +1 -0
  40. package/dist/key-pool.d.ts +66 -0
  41. package/dist/key-pool.d.ts.map +1 -0
  42. package/dist/key-pool.js +207 -0
  43. package/dist/key-pool.js.map +1 -0
  44. package/dist/missing-reasoning-circuit.d.ts +17 -0
  45. package/dist/missing-reasoning-circuit.d.ts.map +1 -0
  46. package/dist/missing-reasoning-circuit.js +38 -0
  47. package/dist/missing-reasoning-circuit.js.map +1 -0
  48. package/dist/model-failure.d.ts +156 -0
  49. package/dist/model-failure.d.ts.map +1 -0
  50. package/dist/model-failure.js +253 -0
  51. package/dist/model-failure.js.map +1 -0
  52. package/dist/model-fallback.d.ts +18 -0
  53. package/dist/model-fallback.d.ts.map +1 -0
  54. package/dist/model-fallback.js +87 -0
  55. package/dist/model-fallback.js.map +1 -0
  56. package/dist/models.d.ts +20 -0
  57. package/dist/models.d.ts.map +1 -0
  58. package/dist/models.js +55 -0
  59. package/dist/models.js.map +1 -0
  60. package/dist/openai-compatible.d.ts +87 -0
  61. package/dist/openai-compatible.d.ts.map +1 -0
  62. package/dist/openai-compatible.js +368 -0
  63. package/dist/openai-compatible.js.map +1 -0
  64. package/dist/openai-engine.d.ts +18 -0
  65. package/dist/openai-engine.d.ts.map +1 -0
  66. package/dist/openai-engine.js +515 -0
  67. package/dist/openai-engine.js.map +1 -0
  68. package/dist/openai-images.d.ts +38 -0
  69. package/dist/openai-images.d.ts.map +1 -0
  70. package/dist/openai-images.js +301 -0
  71. package/dist/openai-images.js.map +1 -0
  72. package/dist/openai-messages.d.ts +40 -0
  73. package/dist/openai-messages.d.ts.map +1 -0
  74. package/dist/openai-messages.js +135 -0
  75. package/dist/openai-messages.js.map +1 -0
  76. package/dist/openai-wire.d.ts +93 -0
  77. package/dist/openai-wire.d.ts.map +1 -0
  78. package/dist/openai-wire.js +151 -0
  79. package/dist/openai-wire.js.map +1 -0
  80. package/dist/persona/apply.d.ts +19 -0
  81. package/dist/persona/apply.d.ts.map +1 -0
  82. package/dist/persona/apply.js +98 -0
  83. package/dist/persona/apply.js.map +1 -0
  84. package/dist/persona/builtins.d.ts +3 -0
  85. package/dist/persona/builtins.d.ts.map +1 -0
  86. package/dist/persona/builtins.js +180 -0
  87. package/dist/persona/builtins.js.map +1 -0
  88. package/dist/persona/decorator.d.ts +4 -0
  89. package/dist/persona/decorator.d.ts.map +1 -0
  90. package/dist/persona/decorator.js +112 -0
  91. package/dist/persona/decorator.js.map +1 -0
  92. package/dist/persona/files.d.ts +20 -0
  93. package/dist/persona/files.d.ts.map +1 -0
  94. package/dist/persona/files.js +84 -0
  95. package/dist/persona/files.js.map +1 -0
  96. package/dist/persona/ids.d.ts +9 -0
  97. package/dist/persona/ids.d.ts.map +1 -0
  98. package/dist/persona/ids.js +11 -0
  99. package/dist/persona/ids.js.map +1 -0
  100. package/dist/persona/registry.d.ts +12 -0
  101. package/dist/persona/registry.d.ts.map +1 -0
  102. package/dist/persona/registry.js +54 -0
  103. package/dist/persona/registry.js.map +1 -0
  104. package/dist/persona/runtime.d.ts +23 -0
  105. package/dist/persona/runtime.d.ts.map +1 -0
  106. package/dist/persona/runtime.js +32 -0
  107. package/dist/persona/runtime.js.map +1 -0
  108. package/dist/persona/schema.d.ts +27 -0
  109. package/dist/persona/schema.d.ts.map +1 -0
  110. package/dist/persona/schema.js +165 -0
  111. package/dist/persona/schema.js.map +1 -0
  112. package/dist/persona/types.d.ts +38 -0
  113. package/dist/persona/types.d.ts.map +1 -0
  114. package/dist/persona/types.js +2 -0
  115. package/dist/persona/types.js.map +1 -0
  116. package/dist/pricing.d.ts +40 -0
  117. package/dist/pricing.d.ts.map +1 -0
  118. package/dist/pricing.js +70 -0
  119. package/dist/pricing.js.map +1 -0
  120. package/dist/quota-park.d.ts +53 -0
  121. package/dist/quota-park.d.ts.map +1 -0
  122. package/dist/quota-park.js +135 -0
  123. package/dist/quota-park.js.map +1 -0
  124. package/dist/rate-pause.d.ts +28 -0
  125. package/dist/rate-pause.d.ts.map +1 -0
  126. package/dist/rate-pause.js +72 -0
  127. package/dist/rate-pause.js.map +1 -0
  128. package/dist/registry.d.ts +142 -0
  129. package/dist/registry.d.ts.map +1 -0
  130. package/dist/registry.js +471 -0
  131. package/dist/registry.js.map +1 -0
  132. package/dist/responses.d.ts +5 -0
  133. package/dist/responses.d.ts.map +1 -0
  134. package/dist/responses.js +290 -0
  135. package/dist/responses.js.map +1 -0
  136. package/dist/retry-after.d.ts +13 -0
  137. package/dist/retry-after.d.ts.map +1 -0
  138. package/dist/retry-after.js +64 -0
  139. package/dist/retry-after.js.map +1 -0
  140. package/dist/retry-ladder.d.ts +176 -0
  141. package/dist/retry-ladder.d.ts.map +1 -0
  142. package/dist/retry-ladder.js +664 -0
  143. package/dist/retry-ladder.js.map +1 -0
  144. package/dist/split-inband-thinking.d.ts +35 -0
  145. package/dist/split-inband-thinking.d.ts.map +1 -0
  146. package/dist/split-inband-thinking.js +117 -0
  147. package/dist/split-inband-thinking.js.map +1 -0
  148. package/dist/stream-idle.d.ts +97 -0
  149. package/dist/stream-idle.d.ts.map +1 -0
  150. package/dist/stream-idle.js +127 -0
  151. package/dist/stream-idle.js.map +1 -0
  152. package/dist/tool-call-ids.d.ts +16 -0
  153. package/dist/tool-call-ids.d.ts.map +1 -0
  154. package/dist/tool-call-ids.js +36 -0
  155. package/dist/tool-call-ids.js.map +1 -0
  156. package/package.json +32 -3
@@ -0,0 +1,151 @@
1
+ import { offloadRequestFiles } from "@wudao-org/core";
2
+ import { mandatoryRepairReasoningBody, reasoningFormatBody, resolveReasoningContext } from "./config.js";
3
+ import { isCappedReasoning, toOpenAIMessage } from "./openai-messages.js";
4
+ import { inputHasImages, imageWireMessages } from "./openai-images.js";
5
+ /** Create the per-call runtime; a pre-armed client starts with the repair
6
+ * body already set (the leg's own config shapes it). */
7
+ export function createMandatoryReasoningCall(flag, config) {
8
+ return flag.applied
9
+ ? { flag, body: mandatoryRepairReasoningBody(resolveReasoningContext(config)) }
10
+ : { flag };
11
+ }
12
+ /** Arm the client flag (idempotent) after a repaired request was served. */
13
+ export function armMandatoryReasoningFlag(flag) {
14
+ if (flag.applied)
15
+ return;
16
+ flag.applied = true;
17
+ flag.onApplied?.();
18
+ }
19
+ /** The request's EFFECTIVE reasoning effort — a per-input effort (already
20
+ * parsed once at the public boundary) overrides the config's own. The single
21
+ * source both the request body and the ω-2a repair gates read, so a gate can
22
+ * never disagree with the bytes that actually went out. */
23
+ export function effectiveReasoningEffort(input, config) {
24
+ return input.reasoningEffort !== undefined && input.reasoningEffort !== ""
25
+ ? input.reasoningEffort
26
+ : config.reasoningEffort;
27
+ }
28
+ /** Disjoint-count mapping (dsh rule): `prompt_tokens` includes cache hits, and
29
+ * the two wire spellings report the SAME quantity — prefer details, fall back
30
+ * to the flat field, never sum them (no double counting). Miss = the rest
31
+ * (DeepSeek's explicit miss spelling wins when present).
32
+ *
33
+ * M56 §2 (turn_usage, omit-never-null): `cacheWriteTokens` is set only when
34
+ * the wire actually reported a cache split — on DeepSeek-style endpoints
35
+ * every miss is written, so cache-write ≈ miss; `reasoningTokens` rides the
36
+ * completion details spelling when the endpoint reports it. Everything
37
+ * unknown stays OMITTED (never null, never zero-backfilled). */
38
+ export function toModelUsage(u) {
39
+ const promptTokens = u.prompt_tokens ?? 0;
40
+ const hit = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;
41
+ const miss = u.prompt_cache_miss_tokens ?? Math.max(0, promptTokens - hit);
42
+ const cacheReported = u.prompt_cache_hit_tokens !== undefined
43
+ || u.prompt_cache_miss_tokens !== undefined
44
+ || u.prompt_cache_write_tokens !== undefined
45
+ || u.prompt_tokens_details?.cached_tokens !== undefined;
46
+ const write = u.prompt_cache_write_tokens ?? (cacheReported ? miss : undefined);
47
+ const reasoning = u.completion_tokens_details?.reasoning_tokens ?? u.reasoning_tokens;
48
+ return {
49
+ promptTokens,
50
+ cacheHitTokens: hit,
51
+ cacheMissTokens: miss,
52
+ completionTokens: u.completion_tokens ?? 0, // M29: workflow budgets bill prompt + completion
53
+ ...(write !== undefined && write > 0 ? { cacheWriteTokens: write } : {}),
54
+ ...(reasoning !== undefined && reasoning > 0 ? { reasoningTokens: reasoning } : {}),
55
+ };
56
+ }
57
+ /** M56 §2: the receipt's client-side extras — the wall duration measured
58
+ * around the attempt (always set; CodeWhale's duration_ms-always rule) and
59
+ * the replayed-reasoning estimate (only when the replay contract sent bytes
60
+ * back out). */
61
+ export function enrichUsage(usage, durationMs, replayTokens) {
62
+ return {
63
+ ...usage,
64
+ durationMs: Math.max(0, Math.round(durationMs)),
65
+ ...(replayTokens > 0 ? { reasoningReplayTokens: replayTokens } : {}),
66
+ };
67
+ }
68
+ /** Client-side estimate of the reasoning tokens sent BACK to the model this
69
+ * call (the M47 replay contract): CJK chars ≈ 1 token, ~4 others per token.
70
+ * An estimate by construction — no endpoint reports it. */
71
+ export function replayedReasoningTokens(messages, replay) {
72
+ if (replay === "never")
73
+ return 0;
74
+ let cjk = 0;
75
+ let other = 0;
76
+ for (const m of messages) {
77
+ if (m.role !== "assistant" || m.reasoning === undefined)
78
+ continue;
79
+ if (replay === "toolCallTurns" && (m.toolCalls === undefined || m.toolCalls.length === 0))
80
+ continue;
81
+ // ω-2a: a capped tail never rides back out — never billed as replayed.
82
+ if (isCappedReasoning(m.reasoning))
83
+ continue;
84
+ for (const ch of m.reasoning) {
85
+ if (ch >= "一" && ch <= "鿿")
86
+ cjk += 1;
87
+ else
88
+ other += 1;
89
+ }
90
+ }
91
+ return cjk + Math.ceil(other / 4);
92
+ }
93
+ function toOpenAIRequest(config, input, mr) {
94
+ const messages = [
95
+ { role: "system", content: input.systemPrompt },
96
+ ...input.messages.map((m) => toOpenAIMessage(m, config.reasoningReplay ?? "never")),
97
+ ];
98
+ return assembleOpenAIBody(config, input, messages, mr.body);
99
+ }
100
+ /** The request tail shared by both build paths: tools, then the
101
+ * reasoning-effort matrix fields, then the optional completion cap. Key
102
+ * insertion order is load-bearing (the wire bytes) — unchanged by M79.
103
+ * ω99-42: `repairBody` (the mandatory-reasoning repair, when armed) merges
104
+ * AFTER the effort fields — same keys, new values, so the repaired body
105
+ * differs from the rejected one only in the request-level reasoning
106
+ * fields; the messages (the prefix-cache key material) are byte-identical. */
107
+ function assembleOpenAIBody(config, input, messages, repairBody) {
108
+ const tools = input.tools.map((t) => ({
109
+ type: "function",
110
+ function: { name: t.name, description: t.description, parameters: t.parameters },
111
+ }));
112
+ const body = { model: config.model, messages, tools, tool_choice: "auto" };
113
+ // Reasoning-effort fields are appended only when configured — the default
114
+ // request stays byte-identical (prefix-cache friendly). The single matrix
115
+ // implementation shapes them (M16's per-profile transforms live here now).
116
+ // M58 §C: the per-INPUT effort was already parsed once at the public
117
+ // boundary (validatedInputEffort); ω-2a routes both this and the repair
118
+ // gates through effectiveReasoningEffort so they can never disagree.
119
+ const effort = effectiveReasoningEffort(input, config);
120
+ if (effort !== undefined) {
121
+ Object.assign(body, reasoningFormatBody(resolveReasoningContext(config), effort));
122
+ }
123
+ if (repairBody !== undefined) {
124
+ Object.assign(body, repairBody);
125
+ }
126
+ // M45: a configured completion cap rides last (budget-critical side calls
127
+ // only; the main loop never sets it). ω-2b (I1-b): a per-INPUT cap overrides
128
+ // the config's for this one call (the reasoningEffort override pattern) —
129
+ // max_tokens is a sampling parameter, never prompt bytes, so the swap is
130
+ // prefix-cache-neutral by construction.
131
+ const maxTokens = input.maxTokens ?? config.maxTokens;
132
+ if (maxTokens !== undefined) {
133
+ body["max_tokens"] = maxTokens;
134
+ }
135
+ return body;
136
+ }
137
+ /** The one request body builder (M79): the pre-M79 byte-identical
138
+ * construction when no images ride the input, the image walk above when
139
+ * they do. ω99-42: threads the mandatory-reasoning repair body through.
140
+ * ω99-55: FILE blocks project to handle text FIRST (dsh LlmRuntime parity
141
+ * — no wire ever receives file bytes); the projection is the identity when
142
+ * nothing rides files, so text/image request bytes are untouched. */
143
+ export async function buildOpenAIRequestBody(config, input, imageCtx, mr) {
144
+ const projectedMessages = offloadRequestFiles(input.messages);
145
+ const projected = projectedMessages === input.messages ? input : { ...input, messages: projectedMessages };
146
+ if (!inputHasImages(projected))
147
+ return toOpenAIRequest(config, projected, mr);
148
+ const messages = await imageWireMessages(config, projected, imageCtx);
149
+ return assembleOpenAIBody(config, projected, messages, mr.body);
150
+ }
151
+ //# sourceMappingURL=openai-wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-wire.js","sourceRoot":"","sources":["../src/openai-wire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { PersonaRuntime, PersonaRuntimeSlots } from "./runtime.js";
2
+ import type { ProtocolId, ResolvedPersona } from "./types.js";
3
+ export declare function resolveTemplate(value: string, slots: PersonaRuntimeSlots): string;
4
+ /** 层1:该协议头套 → 槽解析后的普通头对象(鉴权/传输控制键防御性跳过;schema 加载期已拒——程序化构造的定义仍走这里的兜底)。 */
5
+ export declare function resolvePersonaHeaders(persona: ResolvedPersona, protocol: ProtocolId, slots: PersonaRuntimeSlots): Record<string, string>;
6
+ /** 层2:标量替换、对象一级深合并。确定性:键序 = base 原序,overlay 新键按 overlay 序追加。 */
7
+ export declare function mergeBodyOverlay<T extends Record<string, unknown>>(base: T, overlay: Record<string, unknown> | undefined): T;
8
+ export interface WirePersona {
9
+ readonly headers: Record<string, string>;
10
+ readonly bodyOverlay: Record<string, unknown> | undefined;
11
+ }
12
+ /** 适配器 fetch 入口的统一缝:读 runtime.current,产出该协议层1/2。无 persona / 两层全关 / 该协议未定义 → null。
13
+ * ω99-50:可选 `label`(provider 名,适配器传 config.provider)只用于错误/警告
14
+ * 指名;缺省回退 persona id。persona 是逐请求可换的(适配器刻意不在工厂期
15
+ * 缓存 runtime.current),所以加载期校验挂在本缝——fetch 字节发出前、5 触点
16
+ * 的唯一上游。合法 header 走 assert 直通(零字节变化);坏名字/坏值在此抛
17
+ * HeaderValidationError(typed,两梯快速失败),不等到 undici 的匿名 TypeError。 */
18
+ export declare function applyWirePersona(runtime: PersonaRuntime | undefined, protocol: ProtocolId, label?: string): WirePersona | null;
19
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/persona/apply.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI9D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAWjF;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxI;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,CAAC,CAY5H;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC3D;AA+BD;;;;;oEAKoE;AACpE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAY9H"}
@@ -0,0 +1,98 @@
1
+ import { BODY_WHITELIST, FORBIDDEN_HEADER_KEYS } from "./schema.js";
2
+ import { RESERVED_CREDENTIAL_HEADER_KEYS, assertValidHeaders, noticeReservedCredentialHeader } from "../header-validation.js";
3
+ export function resolveTemplate(value, slots) {
4
+ return value.replace(/\{\{(sessionId|uuid|iso8601)\}\}/g, (_m, slot) => {
5
+ if (slot === "sessionId") {
6
+ if (slots.sessionId === undefined || slots.sessionId === "") {
7
+ throw new Error("persona template references {{sessionId}} but PersonaRuntime.slots has no session id");
8
+ }
9
+ return slots.sessionId;
10
+ }
11
+ if (slot === "uuid")
12
+ return (slots.uuid ?? (() => crypto.randomUUID()))();
13
+ return (slots.now ?? (() => new Date()))().toISOString();
14
+ });
15
+ }
16
+ /** 层1:该协议头套 → 槽解析后的普通头对象(鉴权/传输控制键防御性跳过;schema 加载期已拒——程序化构造的定义仍走这里的兜底)。 */
17
+ export function resolvePersonaHeaders(persona, protocol, slots) {
18
+ const out = {};
19
+ if (!persona.layers.headers)
20
+ return out;
21
+ const map = persona.definition.headers[protocol];
22
+ if (map === undefined)
23
+ return out;
24
+ for (const [k, v] of Object.entries(map)) {
25
+ if (FORBIDDEN_HEADER_KEYS.has(k.toLowerCase()))
26
+ continue;
27
+ out[k] = resolveTemplate(v, slots);
28
+ }
29
+ return out;
30
+ }
31
+ /** 层2:标量替换、对象一级深合并。确定性:键序 = base 原序,overlay 新键按 overlay 序追加。 */
32
+ export function mergeBodyOverlay(base, overlay) {
33
+ if (overlay === undefined)
34
+ return base;
35
+ const out = { ...base };
36
+ for (const [k, v] of Object.entries(overlay)) {
37
+ const prev = out[k];
38
+ out[k] =
39
+ typeof prev === "object" && prev !== null && !Array.isArray(prev) &&
40
+ typeof v === "object" && v !== null && !Array.isArray(v)
41
+ ? { ...prev, ...v }
42
+ : v;
43
+ }
44
+ return out;
45
+ }
46
+ /** Final-review I4:程序化构造的 PersonaDefinition 是公开 API 面,绕过
47
+ * schema 加载期校验——在 apply 时把 overlay 键重新过滤到该协议白名单
48
+ * (与 schema 校验消费同一个 BODY_WHITELIST 常量,单一来源)。全部键被
49
+ * 过滤掉 → 折叠为 undefined(该层对该协议无事可做)。 */
50
+ function whitelistedOverlay(protocol, overlay) {
51
+ const allow = BODY_WHITELIST[protocol];
52
+ const out = {};
53
+ for (const [k, v] of Object.entries(overlay)) {
54
+ if (allow.has(k))
55
+ out[k] = v;
56
+ }
57
+ return Object.keys(out).length > 0 ? out : undefined;
58
+ }
59
+ /** ω99-50:凭证保留名可见性(程序化构造兜底面)。schema 加载期已拒
60
+ * authorization/x-api-key(FORBIDDEN_HEADER_KEYS),resolvePersonaHeaders
61
+ * 会防御性跳过它们——本函数只对这条"静默丢弃"补一次性告知,跳过行为
62
+ * 零变化。首命中即止(guard 本身一进程一行)。 */
63
+ function noticeReservedCredentialHeadersIn(p, protocol, label) {
64
+ if (!p.layers.headers)
65
+ return;
66
+ const map = p.definition.headers?.[protocol];
67
+ if (map === undefined)
68
+ return;
69
+ for (const k of Object.keys(map)) {
70
+ if (RESERVED_CREDENTIAL_HEADER_KEYS.has(k.toLowerCase())) {
71
+ noticeReservedCredentialHeader(k, label);
72
+ return;
73
+ }
74
+ }
75
+ }
76
+ /** 适配器 fetch 入口的统一缝:读 runtime.current,产出该协议层1/2。无 persona / 两层全关 / 该协议未定义 → null。
77
+ * ω99-50:可选 `label`(provider 名,适配器传 config.provider)只用于错误/警告
78
+ * 指名;缺省回退 persona id。persona 是逐请求可换的(适配器刻意不在工厂期
79
+ * 缓存 runtime.current),所以加载期校验挂在本缝——fetch 字节发出前、5 触点
80
+ * 的唯一上游。合法 header 走 assert 直通(零字节变化);坏名字/坏值在此抛
81
+ * HeaderValidationError(typed,两梯快速失败),不等到 undici 的匿名 TypeError。 */
82
+ export function applyWirePersona(runtime, protocol, label) {
83
+ if (runtime === undefined)
84
+ return null;
85
+ const p = runtime.current;
86
+ if (p === null || p === undefined)
87
+ return null;
88
+ const who = label !== undefined && label !== "" ? `provider "${label}"` : `persona "${p.definition.id}"`;
89
+ const headers = resolvePersonaHeaders(p, protocol, runtime.slots);
90
+ assertValidHeaders(headers, who);
91
+ noticeReservedCredentialHeadersIn(p, protocol, who);
92
+ const overlayRaw = p.layers.body ? p.definition.body?.[protocol] : undefined;
93
+ const overlay = overlayRaw !== undefined ? whitelistedOverlay(protocol, overlayRaw) : undefined;
94
+ if (Object.keys(headers).length === 0 && overlay === undefined)
95
+ return null;
96
+ return { headers, bodyOverlay: overlay };
97
+ }
98
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/persona/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAE9H,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAA0B;IACvE,OAAO,KAAK,CAAC,OAAO,CAAC,mCAAmC,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,EAAE;QAC7E,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;YAC1G,CAAC;YACD,OAAO,KAAK,CAAC,SAAS,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,OAAwB,EAAE,QAAoB,EAAE,KAA0B;IAC9G,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACzD,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAAoC,IAAO,EAAE,OAA4C;IACvH,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC;YACJ,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjE,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtD,CAAC,CAAC,EAAE,GAAI,IAAgC,EAAE,GAAI,CAA6B,EAAE;gBAC7E,CAAC,CAAC,CAAC,CAAC;IACV,CAAC;IACD,OAAO,GAAQ,CAAC;AAClB,CAAC;AAOD;;;sCAGsC;AACtC,SAAS,kBAAkB,CAAC,QAAoB,EAAE,OAAgC;IAChF,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED;;;gCAGgC;AAChC,SAAS,iCAAiC,CAAC,CAAkB,EAAE,QAAoB,EAAE,KAAa;IAChG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,+BAA+B,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACzD,8BAA8B,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;oEAKoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,OAAmC,EAAE,QAAoB,EAAE,KAAc;IACxG,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,GAAG,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;IACzG,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjC,iCAAiC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,OAAO,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PersonaDefinition } from "./types.js";
2
+ export declare const BUILTIN_PERSONAS: readonly PersonaDefinition[];
3
+ //# sourceMappingURL=builtins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/persona/builtins.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,gBAAgB,EAAE,SAAS,iBAAiB,EAuLxD,CAAC"}
@@ -0,0 +1,180 @@
1
+ export const BUILTIN_PERSONAS = [
2
+ {
3
+ // doc90 §1 (anthropic-protocol reference snapshot, 2026-08)
4
+ id: "anthropic-cli",
5
+ displayName: "Anthropic CLI",
6
+ source: {
7
+ kind: "workspace-source",
8
+ provenance: "doc90 §1 (the anthropic-protocol reference source): headers http.ts:34 + services/api/client.ts:106-108; betas constants/betas.ts:3; prompt constants/system.ts:10. Anthropic Messages protocol only — openai-chat/responses undefined ⇒ byte-identical on those wires.",
9
+ pinnedVersion: "reference snapshot a8a678cb (2026-08); upstream client 2.1.88",
10
+ },
11
+ confidence: "byte-verified",
12
+ headers: {
13
+ anthropic: {
14
+ // 恒发 (SDK defaultHeaders). doc90 §1.1 rows 1/3.
15
+ // doc90 §1.1: utils/http.ts:34 getUserAgent() — 求值形 (pinned build):
16
+ // ${MACRO.VERSION}→钉定 npm 2.1.88; USER_TYPE→external (npm 发行,'ant' 为
17
+ // Anthropic 员工环境); 入口缺省 cli; agent-sdk/client-app/workload 后缀在
18
+ // 普通 CLI 运行下为空。模板原文会把未解析的 ${…} 发上线 — 按 UA 白名单
19
+ // 认编程工具的供应商直接拒收 (用户反馈 2026-08-31, kimi 后台显示模板原文),
20
+ // persona 等于不可用,故钉定求值常量。
21
+ "user-agent": "wudao-harness/2.1.88 (external, cli)",
22
+ "anthropic-version": "2023-06-01", // doc90 §1.1: 恒发, codeSessionApi.ts:16 等
23
+ "x-app": "cli", // doc90 §1.1: client.ts:106, 恒发
24
+ "X-Claude-Code-Session-Id": "{{sessionId}}", // doc90 §1.1: client.ts:108, 会话 UUID 恒发
25
+ "anthropic-beta": "claude-code-20250219", // doc90 §1.1 beta 表: 非 haiku 模型恒发 (betas.ts:3); 其余 beta 均条件发,不编码
26
+ },
27
+ // Conditional rows omitted: x-claude-remote-container-id / -remote-session-id /
28
+ // x-client-app / x-anthropic-additional-protection / x-client-request-id, and the
29
+ // model/identity-conditional betas (doc90 §1.1). Authorization / x-api-key are
30
+ // auth headers — never persona-controlled (schema). The x-anthropic-billing-header
31
+ // row is a system-prompt first block, NOT an HTTP header (doc90 §1.3), and its
32
+ // fingerprint component is unpinned ⇒ not transcribed.
33
+ },
34
+ // body: none. doc90 §1.2 rows are wire-mechanical (stream/model/messages/system/
35
+ // tools), runtime-valued (max_tokens), identity-bound (metadata.user_id) or
36
+ // conditional (temperature 仅 thinking 禁用; thinking 仅模型支持且未禁用 — and a
37
+ // partial `thinking` overlay would one-level-merge into an invalid hybrid).
38
+ prompt: {
39
+ system: {
40
+ mode: "prefix", // billing 首块与各 section 未整体钉定,prefix 携带字节稳定头部
41
+ text: "You are Anthropic CLI, Anthropic's official CLI agent.", // doc90 §1.3: constants/system.ts:10 (交互主前缀)
42
+ },
43
+ },
44
+ },
45
+ {
46
+ // doc90 §2 (responses-protocol reference clone @ 51ebf5b1)
47
+ id: "openai-responses",
48
+ displayName: "OpenAI Responses",
49
+ source: {
50
+ kind: "workspace-source",
51
+ provenance: "doc90 §2 (responses-protocol reference): originator (auth default client); session-id (request headers); store (client); instructions (base prompts). OpenAI Responses protocol only.",
52
+ pinnedVersion: "responses-protocol reference HEAD 51ebf5b1 (2026-08-21); version 0.0.0 (rolling dev)",
53
+ },
54
+ confidence: "byte-verified",
55
+ headers: {
56
+ responses: {
57
+ originator: "wudao_harness", // doc90 §2.1: DEFAULT_ORIGINATOR (default_client.rs:40), 进程级 default_headers 恒发
58
+ "session-id": "{{sessionId}}", // doc90 §2.1: build_session_headers (headers.rs:5-13), Responses 请求恒发 — 连字符头名,brief 草图的 session_id 以 doc90+源码为准
59
+ // doc90 §2.1: the originator user-agent builder (default client) — 求值形:
60
+ // originator/version 用钉定值 (workspace 0.0.0); os/arch/terminal 段为运行
61
+ // 机器值 (os_info::os_type()/version()/architecture() + terminal-detection
62
+ // user_agent_token),无 slot 可解析 — 钉定为常见 macOS/Apple Silicon 形
63
+ // ("Mac OS"/arm64 即 os_info 在 macOS 的取值,Apple_Terminal 为终端名回退
64
+ // token 形)。原模板 ${…} 占位与 anthropic-cli UA 同病:按 UA 认工具的供应商
65
+ // 拒收 (2026-08-31),求值常量才可上线。
66
+ "User-Agent": "wudao_harness/0.0.0 (Mac OS 15.5; arm64) Apple_Terminal",
67
+ },
68
+ // Omitted: thread-id (no v1 slot), installation-id / beta-features /
69
+ // turn-state / routing-hint, attestation, residency / responses-lite —
70
+ // all conditional or runtime-valued (doc90 §2.1).
71
+ },
72
+ body: {
73
+ responses: {
74
+ store: false, // doc90 §2.2: 恒发 (core/src/client.rs:946)
75
+ // reasoning 恒发但其字段 (effort/summary/context) 均配置决定,值未钉定 ⇒ 不写。
76
+ // instructions 走 prompt 层(见下),不作为 body 常量。
77
+ },
78
+ },
79
+ prompt: {
80
+ system: {
81
+ mode: "prefix", // default.md 仅钉定开头段("+能力清单等"未转录),snapshot 会断言不完整文本
82
+ text: "You are a coding agent running in a terminal-based coding assistant powered by the OpenAI Responses API. You are expected to be precise, safe, and helpful.", // doc90 §2.3: base_instructions/default.md:1
83
+ },
84
+ },
85
+ },
86
+ {
87
+ // doc90 §5 (closed-source; community reverse engineering read 2026-08-23)
88
+ id: "cursor",
89
+ displayName: "Cursor",
90
+ source: {
91
+ kind: "external-research",
92
+ provenance: "doc90 §5 (community-reverse-engineered; sources S1 eisbaw/cursor_api_demo, S2 dcrebbin/cursor-unchained, S3 xwartz/cursor-api, read 2026-08-23). Headers: only the S1+S2(+S3) cross-confirmed, non-auth subset; 12 single-source-flagged rows (x-client-key, x-ghost-mode, x-cursor-config-version, x-cursor-timezone, client os/arch/os-version triple, x-cursor-client-device-type, x-new-onboarding-completed, x-amzn-trace-id, x-conversation-id, x-cursor-streaming, user-agent connect-es/1.6.1, connect-content-encoding) intentionally omitted — schema has no per-header single-source flag. x-cursor-checksum needs machine identity (no slot); content-type application/connect+proto would corrupt an openai-chat JSON wire. Wire is Connect-RPC/protobuf (doc90 使用注意 #1) — placed under openai-chat as the nearest supported protocol; body/prompt not mappable, prompt 未定 (doc90 §5.3).",
93
+ pinnedVersion: "closed-source; community reverse-engineering read 2026-08-23; target Cursor IDE v2.6.22 (per doc90 钉定版本表)",
94
+ },
95
+ confidence: "community-reverse-engineered",
96
+ headers: {
97
+ "openai-chat": {
98
+ "connect-protocol-version": "1", // doc90 §5.1: S1+S2
99
+ "connect-accept-encoding": "gzip", // doc90 §5.1: S1+S2
100
+ "x-cursor-client-version": "2.6.22", // doc90 §5.1 (S1+S2) + 钉定版本表: 逆向目标 v2.6.22
101
+ "x-cursor-client-type": "ide", // doc90 §5.1: S1+S2
102
+ "x-session-id": "{{sessionId}}", // doc90 §5.1: S1+S2 (会话 id)
103
+ "x-request-id": "{{uuid}}", // doc90 §5.1: S1+S2 (随机 UUID)
104
+ },
105
+ },
106
+ // no body (protobuf transport, nothing mappable) and NO prompt (doc90 §5.3: 未定 — never guess)
107
+ },
108
+ {
109
+ // doc90 §4 (multi-protocol reference snapshot 2026-08) — multi-protocol
110
+ id: "multi-wire",
111
+ displayName: "multi-wire",
112
+ source: {
113
+ kind: "workspace-source",
114
+ provenance: "doc90 §4 (the multi-protocol reference): session headers core/src/session/runner/llm.ts:209-211 (每个 LLM 请求恒发,协议无关); anthropic-beta core/src/plugin/provider/anthropic.ts:13-14; store=false packages/llm/src/protocols/openai-responses.ts:990-991,1017-1019 (route 级默认); prompt core/src/plugin/agent.ts:12-13 (BUILD_SYSTEM).",
115
+ pinnedVersion: "multi-protocol reference snapshot 3a31c4ea (2026-08-22)",
116
+ },
117
+ confidence: "byte-verified",
118
+ headers: {
119
+ anthropic: {
120
+ "anthropic-beta": "interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14", // doc90 §4.1: @ai-sdk/anthropic provider 恒发
121
+ "x-session-affinity": "{{sessionId}}", // doc90 §4.1: llm.ts:209
122
+ "X-Session-Id": "{{sessionId}}", // doc90 §4.1: llm.ts:210
123
+ },
124
+ responses: {
125
+ "x-session-affinity": "{{sessionId}}", // doc90 §4.1: 协议无关恒发
126
+ "X-Session-Id": "{{sessionId}}",
127
+ },
128
+ "openai-chat": {
129
+ "x-session-affinity": "{{sessionId}}", // doc90 §4.1: 协议无关恒发
130
+ "X-Session-Id": "{{sessionId}}",
131
+ },
132
+ // Omitted: x-parent-session-id (仅子会话), User-Agent rows (OAuth/metadata/plugin
133
+ // 路径,非 LLM chat 请求路径), provider 级配置驱动头 (doc90 §4.1)。
134
+ },
135
+ body: {
136
+ responses: {
137
+ store: false, // doc90 §4.2: openai-responses 两条 route 的恒定默认
138
+ // openai-chat 的 reasoningEffort 'medium' 未编码: 源码中为 gpt-5 模型族门控
139
+ // (openai-options.ts:48-51),非该协议无条件默认 — 静态 persona 常量会偏离
140
+ // 真实客户端行为。promptCacheKey 不在 v1 responses 白名单。
141
+ },
142
+ },
143
+ prompt: {
144
+ system: {
145
+ mode: "prefix", // 组装序 [agent.system, baseline] (llm.ts:221-226): agent 段领头
146
+ text: "You are an AI coding agent. Help the user accomplish software engineering tasks by inspecting the workspace, making targeted changes, and using tools according to the configured permissions.", // doc90 §4.3: BUILD_SYSTEM (agent.ts:12-13)
147
+ },
148
+ },
149
+ },
150
+ {
151
+ // doc90 §3 (openai-chat reference @ b150a551, snapshot 2026-08)
152
+ id: "deepseek-native",
153
+ displayName: "DeepSeek Native",
154
+ source: {
155
+ kind: "workspace-source",
156
+ provenance: "doc90 §3 (openai-chat reference): attribution user-agent (版本取自包清单); session 头 (llm adapter); 身份段 system-prompt index.ts:358-363 (harness:identity, order -100). OpenAI 兼容 chat-completions 协议 (relay 场景)。",
157
+ pinnedVersion: "openai-chat reference snapshot b150a551 (2026-08)",
158
+ },
159
+ confidence: "byte-verified",
160
+ headers: {
161
+ "openai-chat": {
162
+ "user-agent": "wudao-harness/0.4.20 (+https://github.com/feiniaojin/wudao-harness-opensource)", // doc90 §3.1: attribution 恒发不可关闭; 版本=本 harness 版本
163
+ "x-deepseek-harness-session-id": "{{sessionId}}", // doc90 §3.1: adapter.ts:526-528 (sessionId 存在时; v1 槽位语义=必须提供,见 task-4 report)
164
+ // Omitted: authorization (auth — schema 拒绝), content-type/accept (传输机械头,
165
+ // 适配器自管), x-deepseek-harness-user-id (稳定匿名用户 id,无忠实槽位 — {{uuid}}
166
+ // 为逐请求随机,语义不符), x-deepseek-harness-compact (仅 compaction)。
167
+ },
168
+ },
169
+ // no body: thinking (§3.2 该参考的签名开关) 不在 v1 openai-chat 白名单 — 冲突已披露,
170
+ // 不强行写入; reasoning_effort 值(low/high/max)配置驱动未钉定; temperature/max_tokens/
171
+ // stop 为透传可选。
172
+ prompt: {
173
+ system: {
174
+ mode: "prefix", // harness:identity order -100 = system 首段
175
+ text: "You are an AI agent powered by wudao-harness.", // doc90 §3.3: index.ts:361
176
+ },
177
+ },
178
+ },
179
+ ];
180
+ //# sourceMappingURL=builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/persona/builtins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ModelClient } from "@wudao-org/core";
2
+ import type { PersonaRuntime } from "./runtime.js";
3
+ export declare function withPersona(client: ModelClient, runtime: PersonaRuntime): ModelClient;
4
+ //# sourceMappingURL=decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/persona/decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,WAAW,EAAc,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgFnD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,WAAW,CAyBrF"}
@@ -0,0 +1,112 @@
1
+ function invertMap(map) {
2
+ const out = {};
3
+ for (const [from, to] of Object.entries(map))
4
+ out[to] = from;
5
+ return out;
6
+ }
7
+ /** Final-review I2:映射显示名 ∩ 未映射的在册工具名 ≠ ∅ → fail-closed。
8
+ * 这种冲突会把两个同名工具送上 wire,且入向逆映射会把模型对真
9
+ * `bash` 的调用翻译成 `read_file`——用 bash 的参数执行错工具。在任
10
+ * 何 wire 效果之前抛出(transformInput 在 client 调用之前求值),
11
+ * 报错点名 persona id 与冲突双方。schema 已查显示名互相重复
12
+ * (schema.ts checkPrompt)——这里补的是对在册清单的交叉检查。 */
13
+ function assertNoDisplayCollision(personaId, map, input) {
14
+ const mapped = new Set(Object.values(map));
15
+ const hits = [];
16
+ for (const t of input.tools) {
17
+ if (map[t.name] === undefined && mapped.has(t.name))
18
+ hits.push(t.name);
19
+ }
20
+ if (hits.length === 0)
21
+ return;
22
+ const detail = hits
23
+ .map((n) => {
24
+ const from = Object.entries(map).find(([, to]) => to === n)?.[0];
25
+ return `"${n}" is both the display name of "${from ?? "?"}" and a live unmapped tool name`;
26
+ })
27
+ .join("; ");
28
+ throw new Error(`persona "${personaId}" prompt.toolNameMap: display-name collision — ${detail}; two same-named tools would reach the wire and the inbound reverse map would execute the wrong tool`);
29
+ }
30
+ /** 出向:system 快照/前缀 + 工具名映射(tools 定义与 tool 消息都改)。永不改写原对象。 */
31
+ function transformInput(personaId, style, input) {
32
+ let systemPrompt = input.systemPrompt;
33
+ if (style.system?.mode === "snapshot")
34
+ systemPrompt = style.system.text;
35
+ else if (style.system?.mode === "prefix")
36
+ systemPrompt = style.system.text + input.systemPrompt;
37
+ const map = style.toolNameMap;
38
+ if (map === undefined || Object.keys(map).length === 0) {
39
+ return systemPrompt === input.systemPrompt ? input : { ...input, systemPrompt };
40
+ }
41
+ assertNoDisplayCollision(personaId, map, input);
42
+ const tools = input.tools.map((t) => {
43
+ const n = map[t.name];
44
+ return n !== undefined ? { ...t, name: n } : t;
45
+ });
46
+ const messages = input.messages.map((m) => {
47
+ if (m.role === "tool") {
48
+ const n = map[m.name];
49
+ if (n !== undefined)
50
+ return { ...m, name: n };
51
+ }
52
+ if (m.role === "assistant" && m.toolCalls !== undefined && m.toolCalls.length > 0) {
53
+ // Multi-turn: assistant history toolCalls need renaming too (fix round 1)
54
+ return {
55
+ ...m,
56
+ toolCalls: m.toolCalls.map((tc) => {
57
+ const n = map[tc.name];
58
+ return n !== undefined ? { ...tc, name: n } : tc;
59
+ }),
60
+ };
61
+ }
62
+ return m;
63
+ });
64
+ return { ...input, systemPrompt, tools, messages };
65
+ }
66
+ /** 入向:响应 tool_calls 的显示名逆映射回我们的原名(core loop 只认原名)。 */
67
+ function reverseMessage(style, msg) {
68
+ if (style.toolNameMap === undefined || msg.toolCalls === undefined || msg.toolCalls.length === 0)
69
+ return msg;
70
+ const rev = invertMap(style.toolNameMap);
71
+ return {
72
+ ...msg,
73
+ toolCalls: msg.toolCalls.map((tc) => {
74
+ const n = rev[tc.name];
75
+ return n !== undefined ? { ...tc, name: n } : tc;
76
+ }),
77
+ };
78
+ }
79
+ export function withPersona(client, runtime) {
80
+ const activeStyle = () => {
81
+ const p = runtime.current;
82
+ if (p === null || !p.layers.prompt || p.definition.prompt === undefined)
83
+ return null;
84
+ return { id: p.definition.id, style: p.definition.prompt };
85
+ };
86
+ const wrapped = {
87
+ ...(client.modelId !== undefined ? { modelId: client.modelId } : {}),
88
+ async generate(input) {
89
+ const a = activeStyle();
90
+ if (a === null)
91
+ return client.generate(input);
92
+ return reverseMessage(a.style, await client.generate(transformInput(a.id, a.style, input)));
93
+ },
94
+ };
95
+ if (client.stream !== undefined) {
96
+ wrapped.stream = async function* (input) {
97
+ const a = activeStyle();
98
+ if (a === null) {
99
+ yield* client.stream(input);
100
+ return;
101
+ }
102
+ for await (const ev of client.stream(transformInput(a.id, a.style, input))) {
103
+ if (ev.type === "done")
104
+ yield { type: "done", message: reverseMessage(a.style, ev.message) };
105
+ else
106
+ yield ev;
107
+ }
108
+ };
109
+ }
110
+ return wrapped;
111
+ }
112
+ //# sourceMappingURL=decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorator.js","sourceRoot":"","sources":["../../src/persona/decorator.ts"],"names":[],"mappings":"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"}