@actalk/inkos-core 1.3.6 → 1.3.7

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 (444) hide show
  1. package/dist/agent/agent-session.d.ts +7 -7
  2. package/dist/agent/agent-session.d.ts.map +1 -1
  3. package/dist/agent/agent-session.js +392 -63
  4. package/dist/agent/agent-session.js.map +1 -1
  5. package/dist/agent/agent-system-prompt.d.ts.map +1 -1
  6. package/dist/agent/agent-system-prompt.js +20 -16
  7. package/dist/agent/agent-system-prompt.js.map +1 -1
  8. package/dist/agent/agent-tools.d.ts +4 -1
  9. package/dist/agent/agent-tools.d.ts.map +1 -1
  10. package/dist/agent/agent-tools.js +81 -64
  11. package/dist/agent/agent-tools.js.map +1 -1
  12. package/dist/agents/architect.d.ts +18 -20
  13. package/dist/agents/architect.d.ts.map +1 -1
  14. package/dist/agents/architect.js +513 -632
  15. package/dist/agents/architect.js.map +1 -1
  16. package/dist/agents/chapter-analyzer.d.ts.map +1 -1
  17. package/dist/agents/chapter-analyzer.js +10 -6
  18. package/dist/agents/chapter-analyzer.js.map +1 -1
  19. package/dist/agents/composer.d.ts +1 -13
  20. package/dist/agents/composer.d.ts.map +1 -1
  21. package/dist/agents/composer.js +297 -290
  22. package/dist/agents/composer.js.map +1 -1
  23. package/dist/agents/consolidator.d.ts +17 -1
  24. package/dist/agents/consolidator.d.ts.map +1 -1
  25. package/dist/agents/consolidator.js +44 -6
  26. package/dist/agents/consolidator.js.map +1 -1
  27. package/dist/agents/continuity.d.ts +4 -1
  28. package/dist/agents/continuity.d.ts.map +1 -1
  29. package/dist/agents/continuity.js +111 -21
  30. package/dist/agents/continuity.js.map +1 -1
  31. package/dist/agents/length-normalizer.d.ts.map +1 -1
  32. package/dist/agents/length-normalizer.js +1 -4
  33. package/dist/agents/length-normalizer.js.map +1 -1
  34. package/dist/agents/planner-context.d.ts +54 -0
  35. package/dist/agents/planner-context.d.ts.map +1 -0
  36. package/dist/agents/planner-context.js +245 -0
  37. package/dist/agents/planner-context.js.map +1 -0
  38. package/dist/agents/planner-prompts.d.ts +36 -0
  39. package/dist/agents/planner-prompts.d.ts.map +1 -0
  40. package/dist/agents/planner-prompts.js +350 -0
  41. package/dist/agents/planner-prompts.js.map +1 -0
  42. package/dist/agents/planner.d.ts +39 -11
  43. package/dist/agents/planner.d.ts.map +1 -1
  44. package/dist/agents/planner.js +212 -195
  45. package/dist/agents/planner.js.map +1 -1
  46. package/dist/agents/polisher.d.ts +33 -0
  47. package/dist/agents/polisher.d.ts.map +1 -0
  48. package/dist/agents/polisher.js +122 -0
  49. package/dist/agents/polisher.js.map +1 -0
  50. package/dist/agents/post-write-validator.d.ts +1 -0
  51. package/dist/agents/post-write-validator.d.ts.map +1 -1
  52. package/dist/agents/post-write-validator.js +13 -0
  53. package/dist/agents/post-write-validator.js.map +1 -1
  54. package/dist/agents/reviser.d.ts +6 -2
  55. package/dist/agents/reviser.d.ts.map +1 -1
  56. package/dist/agents/reviser.js +379 -98
  57. package/dist/agents/reviser.js.map +1 -1
  58. package/dist/agents/rules-reader.d.ts +15 -2
  59. package/dist/agents/rules-reader.d.ts.map +1 -1
  60. package/dist/agents/rules-reader.js +49 -6
  61. package/dist/agents/rules-reader.js.map +1 -1
  62. package/dist/agents/state-validator.d.ts +9 -1
  63. package/dist/agents/state-validator.d.ts.map +1 -1
  64. package/dist/agents/state-validator.js +37 -1
  65. package/dist/agents/state-validator.js.map +1 -1
  66. package/dist/agents/writer-prompts.d.ts +1 -0
  67. package/dist/agents/writer-prompts.d.ts.map +1 -1
  68. package/dist/agents/writer-prompts.js +272 -29
  69. package/dist/agents/writer-prompts.js.map +1 -1
  70. package/dist/agents/writer.d.ts +12 -3
  71. package/dist/agents/writer.d.ts.map +1 -1
  72. package/dist/agents/writer.js +77 -107
  73. package/dist/agents/writer.js.map +1 -1
  74. package/dist/index.d.ts +20 -5
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +19 -5
  77. package/dist/index.js.map +1 -1
  78. package/dist/interaction/book-session-store.d.ts.map +1 -1
  79. package/dist/interaction/book-session-store.js +84 -69
  80. package/dist/interaction/book-session-store.js.map +1 -1
  81. package/dist/interaction/events.d.ts +2 -2
  82. package/dist/interaction/project-tools.d.ts +1 -0
  83. package/dist/interaction/project-tools.d.ts.map +1 -1
  84. package/dist/interaction/project-tools.js +51 -3
  85. package/dist/interaction/project-tools.js.map +1 -1
  86. package/dist/interaction/session-transcript-legacy.d.ts +4 -0
  87. package/dist/interaction/session-transcript-legacy.d.ts.map +1 -0
  88. package/dist/interaction/session-transcript-legacy.js +100 -0
  89. package/dist/interaction/session-transcript-legacy.js.map +1 -0
  90. package/dist/interaction/session-transcript-restore.d.ts +17 -0
  91. package/dist/interaction/session-transcript-restore.d.ts.map +1 -0
  92. package/dist/interaction/session-transcript-restore.js +493 -0
  93. package/dist/interaction/session-transcript-restore.js.map +1 -0
  94. package/dist/interaction/session-transcript-schema.d.ts +402 -0
  95. package/dist/interaction/session-transcript-schema.d.ts.map +1 -0
  96. package/dist/interaction/session-transcript-schema.js +59 -0
  97. package/dist/interaction/session-transcript-schema.js.map +1 -0
  98. package/dist/interaction/session-transcript.d.ts +14 -0
  99. package/dist/interaction/session-transcript.d.ts.map +1 -0
  100. package/dist/interaction/session-transcript.js +152 -0
  101. package/dist/interaction/session-transcript.js.map +1 -0
  102. package/dist/interaction/session.d.ts +10 -10
  103. package/dist/interaction/session.d.ts.map +1 -1
  104. package/dist/interaction/session.js +5 -3
  105. package/dist/interaction/session.js.map +1 -1
  106. package/dist/llm/provider.d.ts +6 -9
  107. package/dist/llm/provider.d.ts.map +1 -1
  108. package/dist/llm/provider.js +255 -63
  109. package/dist/llm/provider.js.map +1 -1
  110. package/dist/llm/providers/endpoints/ai360.d.ts +10 -0
  111. package/dist/llm/providers/endpoints/ai360.d.ts.map +1 -0
  112. package/dist/llm/providers/endpoints/ai360.js +34 -0
  113. package/dist/llm/providers/endpoints/ai360.js.map +1 -0
  114. package/dist/llm/providers/endpoints/anthropic.d.ts +12 -0
  115. package/dist/llm/providers/endpoints/anthropic.d.ts.map +1 -0
  116. package/dist/llm/providers/endpoints/anthropic.js +72 -0
  117. package/dist/llm/providers/endpoints/anthropic.js.map +1 -0
  118. package/dist/llm/providers/endpoints/astronCodingPlan.d.ts +16 -0
  119. package/dist/llm/providers/endpoints/astronCodingPlan.d.ts.map +1 -0
  120. package/dist/llm/providers/endpoints/astronCodingPlan.js +16 -0
  121. package/dist/llm/providers/endpoints/astronCodingPlan.js.map +1 -0
  122. package/dist/llm/providers/endpoints/baichuan.d.ts +10 -0
  123. package/dist/llm/providers/endpoints/baichuan.d.ts.map +1 -0
  124. package/dist/llm/providers/endpoints/baichuan.js +20 -0
  125. package/dist/llm/providers/endpoints/baichuan.js.map +1 -0
  126. package/dist/llm/providers/endpoints/bailian.d.ts +25 -0
  127. package/dist/llm/providers/endpoints/bailian.d.ts.map +1 -0
  128. package/dist/llm/providers/endpoints/bailian.js +42 -0
  129. package/dist/llm/providers/endpoints/bailian.js.map +1 -0
  130. package/dist/llm/providers/endpoints/bailianCodingPlan.d.ts +10 -0
  131. package/dist/llm/providers/endpoints/bailianCodingPlan.d.ts.map +1 -0
  132. package/dist/llm/providers/endpoints/bailianCodingPlan.js +22 -0
  133. package/dist/llm/providers/endpoints/bailianCodingPlan.js.map +1 -0
  134. package/dist/llm/providers/endpoints/custom.d.ts +16 -0
  135. package/dist/llm/providers/endpoints/custom.d.ts.map +1 -0
  136. package/dist/llm/providers/endpoints/custom.js +15 -0
  137. package/dist/llm/providers/endpoints/custom.js.map +1 -0
  138. package/dist/llm/providers/endpoints/deepseek.d.ts +17 -0
  139. package/dist/llm/providers/endpoints/deepseek.d.ts.map +1 -0
  140. package/dist/llm/providers/endpoints/deepseek.js +20 -0
  141. package/dist/llm/providers/endpoints/deepseek.js.map +1 -0
  142. package/dist/llm/providers/endpoints/giteeai.d.ts +10 -0
  143. package/dist/llm/providers/endpoints/giteeai.d.ts.map +1 -0
  144. package/dist/llm/providers/endpoints/giteeai.js +33 -0
  145. package/dist/llm/providers/endpoints/giteeai.js.map +1 -0
  146. package/dist/llm/providers/endpoints/githubCopilot.d.ts +10 -0
  147. package/dist/llm/providers/endpoints/githubCopilot.d.ts.map +1 -0
  148. package/dist/llm/providers/endpoints/githubCopilot.js +35 -0
  149. package/dist/llm/providers/endpoints/githubCopilot.js.map +1 -0
  150. package/dist/llm/providers/endpoints/glmCodingPlan.d.ts +9 -0
  151. package/dist/llm/providers/endpoints/glmCodingPlan.d.ts.map +1 -0
  152. package/dist/llm/providers/endpoints/glmCodingPlan.js +21 -0
  153. package/dist/llm/providers/endpoints/glmCodingPlan.js.map +1 -0
  154. package/dist/llm/providers/endpoints/google.d.ts +12 -0
  155. package/dist/llm/providers/endpoints/google.d.ts.map +1 -0
  156. package/dist/llm/providers/endpoints/google.js +41 -0
  157. package/dist/llm/providers/endpoints/google.js.map +1 -0
  158. package/dist/llm/providers/endpoints/hunyuan.d.ts +10 -0
  159. package/dist/llm/providers/endpoints/hunyuan.d.ts.map +1 -0
  160. package/dist/llm/providers/endpoints/hunyuan.js +34 -0
  161. package/dist/llm/providers/endpoints/hunyuan.js.map +1 -0
  162. package/dist/llm/providers/endpoints/infiniai.d.ts +10 -0
  163. package/dist/llm/providers/endpoints/infiniai.d.ts.map +1 -0
  164. package/dist/llm/providers/endpoints/infiniai.js +64 -0
  165. package/dist/llm/providers/endpoints/infiniai.js.map +1 -0
  166. package/dist/llm/providers/endpoints/internlm.d.ts +10 -0
  167. package/dist/llm/providers/endpoints/internlm.d.ts.map +1 -0
  168. package/dist/llm/providers/endpoints/internlm.js +20 -0
  169. package/dist/llm/providers/endpoints/internlm.js.map +1 -0
  170. package/dist/llm/providers/endpoints/kimiCodingPlan.d.ts +9 -0
  171. package/dist/llm/providers/endpoints/kimiCodingPlan.d.ts.map +1 -0
  172. package/dist/llm/providers/endpoints/kimiCodingPlan.js +17 -0
  173. package/dist/llm/providers/endpoints/kimiCodingPlan.js.map +1 -0
  174. package/dist/llm/providers/endpoints/longcat.d.ts +9 -0
  175. package/dist/llm/providers/endpoints/longcat.d.ts.map +1 -0
  176. package/dist/llm/providers/endpoints/longcat.js +18 -0
  177. package/dist/llm/providers/endpoints/longcat.js.map +1 -0
  178. package/dist/llm/providers/endpoints/minimax.d.ts +15 -0
  179. package/dist/llm/providers/endpoints/minimax.d.ts.map +1 -0
  180. package/dist/llm/providers/endpoints/minimax.js +26 -0
  181. package/dist/llm/providers/endpoints/minimax.js.map +1 -0
  182. package/dist/llm/providers/endpoints/minimaxCodingPlan.d.ts +9 -0
  183. package/dist/llm/providers/endpoints/minimaxCodingPlan.d.ts.map +1 -0
  184. package/dist/llm/providers/endpoints/minimaxCodingPlan.js +21 -0
  185. package/dist/llm/providers/endpoints/minimaxCodingPlan.js.map +1 -0
  186. package/dist/llm/providers/endpoints/mistral.d.ts +11 -0
  187. package/dist/llm/providers/endpoints/mistral.d.ts.map +1 -0
  188. package/dist/llm/providers/endpoints/mistral.js +31 -0
  189. package/dist/llm/providers/endpoints/mistral.js.map +1 -0
  190. package/dist/llm/providers/endpoints/modelscope.d.ts +10 -0
  191. package/dist/llm/providers/endpoints/modelscope.d.ts.map +1 -0
  192. package/dist/llm/providers/endpoints/modelscope.js +22 -0
  193. package/dist/llm/providers/endpoints/modelscope.js.map +1 -0
  194. package/dist/llm/providers/endpoints/moonshot.d.ts +12 -0
  195. package/dist/llm/providers/endpoints/moonshot.d.ts.map +1 -0
  196. package/dist/llm/providers/endpoints/moonshot.js +29 -0
  197. package/dist/llm/providers/endpoints/moonshot.js.map +1 -0
  198. package/dist/llm/providers/endpoints/newapi.d.ts +14 -0
  199. package/dist/llm/providers/endpoints/newapi.d.ts.map +1 -0
  200. package/dist/llm/providers/endpoints/newapi.js +14 -0
  201. package/dist/llm/providers/endpoints/newapi.js.map +1 -0
  202. package/dist/llm/providers/endpoints/ollama.d.ts +12 -0
  203. package/dist/llm/providers/endpoints/ollama.d.ts.map +1 -0
  204. package/dist/llm/providers/endpoints/ollama.js +63 -0
  205. package/dist/llm/providers/endpoints/ollama.js.map +1 -0
  206. package/dist/llm/providers/endpoints/openai.d.ts +12 -0
  207. package/dist/llm/providers/endpoints/openai.d.ts.map +1 -0
  208. package/dist/llm/providers/endpoints/openai.js +67 -0
  209. package/dist/llm/providers/endpoints/openai.js.map +1 -0
  210. package/dist/llm/providers/endpoints/opencodeCodingPlan.d.ts +9 -0
  211. package/dist/llm/providers/endpoints/opencodeCodingPlan.d.ts.map +1 -0
  212. package/dist/llm/providers/endpoints/opencodeCodingPlan.js +23 -0
  213. package/dist/llm/providers/endpoints/opencodeCodingPlan.js.map +1 -0
  214. package/dist/llm/providers/endpoints/openrouter.d.ts +15 -0
  215. package/dist/llm/providers/endpoints/openrouter.d.ts.map +1 -0
  216. package/dist/llm/providers/endpoints/openrouter.js +74 -0
  217. package/dist/llm/providers/endpoints/openrouter.js.map +1 -0
  218. package/dist/llm/providers/endpoints/ppio.d.ts +15 -0
  219. package/dist/llm/providers/endpoints/ppio.d.ts.map +1 -0
  220. package/dist/llm/providers/endpoints/ppio.js +73 -0
  221. package/dist/llm/providers/endpoints/ppio.js.map +1 -0
  222. package/dist/llm/providers/endpoints/qiniu.d.ts +10 -0
  223. package/dist/llm/providers/endpoints/qiniu.d.ts.map +1 -0
  224. package/dist/llm/providers/endpoints/qiniu.js +24 -0
  225. package/dist/llm/providers/endpoints/qiniu.js.map +1 -0
  226. package/dist/llm/providers/endpoints/sensenova.d.ts +10 -0
  227. package/dist/llm/providers/endpoints/sensenova.d.ts.map +1 -0
  228. package/dist/llm/providers/endpoints/sensenova.js +37 -0
  229. package/dist/llm/providers/endpoints/sensenova.js.map +1 -0
  230. package/dist/llm/providers/endpoints/siliconcloud.d.ts +14 -0
  231. package/dist/llm/providers/endpoints/siliconcloud.d.ts.map +1 -0
  232. package/dist/llm/providers/endpoints/siliconcloud.js +114 -0
  233. package/dist/llm/providers/endpoints/siliconcloud.js.map +1 -0
  234. package/dist/llm/providers/endpoints/spark.d.ts +14 -0
  235. package/dist/llm/providers/endpoints/spark.d.ts.map +1 -0
  236. package/dist/llm/providers/endpoints/spark.js +21 -0
  237. package/dist/llm/providers/endpoints/spark.js.map +1 -0
  238. package/dist/llm/providers/endpoints/stepfun.d.ts +10 -0
  239. package/dist/llm/providers/endpoints/stepfun.d.ts.map +1 -0
  240. package/dist/llm/providers/endpoints/stepfun.js +27 -0
  241. package/dist/llm/providers/endpoints/stepfun.js.map +1 -0
  242. package/dist/llm/providers/endpoints/tencentcloud.d.ts +10 -0
  243. package/dist/llm/providers/endpoints/tencentcloud.d.ts.map +1 -0
  244. package/dist/llm/providers/endpoints/tencentcloud.js +17 -0
  245. package/dist/llm/providers/endpoints/tencentcloud.js.map +1 -0
  246. package/dist/llm/providers/endpoints/volcengine.d.ts +10 -0
  247. package/dist/llm/providers/endpoints/volcengine.d.ts.map +1 -0
  248. package/dist/llm/providers/endpoints/volcengine.js +44 -0
  249. package/dist/llm/providers/endpoints/volcengine.js.map +1 -0
  250. package/dist/llm/providers/endpoints/volcengineCodingPlan.d.ts +19 -0
  251. package/dist/llm/providers/endpoints/volcengineCodingPlan.d.ts.map +1 -0
  252. package/dist/llm/providers/endpoints/volcengineCodingPlan.js +25 -0
  253. package/dist/llm/providers/endpoints/volcengineCodingPlan.js.map +1 -0
  254. package/dist/llm/providers/endpoints/wenxin.d.ts +10 -0
  255. package/dist/llm/providers/endpoints/wenxin.d.ts.map +1 -0
  256. package/dist/llm/providers/endpoints/wenxin.js +98 -0
  257. package/dist/llm/providers/endpoints/wenxin.js.map +1 -0
  258. package/dist/llm/providers/endpoints/xai.d.ts +11 -0
  259. package/dist/llm/providers/endpoints/xai.d.ts.map +1 -0
  260. package/dist/llm/providers/endpoints/xai.js +25 -0
  261. package/dist/llm/providers/endpoints/xai.js.map +1 -0
  262. package/dist/llm/providers/endpoints/xiaomimimo.d.ts +12 -0
  263. package/dist/llm/providers/endpoints/xiaomimimo.d.ts.map +1 -0
  264. package/dist/llm/providers/endpoints/xiaomimimo.js +16 -0
  265. package/dist/llm/providers/endpoints/xiaomimimo.js.map +1 -0
  266. package/dist/llm/providers/endpoints/zeroone.d.ts +10 -0
  267. package/dist/llm/providers/endpoints/zeroone.d.ts.map +1 -0
  268. package/dist/llm/providers/endpoints/zeroone.js +26 -0
  269. package/dist/llm/providers/endpoints/zeroone.js.map +1 -0
  270. package/dist/llm/providers/endpoints/zhipu.d.ts +12 -0
  271. package/dist/llm/providers/endpoints/zhipu.d.ts.map +1 -0
  272. package/dist/llm/providers/endpoints/zhipu.js +51 -0
  273. package/dist/llm/providers/endpoints/zhipu.js.map +1 -0
  274. package/dist/llm/providers/index.d.ts +5 -0
  275. package/dist/llm/providers/index.d.ts.map +1 -0
  276. package/dist/llm/providers/index.js +67 -0
  277. package/dist/llm/providers/index.js.map +1 -0
  278. package/dist/llm/providers/lookup.d.ts +16 -0
  279. package/dist/llm/providers/lookup.d.ts.map +1 -0
  280. package/dist/llm/providers/lookup.js +68 -0
  281. package/dist/llm/providers/lookup.js.map +1 -0
  282. package/dist/llm/providers/probe.d.ts +11 -0
  283. package/dist/llm/providers/probe.d.ts.map +1 -0
  284. package/dist/llm/providers/probe.js +24 -0
  285. package/dist/llm/providers/probe.js.map +1 -0
  286. package/dist/llm/providers/types.d.ts +71 -0
  287. package/dist/llm/providers/types.d.ts.map +1 -0
  288. package/dist/llm/providers/types.js +9 -0
  289. package/dist/llm/providers/types.js.map +1 -0
  290. package/dist/llm/providers/verify.d.ts +27 -0
  291. package/dist/llm/providers/verify.d.ts.map +1 -0
  292. package/dist/llm/providers/verify.js +77 -0
  293. package/dist/llm/providers/verify.js.map +1 -0
  294. package/dist/llm/secrets.d.ts.map +1 -1
  295. package/dist/llm/secrets.js +27 -2
  296. package/dist/llm/secrets.js.map +1 -1
  297. package/dist/llm/service-presets.d.ts +13 -3
  298. package/dist/llm/service-presets.d.ts.map +1 -1
  299. package/dist/llm/service-presets.js +78 -42
  300. package/dist/llm/service-presets.js.map +1 -1
  301. package/dist/llm/service-resolver.d.ts +1 -1
  302. package/dist/llm/service-resolver.d.ts.map +1 -1
  303. package/dist/llm/service-resolver.js +13 -0
  304. package/dist/llm/service-resolver.js.map +1 -1
  305. package/dist/models/book-rules.d.ts +23 -1
  306. package/dist/models/book-rules.d.ts.map +1 -1
  307. package/dist/models/book-rules.js +54 -2
  308. package/dist/models/book-rules.js.map +1 -1
  309. package/dist/models/input-governance.d.ts +20 -244
  310. package/dist/models/input-governance.d.ts.map +1 -1
  311. package/dist/models/input-governance.js +7 -51
  312. package/dist/models/input-governance.js.map +1 -1
  313. package/dist/models/project.d.ts +29 -28
  314. package/dist/models/project.d.ts.map +1 -1
  315. package/dist/models/project.js +11 -9
  316. package/dist/models/project.js.map +1 -1
  317. package/dist/models/runtime-state.d.ts +120 -0
  318. package/dist/models/runtime-state.d.ts.map +1 -1
  319. package/dist/models/runtime-state.js +12 -0
  320. package/dist/models/runtime-state.js.map +1 -1
  321. package/dist/pipeline/agent.d.ts.map +1 -1
  322. package/dist/pipeline/agent.js +59 -10
  323. package/dist/pipeline/agent.js.map +1 -1
  324. package/dist/pipeline/chapter-review-cycle.d.ts +11 -4
  325. package/dist/pipeline/chapter-review-cycle.d.ts.map +1 -1
  326. package/dist/pipeline/chapter-review-cycle.js +156 -73
  327. package/dist/pipeline/chapter-review-cycle.js.map +1 -1
  328. package/dist/pipeline/chapter-truth-validation.d.ts +2 -1
  329. package/dist/pipeline/chapter-truth-validation.d.ts.map +1 -1
  330. package/dist/pipeline/chapter-truth-validation.js +1 -1
  331. package/dist/pipeline/chapter-truth-validation.js.map +1 -1
  332. package/dist/pipeline/persisted-governed-plan.d.ts +1 -0
  333. package/dist/pipeline/persisted-governed-plan.d.ts.map +1 -1
  334. package/dist/pipeline/persisted-governed-plan.js +181 -66
  335. package/dist/pipeline/persisted-governed-plan.js.map +1 -1
  336. package/dist/pipeline/runner.d.ts +20 -17
  337. package/dist/pipeline/runner.d.ts.map +1 -1
  338. package/dist/pipeline/runner.js +359 -84
  339. package/dist/pipeline/runner.js.map +1 -1
  340. package/dist/state/manager.d.ts.map +1 -1
  341. package/dist/state/manager.js +44 -4
  342. package/dist/state/manager.js.map +1 -1
  343. package/dist/state/memory-db.d.ts +6 -0
  344. package/dist/state/memory-db.d.ts.map +1 -1
  345. package/dist/state/memory-db.js.map +1 -1
  346. package/dist/state/runtime-state-store.d.ts.map +1 -1
  347. package/dist/state/runtime-state-store.js +4 -1
  348. package/dist/state/runtime-state-store.js.map +1 -1
  349. package/dist/state/state-projections.d.ts +3 -1
  350. package/dist/state/state-projections.d.ts.map +1 -1
  351. package/dist/state/state-projections.js +58 -15
  352. package/dist/state/state-projections.js.map +1 -1
  353. package/dist/utils/book-id.d.ts +4 -0
  354. package/dist/utils/book-id.d.ts.map +1 -0
  355. package/dist/utils/book-id.js +27 -0
  356. package/dist/utils/book-id.js.map +1 -0
  357. package/dist/utils/chapter-cadence.js +1 -0
  358. package/dist/utils/chapter-cadence.js.map +1 -1
  359. package/dist/utils/chapter-memo-parser.d.ts +19 -0
  360. package/dist/utils/chapter-memo-parser.d.ts.map +1 -0
  361. package/dist/utils/chapter-memo-parser.js +114 -0
  362. package/dist/utils/chapter-memo-parser.js.map +1 -0
  363. package/dist/utils/config-loader.d.ts +7 -11
  364. package/dist/utils/config-loader.d.ts.map +1 -1
  365. package/dist/utils/config-loader.js +13 -253
  366. package/dist/utils/config-loader.js.map +1 -1
  367. package/dist/utils/context-assembly.d.ts +24 -0
  368. package/dist/utils/context-assembly.d.ts.map +1 -0
  369. package/dist/utils/context-assembly.js +77 -0
  370. package/dist/utils/context-assembly.js.map +1 -0
  371. package/dist/utils/effective-llm-config.d.ts +34 -0
  372. package/dist/utils/effective-llm-config.d.ts.map +1 -0
  373. package/dist/utils/effective-llm-config.js +417 -0
  374. package/dist/utils/effective-llm-config.js.map +1 -0
  375. package/dist/utils/governed-working-set.js +1 -1
  376. package/dist/utils/governed-working-set.js.map +1 -1
  377. package/dist/utils/hook-ledger-validator.d.ts +82 -0
  378. package/dist/utils/hook-ledger-validator.d.ts.map +1 -0
  379. package/dist/utils/hook-ledger-validator.js +225 -0
  380. package/dist/utils/hook-ledger-validator.js.map +1 -0
  381. package/dist/utils/hook-lifecycle.d.ts +5 -0
  382. package/dist/utils/hook-lifecycle.d.ts.map +1 -1
  383. package/dist/utils/hook-lifecycle.js +32 -0
  384. package/dist/utils/hook-lifecycle.js.map +1 -1
  385. package/dist/utils/hook-policy.d.ts +0 -17
  386. package/dist/utils/hook-policy.d.ts.map +1 -1
  387. package/dist/utils/hook-policy.js +0 -30
  388. package/dist/utils/hook-policy.js.map +1 -1
  389. package/dist/utils/hook-promotion.d.ts +83 -0
  390. package/dist/utils/hook-promotion.d.ts.map +1 -0
  391. package/dist/utils/hook-promotion.js +241 -0
  392. package/dist/utils/hook-promotion.js.map +1 -0
  393. package/dist/utils/hook-stale-detection.d.ts +51 -0
  394. package/dist/utils/hook-stale-detection.d.ts.map +1 -0
  395. package/dist/utils/hook-stale-detection.js +125 -0
  396. package/dist/utils/hook-stale-detection.js.map +1 -0
  397. package/dist/utils/llm-endpoint-auth.d.ts +5 -0
  398. package/dist/utils/llm-endpoint-auth.d.ts.map +1 -0
  399. package/dist/utils/llm-endpoint-auth.js +36 -0
  400. package/dist/utils/llm-endpoint-auth.js.map +1 -0
  401. package/dist/utils/llm-env.d.ts +14 -0
  402. package/dist/utils/llm-env.d.ts.map +1 -0
  403. package/dist/utils/llm-env.js +53 -0
  404. package/dist/utils/llm-env.js.map +1 -0
  405. package/dist/utils/memory-retrieval.d.ts +23 -1
  406. package/dist/utils/memory-retrieval.d.ts.map +1 -1
  407. package/dist/utils/memory-retrieval.js +45 -2
  408. package/dist/utils/memory-retrieval.js.map +1 -1
  409. package/dist/utils/narrative-control.d.ts +16 -0
  410. package/dist/utils/narrative-control.d.ts.map +1 -0
  411. package/dist/utils/narrative-control.js +131 -0
  412. package/dist/utils/narrative-control.js.map +1 -0
  413. package/dist/utils/path-safety.d.ts +2 -0
  414. package/dist/utils/path-safety.d.ts.map +1 -0
  415. package/dist/utils/path-safety.js +11 -0
  416. package/dist/utils/path-safety.js.map +1 -0
  417. package/dist/utils/planning-materials.d.ts +35 -0
  418. package/dist/utils/planning-materials.d.ts.map +1 -0
  419. package/dist/utils/planning-materials.js +123 -0
  420. package/dist/utils/planning-materials.js.map +1 -0
  421. package/dist/utils/proxy-fetch.d.ts +9 -0
  422. package/dist/utils/proxy-fetch.d.ts.map +1 -0
  423. package/dist/utils/proxy-fetch.js +31 -0
  424. package/dist/utils/proxy-fetch.js.map +1 -0
  425. package/dist/utils/runtime-writer.d.ts +14 -0
  426. package/dist/utils/runtime-writer.d.ts.map +1 -0
  427. package/dist/utils/runtime-writer.js +21 -0
  428. package/dist/utils/runtime-writer.js.map +1 -0
  429. package/dist/utils/spot-fix-patches.d.ts +7 -0
  430. package/dist/utils/spot-fix-patches.d.ts.map +1 -1
  431. package/dist/utils/spot-fix-patches.js +109 -36
  432. package/dist/utils/spot-fix-patches.js.map +1 -1
  433. package/dist/utils/story-markdown.d.ts.map +1 -1
  434. package/dist/utils/story-markdown.js +104 -6
  435. package/dist/utils/story-markdown.js.map +1 -1
  436. package/dist/utils/writing-methodology.d.ts +10 -0
  437. package/dist/utils/writing-methodology.d.ts.map +1 -0
  438. package/dist/utils/writing-methodology.js +163 -0
  439. package/dist/utils/writing-methodology.js.map +1 -0
  440. package/package.json +3 -2
  441. package/dist/utils/hook-agenda.d.ts +0 -21
  442. package/dist/utils/hook-agenda.d.ts.map +0 -1
  443. package/dist/utils/hook-agenda.js +0 -95
  444. package/dist/utils/hook-agenda.js.map +0 -1
