@jsonstudio/llms 0.6.2979 → 0.6.3238

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 (246) hide show
  1. package/dist/conversion/args-mapping.js +8 -0
  2. package/dist/conversion/{shared/bridge-actions.js → bridge-actions.js} +2 -1
  3. package/dist/conversion/{shared/bridge-id-utils.js → bridge-id-utils.js} +1 -1
  4. package/dist/conversion/{shared/bridge-instructions.js → bridge-instructions.js} +1 -1
  5. package/dist/conversion/{shared/bridge-message-utils.d.ts → bridge-message-utils.d.ts} +1 -1
  6. package/dist/conversion/{shared/bridge-message-utils.js → bridge-message-utils.js} +5 -149
  7. package/dist/conversion/{shared/bridge-metadata.js → bridge-metadata.js} +1 -1
  8. package/dist/conversion/{shared/bridge-policies.js → bridge-policies.js} +1 -1
  9. package/dist/conversion/codecs/gemini-openai-codec.js +27 -8
  10. package/dist/conversion/codecs/responses-openai-codec.js +1 -1
  11. package/dist/conversion/{shared/compaction-detect.d.ts → compaction-detect.d.ts} +1 -1
  12. package/dist/conversion/compaction-detect.js +4 -0
  13. package/dist/conversion/compat/actions/apply-patch-fixer.js +2 -2
  14. package/dist/conversion/compat/actions/deepseek-web-response.d.ts +0 -1
  15. package/dist/conversion/compat/actions/deepseek-web-response.js +15 -405
  16. package/dist/conversion/compat/actions/harvest-tool-calls-from-text.js +1 -1
  17. package/dist/conversion/compat/actions/lmstudio-responses-fc-ids.js +1 -1
  18. package/dist/conversion/compat/actions/qwen-transform.js +74 -2
  19. package/dist/conversion/compat/actions/snapshot.js +1 -1
  20. package/dist/conversion/compat/antigravity-session-signature.js +36 -0
  21. package/dist/conversion/compat/profiles/chat-deepseek-web.json +0 -22
  22. package/dist/conversion/compat/profiles/chat-glm.json +251 -72
  23. package/dist/conversion/compat/profiles/chat-iflow.json +174 -39
  24. package/dist/conversion/compat/profiles/chat-lmstudio.json +43 -14
  25. package/dist/conversion/hub/operation-table/operation-table-runner.js +2 -2
  26. package/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper.js +1 -1
  27. package/dist/conversion/hub/operation-table/semantic-mappers/archive/chat-mapper.archive.d.ts +8 -0
  28. package/dist/conversion/hub/operation-table/semantic-mappers/archive/chat-mapper.archive.js +404 -0
  29. package/dist/conversion/hub/operation-table/semantic-mappers/chat-mapper.js +5 -381
  30. package/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper.js +2 -2
  31. package/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.js +2 -8
  32. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +1 -0
  33. package/dist/conversion/hub/pipeline/hub-pipeline.js +50 -3
  34. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.d.ts +1 -1
  35. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.js +62 -0
  36. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage2_route_select/index.js +3 -1
  37. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/index.js +1 -1
  38. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.d.ts +1 -1
  39. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.js +42 -29
  40. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage2_finalize/index.js +12 -0
  41. package/dist/conversion/hub/policy/protocol-spec.js +1 -1
  42. package/dist/conversion/hub/process/chat-process-clock-reminders.js +1 -1
  43. package/dist/conversion/hub/process/chat-process-clock-tools.js +1 -1
  44. package/dist/conversion/hub/process/chat-process-continue-execution.js +1 -1
  45. package/dist/conversion/hub/process/chat-process-servertool-orchestration.js +1 -1
  46. package/dist/conversion/hub/process/chat-process-web-search.js +1 -1
  47. package/dist/conversion/hub/response/provider-response.js +14 -5
  48. package/dist/conversion/hub/response/response-mappers.js +23 -1
  49. package/dist/conversion/hub/response/response-runtime.js +28 -5
  50. package/dist/conversion/hub/snapshot-recorder.js +3 -92
  51. package/dist/conversion/hub/tool-governance/engine.d.ts +8 -0
  52. package/dist/conversion/hub/tool-governance/engine.js +40 -193
  53. package/dist/conversion/hub/tool-governance/rules.js +73 -69
  54. package/dist/conversion/hub/tool-surface/tool-surface-engine.js +1 -1
  55. package/dist/conversion/index.d.ts +1 -2
  56. package/dist/conversion/index.js +1 -2
  57. package/dist/conversion/{shared/jsonish.js → jsonish.js} +1 -1
  58. package/dist/conversion/{shared/mcp-injection.js → mcp-injection.js} +1 -1
  59. package/dist/conversion/media.js +4 -0
  60. package/dist/conversion/{shared/metadata-passthrough.d.ts → metadata-passthrough.d.ts} +1 -1
  61. package/dist/conversion/{shared/metadata-passthrough.js → metadata-passthrough.js} +2 -2
  62. package/dist/conversion/payload-budget.js +47 -0
  63. package/dist/conversion/protocol-field-allowlists.d.ts +7 -0
  64. package/dist/conversion/protocol-field-allowlists.js +9 -0
  65. package/dist/conversion/{shared/protocol-state.d.ts → protocol-state.d.ts} +2 -2
  66. package/dist/conversion/{shared/protocol-state.js → protocol-state.js} +2 -2
  67. package/dist/conversion/{shared/errors.d.ts → provider-protocol-error.d.ts} +0 -3
  68. package/dist/conversion/provider-protocol-error.js +25 -0
  69. package/dist/conversion/responses/responses-openai-bridge/response-payload.js +8 -5
  70. package/dist/conversion/responses/responses-openai-bridge/types.d.ts +1 -1
  71. package/dist/conversion/responses/responses-openai-bridge.d.ts +1 -1
  72. package/dist/conversion/responses/responses-openai-bridge.js +43 -10
  73. package/dist/conversion/{shared/runtime-metadata.d.ts → runtime-metadata.d.ts} +1 -1
  74. package/dist/conversion/{shared/runtime-metadata.js → runtime-metadata.js} +2 -2
  75. package/dist/conversion/shared/anthropic-message-utils.js +19 -8
  76. package/dist/conversion/shared/chat-request-filters.d.ts +3 -4
  77. package/dist/conversion/shared/chat-request-filters.js +22 -78
  78. package/dist/conversion/shared/gemini-tool-utils.d.ts +1 -1
  79. package/dist/conversion/shared/openai-finalizer.js +1 -0
  80. package/dist/conversion/shared/openai-message-normalize.js +2 -2
  81. package/dist/conversion/shared/reasoning-normalizer.js +6 -0
  82. package/dist/conversion/shared/reasoning-utils.js +5 -2
  83. package/dist/conversion/shared/responses-conversation-store.js +1 -1
  84. package/dist/conversion/shared/responses-output-builder.js +55 -11
  85. package/dist/conversion/shared/responses-reasoning-registry.d.ts +14 -2
  86. package/dist/conversion/shared/responses-reasoning-registry.js +34 -6
  87. package/dist/conversion/shared/responses-response-utils.js +99 -9
  88. package/dist/conversion/shared/responses-tool-utils.js +1 -1
  89. package/dist/conversion/shared/text-markup-normalizer/normalize.d.ts +1 -1
  90. package/dist/conversion/shared/text-markup-normalizer.d.ts +2 -2
  91. package/dist/conversion/shared/text-markup-normalizer.js +1 -1
  92. package/dist/conversion/shared/tool-filter-pipeline.js +1 -1
  93. package/dist/conversion/shared/tool-governor.js +3 -3
  94. package/dist/conversion/shared/tool-mapping.d.ts +1 -1
  95. package/dist/conversion/{shared/snapshot-utils.d.ts → snapshot-utils.d.ts} +11 -0
  96. package/dist/conversion/{shared/snapshot-utils.js → snapshot-utils.js} +14 -23
  97. package/dist/conversion/types/text-markup-normalizer.d.ts +13 -0
  98. package/dist/conversion/types/text-markup-normalizer.js +1 -0
  99. package/dist/filters/special/request-tools-normalize.js +1 -1
  100. package/dist/filters/special/response-tool-text-canonicalize.js +2 -2
  101. package/dist/native/router_hotpath_napi.node +0 -0
  102. package/dist/quota/quota-manager.js +31 -59
  103. package/dist/quota/quota-state.js +14 -7
  104. package/dist/router/virtual-router/bootstrap/profile-builder.d.ts +1 -0
  105. package/dist/router/virtual-router/bootstrap/profile-builder.js +13 -0
  106. package/dist/router/virtual-router/bootstrap/provider-normalization.d.ts +2 -0
  107. package/dist/router/virtual-router/bootstrap/provider-normalization.js +4 -1
  108. package/dist/router/virtual-router/bootstrap/streaming-helpers.d.ts +7 -0
  109. package/dist/router/virtual-router/bootstrap/streaming-helpers.js +44 -0
  110. package/dist/router/virtual-router/bootstrap.js +2 -0
  111. package/dist/router/virtual-router/engine/routing-state/store.d.ts +1 -2
  112. package/dist/router/virtual-router/engine/routing-state/store.js +2 -2
  113. package/dist/router/virtual-router/engine-legacy/config.d.ts +11 -0
  114. package/dist/router/virtual-router/engine-legacy/config.js +108 -0
  115. package/dist/router/virtual-router/engine-legacy/direct-model.d.ts +10 -0
  116. package/dist/router/virtual-router/engine-legacy/direct-model.js +38 -0
  117. package/dist/router/virtual-router/engine-legacy/health.d.ts +13 -0
  118. package/dist/router/virtual-router/engine-legacy/health.js +104 -0
  119. package/dist/router/virtual-router/engine-legacy/helpers.d.ts +16 -0
  120. package/dist/router/virtual-router/engine-legacy/helpers.js +226 -0
  121. package/dist/router/virtual-router/engine-legacy/route-finalize.d.ts +9 -0
  122. package/dist/router/virtual-router/engine-legacy/route-finalize.js +84 -0
  123. package/dist/router/virtual-router/engine-legacy/route-selection.d.ts +17 -0
  124. package/dist/router/virtual-router/engine-legacy/route-selection.js +205 -0
  125. package/dist/router/virtual-router/engine-legacy/route-state-allowlist.d.ts +3 -0
  126. package/dist/router/virtual-router/engine-legacy/route-state-allowlist.js +36 -0
  127. package/dist/router/virtual-router/engine-legacy/route-state.d.ts +12 -0
  128. package/dist/router/virtual-router/engine-legacy/route-state.js +386 -0
  129. package/dist/router/virtual-router/engine-legacy/route-utils.d.ts +19 -0
  130. package/dist/router/virtual-router/engine-legacy/route-utils.js +212 -0
  131. package/dist/router/virtual-router/engine-legacy/routing.d.ts +8 -0
  132. package/dist/router/virtual-router/engine-legacy/routing.js +8 -0
  133. package/dist/router/virtual-router/engine-legacy/selection-core.d.ts +28 -0
  134. package/dist/router/virtual-router/engine-legacy/selection-core.js +112 -0
  135. package/dist/router/virtual-router/engine-legacy/selection-state.d.ts +16 -0
  136. package/dist/router/virtual-router/engine-legacy/selection-state.js +187 -0
  137. package/dist/router/virtual-router/engine-legacy/state-accessors.d.ts +21 -0
  138. package/dist/router/virtual-router/engine-legacy/state-accessors.js +118 -0
  139. package/dist/router/virtual-router/engine-legacy.d.ts +123 -0
  140. package/dist/router/virtual-router/engine-legacy.js +194 -0
  141. package/dist/router/virtual-router/engine-logging.d.ts +2 -0
  142. package/dist/router/virtual-router/engine-logging.js +7 -2
  143. package/dist/router/virtual-router/engine-selection/key-parsing.js +0 -3
  144. package/dist/router/virtual-router/engine-selection/native-chat-request-filter-semantics.d.ts +1 -0
  145. package/dist/router/virtual-router/engine-selection/native-chat-request-filter-semantics.js +54 -0
  146. package/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.d.ts +10 -0
  147. package/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.js +67 -0
  148. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-governance-semantics.d.ts +30 -0
  149. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-governance-semantics.js +202 -0
  150. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-semantic-mappers.d.ts +2 -0
  151. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-semantic-mappers.js +83 -0
  152. package/dist/router/virtual-router/engine-selection/native-router-hotpath-loader.js +43 -2
  153. package/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.d.ts +75 -0
  154. package/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.js +205 -0
  155. package/dist/router/virtual-router/engine-selection/native-snapshot-hooks.d.ts +3 -0
  156. package/dist/router/virtual-router/engine-selection/native-snapshot-hooks.js +109 -0
  157. package/dist/router/virtual-router/engine-selection/native-virtual-router-engine-proxy.d.ts +16 -0
  158. package/dist/router/virtual-router/engine-selection/native-virtual-router-engine-proxy.js +14 -0
  159. package/dist/router/virtual-router/engine-selection/native-virtual-router-routing-instructions-semantics.d.ts +2 -0
  160. package/dist/router/virtual-router/engine-selection/native-virtual-router-routing-instructions-semantics.js +86 -0
  161. package/dist/router/virtual-router/engine-selection/tier-selection-quota-integration.js +100 -0
  162. package/dist/router/virtual-router/engine-selection/tier-selection-select.js +99 -0
  163. package/dist/router/virtual-router/engine.d.ts +22 -105
  164. package/dist/router/virtual-router/engine.js +274 -1641
  165. package/dist/router/virtual-router/load-balancer.d.ts +8 -0
  166. package/dist/router/virtual-router/load-balancer.js +65 -2
  167. package/dist/router/virtual-router/provider-registry.js +2 -0
  168. package/dist/router/virtual-router/routing-instructions/clean.d.ts +3 -0
  169. package/dist/router/virtual-router/routing-instructions/clean.js +34 -0
  170. package/dist/router/virtual-router/routing-instructions/parse.d.ts +18 -0
  171. package/dist/router/virtual-router/routing-instructions/parse.js +377 -0
  172. package/dist/router/virtual-router/routing-instructions/state.d.ts +4 -0
  173. package/dist/router/virtual-router/routing-instructions/state.js +245 -0
  174. package/dist/router/virtual-router/routing-instructions/types.d.ts +70 -0
  175. package/dist/router/virtual-router/routing-instructions/types.js +2 -0
  176. package/dist/router/virtual-router/routing-instructions.d.ts +5 -89
  177. package/dist/router/virtual-router/routing-instructions.js +4 -655
  178. package/dist/router/virtual-router/sticky-session-store.d.ts +4 -0
  179. package/dist/router/virtual-router/sticky-session-store.js +19 -81
  180. package/dist/router/virtual-router/tool-signals.js +21 -3
  181. package/dist/router/virtual-router/types.d.ts +4 -0
  182. package/dist/servertool/clock/session-scope.js +32 -1
  183. package/dist/servertool/engine.js +79 -8
  184. package/dist/servertool/handlers/antigravity-thought-signature-bootstrap.js +1 -1
  185. package/dist/servertool/handlers/clock-auto.js +1 -1
  186. package/dist/servertool/handlers/clock.js +1 -1
  187. package/dist/servertool/handlers/compaction-detect.d.ts +1 -1
  188. package/dist/servertool/handlers/compaction-detect.js +1 -1
  189. package/dist/servertool/handlers/gemini-empty-reply-continue.js +1 -1
  190. package/dist/servertool/handlers/iflow-model-error-retry.js +1 -1
  191. package/dist/servertool/handlers/recursive-detection-guard.js +1 -1
  192. package/dist/servertool/handlers/review.js +1 -1
  193. package/dist/servertool/handlers/stop-message-auto/iflow-followup.js +1 -1
  194. package/dist/servertool/handlers/stop-message-auto/runtime-utils.js +1 -1
  195. package/dist/servertool/handlers/stop-message-auto.js +1 -1
  196. package/dist/servertool/handlers/vision.js +1 -1
  197. package/dist/servertool/handlers/web-search.js +1 -1
  198. package/dist/servertool/reenter-backend.js +1 -1
  199. package/dist/servertool/server-side-tools.js +2 -2
  200. package/dist/servertool/stop-gateway-context.js +1 -1
  201. package/dist/servertool/stop-message-compare-context.js +1 -1
  202. package/dist/sse/json-to-sse/event-generators/responses.d.ts +4 -0
  203. package/dist/sse/json-to-sse/event-generators/responses.js +95 -1
  204. package/dist/sse/json-to-sse/sequencers/responses-sequencer.js +6 -4
  205. package/dist/sse/sse-to-json/builders/response-builder.d.ts +8 -0
  206. package/dist/sse/sse-to-json/builders/response-builder.js +162 -4
  207. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +2 -0
  208. package/dist/sse/types/responses-types.d.ts +6 -2
  209. package/dist/tools/apply-patch/structured/coercion.js +5 -0
  210. package/dist/tools/args-json.js +29 -0
  211. package/package.json +8 -5
  212. package/dist/conversion/shared/args-mapping.js +0 -77
  213. package/dist/conversion/shared/compaction-detect.js +0 -4
  214. package/dist/conversion/shared/errors.js +0 -31
  215. package/dist/conversion/shared/media.js +0 -4
  216. package/dist/conversion/shared/payload-budget.js +0 -165
  217. package/dist/conversion/shared/protocol-field-allowlists.d.ts +0 -7
  218. package/dist/conversion/shared/protocol-field-allowlists.js +0 -149
  219. package/dist/conversion/shared/snapshot-hooks.d.ts +0 -11
  220. package/dist/conversion/shared/snapshot-hooks.js +0 -503
  221. package/dist/conversion/shared/text-markup-normalizer/extractors-apply-patch.d.ts +0 -2
  222. package/dist/conversion/shared/text-markup-normalizer/extractors-apply-patch.js +0 -129
  223. package/dist/conversion/shared/text-markup-normalizer/extractors-json.d.ts +0 -4
  224. package/dist/conversion/shared/text-markup-normalizer/extractors-json.js +0 -637
  225. package/dist/conversion/shared/text-markup-normalizer/extractors-shared.d.ts +0 -21
  226. package/dist/conversion/shared/text-markup-normalizer/extractors-shared.js +0 -177
  227. package/dist/conversion/shared/text-markup-normalizer/extractors-transcript.d.ts +0 -5
  228. package/dist/conversion/shared/text-markup-normalizer/extractors-transcript.js +0 -385
  229. package/dist/conversion/shared/text-markup-normalizer/extractors-xml.d.ts +0 -10
  230. package/dist/conversion/shared/text-markup-normalizer/extractors-xml.js +0 -602
  231. package/dist/conversion/shared/text-markup-normalizer/extractors.d.ts +0 -5
  232. package/dist/conversion/shared/text-markup-normalizer/extractors.js +0 -4
  233. package/dist/conversion/shared/tool-canonicalizer.d.ts +0 -2
  234. package/dist/conversion/shared/tool-canonicalizer.js +0 -38
  235. /package/dist/conversion/{shared/args-mapping.d.ts → args-mapping.d.ts} +0 -0
  236. /package/dist/conversion/{shared/bridge-actions.d.ts → bridge-actions.d.ts} +0 -0
  237. /package/dist/conversion/{shared/bridge-id-utils.d.ts → bridge-id-utils.d.ts} +0 -0
  238. /package/dist/conversion/{shared/bridge-instructions.d.ts → bridge-instructions.d.ts} +0 -0
  239. /package/dist/conversion/{shared/bridge-metadata.d.ts → bridge-metadata.d.ts} +0 -0
  240. /package/dist/conversion/{shared/bridge-policies.d.ts → bridge-policies.d.ts} +0 -0
  241. /package/dist/conversion/{shared/jsonish.d.ts → jsonish.d.ts} +0 -0
  242. /package/dist/conversion/{shared/mcp-injection.d.ts → mcp-injection.d.ts} +0 -0
  243. /package/dist/conversion/{shared/media.d.ts → media.d.ts} +0 -0
  244. /package/dist/conversion/{shared/payload-budget.d.ts → payload-budget.d.ts} +0 -0
  245. /package/dist/conversion/{shared → types}/bridge-message-types.d.ts +0 -0
  246. /package/dist/conversion/{shared → types}/bridge-message-types.js +0 -0
