@jsonstudio/llms 0.6.2172 → 0.6.2979

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 (362) hide show
  1. package/README.md +2 -0
  2. package/dist/conversion/compat/antigravity-session-signature.js +35 -1
  3. package/dist/conversion/compat/profiles/chat-gemini-cli.json +0 -7
  4. package/dist/conversion/compat/profiles/chat-gemini.json +0 -6
  5. package/dist/conversion/hub/core/detour-registry.d.ts +2 -0
  6. package/dist/conversion/hub/core/hub-context.d.ts +3 -1
  7. package/dist/conversion/hub/core/index.d.ts +1 -0
  8. package/dist/conversion/hub/core/stage-driver.js +2 -0
  9. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.js +15 -4
  10. package/dist/conversion/hub/format-adapters/chat-format-adapter.js +15 -4
  11. package/dist/conversion/hub/format-adapters/gemini-format-adapter.js +15 -4
  12. package/dist/conversion/hub/format-adapters/responses-format-adapter.js +15 -4
  13. package/dist/conversion/hub/hub-feature.js +3 -2
  14. package/dist/conversion/hub/node-support.js +9 -4
  15. package/dist/conversion/hub/operation-table/operation-table-runner.js +10 -6
  16. package/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper.js +2 -2
  17. package/dist/conversion/hub/operation-table/semantic-mappers/chat-mapper.js +10 -10
  18. package/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper.js +4 -8
  19. package/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.js +19 -65
  20. package/dist/conversion/hub/ops/operations.js +2 -121
  21. package/dist/conversion/hub/pipeline/compat/compat-engine.js +6 -0
  22. package/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.d.ts +1 -1
  23. package/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +33 -1042
  24. package/dist/conversion/hub/pipeline/compat/compat-profile-resolver.js +2 -0
  25. package/dist/conversion/hub/pipeline/compat/compat-profile-store.js +2 -0
  26. package/dist/conversion/hub/pipeline/compat/compat-types.d.ts +14 -17
  27. package/dist/conversion/hub/pipeline/compat/native-adapter-context.d.ts +3 -0
  28. package/dist/conversion/hub/pipeline/compat/native-adapter-context.js +39 -0
  29. package/dist/conversion/hub/pipeline/hub-pipeline.js +115 -262
  30. package/dist/conversion/hub/pipeline/session-identifiers.js +6 -196
  31. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage1_format_parse/index.d.ts +1 -2
  32. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage1_format_parse/index.js +37 -1
  33. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.js +12 -86
  34. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.d.ts +14 -0
  35. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.js +24 -0
  36. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/archive/shell-like-tool-call-normalization-fallback.d.ts +2 -0
  37. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/archive/shell-like-tool-call-normalization-fallback.js +157 -0
  38. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/context-capture-orchestration.d.ts +16 -0
  39. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/context-capture-orchestration.js +29 -0
  40. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/context-factories.js +3 -1
  41. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/index.d.ts +2 -15
  42. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/index.js +8 -595
  43. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.d.ts +8 -0
  44. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.js +28 -0
  45. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-diagnostics.d.ts +2 -0
  46. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-diagnostics.js +4 -0
  47. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-snapshot.d.ts +10 -0
  48. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-snapshot.js +12 -0
  49. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage1_semantic_map/context-merge.d.ts +3 -0
  50. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage1_semantic_map/context-merge.js +30 -0
  51. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage1_semantic_map/index.js +9 -129
  52. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage2_format_build/index.d.ts +1 -4
  53. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage2_format_build/index.js +9 -26
  54. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage3_compat/index.js +32 -14
  55. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage1_tool_governance/index.d.ts +2 -2
  56. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage1_tool_governance/index.js +48 -8
  57. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage2_route_select/index.js +18 -3
  58. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/index.js +10 -198
  59. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/stream-json-sniffer.d.ts +3 -0
  60. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/stream-json-sniffer.js +81 -0
  61. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage2_format_parse/index.d.ts +1 -2
  62. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage2_format_parse/index.js +36 -1
  63. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage3_semantic_map/index.js +3 -1
  64. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.d.ts +6 -0
  65. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.js +17 -0
  66. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.d.ts +9 -0
  67. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.js +28 -0
  68. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.d.ts +1 -2
  69. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.js +14 -102
  70. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage2_sse_stream/index.js +3 -1
  71. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.js +12 -10
  72. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage2_finalize/index.js +6 -5
  73. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.d.ts +11 -1
  74. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.js +10 -32
  75. package/dist/conversion/hub/pipeline/stages/utils.js +17 -1
  76. package/dist/conversion/hub/pipeline/target-utils.js +14 -91
  77. package/dist/conversion/hub/pipelines/inbound.js +3 -1
  78. package/dist/conversion/hub/pipelines/outbound.js +2 -0
  79. package/dist/conversion/hub/policy/policy-engine.js +9 -3
  80. package/dist/conversion/hub/policy/protocol-spec.js +20 -148
  81. package/dist/conversion/hub/process/chat-process-anthropic-alias.d.ts +2 -0
  82. package/dist/conversion/hub/process/chat-process-anthropic-alias.js +36 -0
  83. package/dist/conversion/hub/process/chat-process-clock-directive-parser.d.ts +5 -0
  84. package/dist/conversion/hub/process/chat-process-clock-directive-parser.js +48 -0
  85. package/dist/conversion/hub/process/chat-process-clock-directives.d.ts +24 -0
  86. package/dist/conversion/hub/process/chat-process-clock-directives.js +98 -0
  87. package/dist/conversion/hub/process/chat-process-clock-reminder-directives.d.ts +8 -0
  88. package/dist/conversion/hub/process/chat-process-clock-reminder-directives.js +42 -0
  89. package/dist/conversion/hub/process/chat-process-clock-reminder-finalize.d.ts +14 -0
  90. package/dist/conversion/hub/process/chat-process-clock-reminder-finalize.js +10 -0
  91. package/dist/conversion/hub/process/chat-process-clock-reminder-messages.d.ts +5 -0
  92. package/dist/conversion/hub/process/chat-process-clock-reminder-messages.js +10 -0
  93. package/dist/conversion/hub/process/chat-process-clock-reminder-orchestration.d.ts +30 -0
  94. package/dist/conversion/hub/process/chat-process-clock-reminder-orchestration.js +68 -0
  95. package/dist/conversion/hub/process/chat-process-clock-reminder-time-tag.d.ts +9 -0
  96. package/dist/conversion/hub/process/chat-process-clock-reminder-time-tag.js +18 -0
  97. package/dist/conversion/hub/process/chat-process-clock-reminders.d.ts +2 -0
  98. package/dist/conversion/hub/process/chat-process-clock-reminders.js +104 -0
  99. package/dist/conversion/hub/process/chat-process-clock-tool-schemas.d.ts +3 -0
  100. package/dist/conversion/hub/process/chat-process-clock-tool-schemas.js +233 -0
  101. package/dist/conversion/hub/process/chat-process-clock-tools.d.ts +6 -0
  102. package/dist/conversion/hub/process/chat-process-clock-tools.js +41 -0
  103. package/dist/conversion/hub/process/chat-process-continue-execution.d.ts +11 -0
  104. package/dist/conversion/hub/process/chat-process-continue-execution.js +82 -0
  105. package/dist/conversion/hub/process/chat-process-governance-context.d.ts +15 -0
  106. package/dist/conversion/hub/process/chat-process-governance-context.js +7 -0
  107. package/dist/conversion/hub/process/chat-process-governance-finalize.d.ts +16 -0
  108. package/dist/conversion/hub/process/chat-process-governance-finalize.js +11 -0
  109. package/dist/conversion/hub/process/chat-process-governance-orchestration.d.ts +9 -0
  110. package/dist/conversion/hub/process/chat-process-governance-orchestration.js +47 -0
  111. package/dist/conversion/hub/process/chat-process-governed-control-ops.d.ts +8 -0
  112. package/dist/conversion/hub/process/chat-process-governed-control-ops.js +5 -0
  113. package/dist/conversion/hub/process/chat-process-governed-filter-call.d.ts +12 -0
  114. package/dist/conversion/hub/process/chat-process-governed-filter-call.js +18 -0
  115. package/dist/conversion/hub/process/chat-process-governed-merge.d.ts +8 -0
  116. package/dist/conversion/hub/process/chat-process-governed-merge.js +11 -0
  117. package/dist/conversion/hub/process/chat-process-media.d.ts +3 -0
  118. package/dist/conversion/hub/process/chat-process-media.js +18 -0
  119. package/dist/conversion/hub/process/chat-process-node-result.d.ts +23 -0
  120. package/dist/conversion/hub/process/chat-process-node-result.js +24 -0
  121. package/dist/conversion/hub/process/chat-process-pending-tool-sync.d.ts +14 -0
  122. package/dist/conversion/hub/process/chat-process-pending-tool-sync.js +52 -0
  123. package/dist/conversion/hub/process/chat-process-post-governed-normalization.d.ts +8 -0
  124. package/dist/conversion/hub/process/chat-process-post-governed-normalization.js +16 -0
  125. package/dist/conversion/hub/process/chat-process-review.d.ts +2 -0
  126. package/dist/conversion/hub/process/chat-process-review.js +8 -0
  127. package/dist/conversion/hub/process/chat-process-servertool-orchestration.d.ts +8 -0
  128. package/dist/conversion/hub/process/chat-process-servertool-orchestration.js +22 -0
  129. package/dist/conversion/hub/process/chat-process-tool-normalization.d.ts +2 -0
  130. package/dist/conversion/hub/process/chat-process-tool-normalization.js +4 -0
  131. package/dist/conversion/hub/process/chat-process-web-search-intent.d.ts +12 -0
  132. package/dist/conversion/hub/process/chat-process-web-search-intent.js +13 -0
  133. package/dist/conversion/hub/process/chat-process-web-search-tool-schema.d.ts +3 -0
  134. package/dist/conversion/hub/process/chat-process-web-search-tool-schema.js +4 -0
  135. package/dist/conversion/hub/process/chat-process-web-search.d.ts +8 -0
  136. package/dist/conversion/hub/process/chat-process-web-search.js +26 -0
  137. package/dist/conversion/hub/process/chat-process.d.ts +2 -19
  138. package/dist/conversion/hub/process/chat-process.js +12 -1701
  139. package/dist/conversion/hub/process/client-inject-readiness.d.ts +1 -0
  140. package/dist/conversion/hub/process/client-inject-readiness.js +4 -0
  141. package/dist/conversion/hub/registry.js +5 -2
  142. package/dist/conversion/hub/response/chat-response-utils.js +5 -86
  143. package/dist/conversion/hub/response/provider-response.d.ts +9 -0
  144. package/dist/conversion/hub/response/provider-response.js +6 -21
  145. package/dist/conversion/hub/response/response-mappers.js +2 -26
  146. package/dist/conversion/hub/response/response-runtime.js +2 -93
  147. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +1 -0
  148. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.js +1 -0
  149. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +1 -0
  150. package/dist/conversion/hub/semantic-mappers/chat-mapper.js +1 -0
  151. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +1 -0
  152. package/dist/conversion/hub/semantic-mappers/gemini-mapper.js +1 -0
  153. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +1 -0
  154. package/dist/conversion/hub/semantic-mappers/responses-mapper.js +1 -0
  155. package/dist/conversion/hub/snapshot-recorder.js +10 -3
  156. package/dist/conversion/hub/standardized-bridge.js +11 -288
  157. package/dist/conversion/hub/tool-governance/engine.js +5 -0
  158. package/dist/conversion/hub/tool-governance/rules.js +10 -10
  159. package/dist/conversion/hub/tool-session-compat.d.ts +2 -2
  160. package/dist/conversion/hub/tool-session-compat.js +17 -231
  161. package/dist/conversion/hub/tool-surface/tool-surface-engine.js +5 -3
  162. package/dist/conversion/responses/responses-host-policy.js +2 -12
  163. package/dist/conversion/responses/responses-openai-bridge/response-payload.js +6 -82
  164. package/dist/conversion/responses/responses-openai-bridge/types.d.ts +1 -0
  165. package/dist/conversion/responses/responses-openai-bridge.js +21 -54
  166. package/dist/conversion/shared/anthropic-message-utils.js +151 -13
  167. package/dist/conversion/shared/args-mapping.js +2 -146
  168. package/dist/conversion/shared/bridge-actions.js +203 -718
  169. package/dist/conversion/shared/bridge-id-utils.js +5 -71
  170. package/dist/conversion/shared/bridge-instructions.js +2 -1
  171. package/dist/conversion/shared/bridge-message-types.d.ts +2 -0
  172. package/dist/conversion/shared/bridge-message-utils.js +1 -2
  173. package/dist/conversion/shared/bridge-metadata.d.ts +1 -0
  174. package/dist/conversion/shared/bridge-metadata.js +4 -0
  175. package/dist/conversion/shared/bridge-policies.js +5 -189
  176. package/dist/conversion/shared/chat-envelope-validator.js +2 -126
  177. package/dist/conversion/shared/chat-output-normalizer.js +2 -54
  178. package/dist/conversion/shared/compaction-detect.js +2 -57
  179. package/dist/conversion/shared/gemini-tool-utils.js +9 -524
  180. package/dist/conversion/shared/jsonish.js +3 -160
  181. package/dist/conversion/shared/mcp-injection.js +3 -169
  182. package/dist/conversion/shared/media.js +2 -7
  183. package/dist/conversion/shared/metadata-passthrough.js +9 -46
  184. package/dist/conversion/shared/openai-finalizer.js +2 -1
  185. package/dist/conversion/shared/openai-message-normalize.js +11 -283
  186. package/dist/conversion/shared/output-content-normalizer.js +9 -112
  187. package/dist/conversion/shared/payload-budget.js +2 -85
  188. package/dist/conversion/shared/protocol-state.js +11 -7
  189. package/dist/conversion/shared/reasoning-mapping.js +2 -6
  190. package/dist/conversion/shared/reasoning-normalizer.js +4 -1
  191. package/dist/conversion/shared/reasoning-tool-normalizer.js +14 -126
  192. package/dist/conversion/shared/reasoning-tool-parser.js +4 -87
  193. package/dist/conversion/shared/reasoning-utils.js +2 -6
  194. package/dist/conversion/shared/responses-conversation-store.js +4 -82
  195. package/dist/conversion/shared/responses-output-builder.js +11 -47
  196. package/dist/conversion/shared/responses-reasoning-registry.js +7 -1
  197. package/dist/conversion/shared/responses-request-adapter.d.ts +7 -1
  198. package/dist/conversion/shared/responses-request-adapter.js +14 -1
  199. package/dist/conversion/shared/responses-response-utils.js +6 -7
  200. package/dist/conversion/shared/responses-tool-utils.d.ts +1 -0
  201. package/dist/conversion/shared/responses-tool-utils.js +90 -14
  202. package/dist/conversion/shared/runtime-metadata.js +13 -5
  203. package/dist/conversion/shared/streaming-text-extractor.js +2 -7
  204. package/dist/conversion/shared/text-markup-normalizer/normalize.d.ts +1 -1
  205. package/dist/conversion/shared/text-markup-normalizer/normalize.js +43 -17
  206. package/dist/conversion/shared/text-markup-normalizer.d.ts +1 -0
  207. package/dist/conversion/shared/text-markup-normalizer.js +1 -0
  208. package/dist/conversion/shared/thought-signature-validator.js +3 -2
  209. package/dist/conversion/shared/tool-argument-repairer.js +2 -2
  210. package/dist/conversion/shared/tool-call-id-manager.js +5 -7
  211. package/dist/conversion/shared/tool-call-utils.js +3 -45
  212. package/dist/conversion/shared/tool-canonicalizer.js +25 -29
  213. package/dist/conversion/shared/tool-filter-pipeline.js +4 -99
  214. package/dist/conversion/shared/tool-governor.d.ts +6 -0
  215. package/dist/conversion/shared/tool-governor.js +43 -125
  216. package/dist/conversion/shared/tool-harvester.js +2 -8
  217. package/dist/conversion/shared/tool-mapping.js +2 -5
  218. package/dist/conversion/shared/tooling.d.ts +0 -4
  219. package/dist/conversion/shared/tooling.js +18 -0
  220. package/dist/native/router_hotpath_napi.node +0 -0
  221. package/dist/router/virtual-router/engine/provider-key/parse.d.ts +1 -6
  222. package/dist/router/virtual-router/engine/provider-key/parse.js +1 -43
  223. package/dist/router/virtual-router/engine/routing-state/store.js +48 -12
  224. package/dist/router/virtual-router/engine-logging.js +4 -3
  225. package/dist/router/virtual-router/engine-selection/alias-selection.js +45 -83
  226. package/dist/router/virtual-router/engine-selection/key-parsing.js +9 -23
  227. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-directive-parser.d.ts +20 -0
  228. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-directive-parser.js +163 -0
  229. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-directives.d.ts +7 -0
  230. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-directives.js +103 -0
  231. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-orchestration-semantics.d.ts +10 -0
  232. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-orchestration-semantics.js +110 -0
  233. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.d.ts +8 -0
  234. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.js +281 -0
  235. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-time-tag-semantics.d.ts +1 -0
  236. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-time-tag-semantics.js +25 -0
  237. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminders-semantics.d.ts +4 -0
  238. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminders-semantics.js +44 -0
  239. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-tool-schema-semantics.d.ts +2 -0
  240. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-tool-schema-semantics.js +62 -0
  241. package/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.d.ts +40 -0
  242. package/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.js +484 -0
  243. package/dist/router/virtual-router/engine-selection/native-chat-process-governed-filter-semantics.d.ts +9 -0
  244. package/dist/router/virtual-router/engine-selection/native-chat-process-governed-filter-semantics.js +64 -0
  245. package/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.d.ts +5 -0
  246. package/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.js +163 -0
  247. package/dist/router/virtual-router/engine-selection/native-chat-process-post-governed-normalization-semantics.d.ts +1 -0
  248. package/dist/router/virtual-router/engine-selection/native-chat-process-post-governed-normalization-semantics.js +49 -0
  249. package/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.d.ts +30 -0
  250. package/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.js +446 -0
  251. package/dist/router/virtual-router/engine-selection/native-chat-process-web-search-intent-semantics.d.ts +1 -0
  252. package/dist/router/virtual-router/engine-selection/native-chat-process-web-search-intent-semantics.js +49 -0
  253. package/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics.d.ts +134 -0
  254. package/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics.js +729 -0
  255. package/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.d.ts +62 -0
  256. package/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.js +338 -0
  257. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.d.ts +18 -0
  258. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.js +317 -0
  259. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.d.ts +22 -0
  260. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.js +426 -0
  261. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.d.ts +57 -0
  262. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.js +705 -0
  263. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics.d.ts +46 -0
  264. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics.js +503 -0
  265. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics.d.ts +146 -0
  266. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics.js +570 -0
  267. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-process-semantics.d.ts +25 -0
  268. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-process-semantics.js +148 -0
  269. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics.d.ts +25 -0
  270. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics.js +637 -0
  271. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-session-identifiers-semantics.d.ts +11 -0
  272. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-session-identifiers-semantics.js +207 -0
  273. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-target-semantics.d.ts +3 -0
  274. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-target-semantics.js +128 -0
  275. package/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.d.ts +57 -0
  276. package/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.js +217 -0
  277. package/dist/router/virtual-router/engine-selection/native-router-hotpath-loader.d.ts +5 -0
  278. package/dist/router/virtual-router/engine-selection/native-router-hotpath-loader.js +284 -0
  279. package/dist/router/virtual-router/engine-selection/native-router-hotpath-policy.d.ts +5 -0
  280. package/dist/router/virtual-router/engine-selection/native-router-hotpath-policy.js +18 -0
  281. package/dist/router/virtual-router/engine-selection/native-router-hotpath-quota-buckets.d.ts +25 -0
  282. package/dist/router/virtual-router/engine-selection/native-router-hotpath-quota-buckets.js +85 -0
  283. package/dist/router/virtual-router/engine-selection/native-router-hotpath.d.ts +59 -0
  284. package/dist/router/virtual-router/engine-selection/native-router-hotpath.js +117 -0
  285. package/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.d.ts +76 -0
  286. package/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.js +1166 -0
  287. package/dist/router/virtual-router/engine-selection/native-virtual-router-alias-selection-semantics.d.ts +16 -0
  288. package/dist/router/virtual-router/engine-selection/native-virtual-router-alias-selection-semantics.js +96 -0
  289. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-actions-semantics.d.ts +6 -0
  290. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-actions-semantics.js +85 -0
  291. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-semantics.d.ts +9 -0
  292. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-semantics.js +70 -0
  293. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-state-semantics.d.ts +2 -0
  294. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-state-semantics.js +76 -0
  295. package/dist/router/virtual-router/engine-selection/route-utils.js +1 -1
  296. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-session-lease.d.ts +10 -0
  297. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-session-lease.js +231 -0
  298. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-target-split.d.ts +4 -0
  299. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-target-split.js +43 -0
  300. package/dist/router/virtual-router/engine-selection/tier-selection-quota-integration.d.ts +27 -0
  301. package/dist/router/virtual-router/engine-selection/tier-selection-quota-integration.js +116 -0
  302. package/dist/router/virtual-router/engine-selection/tier-selection-select.d.ts +1 -1
  303. package/dist/router/virtual-router/engine-selection/tier-selection-select.js +29 -129
  304. package/dist/router/virtual-router/engine-selection/tier-selection.js +2 -265
  305. package/dist/router/virtual-router/engine.js +258 -249
  306. package/dist/router/virtual-router/features.js +2 -2
  307. package/dist/router/virtual-router/routing-instructions.d.ts +5 -7
  308. package/dist/router/virtual-router/routing-instructions.js +93 -66
  309. package/dist/router/virtual-router/routing-stop-message-actions.js +91 -112
  310. package/dist/router/virtual-router/routing-stop-message-parser.js +9 -132
  311. package/dist/router/virtual-router/routing-stop-message-state-codec.d.ts +1 -0
  312. package/dist/router/virtual-router/routing-stop-message-state-codec.js +58 -71
  313. package/dist/router/virtual-router/sticky-session-store.js +4 -2
  314. package/dist/router/virtual-router/stop-message-file-resolver.d.ts +1 -0
  315. package/dist/router/virtual-router/stop-message-file-resolver.js +10 -0
  316. package/dist/router/virtual-router/stop-message-state-sync.d.ts +1 -1
  317. package/dist/router/virtual-router/stop-message-state-sync.js +3 -7
  318. package/dist/router/virtual-router/token-counter.js +0 -9
  319. package/dist/router/virtual-router/types.d.ts +9 -7
  320. package/dist/servertool/clock/config.js +23 -51
  321. package/dist/servertool/clock/io.js +1 -0
  322. package/dist/servertool/clock/session-scope.d.ts +2 -2
  323. package/dist/servertool/clock/session-scope.js +5 -47
  324. package/dist/servertool/engine.d.ts +9 -0
  325. package/dist/servertool/engine.js +196 -79
  326. package/dist/servertool/handlers/antigravity-thought-signature-bootstrap.js +2 -2
  327. package/dist/servertool/handlers/clock.js +1 -1
  328. package/dist/servertool/handlers/continue-execution.js +8 -4
  329. package/dist/servertool/handlers/followup-request-builder.js +18 -1
  330. package/dist/servertool/handlers/gemini-empty-reply-continue.js +7 -1
  331. package/dist/servertool/handlers/review.js +180 -0
  332. package/dist/servertool/handlers/stop-message-auto/blocked-report.js +59 -1
  333. package/dist/servertool/handlers/stop-message-auto/iflow-followup.d.ts +23 -2
  334. package/dist/servertool/handlers/stop-message-auto/iflow-followup.js +397 -89
  335. package/dist/servertool/handlers/stop-message-auto/routing-state.d.ts +5 -15
  336. package/dist/servertool/handlers/stop-message-auto/routing-state.js +29 -55
  337. package/dist/servertool/handlers/stop-message-auto/runtime-utils.d.ts +6 -0
  338. package/dist/servertool/handlers/stop-message-auto/runtime-utils.js +35 -61
  339. package/dist/servertool/handlers/stop-message-auto.js +392 -76
  340. package/dist/servertool/server-side-tools.d.ts +1 -0
  341. package/dist/servertool/server-side-tools.js +90 -52
  342. package/dist/servertool/types.d.ts +17 -0
  343. package/dist/tools/apply-patch/patch-text/normalize.js +11 -0
  344. package/dist/tools/exec-command/validator.d.ts +4 -1
  345. package/dist/tools/exec-command/validator.js +87 -3
  346. package/dist/tools/tool-registry.d.ts +7 -1
  347. package/dist/tools/tool-registry.js +3 -2
  348. package/package.json +115 -7
  349. package/dist/servertool/handlers/stop-message-stage-policy/bd-runtime.d.ts +0 -18
  350. package/dist/servertool/handlers/stop-message-stage-policy/bd-runtime.js +0 -398
  351. package/dist/servertool/handlers/stop-message-stage-policy/decision.d.ts +0 -9
  352. package/dist/servertool/handlers/stop-message-stage-policy/decision.js +0 -127
  353. package/dist/servertool/handlers/stop-message-stage-policy/observation.d.ts +0 -2
  354. package/dist/servertool/handlers/stop-message-stage-policy/observation.js +0 -179
  355. package/dist/servertool/handlers/stop-message-stage-policy/templates.d.ts +0 -4
  356. package/dist/servertool/handlers/stop-message-stage-policy/templates.js +0 -96
  357. package/dist/servertool/handlers/stop-message-stage-policy/text-utils.d.ts +0 -9
  358. package/dist/servertool/handlers/stop-message-stage-policy/text-utils.js +0 -89
  359. package/dist/servertool/handlers/stop-message-stage-policy/types.d.ts +0 -59
  360. package/dist/servertool/handlers/stop-message-stage-policy.d.ts +0 -3
  361. package/dist/servertool/handlers/stop-message-stage-policy.js +0 -2
  362. /package/dist/servertool/handlers/{stop-message-stage-policy/types.js → review.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { analyzeMediaAttachments, detectExtendedThinkingKeyword, detectKeyword, extractMessageText, getLatestMessageRole, } from './message-utils.js';
2
- import { extractAntigravityGeminiSessionId } from '../../conversion/compat/antigravity-session-signature.js';
2
+ import { extractAntigravityGeminiSessionIdWithNative } from './engine-selection/native-router-hotpath.js';
3
3
  import { detectCodingTool, detectLastAssistantToolCategory, detectVisionTool, detectWebSearchToolDeclared, detectWebTool, extractMeaningfulDeclaredToolNames } from './tool-signals.js';
4
4
  import { computeRequestTokens } from './token-estimator.js';
5
5
  const THINKING_KEYWORDS = ['let me think', 'chain of thought', 'cot', 'reason step', 'deliberate'];
@@ -12,7 +12,7 @@ export function buildRoutingFeatures(request, metadata) {
12
12
  const text = msg ? extractMessageText(msg) : '';
13
13
  return { role, parts: [{ text }] };
14
14
  });