@@ -1,5 +1,14 @@
1
1
  import { streamSimple as piStreamSimple, stream as piStream, completeSimple as piCompleteSimple, complete as piComplete, } from "@mariozechner/pi-ai";
2
2
  import { resolveServicePreset } from "./service-presets.js";
3
+ import { getEndpoint } from "./providers/index.js";
4
+ import { lookupModel } from "./providers/lookup.js";
5
+ import { fetchWithProxy } from "../utils/proxy-fetch.js";
6
+ const INKOS_USER_AGENT = "InkOS/1.3.5";
7
+ const UNKNOWN_MODEL_FALLBACK_MAX_TOKENS = 8192 * 3;
8
+ const TRANSIENT_LLM_RETRIES = 2;
9
+ function mergeUserAgent(headers) {
10
+ return { "User-Agent": INKOS_USER_AGENT, ...(headers ?? {}) };
11
+ }
3
12
  export function createStreamMonitor(onProgress, intervalMs = 30000) {
4
13
  let totalChars = 0;
5
14
  let chineseChars = 0;
@@ -36,14 +45,11 @@ export function createStreamMonitor(onProgress, intervalMs = 30000) {
36
45
  }
37
46
  // === Factory ===
38
47
  export function createLLMClient(config) {
48
+ // C1 (v2.0.0):config.maxTokens / maxTokensCap 已删除;defaults.maxTokens 完全从 modelCard 推导。
49
+ const _earlyCard = lookupModel(config.service ?? "custom", config.model);
39
50
  const defaults = {
40
51
  temperature: config.temperature ?? 0.7,
41
- // fallback: agent 没传 per-call 时用这个
42
- maxTokens: config.maxTokens ?? 8192,
43
- // cap: 只在用户显式配 maxTokensCap 时生效;默认 null = 不封顶 per-call。
44
- // **禁止**改成 `config.maxTokens ?? null` —— 那样会让 architect 的 per-call
45
- // 16384 被用户 config.maxTokens=8192 自动裁剪,基础设定输出会被截断。
46
- maxTokensCap: config.maxTokensCap ?? null,
52
+ maxTokens: _earlyCard?.maxOutput ?? UNKNOWN_MODEL_FALLBACK_MAX_TOKENS,
47
53
  thinkingBudget: config.thinkingBudget ?? 0,
48
54
  extra: config.extra ?? {},
49
55
  };
@@ -52,22 +58,47 @@ export function createLLMClient(config) {
52
58
  // --- Build pi-ai Model object ---
53
59
  const serviceName = config.service ?? "custom";
54
60
  const preset = resolveServicePreset(serviceName);
55
- const piApi = resolvePiApi(serviceName, config.apiFormat, preset?.api);
56
- const baseUrl = config.baseUrl || preset?.baseUrl || "";
61
+ const inkosProvider = getEndpoint(serviceName);
62
+ const modelCard = lookupModel(serviceName, config.model);
63
+ const piApi = resolvePiApi(serviceName, config.apiFormat, (inkosProvider?.api ?? preset?.api));
64
+ const baseUrl = config.baseUrl || inkosProvider?.baseUrl || preset?.baseUrl || "";
57
65
  const extraHeaders = config.headers ?? parseEnvHeaders();
66
+ const compat = piApi === "openai-completions"
67
+ ? resolveProviderCompat(inkosProvider, baseUrl)
68
+ : undefined;
58
69
  const provider = config.provider === "anthropic" ? "anthropic" : "openai";
70
+ // pi-ai provider 字段:大多数情况 pi-ai 会按 baseUrl 自动嗅探(openrouter.ai / api.z.ai /
71
+ // api.x.ai / deepseek.com / anthropic.com 等)。这里只列 pi-ai 嗅探不到、需要显式指定的少数情况。
72
+ let piProvider;
73
+ if (inkosProvider?.id === "google")
74
+ piProvider = "google";
75
+ else if (inkosProvider?.id === "zhipu")
76
+ piProvider = "zai";
77
+ else if (inkosProvider?.id === "openrouter")
78
+ piProvider = "openrouter";
79
+ else if (inkosProvider?.id === "githubCopilot")
80
+ piProvider = "githubCopilot";
81
+ else if (inkosProvider?.api === "anthropic-messages")
82
+ piProvider = "anthropic";
83
+ else
84
+ piProvider = provider;
59
85
  const piModel = {
60
- id: config.model,
86
+ id: modelCard?.deploymentName ?? config.model,
61
87
  name: config.model,
62
88
  api: piApi,
63
- provider,
89
+ provider: piProvider,
64
90
  baseUrl,
91
+ // 注意:piModel.reasoning 是"激活 reasoning 模式"标志(会让 pi-ai 把 system 改成 developer role 等),
92
+ // 不是"模型能力"标签。只有用户显式配了 thinkingBudget > 0 才启用 reasoning mode。
93
+ // 千万不要从 lobe abilities.reasoning 自动推导,否则 Moonshot 这类不支持 developer role 的服务
94
+ // 会把 content 吃掉,只返回 reasoning_content(见 R4 bug 1 诊断)。
65
95
  reasoning: (config.thinkingBudget ?? 0) > 0,
66
96
  input: ["text"],
67
97
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
68
- contextWindow: 128_000,
69
- maxTokens: config.maxTokens ?? 8192,
98
+ contextWindow: modelCard?.contextWindowTokens ?? 128_000,
99
+ maxTokens: modelCard?.maxOutput ?? UNKNOWN_MODEL_FALLBACK_MAX_TOKENS,
70
100
  ...(extraHeaders ? { headers: extraHeaders } : {}),
101
+ ...(compat ? { compat } : {}),
71
102
  };
72
103
  return {
73
104
  provider,
@@ -75,6 +106,7 @@ export function createLLMClient(config) {
75
106
  configSource: config.configSource,
76
107
  apiFormat,
77
108
  stream,
109
+ proxyUrl: config.proxyUrl,
78
110
  _piModel: piModel,
79
111
  _apiKey: config.apiKey,
80
112
  defaults,
@@ -86,6 +118,13 @@ function resolvePiApi(serviceName, apiFormat, presetApi) {
86
118
  }
87
119
  return (presetApi ?? "openai-completions");
88
120
  }
121
+ function resolveProviderCompat(provider, baseUrl) {
122
+ const compat = {
123
+ ...(provider?.compat ?? {}),
124
+ ...(baseUrl.includes("generativelanguage.googleapis.com") ? { supportsStore: false } : {}),
125
+ };
126
+ return Object.keys(compat).length > 0 ? compat : undefined;
127
+ }
89
128
  function parseEnvHeaders() {
90
129
  const raw = process.env.INKOS_LLM_HEADERS;
91
130
  if (!raw)
@@ -128,27 +167,28 @@ function stripReservedKeys(extra) {
128
167
  }
129
168
  // === Fixed-Temperature Model Clamp ===
130
169
  //
131
- // 部分 thinking 模型(如 Moonshot kimi-k2.5、kimi-thinking-preview)强制要求
132
- // temperature === 1,其他值会被 API 直接 400 拒绝。为让这类模型能和 inkos
133
- // 已有的 per-call 温度调参(0.1 validator 0.8 architect brainstorm)共存,
134
- // 在 provider 层统一夹制:命中名单就把传入的 temperature 强制改成 1,并对
135
- // 每个模型名打一次 warning 提示用户。
136
- function requiresFixedTemperature(model) {
137
- const lower = model.toLowerCase();
138
- // kimi-k2.5 及其子变体(k2.5-preview 等),以及任何名字里带 "thinking" 的模型
139
- return lower.startsWith("kimi-k2.5") || lower.includes("thinking");
140
- }
170
+ // 部分 thinking 模型(如 Moonshot kimi-k2.5/k2.6、kimi-k2-thinking)的 API
171
+ // 硬要求 temperature === 1,其他值会被直接 400 拒绝(Moonshot 返回
172
+ // `invalid temperature: only 1 is allowed for this model`)。
173
+ //
174
+ // inkos writer/validator/architect 各自带 per-call 温度(0.1~1.5),
175
+ // 所以 provider 层统一夹制:如果 bank 里模型卡标了 temperature 字段,
176
+ // 就把 per-call 温度 clamp 到那个值,并对每个模型名打一次 warning。
177
+ //
178
+ // 这个字段只表达"服务端硬约束",普通模型不要标,避免误伤 per-call 调参。
141
179
  const warnedFixedTemperatureModels = new Set();
142
- function clampTemperatureForModel(model, requested) {
143
- if (!requiresFixedTemperature(model))
180
+ function clampTemperatureForModel(service, model, requested) {
181
+ const card = service ? lookupModel(service, model) : undefined;
182
+ if (card?.temperature === undefined)
144
183
  return requested;
145
- if (requested === 1)
146
- return 1;
184
+ const locked = card.temperature;
185
+ if (requested === locked)
186
+ return locked;
147
187
  if (!warnedFixedTemperatureModels.has(model)) {
148
188
  warnedFixedTemperatureModels.add(model);
149
- console.warn(`[inkos] 模型 "${model}" thinking 模型,强制 temperature=1(原请求值 ${requested})`);
189
+ console.warn(`[inkos] 模型 "${model}" API 要求 temperature=${locked},已 clamp(原值 ${requested})`);
150
190
  }
151
- return 1;
191
+ return locked;
152
192
  }
153
193
  // 仅测试用:清空 warning 去重集合。
154
194
  export function __resetFixedTemperatureWarnings() {
@@ -161,11 +201,24 @@ function wrapLLMError(error, context) {
161
201
  ? `\n (baseUrl: ${context.baseUrl}, model: ${context.model})`
162
202
  : "";
163
203
  if (msg.includes("400")) {
164
- return new Error(`API 返回 400 (请求参数错误)。可能原因:\n` +
165
- ` 1. 模型名称不正确(检查 INKOS_LLM_MODEL)\n` +
166
- ` 2. 提供方不支持某些参数(如 max_tokens、stream)\n` +
167
- ` 3. 消息格式不兼容(部分提供方不支持 system role)\n` +
168
- ` 建议:检查提供方文档,确认该接口要求流式开启、流式关闭,还是根本不支持 stream${ctxLine}`);
204
+ // 抽上游 error body message / reason / code(和下方 5xx 一致),让真实错因浮到用户面前
205
+ let detail = "";
206
+ if (error && typeof error === "object") {
207
+ const err = error;
208
+ const bodyLike = err.error ?? err.body;
209
+ if (bodyLike && typeof bodyLike === "object") {
210
+ const b = bodyLike;
211
+ if (b.message)
212
+ detail = b.type ? `${b.type}: ${b.message}` : b.message;
213
+ else if (b.reason)
214
+ detail = b.reason;
215
+ }
216
+ }
217
+ return new Error(`API 返回 400(请求参数错误)。${detail ? `上游详情:${detail}。\n` : ""}` +
218
+ `常见原因:\n` +
219
+ ` 1. temperature / max_tokens 超出模型约束(如 Moonshot kimi-k2.X 强制 temperature=1)\n` +
220
+ ` 2. 模型名称不正确或未上架\n` +
221
+ ` 3. 消息格式不兼容(部分服务不支持 system role 或 developer role)${ctxLine}`);
169
222
  }
170
223
  if (msg.includes("403")) {
171
224
  return new Error(`API 返回 403 (请求被拒绝)。可能原因:\n` +
@@ -180,15 +233,99 @@ function wrapLLMError(error, context) {
180
233
  if (msg.includes("429")) {
181
234
  return new Error(`API 返回 429 (请求过多)。请稍后重试,或检查 API 配额。${ctxLine}`);
182
235
  }
183
- if (msg.includes("Connection error") || msg.includes("ECONNREFUSED") || msg.includes("ENOTFOUND") || msg.includes("fetch failed")) {
236
+ if (msg.includes("Connection error")
237
+ || msg.includes("ECONNREFUSED")
238
+ || msg.includes("ENOTFOUND")
239
+ || msg.includes("fetch failed")
240
+ || msg.includes("terminated")
241
+ || msg.includes("UND_ERR_SOCKET")
242
+ || msg.includes("ECONNRESET")
243
+ || msg.includes("ETIMEDOUT")
244
+ || msg.includes("EPIPE")) {
184
245
  return new Error(`无法连接到 API 服务。可能原因:\n` +
185
246
  ` 1. baseUrl 地址不正确(当前:${context?.baseUrl ?? "未知"})\n` +
186
247
  ` 2. 网络不通或被防火墙拦截\n` +
187
248
  ` 3. API 服务暂时不可用\n` +
188
249
  ` 建议:检查 INKOS_LLM_BASE_URL 是否包含完整路径(如 /v1)`);
189
250
  }
251
+ // R4 Bug 2: 5xx "status code (no body)" — 尝试从 OpenAI SDK APIError 里抽 body 给用户看具体原因
252
+ // (如 PPIO 的 {"code":500,"reason":"MODEL_NOT_AVAILABLE","message":"model not available"})
253
+ if (msg.includes("status code") && msg.includes("no body")) {
254
+ let detail = "";
255
+ if (error && typeof error === "object") {
256
+ const err = error;
257
+ const bodyLike = err.error ?? err.body;
258
+ if (bodyLike && typeof bodyLike === "object") {
259
+ const b = bodyLike;
260
+ if (b.reason)
261
+ detail = `${b.reason}${b.message ? `: ${b.message}` : ""}`;
262
+ else if (b.message)
263
+ detail = b.message;
264
+ }
265
+ }
266
+ return new Error(`API 返回 5xx(上游服务异常)。${detail ? `上游详情:${detail}。` : ""}\n` +
267
+ `可能原因:\n` +
268
+ ` 1. 模型在 /models 列表但 inference 未上架(如 PPIO 返回 MODEL_NOT_AVAILABLE)\n` +
269
+ ` 2. 服务端临时故障,稍后重试\n` +
270
+ ` 3. 当前 apikey 无权限调用该模型${ctxLine}`);
271
+ }
190
272
  return error instanceof Error ? error : new Error(msg);
191
273
  }
274
+ function collectErrorText(error, depth = 0) {
275
+ if (depth > 4 || error === null || error === undefined)
276
+ return "";
277
+ const parts = [String(error)];
278
+ if (error instanceof Error) {
279
+ parts.push(error.name, error.message);
280
+ const cause = error.cause;
281
+ if (cause)
282
+ parts.push(collectErrorText(cause, depth + 1));
283
+ }
284
+ else if (typeof error === "object") {
285
+ const err = error;
286
+ if (err.name)
287
+ parts.push(String(err.name));
288
+ if (err.message)
289
+ parts.push(String(err.message));
290
+ if (err.code)
291
+ parts.push(String(err.code));
292
+ if (err.cause)
293
+ parts.push(collectErrorText(err.cause, depth + 1));
294
+ }
295
+ return parts.join("\n");
296
+ }
297
+ function isTransientLLMTransportError(error) {
298
+ const text = collectErrorText(error);
299
+ return [
300
+ "terminated",
301
+ "UND_ERR_SOCKET",
302
+ "ECONNRESET",
303
+ "ETIMEDOUT",
304
+ "EPIPE",
305
+ "socket hang up",
306
+ "other side closed",
307
+ "network socket disconnected",
308
+ ].some((needle) => text.includes(needle));
309
+ }
310
+ async function withTransientLLMRetry(run, options) {
311
+ const enabled = options?.enabled ?? true;
312
+ let lastError;
313
+ for (let attempt = 0; attempt <= TRANSIENT_LLM_RETRIES; attempt++) {
314
+ try {
315
+ return await run();
316
+ }
317
+ catch (error) {
318
+ lastError = error;
319
+ if (!enabled
320
+ || attempt >= TRANSIENT_LLM_RETRIES
321
+ || error instanceof PartialResponseError
322
+ || !isTransientLLMTransportError(error)) {
323
+ throw error;
324
+ }
325
+ }
326
+ }
327
+ throw lastError;
328
+ }
192
329
  function shouldUseNativeCustomTransport(client) {
193
330
  return client.configSource === "studio"
194
331
  && client.service === "custom"
@@ -231,6 +368,35 @@ function buildResponsesInput(messages) {
231
368
  content: [{ type: "input_text", text: message.content }],
232
369
  }));
233
370
  }
371
+ function hasSystemMessages(messages) {
372
+ return messages.some((message) => message.role === "system" && message.content.trim().length > 0);
373
+ }
374
+ function foldSystemMessagesIntoFirstUser(messages) {
375
+ const system = joinSystemPrompt(messages);
376
+ const nonSystemMessages = messages.filter((message) => message.role !== "system");
377
+ if (!system)
378
+ return [...nonSystemMessages];
379
+ const firstUserIndex = nonSystemMessages.findIndex((message) => message.role === "user");
380
+ const prefix = `System instructions:\n${system}\n\nUser request:\n`;
381
+ if (firstUserIndex < 0) {
382
+ return [{ role: "user", content: `System instructions:\n${system}` }, ...nonSystemMessages];
383
+ }
384
+ return nonSystemMessages.map((message, index) => index === firstUserIndex
385
+ ? { ...message, content: `${prefix}${message.content}` }
386
+ : message);
387
+ }
388
+ function isSystemRoleUnsupportedErrorText(text) {
389
+ const normalized = text.toLowerCase();
390
+ const mentionsSystemRole = normalized.includes("system") && normalized.includes("role");
391
+ if (!mentionsSystemRole)
392
+ return false;
393
+ return normalized.includes("unsupported")
394
+ || normalized.includes("not support")
395
+ || normalized.includes("does not support")
396
+ || normalized.includes("invalid")
397
+ || normalized.includes("不支持")
398
+ || normalized.includes("不允许");
399
+ }
234
400
  async function readErrorResponse(res) {
235
401
  const text = await res.text().catch(() => "");
236
402
  try {
@@ -273,17 +439,26 @@ function parseSseEvents(buffer) {
273
439
  }
274
440
  return { events, rest };
275
441
  }
276
- function extractChatContent(json) {
277
- const content = json?.choices?.[0]?.message?.content;
278
- if (typeof content === "string")
279
- return content;
280
- if (Array.isArray(content)) {
281
- return content
442
+ function extractOpenAITextPart(value) {
443
+ if (typeof value === "string")
444
+ return value;
445
+ if (Array.isArray(value)) {
446
+ return value
282
447
  .map((item) => typeof item?.text === "string" ? item.text : typeof item?.content === "string" ? item.content : "")
283
448
  .join("");
284
449
  }
285
450
  return "";
286
451
  }
452
+ function extractChatContent(json) {
453
+ const message = json?.choices?.[0]?.message;
454
+ return extractOpenAITextPart(message?.content) || extractOpenAITextPart(message?.reasoning_content);
455
+ }
456
+ function extractChatDeltaContent(json) {
457
+ return extractOpenAITextPart(json?.choices?.[0]?.delta?.content);
458
+ }
459
+ function extractChatDeltaReasoningContent(json) {
460
+ return extractOpenAITextPart(json?.choices?.[0]?.delta?.reasoning_content);
461
+ }
287
462
  function extractResponsesContent(json) {
288
463
  const output = Array.isArray(json?.output) ? json.output : [];
289
464
  return output
@@ -321,9 +496,10 @@ async function chatCompletionViaCustomAnthropicCompatible(client, model, message
321
496
  const system = joinSystemPrompt(messages);
322
497
  if (system)
323
498
  payload.system = system;
324
- const response = await fetch(`${baseUrl.replace(/\/$/, "")}/messages`, {
499
+ const response = await fetchWithProxy(`${baseUrl.replace(/\/$/, "")}/messages`, {
325
500
  method: "POST",
326
501
  headers: {
502
+ "User-Agent": INKOS_USER_AGENT,
327
503
  "x-api-key": client._apiKey ?? "",
328
504
  "anthropic-version": "2023-06-01",
329
505
  "Content-Type": "application/json",
@@ -331,7 +507,7 @@ async function chatCompletionViaCustomAnthropicCompatible(client, model, message
331
507
  ...(client._piModel?.headers ?? {}),
332
508
  },
333
509
  body: JSON.stringify(payload),
334
- });
510
+ }, client.proxyUrl);
335
511
  if (!response.ok) {
336
512
  throw wrapLLMError(new Error(await readErrorResponse(response)), errorCtx);
337
513
  }
@@ -397,7 +573,7 @@ async function chatCompletionViaCustomAnthropicCompatible(client, model, message
397
573
  }
398
574
  return { content, usage };
399
575
  }
400
- async function chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta) {
576
+ async function chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta, allowSystemRoleFallback = true) {
401
577
  if (client.provider === "anthropic") {
402
578
  return chatCompletionViaCustomAnthropicCompatible(client, model, messages, resolved, onStreamProgress, onTextDelta);
403
579
  }
@@ -419,11 +595,11 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
419
595
  const instructions = joinSystemPrompt(messages);
420
596
  if (instructions)
421
597
  payload.instructions = instructions;
422
- const response = await fetch(`${baseUrl.replace(/\/$/, "")}/responses`, {
598
+ const response = await fetchWithProxy(`${baseUrl.replace(/\/$/, "")}/responses`, {
423
599
  method: "POST",
424
600
  headers,
425
601
  body: JSON.stringify(payload),
426
- });
602
+ }, client.proxyUrl);
427
603
  if (!response.ok) {
428
604
  throw wrapLLMError(new Error(await readErrorResponse(response)), errorCtx);
429
605
  }
@@ -503,13 +679,17 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
503
679
  if (client.stream) {
504
680
  payload.stream_options = { include_usage: true };
505
681
  }
506
- const response = await fetch(`${baseUrl.replace(/\/$/, "")}/chat/completions`, {
682
+ const response = await fetchWithProxy(`${baseUrl.replace(/\/$/, "")}/chat/completions`, {
507
683
  method: "POST",
508
684
  headers,
509
685
  body: JSON.stringify(payload),
510
- });
686
+ }, client.proxyUrl);
511
687
  if (!response.ok) {
512
- throw wrapLLMError(new Error(await readErrorResponse(response)), errorCtx);
688
+ const detail = await readErrorResponse(response);
689
+ if (allowSystemRoleFallback && hasSystemMessages(messages) && isSystemRoleUnsupportedErrorText(detail)) {
690
+ return chatCompletionViaCustomOpenAICompatible(client, model, foldSystemMessagesIntoFirstUser(messages), resolved, onStreamProgress, onTextDelta, false);
691
+ }
692
+ throw wrapLLMError(new Error(detail), errorCtx);
513
693
  }
514
694
  if (!client.stream) {
515
695
  const json = await response.json();
@@ -532,6 +712,7 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
532
712
  const decoder = new TextDecoder();
533
713
  let buffer = "";
534
714
  let content = "";
715
+ let reasoningContent = "";
535
716
  let usage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
536
717
  try {
537
718
  while (true) {
@@ -545,12 +726,19 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
545
726
  if (!event.data || event.data === "[DONE]")
546
727
  continue;
547
728
  const json = JSON.parse(event.data);
548
- const delta = json?.choices?.[0]?.delta?.content;
549
- if (typeof delta === "string") {
729
+ const delta = extractChatDeltaContent(json);
730
+ if (delta) {
550
731
  content += delta;
551
732
  monitor.onChunk(delta);
552
733
  onTextDelta?.(delta);
553
734
  }
735
+ else {
736
+ const reasoningDelta = extractChatDeltaReasoningContent(json);
737
+ if (reasoningDelta) {
738
+ reasoningContent += reasoningDelta;
739
+ monitor.onChunk(reasoningDelta);
740
+ }
741
+ }
554
742
  if (json?.usage) {
555
743
  usage = {
556
744
  promptTokens: json.usage.prompt_tokens ?? usage.promptTokens,
@@ -564,28 +752,32 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
564
752
  finally {
565
753
  monitor.stop();
566
754
  }
567
- if (!content) {
755
+ const finalContent = content || reasoningContent;
756
+ if (!finalContent) {
568
757
  throw wrapLLMError(new Error("LLM returned empty response from stream"), errorCtx);
569
758
  }
570
- return { content, usage };
759
+ return { content: finalContent, usage };
571
760
  }
572
761
  // === Simple Chat (used by all agents via BaseAgent.chat()) ===
573
762
  export async function chatCompletion(client, model, messages, options) {
574
- const perCallMax = options?.maxTokens ?? client.defaults.maxTokens;
575
- const cap = client.defaults.maxTokensCap;
763
+ // C1 (v2.0.0):删除 maxTokensCap 机制。per-call 显式传的 maxTokens 永远不被裁剪。
576
764
  const resolved = {
577
- temperature: clampTemperatureForModel(model, options?.temperature ?? client.defaults.temperature),
578
- maxTokens: cap !== null ? Math.min(perCallMax, cap) : perCallMax,
765
+ temperature: clampTemperatureForModel(client.service, model, options?.temperature ?? client.defaults.temperature),
766
+ maxTokens: options?.maxTokens ?? client.defaults.maxTokens,
579
767
  extra: client.defaults.extra,
580
768
  };
581
769
  const onStreamProgress = options?.onStreamProgress;
582
770
  const onTextDelta = options?.onTextDelta;
583
771
  const errorCtx = { baseUrl: client._piModel?.baseUrl ?? "(unknown)", model };
584
772
  try {
585
- if (shouldUseNativeCustomTransport(client)) {
586
- return await chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta);
587
- }
588
- return await chatCompletionViaPiAi(client, model, messages, resolved, onStreamProgress, onTextDelta);
773
+ return await withTransientLLMRetry(async () => {
774
+ if (shouldUseNativeCustomTransport(client)) {
775
+ return chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta);
776
+ }
777
+ return chatCompletionViaPiAi(client, model, messages, resolved, onStreamProgress, onTextDelta);
778
+ },
779
+ // Retrying after UI text deltas have been emitted can duplicate visible text.
780
+ { enabled: !onTextDelta });
589
781
  }
590
782
  catch (error) {
591
783
  // Stream interrupted but partial content is usable — return truncated response
@@ -602,7 +794,7 @@ export async function chatCompletion(client, model, messages, options) {
602
794
  export async function chatWithTools(client, model, messages, tools, options) {
603
795
  try {
604
796
  const resolved = {
605
- temperature: clampTemperatureForModel(model, options?.temperature ?? client.defaults.temperature),
797
+ temperature: clampTemperatureForModel(client.service, model, options?.temperature ?? client.defaults.temperature),
606
798
  maxTokens: options?.maxTokens ?? client.defaults.maxTokens,
607
799
  };
608
800
  return await chatWithToolsViaPiAi(client, model, messages, tools, resolved);
@@ -716,7 +908,7 @@ async function chatCompletionViaPiAi(client, model, messages, resolved, onStream
716
908
  temperature: resolved.temperature,
717
909
  maxTokens: resolved.maxTokens,
718
910
  apiKey: client._apiKey,
719
- headers: piModel.headers,
911
+ headers: mergeUserAgent(piModel.headers),
720
912
  };
721
913
  if (!client.stream) {
722
914
  const response = await piCompleteSimple(piModel, context, streamOpts);
@@ -803,7 +995,7 @@ async function chatWithToolsViaPiAi(client, model, messages, tools, resolved) {
803
995
  temperature: resolved.temperature,
804
996
  maxTokens: resolved.maxTokens,
805
997
  apiKey: client._apiKey,
806
- headers: piModel.headers,
998
+ headers: mergeUserAgent(piModel.headers),
807
999
  };
808
1000
  if (!client.stream) {
809
1001
  const response = await piComplete(piModel, context, streamOpts);