@@ -0,0 +1,245 @@
1
+ import { applyStopMessageInstructionToState } from '../routing-stop-message-actions.js';
2
+ import { applyPreCommandInstructionToState, clearPreCommandState } from '../routing-pre-command-actions.js';
3
+ import { deserializeStopMessageState, serializeStopMessageState } from '../routing-stop-message-state-codec.js';
4
+ import { deserializePreCommandState, serializePreCommandState } from '../routing-pre-command-state-codec.js';
5
+ export function applyRoutingInstructions(instructions, currentState) {
6
+ const newState = {
7
+ forcedTarget: currentState.forcedTarget ? { ...currentState.forcedTarget } : undefined,
8
+ stickyTarget: currentState.stickyTarget ? { ...currentState.stickyTarget } : undefined,
9
+ preferTarget: currentState.preferTarget ? { ...currentState.preferTarget } : undefined,
10
+ allowedProviders: new Set(currentState.allowedProviders),
11
+ disabledProviders: new Set(currentState.disabledProviders),
12
+ disabledKeys: new Map(Array.from(currentState.disabledKeys.entries()).map(([k, v]) => [k, new Set(v)])),
13
+ disabledModels: new Map(Array.from(currentState.disabledModels.entries()).map(([k, v]) => [k, new Set(v)])),
14
+ stopMessageSource: currentState.stopMessageSource,
15
+ stopMessageText: currentState.stopMessageText,
16
+ stopMessageMaxRepeats: currentState.stopMessageMaxRepeats,
17
+ stopMessageUsed: currentState.stopMessageUsed,
18
+ stopMessageUpdatedAt: currentState.stopMessageUpdatedAt,
19
+ stopMessageLastUsedAt: currentState.stopMessageLastUsedAt,
20
+ stopMessageStageMode: currentState.stopMessageStageMode,
21
+ stopMessageAiMode: currentState.stopMessageAiMode,
22
+ stopMessageAiSeedPrompt: currentState.stopMessageAiSeedPrompt,
23
+ stopMessageAiHistory: Array.isArray(currentState.stopMessageAiHistory)
24
+ ? currentState.stopMessageAiHistory.map((entry) => entry && typeof entry === 'object' && !Array.isArray(entry)
25
+ ? { ...entry }
26
+ : {})
27
+ : undefined,
28
+ preCommandSource: currentState.preCommandSource,
29
+ preCommandScriptPath: currentState.preCommandScriptPath,
30
+ preCommandUpdatedAt: currentState.preCommandUpdatedAt
31
+ };
32
+ let allowReset = false;
33
+ let disableReset = false;
34
+ for (const instruction of instructions) {
35
+ switch (instruction.type) {
36
+ case 'force':
37
+ newState.forcedTarget = {
38
+ provider: instruction.provider,
39
+ keyAlias: instruction.keyAlias,
40
+ keyIndex: instruction.keyIndex,
41
+ model: instruction.model,
42
+ pathLength: instruction.pathLength,
43
+ processMode: instruction.processMode
44
+ };
45
+ // 保留 stickyTarget,允许单次 force 覆盖但不清除持久 sticky
46
+ // newState.stickyTarget = undefined;
47
+ break;
48
+ case 'sticky':
49
+ newState.stickyTarget = {
50
+ provider: instruction.provider,
51
+ keyAlias: instruction.keyAlias,
52
+ keyIndex: instruction.keyIndex,
53
+ model: instruction.model,
54
+ pathLength: instruction.pathLength,
55
+ processMode: instruction.processMode
56
+ };
57
+ newState.forcedTarget = undefined;
58
+ break;
59
+ case 'prefer':
60
+ newState.preferTarget = {
61
+ provider: instruction.provider,
62
+ keyAlias: instruction.keyAlias,
63
+ keyIndex: instruction.keyIndex,
64
+ model: instruction.model,
65
+ pathLength: instruction.pathLength,
66
+ processMode: instruction.processMode
67
+ };
68
+ newState.forcedTarget = undefined;
69
+ newState.stickyTarget = undefined;
70
+ break;
71
+ case 'allow':
72
+ if (!allowReset) {
73
+ newState.allowedProviders.clear();
74
+ allowReset = true;
75
+ }
76
+ if (instruction.provider) {
77
+ newState.allowedProviders.add(instruction.provider);
78
+ }
79
+ break;
80
+ case 'disable': {
81
+ if (!disableReset) {
82
+ newState.disabledProviders.clear();
83
+ newState.disabledKeys.clear();
84
+ newState.disabledModels.clear();
85
+ disableReset = true;
86
+ }
87
+ if (instruction.provider) {
88
+ const hasKeySpecifier = instruction.keyAlias || instruction.keyIndex !== undefined;
89
+ const hasModelSpecifier = typeof instruction.model === 'string' && instruction.model.length > 0;
90
+ if (hasKeySpecifier) {
91
+ if (!newState.disabledKeys.has(instruction.provider)) {
92
+ newState.disabledKeys.set(instruction.provider, new Set());
93
+ }
94
+ const keySet = newState.disabledKeys.get(instruction.provider);
95
+ if (instruction.keyAlias) {
96
+ keySet.add(instruction.keyAlias);
97
+ }
98
+ if (instruction.keyIndex !== undefined) {
99
+ keySet.add(instruction.keyIndex);
100
+ }
101
+ }
102
+ if (hasModelSpecifier) {
103
+ if (!newState.disabledModels.has(instruction.provider)) {
104
+ newState.disabledModels.set(instruction.provider, new Set());
105
+ }
106
+ newState.disabledModels.get(instruction.provider).add(instruction.model);
107
+ }
108
+ if (!hasKeySpecifier && !hasModelSpecifier) {
109
+ newState.disabledProviders.add(instruction.provider);
110
+ }
111
+ }
112
+ break;
113
+ }
114
+ case 'enable': {
115
+ if (instruction.provider) {
116
+ const hasKeySpecifier = instruction.keyAlias || instruction.keyIndex !== undefined;
117
+ const hasModelSpecifier = typeof instruction.model === 'string' && instruction.model.length > 0;
118
+ if (hasKeySpecifier) {
119
+ const keySet = newState.disabledKeys.get(instruction.provider);
120
+ if (keySet) {
121
+ if (instruction.keyAlias) {
122
+ keySet.delete(instruction.keyAlias);
123
+ }
124
+ if (instruction.keyIndex !== undefined) {
125
+ keySet.delete(instruction.keyIndex);
126
+ }
127
+ if (keySet.size === 0) {
128
+ newState.disabledKeys.delete(instruction.provider);
129
+ }
130
+ }
131
+ }
132
+ if (hasModelSpecifier) {
133
+ const modelSet = newState.disabledModels.get(instruction.provider);
134
+ if (modelSet) {
135
+ modelSet.delete(instruction.model);
136
+ if (modelSet.size === 0) {
137
+ newState.disabledModels.delete(instruction.provider);
138
+ }
139
+ }
140
+ }
141
+ if (!hasKeySpecifier && !hasModelSpecifier) {
142
+ newState.disabledProviders.delete(instruction.provider);
143
+ newState.disabledKeys.delete(instruction.provider);
144
+ newState.disabledModels.delete(instruction.provider);
145
+ }
146
+ }
147
+ break;
148
+ }
149
+ case 'clear':
150
+ newState.forcedTarget = undefined;
151
+ newState.stickyTarget = undefined;
152
+ newState.preferTarget = undefined;
153
+ newState.allowedProviders.clear();
154
+ newState.disabledProviders.clear();
155
+ newState.disabledKeys.clear();
156
+ newState.disabledModels.clear();
157
+ applyStopMessageInstructionToState({ type: 'stopMessageClear' }, newState);
158
+ clearPreCommandState(newState);
159
+ break;
160
+ case 'stopMessageSet':
161
+ case 'stopMessageMode':
162
+ case 'stopMessageClear':
163
+ applyStopMessageInstructionToState(instruction, newState);
164
+ break;
165
+ case 'preCommandSet':
166
+ case 'preCommandClear':
167
+ applyPreCommandInstructionToState(instruction, newState);
168
+ break;
169
+ }
170
+ }
171
+ return newState;
172
+ }
173
+ export function serializeRoutingInstructionState(state) {
174
+ return {
175
+ forcedTarget: state.forcedTarget,
176
+ stickyTarget: state.stickyTarget,
177
+ preferTarget: state.preferTarget,
178
+ allowedProviders: Array.from(state.allowedProviders),
179
+ disabledProviders: Array.from(state.disabledProviders),
180
+ disabledKeys: Array.from(state.disabledKeys.entries()).map(([provider, keys]) => ({
181
+ provider,
182
+ keys: Array.from(keys)
183
+ })),
184
+ disabledModels: Array.from(state.disabledModels.entries()).map(([provider, models]) => ({
185
+ provider,
186
+ models: Array.from(models)
187
+ })),
188
+ ...serializeStopMessageState(state),
189
+ ...serializePreCommandState(state)
190
+ };
191
+ }
192
+ export function deserializeRoutingInstructionState(data) {
193
+ const state = {
194
+ forcedTarget: undefined,
195
+ stickyTarget: undefined,
196
+ preferTarget: undefined,
197
+ allowedProviders: new Set(),
198
+ disabledProviders: new Set(),
199
+ disabledKeys: new Map(),
200
+ disabledModels: new Map(),
201
+ stopMessageText: undefined,
202
+ stopMessageSource: undefined,
203
+ stopMessageMaxRepeats: undefined,
204
+ stopMessageUsed: undefined,
205
+ stopMessageStageMode: undefined,
206
+ stopMessageAiMode: undefined,
207
+ stopMessageAiSeedPrompt: undefined,
208
+ stopMessageAiHistory: undefined,
209
+ preCommandSource: undefined,
210
+ preCommandScriptPath: undefined,
211
+ preCommandUpdatedAt: undefined
212
+ };
213
+ if (data.forcedTarget && typeof data.forcedTarget === 'object') {
214
+ state.forcedTarget = data.forcedTarget;
215
+ }
216
+ if (data.stickyTarget && typeof data.stickyTarget === 'object') {
217
+ state.stickyTarget = data.stickyTarget;
218
+ }
219
+ if (data.preferTarget && typeof data.preferTarget === 'object') {
220
+ state.preferTarget = data.preferTarget;
221
+ }
222
+ if (Array.isArray(data.allowedProviders)) {
223
+ state.allowedProviders = new Set(data.allowedProviders);
224
+ }
225
+ if (Array.isArray(data.disabledProviders)) {
226
+ state.disabledProviders = new Set(data.disabledProviders);
227
+ }
228
+ if (Array.isArray(data.disabledKeys)) {
229
+ for (const entry of data.disabledKeys) {
230
+ if (entry.provider && Array.isArray(entry.keys)) {
231
+ state.disabledKeys.set(entry.provider, new Set(entry.keys));
232
+ }
233
+ }
234
+ }
235
+ if (Array.isArray(data.disabledModels)) {
236
+ for (const entry of data.disabledModels) {
237
+ if (entry.provider && Array.isArray(entry.models)) {
238
+ state.disabledModels.set(entry.provider, new Set(entry.models));
239
+ }
240
+ }
241
+ }
242
+ deserializeStopMessageState(data, state);
243
+ deserializePreCommandState(data, state);
244
+ return state;
245
+ }
@@ -0,0 +1,70 @@
1
+ export declare const ROUTING_INSTRUCTION_MARKER_PATTERN: RegExp;
2
+ export declare const ROUTING_INSTRUCTION_MARKER_GLOBAL_PATTERN: RegExp;
3
+ export interface RoutingInstruction {
4
+ type: 'force' | 'sticky' | 'prefer' | 'disable' | 'enable' | 'clear' | 'allow' | 'stopMessageSet' | 'stopMessageMode' | 'stopMessageClear' | 'preCommandSet' | 'preCommandClear';
5
+ provider?: string;
6
+ keyAlias?: string;
7
+ keyIndex?: number;
8
+ model?: string;
9
+ pathLength?: number;
10
+ processMode?: 'chat' | 'passthrough';
11
+ stopMessageText?: string;
12
+ stopMessageMaxRepeats?: number;
13
+ stopMessageStageMode?: 'on' | 'off' | 'auto';
14
+ stopMessageAiMode?: 'on' | 'off';
15
+ stopMessageSource?: string;
16
+ /**
17
+ * True when the instruction is parsed from an older user message
18
+ * (not the latest user turn in current request).
19
+ */
20
+ fromHistoricalUserMessage?: boolean;
21
+ preCommandScriptPath?: string;
22
+ }
23
+ export interface RoutingInstructionState {
24
+ forcedTarget?: {
25
+ provider?: string;
26
+ keyAlias?: string;
27
+ keyIndex?: number;
28
+ model?: string;
29
+ pathLength?: number;
30
+ processMode?: 'chat' | 'passthrough';
31
+ };
32
+ stickyTarget?: {
33
+ provider?: string;
34
+ keyAlias?: string;
35
+ keyIndex?: number;
36
+ model?: string;
37
+ pathLength?: number;
38
+ processMode?: 'chat' | 'passthrough';
39
+ };
40
+ preferTarget?: {
41
+ provider?: string;
42
+ keyAlias?: string;
43
+ keyIndex?: number;
44
+ model?: string;
45
+ pathLength?: number;
46
+ processMode?: 'chat' | 'passthrough';
47
+ };
48
+ allowedProviders: Set<string>;
49
+ disabledProviders: Set<string>;
50
+ disabledKeys: Map<string, Set<string | number>>;
51
+ disabledModels: Map<string, Set<string>>;
52
+ /**
53
+ * Source of the current stopMessage configuration.
54
+ * - 'explicit':由用户通过 <** stopMessage:"..." **> 指令显式设置
55
+ * - 'auto':由系统基于空响应/错误自动推导(例如 Gemini 空回复)
56
+ */
57
+ stopMessageSource?: string;
58
+ stopMessageText?: string;
59
+ stopMessageMaxRepeats?: number;
60
+ stopMessageUsed?: number;
61
+ stopMessageUpdatedAt?: number;
62
+ stopMessageLastUsedAt?: number;
63
+ stopMessageStageMode?: 'on' | 'off' | 'auto';
64
+ stopMessageAiMode?: 'on' | 'off';
65
+ stopMessageAiSeedPrompt?: string;
66
+ stopMessageAiHistory?: Array<Record<string, unknown>>;
67
+ preCommandSource?: string;
68
+ preCommandScriptPath?: string;
69
+ preCommandUpdatedAt?: number;
70
+ }
@@ -0,0 +1,2 @@
1
+ export const ROUTING_INSTRUCTION_MARKER_PATTERN = /<\*\*[\s\S]*?\*\*>/;
2
+ export const ROUTING_INSTRUCTION_MARKER_GLOBAL_PATTERN = /<\*\*[\s\S]*?\*\*>/g;
@@ -1,89 +1,5 @@
1
- import type { StandardizedMessage } from '../../conversion/hub/types/standardized.js';
2
- export interface RoutingInstruction {
3
- type: 'force' | 'sticky' | 'prefer' | 'disable' | 'enable' | 'clear' | 'allow' | 'stopMessageSet' | 'stopMessageMode' | 'stopMessageClear' | 'preCommandSet' | 'preCommandClear';
4
- provider?: string;
5
- keyAlias?: string;
6
- keyIndex?: number;
7
- model?: string;
8
- pathLength?: number;
9
- processMode?: 'chat' | 'passthrough';
10
- stopMessageText?: string;
11
- stopMessageMaxRepeats?: number;
12
- stopMessageStageMode?: 'on' | 'off' | 'auto';
13
- stopMessageAiMode?: 'on' | 'off';
14
- stopMessageSource?: string;
15
- /**
16
- * True when the instruction is parsed from an older user message
17
- * (not the latest user turn in current request).
18
- */
19
- fromHistoricalUserMessage?: boolean;
20
- preCommandScriptPath?: string;
21
- }
22
- export interface RoutingInstructionState {
23
- forcedTarget?: {
24
- provider?: string;
25
- keyAlias?: string;
26
- keyIndex?: number;
27
- model?: string;
28
- pathLength?: number;
29
- processMode?: 'chat' | 'passthrough';
30
- };
31
- stickyTarget?: {
32
- provider?: string;
33
- keyAlias?: string;
34
- keyIndex?: number;
35
- model?: string;
36
- pathLength?: number;
37
- processMode?: 'chat' | 'passthrough';
38
- };
39
- preferTarget?: {
40
- provider?: string;
41
- keyAlias?: string;
42
- keyIndex?: number;
43
- model?: string;
44
- pathLength?: number;
45
- processMode?: 'chat' | 'passthrough';
46
- };
47
- allowedProviders: Set<string>;
48
- disabledProviders: Set<string>;
49
- disabledKeys: Map<string, Set<string | number>>;
50
- disabledModels: Map<string, Set<string>>;
51
- /**
52
- * Source of the current stopMessage configuration.
53
- * - 'explicit':由用户通过 <** stopMessage:"..." **> 指令显式设置
54
- * - 'auto':由系统基于空响应/错误自动推导(例如 Gemini 空回复)
55
- */
56
- stopMessageSource?: string;
57
- stopMessageText?: string;
58
- stopMessageMaxRepeats?: number;
59
- stopMessageUsed?: number;
60
- stopMessageUpdatedAt?: number;
61
- stopMessageLastUsedAt?: number;
62
- stopMessageStageMode?: 'on' | 'off' | 'auto';
63
- stopMessageAiMode?: 'on' | 'off';
64
- stopMessageAiSeedPrompt?: string;
65
- stopMessageAiHistory?: Array<Record<string, unknown>>;
66
- preCommandSource?: string;
67
- preCommandScriptPath?: string;
68
- preCommandUpdatedAt?: number;
69
- }
70
- export declare function parseRoutingInstructions(messages: StandardizedMessage[]): RoutingInstruction[];
71
- /**
72
- * 解析并预处理路由指令,优先处理 clear 指令,确保新指令能够覆盖旧状态。
73
- * 返回清理后的指令列表,移除冗余的 stopMessageSet 指令。
74
- */
75
- export declare function parseAndPreprocessRoutingInstructions(messages: StandardizedMessage[]): RoutingInstruction[];
76
- /**
77
- * 提取 clear 指令(如果存在)。用于在路由选择前优先执行清理操作。
78
- * @returns 是否存在 clear 指令
79
- */
80
- export declare function extractClearInstruction(messages: StandardizedMessage[]): boolean;
81
- /**
82
- * 提取 stopMessageClear 指令(如果存在)。
83
- * @returns 是否存在 stopMessageClear 指令
84
- */
85
- export declare function extractStopMessageClearInstruction(messages: StandardizedMessage[]): boolean;
86
- export declare function applyRoutingInstructions(instructions: RoutingInstruction[], currentState: RoutingInstructionState): RoutingInstructionState;
87
- export declare function cleanMessagesFromRoutingInstructions(messages: StandardizedMessage[]): StandardizedMessage[];
88
- export declare function serializeRoutingInstructionState(state: RoutingInstructionState): Record<string, unknown>;
89
- export declare function deserializeRoutingInstructionState(data: Record<string, unknown>): RoutingInstructionState;
1
+ export type { RoutingInstruction, RoutingInstructionState } from './routing-instructions/types.js';
2
+ export { ROUTING_INSTRUCTION_MARKER_PATTERN, ROUTING_INSTRUCTION_MARKER_GLOBAL_PATTERN } from './routing-instructions/types.js';
3
+ export { parseRoutingInstructions, parseAndPreprocessRoutingInstructions, extractClearInstruction, extractStopMessageClearInstruction } from './routing-instructions/parse.js';
4
+ export { applyRoutingInstructions, serializeRoutingInstructionState, deserializeRoutingInstructionState } from './routing-instructions/state.js';
5
+ export { cleanMessagesFromRoutingInstructions } from './routing-instructions/clean.js';