15
- return extractAntigravityGeminiSessionId({ contents });
15
+ return extractAntigravityGeminiSessionIdWithNative({ contents });
16
16
  }
17
17
  catch {
18
18
  return undefined;
@@ -10,6 +10,8 @@ export interface RoutingInstruction {
10
10
  stopMessageText?: string;
11
11
  stopMessageMaxRepeats?: number;
12
12
  stopMessageStageMode?: 'on' | 'off' | 'auto';
13
+ stopMessageAiMode?: 'on' | 'off';
14
+ stopMessageSource?: string;
13
15
  /**
14
16
  * True when the instruction is parsed from an older user message
15
17
  * (not the latest user turn in current request).
@@ -57,14 +59,10 @@ export interface RoutingInstructionState {
57
59
  stopMessageUsed?: number;
58
60
  stopMessageUpdatedAt?: number;
59
61
  stopMessageLastUsedAt?: number;
60
- stopMessageStage?: string;
61
62
  stopMessageStageMode?: 'on' | 'off' | 'auto';
62
- stopMessageObservationHash?: string;
63
- stopMessageObservationStableCount?: number;
64
- stopMessageBdWorkState?: string;
65
- stopMessageAssignedIssueId?: string;
66
- stopMessageAssignedIssueSource?: 'in_progress' | 'ready' | 'open';
67
- stopMessageNoTaskSummaryUsed?: boolean;
63
+ stopMessageAiMode?: 'on' | 'off';
64
+ stopMessageAiSeedPrompt?: string;
65
+ stopMessageAiHistory?: Array<Record<string, unknown>>;
68
66
  preCommandSource?: string;
69
67
  preCommandScriptPath?: string;
70
68
  preCommandUpdatedAt?: number;
@@ -5,41 +5,24 @@ import { parsePreCommandInstruction } from './routing-pre-command-parser.js';
5
5
  import { applyPreCommandInstructionToState, clearPreCommandState } from './routing-pre-command-actions.js';
6
6
  import { deserializeStopMessageState, serializeStopMessageState } from './routing-stop-message-state-codec.js';
7
7
  import { deserializePreCommandState, serializePreCommandState } from './routing-pre-command-state-codec.js';
8
+ const ROUTING_INSTRUCTION_MARKER_PATTERN = /<\*\*[\s\S]*?\*\*>/;
9
+ const ROUTING_INSTRUCTION_MARKER_GLOBAL_PATTERN = /<\*\*[\s\S]*?\*\*>/g;
8
10
  export function parseRoutingInstructions(messages) {
9
11
  const instructions = [];
10
- // 从最新一条携带路由指令标记(<** ... **>)的 user 消息中解析指令,
11
- // 而不是简单地取"最后一条 user 消息"。这样可以在服务重启后,通过完整
12
- // 会话历史恢复 sticky/黑名单状态,同时保持"最后一次指令生效"的语义。
13
- let sanitized = null;
14
- let sanitizedIndex = -1;
15
- let lastUserIndex = -1;
16
- for (let idx = messages.length - 1; idx >= 0; idx -= 1) {
17
- const message = messages[idx];
18
- if (!message || message.role !== 'user') {
19
- continue;
20
- }
21
- if (lastUserIndex < 0) {
22
- lastUserIndex = idx;
23
- }
24
- const content = extractMessageText(message);
25
- if (!content) {
26
- continue;
27
- }
28
- const candidate = stripCodeSegments(content);
29
- if (!candidate) {
30
- continue;
31
- }
32
- if (!/<\*\*[^*]+\*\*>/.test(candidate)) {
33
- continue;
34
- }
35
- sanitized = candidate;
36
- sanitizedIndex = idx;
37
- break;
12
+ // 只解析“当前最新一条消息”中的 marker,避免历史 user marker 在后续轮次被重复回放。
13
+ const latestMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
14
+ if (!latestMessage || latestMessage.role !== 'user') {
15
+ return instructions;
16
+ }
17
+ const content = extractMessageText(latestMessage);
18
+ if (!content) {
19
+ return instructions;
38
20
  }
39
- if (!sanitized) {
21
+ const sanitized = stripCodeSegments(content);
22
+ if (!sanitized || !ROUTING_INSTRUCTION_MARKER_PATTERN.test(sanitized)) {
40
23
  return instructions;
41
24
  }
42
- const regex = /<\*\*([^*]+)\*\*>/g;
25
+ const regex = /<\*\*([\s\S]*?)\*\*>/g;
43
26
  let match;
44
27
  while ((match = regex.exec(sanitized)) !== null) {
45
28
  const instruction = match[1].trim();
@@ -50,27 +33,11 @@ export function parseRoutingInstructions(messages) {
50
33
  for (const segment of segments) {
51
34
  const parsed = parseSingleInstruction(segment);
52
35
  if (parsed) {
53
- const fromHistoricalUserMessage = lastUserIndex >= 0 &&
54
- sanitizedIndex >= 0 &&
55
- sanitizedIndex !== lastUserIndex;
56
- const normalizedParsed = fromHistoricalUserMessage &&
57
- (parsed.type === 'stopMessageSet' ||
58
- parsed.type === 'stopMessageMode' ||
59
- parsed.type === 'stopMessageClear')
60
- ? { ...parsed, fromHistoricalUserMessage: true }
61
- : parsed;
62
- // preCommand 是强副作用命令(执行本地脚本),仅允许从 latest user message 生效。
63
- if ((normalizedParsed.type === 'preCommandSet' || normalizedParsed.type === 'preCommandClear') &&
64
- lastUserIndex >= 0 &&
65
- sanitizedIndex >= 0 &&
66
- sanitizedIndex !== lastUserIndex) {
67
- continue;
68
- }
69
- instructions.push(normalizedParsed);
36
+ instructions.push(parsed);
70
37
  }
71
38
  }
72
39
  }
73
- return instructions;
40
+ return normalizeStopMessageInstructionPrecedence(instructions);
74
41
  }
75
42
  /**
76
43
  * 解析并预处理路由指令,优先处理 clear 指令,确保新指令能够覆盖旧状态。
@@ -115,10 +82,14 @@ function expandInstructionSegments(instruction) {
115
82
  if (!trimmed) {
116
83
  return [];
117
84
  }
85
+ const normalizedLeading = normalizeInstructionLeading(trimmed);
118
86
  // stopMessage 指令需要整体解析,不能按逗号拆分,否则类似
119
87
  // "<**stopMessage:\"继续\",3**>" 会被错误拆成 ["stopMessage:\"继续\"", "3"]。
120
- if (/^stopMessage\s*:/i.test(trimmed) || /^precommand(?:\s*:|$)/i.test(trimmed)) {
121
- return [trimmed];
88
+ if (/^(?:"|')?stopMessage(?:"|')?\s*[:,]/i.test(normalizedLeading)) {
89
+ return [normalizeStopMessageCommandPrefix(normalizedLeading)];
90
+ }
91
+ if (/^precommand(?:\s*:|$)/i.test(normalizedLeading)) {
92
+ return [normalizedLeading];
122
93
  }
123
94
  const prefix = trimmed[0];
124
95
  if (prefix === '!' || prefix === '#' || prefix === '@') {
@@ -128,7 +99,12 @@ function expandInstructionSegments(instruction) {
128
99
  .filter((token) => token.length > 0)
129
100
  .map((token) => `${prefix}${token}`);
130
101
  }
131
- return splitInstructionTargets(trimmed);
102
+ const splitTokens = splitInstructionTargets(trimmed);
103
+ const recoveredStopMessage = recoverSplitStopMessageInstruction(splitTokens);
104
+ if (recoveredStopMessage) {
105
+ return [recoveredStopMessage];
106
+ }
107
+ return splitTokens;
132
108
  }
133
109
  function splitInstructionTargets(content) {
134
110
  return content
@@ -136,6 +112,33 @@ function splitInstructionTargets(content) {
136
112
  .map((segment) => segment.trim())
137
113
  .filter((segment) => segment.length > 0);
138
114
  }
115
+ function normalizeInstructionLeading(content) {
116
+ // Remove common zero-width prefixes that may be injected by client/editor copies.
117
+ return content.replace(/^[\u200B-\u200D\u2060\uFEFF]+/, '').trimStart();
118
+ }
119
+ function normalizeStopMessageCommandPrefix(content) {
120
+ const normalized = normalizeInstructionLeading(content);
121
+ return normalized.replace(/^(?:"|')?stopMessage(?:"|')?\s*([:,])/i, 'stopMessage$1');
122
+ }
123
+ function normalizeSplitStopMessageHeadToken(token) {
124
+ return normalizeInstructionLeading(token)
125
+ .replace(/^["']+|["']+$/g, '')
126
+ .trim();
127
+ }
128
+ function recoverSplitStopMessageInstruction(tokens) {
129
+ if (!Array.isArray(tokens) || tokens.length < 2) {
130
+ return null;
131
+ }
132
+ const head = normalizeSplitStopMessageHeadToken(tokens[0]);
133
+ if (!/^stopmessage$/i.test(head)) {
134
+ return null;
135
+ }
136
+ const tail = tokens.slice(1).join(',').trim();
137
+ if (!tail) {
138
+ return null;
139
+ }
140
+ return `stopMessage:${tail}`;
141
+ }
139
142
  function splitTargetAndProcessMode(rawTarget) {
140
143
  const trimmed = typeof rawTarget === 'string' ? rawTarget.trim() : '';
141
144
  if (!trimmed) {
@@ -179,7 +182,7 @@ function parseNamedTargetInstruction(instruction, prefix) {
179
182
  return { type: prefix, ...normalized, ...(processMode ? { processMode } : {}) };
180
183
  }
181
184
  function parseSingleInstruction(instruction) {
182
- if (instruction === 'clear') {
185
+ if (/^clear$/i.test(instruction)) {
183
186
  return { type: 'clear' };
184
187
  }
185
188
  const preCommandInstruction = parsePreCommandInstruction(instruction);
@@ -260,6 +263,33 @@ function parseSingleInstruction(instruction) {
260
263
  }
261
264
  return null;
262
265
  }
266
+ function normalizeStopMessageInstructionPrecedence(instructions) {
267
+ if (!Array.isArray(instructions) || instructions.length <= 1) {
268
+ return instructions;
269
+ }
270
+ const isStopDirective = (inst) => inst.type === 'stopMessageSet' || inst.type === 'stopMessageMode' || inst.type === 'stopMessageClear';
271
+ const hasGlobalClear = instructions.some((inst) => inst.type === 'clear');
272
+ const hasStopClear = instructions.some((inst) => inst.type === 'stopMessageClear');
273
+ if (hasGlobalClear) {
274
+ const lastGlobalClearIndex = instructions.map((inst) => inst.type).lastIndexOf('clear');
275
+ return lastGlobalClearIndex >= 0 ? [instructions[lastGlobalClearIndex]] : instructions;
276
+ }
277
+ if (hasStopClear) {
278
+ const lastStopClearIndex = instructions.map((inst) => inst.type).lastIndexOf('stopMessageClear');
279
+ return lastStopClearIndex >= 0 ? [instructions[lastStopClearIndex]] : instructions;
280
+ }
281
+ let lastStopIndex = -1;
282
+ for (let idx = instructions.length - 1; idx >= 0; idx -= 1) {
283
+ if (isStopDirective(instructions[idx])) {
284
+ lastStopIndex = idx;
285
+ break;
286
+ }
287
+ }
288
+ if (lastStopIndex < 0) {
289
+ return instructions;
290
+ }
291
+ return instructions.filter((inst, idx) => !isStopDirective(inst) || idx === lastStopIndex);
292
+ }
263
293
  function parseTarget(target) {
264
294
  if (!target) {
265
295
  return null;
@@ -375,14 +405,14 @@ export function applyRoutingInstructions(instructions, currentState) {
375
405
  stopMessageUsed: currentState.stopMessageUsed,
376
406
  stopMessageUpdatedAt: currentState.stopMessageUpdatedAt,
377
407
  stopMessageLastUsedAt: currentState.stopMessageLastUsedAt,
378
- stopMessageStage: currentState.stopMessageStage,
379
408
  stopMessageStageMode: currentState.stopMessageStageMode,
380
- stopMessageObservationHash: currentState.stopMessageObservationHash,
381
- stopMessageObservationStableCount: currentState.stopMessageObservationStableCount,
382
- stopMessageBdWorkState: currentState.stopMessageBdWorkState,
383
- stopMessageAssignedIssueId: currentState.stopMessageAssignedIssueId,
384
- stopMessageAssignedIssueSource: currentState.stopMessageAssignedIssueSource,
385
- stopMessageNoTaskSummaryUsed: currentState.stopMessageNoTaskSummaryUsed,
409
+ stopMessageAiMode: currentState.stopMessageAiMode,
410
+ stopMessageAiSeedPrompt: currentState.stopMessageAiSeedPrompt,
411
+ stopMessageAiHistory: Array.isArray(currentState.stopMessageAiHistory)
412
+ ? currentState.stopMessageAiHistory.map((entry) => entry && typeof entry === 'object' && !Array.isArray(entry)
413
+ ? { ...entry }
414
+ : {})
415
+ : undefined,
386
416
  preCommandSource: currentState.preCommandSource,
387
417
  preCommandScriptPath: currentState.preCommandScriptPath,
388
418
  preCommandUpdatedAt: currentState.preCommandUpdatedAt
@@ -534,7 +564,7 @@ export function cleanMessagesFromRoutingInstructions(messages) {
534
564
  if (message.role !== 'user' || typeof message.content !== 'string') {
535
565
  return message;
536
566
  }
537
- const cleanedContent = message.content.replace(/<\*\*[^*]+\*\*>/g, '').trim();
567
+ const cleanedContent = message.content.replace(ROUTING_INSTRUCTION_MARKER_GLOBAL_PATTERN, '').trim();
538
568
  return {
539
569
  ...message,
540
570
  content: cleanedContent
@@ -582,13 +612,10 @@ export function deserializeRoutingInstructionState(data) {
582
612
  stopMessageSource: undefined,
583
613
  stopMessageMaxRepeats: undefined,
584
614
  stopMessageUsed: undefined,
585
- stopMessageStage: undefined,
586
615
  stopMessageStageMode: undefined,
587
- stopMessageObservationHash: undefined,
588
- stopMessageBdWorkState: undefined,
589
- stopMessageAssignedIssueId: undefined,
590
- stopMessageAssignedIssueSource: undefined,
591
- stopMessageNoTaskSummaryUsed: undefined,
616
+ stopMessageAiMode: undefined,
617
+ stopMessageAiSeedPrompt: undefined,
618
+ stopMessageAiHistory: undefined,
592
619
  preCommandSource: undefined,
593
620
  preCommandScriptPath: undefined,
594
621
  preCommandUpdatedAt: undefined
@@ -1,120 +1,99 @@
1
- import { DEFAULT_STOP_MESSAGE_MAX_REPEATS, ensureStopMessageModeMaxRepeats, normalizeStopMessageStageMode } from './routing-stop-message-state-codec.js';
1
+ import { normalizeStopMessageStageMode } from './routing-stop-message-state-codec.js';
2
+ import { applyStopMessageInstructionWithNative } from './engine-selection/native-virtual-router-stop-message-actions-semantics.js';
3
+ const STOP_MESSAGE_FIELDS = [
4
+ 'stopMessageSource',
5
+ 'stopMessageText',
6
+ 'stopMessageMaxRepeats',
7
+ 'stopMessageUsed',
8
+ 'stopMessageUpdatedAt',
9
+ 'stopMessageLastUsedAt',
10
+ 'stopMessageStageMode',
11
+ 'stopMessageAiMode',
12
+ 'stopMessageAiSeedPrompt',
13
+ 'stopMessageAiHistory'
14
+ ];
15
+ const SKIP_PATCH_VALUE = Symbol('skipPatchValue');
2
16
  export function applyStopMessageInstructionToState(instruction, state) {
3
- switch (instruction.type) {
4
- case 'stopMessageSet': {
5
- const text = typeof instruction.stopMessageText === 'string' && instruction.stopMessageText.trim()
6
- ? instruction.stopMessageText.trim()
7
- : '';
8
- const maxRepeats = typeof instruction.stopMessageMaxRepeats === 'number' && Number.isFinite(instruction.stopMessageMaxRepeats)
9
- ? Math.floor(instruction.stopMessageMaxRepeats)
10
- : 0;
11
- if (!text || maxRepeats <= 0) {
12
- return true;
13
- }
14
- const incomingMode = normalizeStopMessageStageMode(instruction.stopMessageStageMode);
15
- const currentMode = normalizeStopMessageStageMode(state.stopMessageStageMode);
16
- const targetMode = incomingMode ?? (currentMode === 'off' ? 'on' : currentMode);
17
- const sameText = typeof state.stopMessageText === 'string' && state.stopMessageText.trim() === text;
18
- const sameMax = typeof state.stopMessageMaxRepeats === 'number' &&
19
- Math.floor(state.stopMessageMaxRepeats) === maxRepeats;
20
- const sameMode = currentMode === targetMode;
21
- const isSameInstruction = sameText && sameMax && sameMode;
22
- const used = typeof state.stopMessageUsed === 'number' && Number.isFinite(state.stopMessageUsed)
23
- ? Math.max(0, Math.floor(state.stopMessageUsed))
24
- : 0;
25
- const hasLastUsedAt = typeof state.stopMessageLastUsedAt === 'number' && Number.isFinite(state.stopMessageLastUsedAt);
26
- const shouldRearm = !isSameInstruction || used > 0 || hasLastUsedAt;
27
- const shouldRearmForSource = instruction.fromHistoricalUserMessage
28
- ? !isSameInstruction
29
- : shouldRearm;
30
- state.stopMessageText = text;
31
- state.stopMessageMaxRepeats = maxRepeats;
32
- state.stopMessageSource = 'explicit';
33
- if (targetMode) {
34
- state.stopMessageStageMode = targetMode;
35
- }
36
- if (shouldRearmForSource) {
37
- resetStopMessageRuntimeState(state, Date.now());
38
- }
39
- return true;
17
+ const nowMs = Date.now();
18
+ const before = snapshotStopMessageState(state);
19
+ const patch = applyStopMessageInstructionWithNative(instruction, before, nowMs);
20
+ applyStopMessagePatch(state, patch);
21
+ return patch.applied;
22
+ }
23
+ function snapshotStopMessageState(state) {
24
+ return {
25
+ stopMessageSource: state.stopMessageSource,
26
+ stopMessageText: state.stopMessageText,
27
+ stopMessageMaxRepeats: state.stopMessageMaxRepeats,
28
+ stopMessageUsed: state.stopMessageUsed,
29
+ stopMessageUpdatedAt: state.stopMessageUpdatedAt,
30
+ stopMessageLastUsedAt: state.stopMessageLastUsedAt,
31
+ stopMessageStageMode: state.stopMessageStageMode,
32
+ stopMessageAiMode: state.stopMessageAiMode,
33
+ stopMessageAiSeedPrompt: state.stopMessageAiSeedPrompt,
34
+ stopMessageAiHistory: Array.isArray(state.stopMessageAiHistory) ? cloneHistory(state.stopMessageAiHistory) : undefined
35
+ };
36
+ }
37
+ function applyStopMessagePatch(state, patch) {
38
+ for (const field of patch.unset) {
39
+ if (!STOP_MESSAGE_FIELDS.includes(field)) {
40
+ continue;
40
41
  }
41
- case 'stopMessageMode': {
42
- const mode = normalizeStopMessageStageMode(instruction.stopMessageStageMode);
43
- if (!mode) {
44
- return true;
45
- }
46
- const explicitMaxRepeats = typeof instruction.stopMessageMaxRepeats === 'number' && Number.isFinite(instruction.stopMessageMaxRepeats)
47
- ? Math.floor(instruction.stopMessageMaxRepeats)
48
- : undefined;
49
- if (mode === 'off') {
50
- clearStopMessageState(state, { keepMode: 'off' });
51
- return true;
52
- }
53
- const previousMode = normalizeStopMessageStageMode(state.stopMessageStageMode);
54
- const previousMax = typeof state.stopMessageMaxRepeats === 'number' && Number.isFinite(state.stopMessageMaxRepeats)
55
- ? Math.floor(state.stopMessageMaxRepeats)
56
- : undefined;
57
- const preservedMax = typeof state.stopMessageMaxRepeats === 'number' && Number.isFinite(state.stopMessageMaxRepeats)
58
- ? Math.floor(state.stopMessageMaxRepeats)
59
- : undefined;
60
- const resolvedMax = typeof explicitMaxRepeats === 'number' && explicitMaxRepeats > 0
61
- ? explicitMaxRepeats
62
- : typeof preservedMax === 'number' && preservedMax > 0
63
- ? preservedMax
64
- : mode === 'on' || mode === 'auto'
65
- ? DEFAULT_STOP_MESSAGE_MAX_REPEATS
66
- : undefined;
67
- state.stopMessageStageMode = mode;
68
- state.stopMessageSource = 'explicit';
69
- state.stopMessageMaxRepeats = resolvedMax;
70
- ensureStopMessageModeMaxRepeats(state);
71
- const nextMax = typeof state.stopMessageMaxRepeats === 'number' && Number.isFinite(state.stopMessageMaxRepeats)
72
- ? Math.floor(state.stopMessageMaxRepeats)
73
- : undefined;
74
- const shouldRearm = previousMode !== mode ||
75
- previousMax !== nextMax ||
76
- typeof state.stopMessageUsed !== 'number' ||
77
- !Number.isFinite(state.stopMessageUsed);
78
- const shouldRearmForSource = instruction.fromHistoricalUserMessage
79
- ? (previousMode !== mode || previousMax !== nextMax || typeof state.stopMessageUsed !== 'number' || !Number.isFinite(state.stopMessageUsed))
80
- : shouldRearm;
81
- if (shouldRearmForSource) {
82
- resetStopMessageRuntimeState(state, Date.now());
42
+ state[field] = undefined;
43
+ }
44
+ for (const [field, rawValue] of Object.entries(patch.set)) {
45
+ const value = coerceStopMessagePatchValue(field, rawValue);
46
+ if (value === SKIP_PATCH_VALUE) {
47
+ continue;
48
+ }
49
+ state[field] = value;
50
+ }
51
+ }
52
+ function coerceStopMessagePatchValue(field, value) {
53
+ switch (field) {
54
+ case 'stopMessageSource':
55
+ case 'stopMessageText':
56
+ case 'stopMessageAiSeedPrompt':
57
+ return typeof value === 'string' ? value : SKIP_PATCH_VALUE;
58
+ case 'stopMessageStageMode': {
59
+ const normalized = normalizeStopMessageStageMode(value);
60
+ return normalized ?? SKIP_PATCH_VALUE;
61
+ }
62
+ case 'stopMessageAiMode': {
63
+ const normalizedAiMode = normalizeStopMessageAiMode(value);
64
+ return normalizedAiMode ?? SKIP_PATCH_VALUE;
65
+ }
66
+ case 'stopMessageMaxRepeats':
67
+ case 'stopMessageUsed':
68
+ case 'stopMessageUpdatedAt':
69
+ case 'stopMessageLastUsedAt':
70
+ return typeof value === 'number' && Number.isFinite(value) ? value : SKIP_PATCH_VALUE;
71
+ case 'stopMessageAiHistory': {
72
+ if (!Array.isArray(value)) {
73
+ return SKIP_PATCH_VALUE;
83
74
  }
84
- return true;
75
+ return cloneHistory(value);
85
76
  }
86
- case 'stopMessageClear':
87
- clearStopMessageState(state);
88
- return true;
89
- default:
90
- return false;
91
77
  }
78
+ return SKIP_PATCH_VALUE;
92
79
  }
93
- function resetStopMessageRuntimeState(state, atMs) {
94
- state.stopMessageUsed = 0;
95
- state.stopMessageUpdatedAt = atMs;
96
- state.stopMessageLastUsedAt = undefined;
97
- state.stopMessageStage = undefined;
98
- state.stopMessageObservationHash = undefined;
99
- state.stopMessageObservationStableCount = 0;
100
- state.stopMessageBdWorkState = undefined;
101
- state.stopMessageAssignedIssueId = undefined;
102
- state.stopMessageAssignedIssueSource = undefined;
103
- state.stopMessageNoTaskSummaryUsed = undefined;
80
+ function cloneHistory(value) {
81
+ const out = [];
82
+ for (const item of value) {
83
+ if (!item || typeof item !== 'object' || Array.isArray(item)) {
84
+ continue;
85
+ }
86
+ out.push({ ...item });
87
+ }
88
+ return out;
104
89
  }
105
- function clearStopMessageState(state, options) {
106
- state.stopMessageText = undefined;
107
- state.stopMessageMaxRepeats = undefined;
108
- state.stopMessageUsed = undefined;
109
- state.stopMessageSource = undefined;
110
- state.stopMessageUpdatedAt = undefined;
111
- state.stopMessageLastUsedAt = undefined;
112
- state.stopMessageStage = undefined;
113
- state.stopMessageStageMode = options?.keepMode;
114
- state.stopMessageObservationHash = undefined;
115
- state.stopMessageObservationStableCount = undefined;
116
- state.stopMessageBdWorkState = undefined;
117
- state.stopMessageAssignedIssueId = undefined;
118
- state.stopMessageAssignedIssueSource = undefined;
119
- state.stopMessageNoTaskSummaryUsed = undefined;
90
+ function normalizeStopMessageAiMode(value) {
91
+ if (typeof value !== 'string') {
92
+ return undefined;
93
+ }
94
+ const normalized = value.trim().toLowerCase();
95
+ if (normalized === 'on' || normalized === 'off') {
96
+ return normalized;
97
+ }
98
+ return undefined;
120
99
  }
@@ -1,142 +1,19 @@
1
- import { resolveStopMessageText } from './stop-message-file-resolver.js';
1
+ import { isStopMessageFileReference, resolveStopMessageText } from './stop-message-file-resolver.js';
2
+ import { parseStopMessageInstructionWithNative } from './engine-selection/native-virtual-router-stop-message-semantics.js';
2
3
  export const DEFAULT_STOP_MESSAGE_MAX_REPEATS = 10;
3
4
  export function parseStopMessageInstruction(instruction) {
4
- if (!/^stopMessage\s*:/i.test(instruction)) {
5
+ const resolved = parseStopMessageInstructionWithNative(instruction);
6
+ if (!resolved) {
5
7
  return null;
6
8
  }
7
- const body = instruction.slice('stopMessage'.length + 1).trim();
8
- if (!body) {
9
- return null;
10
- }
11
- if (/^clear$/i.test(body)) {
9
+ if (resolved.kind === 'clear') {
12
10
  return { type: 'stopMessageClear' };
13
11
  }
14
- const modeOnly = parseStopMessageModeWithOptionalRepeats(body);
15
- if (modeOnly) {
16
- return {
17
- type: 'stopMessageMode',
18
- stopMessageStageMode: modeOnly.mode,
19
- ...(typeof modeOnly.maxRepeats === 'number' ? { stopMessageMaxRepeats: modeOnly.maxRepeats } : {})
20
- };
21
- }
22
- let text = '';
23
- let maxRepeats = DEFAULT_STOP_MESSAGE_MAX_REPEATS;
24
- let cursor = body;
25
- let stageMode;
26
- if (cursor[0] === '"') {
27
- let escaped = false;
28
- let endIndex = -1;
29
- for (let i = 1; i < cursor.length; i += 1) {
30
- const ch = cursor[i];
31
- if (escaped) {
32
- escaped = false;
33
- continue;
34
- }
35
- if (ch === '\\') {
36
- escaped = true;
37
- continue;
38
- }
39
- if (ch === '"') {
40
- endIndex = i;
41
- break;
42
- }
43
- }
44
- if (endIndex <= 0) {
45
- return null;
46
- }
47
- const rawText = cursor.slice(1, endIndex);
48
- text = rawText.replace(/\\"/g, '"');
49
- cursor = cursor.slice(endIndex + 1).trim();
50
- if (cursor.startsWith(',')) {
51
- const tail = cursor.slice(1).trim();
52
- const parsedTail = parseStopMessageTail(tail);
53
- maxRepeats = parsedTail.maxRepeats;
54
- stageMode = parsedTail.stageMode;
55
- }
56
- }
57
- else {
58
- const parts = cursor
59
- .split(',')
60
- .map((part) => part.trim())
61
- .filter(Boolean);
62
- if (!parts.length) {
63
- return null;
64
- }
65
- text = parts[0];
66
- const parsedTail = parseStopMessageTail(parts.slice(1));
67
- maxRepeats = parsedTail.maxRepeats;
68
- stageMode = parsedTail.stageMode;
69
- }
70
- if (!text) {
71
- return null;
72
- }
73
12
  return {
74
13
  type: 'stopMessageSet',
75
- stopMessageText: resolveStopMessageText(text),
76
- stopMessageMaxRepeats: maxRepeats,
77
- ...(stageMode ? { stopMessageStageMode: stageMode } : {})
78
- };
79
- }
80
- function parseStopMessageTail(input) {
81
- const tokens = Array.isArray(input)
82
- ? input.map((part) => part.trim()).filter(Boolean)
83
- : input
84
- .split(',')
85
- .map((part) => part.trim())
86
- .filter(Boolean);
87
- let maxRepeats = DEFAULT_STOP_MESSAGE_MAX_REPEATS;
88
- let stageMode;
89
- for (const token of tokens) {
90
- const mode = parseStopMessageStageModeToken(token);
91
- if (mode) {
92
- stageMode = mode;
93
- continue;
94
- }
95
- const parsed = Number.parseInt(token, 10);
96
- if (!Number.isNaN(parsed) && parsed > 0) {
97
- maxRepeats = parsed;
98
- }
99
- }
100
- return {
101
- maxRepeats,
102
- ...(stageMode ? { stageMode } : {})
14
+ stopMessageText: resolveStopMessageText(resolved.text),
15
+ stopMessageMaxRepeats: resolved.maxRepeats,
16
+ stopMessageSource: isStopMessageFileReference(resolved.text) ? 'explicit_file' : 'explicit_text',
17
+ ...(resolved.aiMode ? { stopMessageAiMode: resolved.aiMode } : {})
103
18
  };
104
19
  }
105
- function parseStopMessageModeWithOptionalRepeats(value) {
106
- const normalized = value.trim().toLowerCase();
107
- const match = normalized.match(/^(?:(?:stage|mode)\s*[:=]\s*)?(on|off|auto)\s*(?:,\s*(\d+)\s*)?$/i);
108
- if (!match) {
109
- return null;
110
- }
111
- const token = match[1].trim().toLowerCase();
112
- const mode = token === 'on' || token === 'off' || token === 'auto'
113
- ? token
114
- : undefined;
115
- if (!mode) {
116
- return null;
117
- }
118
- if (mode === 'off') {
119
- return { mode };
120
- }
121
- const repeatToken = match[2];
122
- if (!repeatToken) {
123
- return { mode, maxRepeats: DEFAULT_STOP_MESSAGE_MAX_REPEATS };
124
- }
125
- const parsed = Number.parseInt(repeatToken, 10);
126
- if (Number.isNaN(parsed) || parsed <= 0) {
127
- return { mode, maxRepeats: DEFAULT_STOP_MESSAGE_MAX_REPEATS };
128
- }
129
- return { mode, maxRepeats: parsed };
130
- }
131
- function parseStopMessageStageModeToken(value) {
132
- const normalized = value.trim().toLowerCase();
133
- const match = normalized.match(/^(?:(?:stage|mode)\s*[:=]\s*)?(on|off|auto)$/i);
134
- if (!match) {
135
- return undefined;
136
- }
137
- const token = match[1].trim().toLowerCase();
138
- if (token === 'on' || token === 'off' || token === 'auto') {
139
- return token;
140
- }
141
- return undefined;
142
- }
@@ -4,3 +4,4 @@ export declare function serializeStopMessageState(state: RoutingInstructionState
4
4
  export declare function deserializeStopMessageState(data: Record<string, unknown>, state: RoutingInstructionState): void;
5
5
  export declare function normalizeStopMessageStageMode(value: unknown): 'on' | 'off' | 'auto' | undefined;
6
6
  export declare function ensureStopMessageModeMaxRepeats(state: RoutingInstructionState): boolean;
7
+ export declare function normalizeStopMessageAiMode(value: unknown): 'on' | 'off' | undefined;