chainlesschain 0.166.127 → 0.166.129

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 (183) hide show
  1. package/README.md +25 -1
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-DkSOwKNn.js → AIOps-CjPaaF2r.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CaYSnkeR.js → ActionButton-_zlP_Z6z.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-D8kEgXLP.js → Analytics-C7X31L8l.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-D43FaO4a.js → AppLayout-BmYa34Se.js} +3 -3
  9. package/src/assets/web-panel/assets/{Artifacts-DfxY2Gqs.js → Artifacts-B_YKNjlp.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-0ogv1Zu5.js → Audit-5JsI67XQ.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BhLnn-Gw.js → BackgroundAgents-BL3QbzvS.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-D4591rlk.js → Backup-BRmg-gTa.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-gK1PjPDZ.js → BaseInput-DNE7mT3K.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CCDmOYwg.js → Chat-OYwAopdM.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-Dtxw3Wgt.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-DG4PRH9M.js → Checkbox-nMgYkH8H.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-DtJxGiSg.js → Codegen-B9G2ngLI.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-4wGBC25p.js → Col-i0owJaGP.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-dOCSc8t-.js → Community-B3Ta0mI_.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Du4kXsyN.js → Compact-DDXrvvm-.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-BbI5XMcz.js → Compliance-Bn4Uq6U1.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-CbQRpyiK.js → Cowork-CO5NKD6r.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-CtWy2bMC.js → Cron-ByjNese0.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-CzdM5hF6.js → Crosschain-BN1FUYyi.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CcBboBJN.js → DID-CUFX5RL3.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-I7m0oCeC.js → Dashboard-D_2FDPBP.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CKIy2Ikn.js → Dropdown-lGOMtIzb.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-BNuxCq89.js → EmailListRenderer-DA3Qf1S2.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-BeBovLZs.js → EvolutionSettings-DLcnicCr.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-QThmET-n.js → FamilyGuardDashboard-BPOSaIN1.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-Bqf7YYlV.js → Federation-DzJUCQq8.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DZAM28ve.js → FormItemContext-DVx1XNKx.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DunXFYML.js → GenericCardRenderer-BkqzO_lh.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BgwOjaMf.js → Git-Dr_rdT_j.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-B1za4wCP.js → Governance-DyVkZddw.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DMPqX1oN.js → Inference-IN2YDd4v.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-ChDn3okr.js → KnowledgeGraph-Ceiy4n6N.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BQoPB6-O.js → Logs-d7pIEAX2.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-DmSl0MNI.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DZXEaPpe.js → Marketplace-uVE7U14g.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CZbVOFaG.js → McpTools-DUfBM--y.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Cl3T8asu.js → Memory-6gkcR02J.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DK_ayU9I.js → MobileBridge-Cl6ys2O9.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DEWAA2gT.js → MobileProjects-5P8jN4gf.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-z-XAWzMh.js → Mtc-DtiT1Kol.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-CX7qJvQS.js → MtcAudit-DZz8iiTE.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-DiQlKgxx.js → Multisig-DFH3-fBJ.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Ciuxcu00.js → NLProgramming-BYNuDOt-.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BAvqNw_6.js → Notes-BCY4jgYy.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DkHDTslA.js → NotificationSettings-Bk2ltghU.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer--WZdD2oV.js → OrderTableRenderer-OdeXEGAn.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-Bv6bMLCe.js → Organization-CY4_mSiV.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-Bwoz_oq1.js → Overflow-CaRUAOY_.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-De7T0ZeB.js → P2P-Bd96rBWQ.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-Dblr2x25.js → PdhVaultBrowser-JjnExxan.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-C-jAt-cg.js → Permissions-CW1PUJB0.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-yXeXDMgf.js → PersonalDataHub-BNn9alTk.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-C8CYoLOa.js → Pipeline-01_PBiUu.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-B-gwnOGT.js → Privacy-BP4DlVGb.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CbNjHiBV.js → ProjectInit-CAMnQj4n.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-BMUY0GCP.js → ProjectSettings-DKxV5On_.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-B_4kRnM8.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-K_tlWkON.js → Providers-DeqqZyUv.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-2RSZDzJI.js → QrScannerModal-fFkycCT4.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-mhbcQRMI.js → QuickAsk-Ln6qQidy.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BXm0uG0q.js → Recommend-DeENA-y0.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-xhOpmNZG.js → RemoteSession-CRxSYxo4.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-CwbCWB-3.js → Reputation-B2kU2F0l.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-BdAjmDBO.js → Row-lV_nLlFq.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-Cq4LZ9WU.js → RssFeed-Df21mCdF.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-C_I6B-4l.js → Search-8_Dz4qU9.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CdH6mzL-.js → Security-Cl5-PEcp.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-CWu1wqtS.js → Services-C5qgCqA7.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-daw9DiVM.js → Skeleton-ASRgSh_Y.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-CmurIxkM.js → Skills-DWx01ZJ7.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-cETA5aPO.js → Sla-I2gbgtW8.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-B1llZgu3.js → SpeechSettings-BqTikzfe.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-DufZ-B2q.js → SyncSettings-D3zCpBFV.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-PfRLKTFY.js → Tasks-DjMWII45.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-DGtz-vT8.js → Templates-Cq7qDnHX.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-JeKYLN0b.js → Tenant-DEasKDpQ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BiMsF2Y0.js → Terminal-J6fLkTzi.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-DhcBAGPg.js → TimelineRenderer-CNvWrWN-.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-DpIg-0ju.js → Tokens-BSgHJCKH.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DreKHxyb.js → Trigger-DgGU_D0o.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-D7ByQvBQ.js → Trust-BANlv-uB.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-OudyQByy.js → UkeySign-qh8GPRsU.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BhU6nzCF.js → VideoEditing-DBiGTB4H.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BCEpB6E0.js → Wallet-DMUFR7cL.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DwjAM5Mr.js → WebAuthn-DP9nQQzW.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-ChQqlAmY.js → WorkflowEditor-DT_6jDkL.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CzUKWqTy.js → chat-C_kELmV6.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-D3Y_Pvu4.js → colors-DE-ZxAv_.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-ByyPRfkA.js → compact-item-BowulLDi.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-Dt5PF6VI.js → createContext-DCh8oMBQ.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BVvJAp91.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BuIaEKuC.js → hasIn-Be7mK-iw.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BO29sPX8.js → index-3Ql7xQLn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CFXZ9lbO.js → index-4KkYmFy5.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DHzVIQLX.js → index-6OluUVJJ.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DxVLI-Iu.js → index-Ao-LXr-d.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-COsjgjvP.js → index-B-3EDOlf.js} +1 -1
  103. package/src/assets/web-panel/assets/index-B7IhCfsh.js +1 -0
  104. package/src/assets/web-panel/assets/{index-CCBm8_o4.js → index-BDIIR8g6.js} +1 -1
  105. package/src/assets/web-panel/assets/index-BMrbe_Ey.js +1 -0
  106. package/src/assets/web-panel/assets/{index-BFQGN97S.js → index-BdzVLz-c.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CmrfHS36.js → index-BlzMqaWB.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-GyTOYTFg.js → index-BwY31W-u.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CAfX0VyL.js → index-C2pCquZC.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BdvZNMNm.js → index-CKmC6ugN.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CgPKUSe4.js → index-CL2hAUWh.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BmVY2f7I.js → index-CUXfwAhF.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Di78LDr8.js → index-CXvy8HrM.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DpAqy6Co.js → index-C_VnSUjh.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DSXjiZAV.js → index-CecGCLWI.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-D51wU4q-.js → index-Ck6MYKVN.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-gg5zO3aD.js → index-Cvy4vdVW.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-1YgdY0Vq.js → index-CwJfLNqv.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-NFqKQquS.js → index-D3lOYd9_.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CDTS4qJm.js → index-DEDVYN7D.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BwlY7Yap.js → index-DLCzaLH4.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BcqZAAr5.js → index-DMDaGPxG.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DWW5svXU.js → index-DMKo49Um.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CByWkXdO.js → index-DN1AT3FH.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-EtrWRKu2.js → index-DOebEvgn.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D7QSTEjb.js → index-DPX3N4T8.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-F-T8AHeo.js → index-DSRKtgJg.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-B600riYP.js → index-DSqZBvQM.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BSWTyRhI.js → index-DbrQO1p9.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-huWw0XBb.js → index-DjC2TJeH.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Dlec7Sr4.js → index-LVrxqU88.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CZX4_hGp.js → index-OH54KMLN.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DSgroT-P.js → index-Qx8cTReg.js} +3 -3
  134. package/src/assets/web-panel/assets/{index-BztqxXMP.js → index-_cYsz4df.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Cb7MzML-.js → index-lN916819.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-_oJnnOnZ.js → index-nLHTuHoT.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Bny6G13G.js → initDefaultProps-BNhziAal.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-DRhRj_uM.js → motion-fUkbJz38.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-D0wKnhYr.js → move-rFx211Cl.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BXXSTJBk.js → mtc-parser-CEP1wN3R.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-d8t9Yze4.js → omit-DacHd_Zm.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-nyB6BMe6.js → pickAttrs-Dqp58Ep2.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CSFyBNA2.js → placementArrow-Cv6Rm0pV.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DYmiKhJa.js → responsiveObserve-rNE0p9ZW.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-D4KZSRmt.js → slide-C97JxD4S.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BcrcPeFm.js → statusUtils-Cxk1gV9M.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BFgOb1vz.js → styleChecker-CbtKKsPo.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-DQ5qSQlN.js → useFlexGapSupport-CQATs2JQ.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Cafq069l.js → useFs-6c7qrpE_.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DTma9Ary.js → usePersonalDataHub-OjxtBGe7.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-HvC2-bE9.js → vnode-CSlXfUSh.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-AZxADWXu.js → zoom-Cc1qKiSZ.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent.js +29 -0
  156. package/src/commands/setup.js +35 -10
  157. package/src/constants.js +15 -89
  158. package/src/data/changelog.json +27 -1
  159. package/src/lib/bm25-search.js +6 -3
  160. package/src/lib/codex-app-server-adapter.js +36 -22
  161. package/src/lib/codex-app-server-support.js +91 -0
  162. package/src/lib/coding-change-review-context.js +258 -0
  163. package/src/lib/coding-task-guidance.js +9 -1
  164. package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
  165. package/src/lib/context-memory-kernel/provider-context.js +22 -12
  166. package/src/lib/goal-check-evidence.js +159 -0
  167. package/src/lib/goal-condition-engine.js +24 -2
  168. package/src/lib/llm-connection-probe.js +48 -4
  169. package/src/lib/llm-onboarding-catalog.json +131 -0
  170. package/src/lib/skill-retrieval-router.js +2 -1
  171. package/src/lib/skill-search-tokenizer.js +143 -0
  172. package/src/repl/agent-repl.js +8 -4
  173. package/src/runtime/agent-core.js +207 -42
  174. package/src/runtime/headless-runner.js +138 -66
  175. package/src/runtime/headless-stream.js +1 -0
  176. package/src/runtime/mcp-tool-search-ranking.js +142 -0
  177. package/src/runtime/mcp-tool-search.js +198 -60
  178. package/src/assets/web-panel/assets/ChatBubbleRenderer-CnpWe3dp.js +0 -1
  179. package/src/assets/web-panel/assets/MarkdownRenderer-uS1yHX12.js +0 -1
  180. package/src/assets/web-panel/assets/Projects-DpCaWXv6.js +0 -1
  181. package/src/assets/web-panel/assets/devWarning-BgSxkkQ3.js +0 -1
  182. package/src/assets/web-panel/assets/index-D5v6roiB.js +0 -1
  183. package/src/assets/web-panel/assets/index-DgXZCvH5.js +0 -1
@@ -157,7 +157,7 @@ export function checkDeterministicCondition(condition, evidence = {}) {
157
157
  };
158
158
  }
159
159
  case "exit-zero": {
160
- const met = Number(evidence.exitCode) === 0;
160
+ const met = evidence.exitCode === 0;
161
161
  return {
162
162
  met,
163
163
  reason: `\`${condition.command}\` exited ${evidence.exitCode}`,
@@ -205,7 +205,10 @@ export function runDeterministicCheck(condition, deps = {}) {
205
205
  encoding: "utf8",
206
206
  windowsHide: true,
207
207
  });
208
- evidence.exitCode = res?.status ?? (res?.error ? 1 : null);
208
+ // A timeout/signal or spawn error has no successful process exit, even if
209
+ // an adapter also supplies a status. Never coerce null/false/"0" to zero.
210
+ evidence.exitCode =
211
+ res?.error || res?.signal ? null : (res?.status ?? null);
209
212
  } else if (condition.kind === "file-exists") {
210
213
  const existsSync = deps.existsSync;
211
214
  evidence.fileExists = (p) =>
@@ -381,6 +384,25 @@ export class GoalConditionEngine {
381
384
 
382
385
  /** Restore a prior run (same clock injection contract). */
383
386
  static fromSnapshot(snap, { now } = {}) {
387
+ const state = snap?.state;
388
+ if (
389
+ !snap?.condition ||
390
+ !["model", "exit-zero", "file-exists", "contains", "regex"].includes(
391
+ snap.condition.kind,
392
+ ) ||
393
+ !state ||
394
+ !Number.isSafeInteger(state.outerTurns) ||
395
+ state.outerTurns < 0 ||
396
+ !Number.isSafeInteger(state.tokens) ||
397
+ state.tokens < 0 ||
398
+ typeof state.costUsd !== "number" ||
399
+ !Number.isFinite(state.costUsd) ||
400
+ state.costUsd < 0 ||
401
+ typeof state.startedAtMs !== "number" ||
402
+ !Number.isFinite(state.startedAtMs) ||
403
+ typeof state.done !== "boolean"
404
+ )
405
+ throw new TypeError("Invalid goal checkpoint state");
384
406
  const engine = new GoalConditionEngine({
385
407
  condition: snap.condition,
386
408
  budget: snap.budget,
@@ -3,6 +3,12 @@ import { estimateCost } from "./llm-pricing.js";
3
3
  import { providerFetch } from "./formal-budget-provider-scope.js";
4
4
  import { isFormalBudgetError } from "./formal-budget-errors.js";
5
5
  import { normalizeOllamaBaseUrl } from "./ollama-base-url.js";
6
+ import { resolveModelCapabilityProfile } from "./model-capabilities.js";
7
+ import {
8
+ createOpenAIResponsesBody,
9
+ normalizeOpenAIResponsesResponse,
10
+ normalizeOpenAIResponsesUsage,
11
+ } from "./openai-responses.js";
6
12
 
7
13
  // Reasoning models spend the same output allowance on thinking before the
8
14
  // final answer. A 16-token probe can therefore receive HTTP 200 with only
@@ -13,10 +19,16 @@ export const LLM_PROBE_SCHEMA = "chainlesschain.llm-connection-probe/v1";
13
19
  const count = (value) => Number.isSafeInteger(value) && value >= 0;
14
20
 
15
21
  /** Preserve missing/malformed usage as unknown, including cached prompt tokens. */
16
- export function normalizeLlmProbeUsage(provider, data) {
22
+ export function normalizeLlmProbeUsage(provider, data, runtimeProtocol = null) {
17
23
  if (!data || typeof data !== "object" || Array.isArray(data)) return null;
18
24
  let usage;
19
- if (provider === "ollama") {
25
+ if (provider === "openai" && runtimeProtocol === "openai-responses") {
26
+ // The existing Responses codec owns cached/reasoning token accounting.
27
+ // Do not invent a priced cache-write split that the probe has not verified.
28
+ const writes = data.usage?.input_tokens_details?.cache_write_tokens;
29
+ if (writes !== undefined && writes !== 0) return null;
30
+ usage = normalizeOpenAIResponsesUsage(data.usage);
31
+ } else if (provider === "ollama") {
20
32
  usage = {
21
33
  input_tokens: data.prompt_eval_count,
22
34
  output_tokens: data.eval_count,
@@ -145,6 +157,15 @@ export async function probeLlmConnection(
145
157
  ? normalizeOllamaBaseUrl(target.baseUrl)
146
158
  : target.baseUrl.replace(/\/+$/, "");
147
159
  const headers = { "Content-Type": "application/json" };
160
+ const profile =
161
+ target.provider === "openai"
162
+ ? resolveModelCapabilityProfile({
163
+ provider: target.provider,
164
+ model: target.model,
165
+ baseUrl: target.baseUrl,
166
+ })
167
+ : null;
168
+ const nativeResponses = profile?.runtimeProtocol === "openai-responses";
148
169
  let url, body;
149
170
  if (target.provider === "ollama") {
150
171
  url = `${base}/api/generate`;
@@ -172,6 +193,15 @@ export async function probeLlmConnection(
172
193
  contents: [{ parts: [{ text: "Say hi in one word." }] }],
173
194
  generationConfig: { maxOutputTokens: PROBE_OUTPUT_TOKENS },
174
195
  };
196
+ } else if (nativeResponses) {
197
+ url = `${base}/responses`;
198
+ headers.Authorization = `Bearer ${target.apiKey}`;
199
+ body = createOpenAIResponsesBody({
200
+ model: target.model,
201
+ messages: [{ role: "user", content: "Say hi in one word." }],
202
+ maxOutputTokens: PROBE_OUTPUT_TOKENS,
203
+ modelProfile: profile,
204
+ });
175
205
  } else {
176
206
  url = `${base}/chat/completions`;
177
207
  headers.Authorization = `Bearer ${target.apiKey}`;
@@ -204,7 +234,19 @@ export async function probeLlmConnection(
204
234
  }),
205
235
  );
206
236
  const data = await response.json();
207
- usage = normalizeLlmProbeUsage(target.provider, data);
237
+ usage = normalizeLlmProbeUsage(
238
+ target.provider,
239
+ data,
240
+ profile?.runtimeProtocol,
241
+ );
242
+ if (nativeResponses && (data?.error || data?.status !== "completed")) {
243
+ throw new Error(
244
+ data?.status === "incomplete" &&
245
+ data?.incomplete_details?.reason === "max_output_tokens"
246
+ ? "The model responded but exhausted the test output limit before a final answer; this does not mean the connection settings are invalid"
247
+ : "The Responses endpoint did not complete the connection test",
248
+ );
249
+ }
208
250
  const text =
209
251
  target.provider === "ollama"
210
252
  ? data.response
@@ -218,7 +260,9 @@ export async function probeLlmConnection(
218
260
  ?.filter((p) => p.thought !== true)
219
261
  ?.map((p) => p.text || "")
220
262
  .join("")
221
- : data.choices?.[0]?.message?.content;
263
+ : nativeResponses
264
+ ? normalizeOpenAIResponsesResponse(data).message.content
265
+ : data.choices?.[0]?.message?.content;
222
266
  if (typeof text !== "string" || !text.trim()) {
223
267
  const reachedLimit =
224
268
  data.choices?.[0]?.finish_reason === "length" ||
@@ -0,0 +1,131 @@
1
+ {
2
+ "schema": "chainlesschain.llm-onboarding-catalog/v1",
3
+ "capabilityCatalogVersion": "2026-10-15",
4
+ "scope": "new-connections",
5
+ "runtimeVerified": false,
6
+ "accountVerified": false,
7
+ "providers": [
8
+ {
9
+ "id": "volcengine",
10
+ "label": "Volcengine / Doubao (volcengine)",
11
+ "cliLabel": "Volcengine (火山引擎/豆包)",
12
+ "baseUrl": "https://ark.cn-beijing.volces.com/api/v3",
13
+ "defaultModel": "deepseek-v4-1-flash-260910",
14
+ "needsKey": true,
15
+ "visionModel": "doubao-seed-2-0-lite-260215"
16
+ },
17
+ {
18
+ "id": "ollama",
19
+ "label": "Ollama (local, no key)",
20
+ "cliLabel": "Ollama (本地部署)",
21
+ "baseUrl": "http://localhost:11434",
22
+ "defaultModel": "qwen2.5:7b",
23
+ "needsKey": false,
24
+ "visionModel": ""
25
+ },
26
+ {
27
+ "id": "anthropic",
28
+ "label": "Anthropic Claude",
29
+ "cliLabel": "Anthropic (Claude)",
30
+ "baseUrl": "https://api.anthropic.com/v1",
31
+ "defaultModel": "claude-sonnet-5-5",
32
+ "needsKey": true,
33
+ "visionModel": ""
34
+ },
35
+ {
36
+ "id": "openai",
37
+ "label": "OpenAI",
38
+ "baseUrl": "https://api.openai.com/v1",
39
+ "defaultModel": "gpt-6.1-sol",
40
+ "needsKey": true,
41
+ "visionModel": ""
42
+ },
43
+ {
44
+ "id": "deepseek",
45
+ "label": "DeepSeek",
46
+ "baseUrl": "https://api.deepseek.com/v1",
47
+ "defaultModel": "deepseek-chat",
48
+ "needsKey": true,
49
+ "visionModel": ""
50
+ },
51
+ {
52
+ "id": "dashscope",
53
+ "label": "Aliyun Bailian / Tongyi (dashscope)",
54
+ "cliLabel": "DashScope (阿里通义)",
55
+ "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
56
+ "defaultModel": "qwen-max",
57
+ "needsKey": true,
58
+ "visionModel": ""
59
+ },
60
+ {
61
+ "id": "kimi",
62
+ "label": "Moonshot Kimi",
63
+ "cliLabel": "Kimi (月之暗面)",
64
+ "baseUrl": "https://api.moonshot.cn/v1",
65
+ "defaultModel": "moonshot-v1-auto",
66
+ "needsKey": true,
67
+ "visionModel": ""
68
+ },
69
+ {
70
+ "id": "gemini",
71
+ "label": "Google Gemini",
72
+ "baseUrl": "https://generativelanguage.googleapis.com/v1beta",
73
+ "defaultModel": "gemini-2.0-flash",
74
+ "needsKey": true,
75
+ "visionModel": ""
76
+ },
77
+ {
78
+ "id": "mistral",
79
+ "label": "Mistral",
80
+ "cliLabel": "Mistral AI",
81
+ "baseUrl": "https://api.mistral.ai/v1",
82
+ "defaultModel": "mistral-large-latest",
83
+ "needsKey": true,
84
+ "visionModel": ""
85
+ },
86
+ {
87
+ "id": "minimax",
88
+ "label": "MiniMax",
89
+ "cliLabel": "MiniMax (海螺AI)",
90
+ "baseUrl": "https://api.minimax.chat/v1",
91
+ "defaultModel": "MiniMax-Text-01",
92
+ "needsKey": true,
93
+ "visionModel": ""
94
+ },
95
+ {
96
+ "id": "openai-proxy",
97
+ "label": "OpenAI compatible gateway",
98
+ "cliLabel": "OpenAI 中转站 (API2D/CloseAI等)",
99
+ "baseUrl": "",
100
+ "defaultModel": "gpt-4o",
101
+ "needsKey": true,
102
+ "isProxy": true
103
+ },
104
+ {
105
+ "id": "anthropic-proxy",
106
+ "label": "Anthropic compatible gateway",
107
+ "cliLabel": "Anthropic 中转站 (Claude代理)",
108
+ "baseUrl": "",
109
+ "defaultModel": "claude-sonnet-4-6",
110
+ "needsKey": true,
111
+ "isProxy": true
112
+ },
113
+ {
114
+ "id": "gemini-proxy",
115
+ "label": "Gemini compatible gateway",
116
+ "cliLabel": "Gemini 中转站 (Google代理)",
117
+ "baseUrl": "",
118
+ "defaultModel": "gemini-2.0-flash",
119
+ "needsKey": true,
120
+ "isProxy": true
121
+ },
122
+ {
123
+ "id": "custom",
124
+ "label": "Custom provider (vLLM / TGI / compatible service)",
125
+ "cliLabel": "自定义 Provider (自建服务/vLLM/TGI等)",
126
+ "baseUrl": "",
127
+ "defaultModel": "",
128
+ "needsKey": true
129
+ }
130
+ ]
131
+ }
@@ -1,4 +1,5 @@
1
1
  import { BM25Search } from "./bm25-search.js";
2
+ import { tokenizeSkillSearchText } from "./skill-search-tokenizer.js";
2
3
  import { captureSkillRetrievalRevocationReader } from "./evolution/skill-retrieval-revocation-authority.js";
3
4
 
4
5
  export const SKILL_RETRIEVAL_RESULT_SCHEMA =
@@ -150,7 +151,7 @@ export function routeSkillDescriptors({
150
151
  admitted.push({ skill, digest });
151
152
  }
152
153
 
153
- const bm25 = new BM25Search({ language: "auto" });
154
+ const bm25 = new BM25Search({ tokenizer: tokenizeSkillSearchText });
154
155
  bm25.indexDocuments(
155
156
  admitted.map(({ skill, digest }) => ({
156
157
  id: digest,
@@ -0,0 +1,143 @@
1
+ // Descriptor retrieval only. Skill bodies and execution admission never enter
2
+ // this tokenizer. Keep the generic RAG tokenizer unchanged.
3
+ const segmenter = new Intl.Segmenter("zh", { granularity: "word" });
4
+ const stopWords = new Set([
5
+ "a",
6
+ "an",
7
+ "the",
8
+ "is",
9
+ "are",
10
+ "was",
11
+ "were",
12
+ "be",
13
+ "been",
14
+ "being",
15
+ "have",
16
+ "has",
17
+ "had",
18
+ "do",
19
+ "does",
20
+ "did",
21
+ "will",
22
+ "would",
23
+ "could",
24
+ "should",
25
+ "may",
26
+ "might",
27
+ "shall",
28
+ "can",
29
+ "to",
30
+ "of",
31
+ "in",
32
+ "for",
33
+ "on",
34
+ "with",
35
+ "at",
36
+ "by",
37
+ "from",
38
+ "as",
39
+ "into",
40
+ "through",
41
+ "during",
42
+ "before",
43
+ "after",
44
+ "above",
45
+ "below",
46
+ "between",
47
+ "but",
48
+ "and",
49
+ "or",
50
+ "not",
51
+ "no",
52
+ "nor",
53
+ "so",
54
+ "if",
55
+ "then",
56
+ "than",
57
+ "too",
58
+ "very",
59
+ "just",
60
+ "about",
61
+ "up",
62
+ "out",
63
+ "it",
64
+ "its",
65
+ "this",
66
+ "that",
67
+ "these",
68
+ "those",
69
+ "i",
70
+ "me",
71
+ "my",
72
+ "we",
73
+ "our",
74
+ "you",
75
+ "your",
76
+ "he",
77
+ "him",
78
+ "his",
79
+ "she",
80
+ "her",
81
+ "they",
82
+ "them",
83
+ "their",
84
+ "what",
85
+ "which",
86
+ "please",
87
+ "help",
88
+ "请",
89
+ "请问",
90
+ "帮",
91
+ "帮我",
92
+ "我",
93
+ "我要",
94
+ "需要",
95
+ "如何",
96
+ "怎么",
97
+ "一下",
98
+ "一个",
99
+ "的",
100
+ "在",
101
+ "中",
102
+ "和",
103
+ "并",
104
+ "给",
105
+ "为",
106
+ "从",
107
+ "将",
108
+ "把",
109
+ "进行",
110
+ "可以",
111
+ "使用",
112
+ ]);
113
+
114
+ export function tokenizeSkillSearchText(text) {
115
+ if (typeof text !== "string" || !text) return [];
116
+ const unicodeNormalized = text.normalize("NFKC");
117
+ const identifiers = [];
118
+ for (const part of segmenter.segment(unicodeNormalized)) {
119
+ if (
120
+ part.isWordLike &&
121
+ /_|[\p{Ll}\p{N}]\p{Lu}|\p{Lu}\p{Lu}\p{Ll}/u.test(part.segment)
122
+ ) {
123
+ identifiers.push(part.segment.toLowerCase());
124
+ }
125
+ }
126
+ // Split acronym and camel-case boundaries before lowercasing; punctuation
127
+ // already separates kebab/snake identifiers in the word segmenter.
128
+ const normalized = unicodeNormalized
129
+ .replace(/([\p{Lu}])([\p{Lu}][\p{Ll}])/gu, "$1 $2")
130
+ .replace(/([\p{Ll}\p{N}])([\p{Lu}])/gu, "$1 $2")
131
+ .toLowerCase();
132
+ const tokens = [];
133
+ for (const part of segmenter.segment(normalized)) {
134
+ if (!part.isWordLike) continue;
135
+ // Intl keeps snake_case as a single word, while user queries use spaces.
136
+ for (const word of part.segment.split("_")) {
137
+ if (word && !stopWords.has(word)) tokens.push(word);
138
+ }
139
+ }
140
+ // Retain literal compound names too, so lowercase exact-name searches still
141
+ // work after adding their natural-language word boundaries.
142
+ return [...tokens, ...identifiers];
143
+ }
@@ -4430,11 +4430,15 @@ async function startAgentReplInWorkspaceOwned(
4430
4430
  // for this session via the shared mcp-config engine. Holds {mcpClient,
4431
4431
  // extraToolDefinitions, externalToolExecutors, externalToolDescriptors}.
4432
4432
  let _adhocMcp = null;
4433
+ let _projectMcpToolDefinitions = (definitions) => definitions;
4433
4434
  const _persistReplContextSources = () => {
4434
4435
  if (!useJsonl || !sessionId) return false;
4435
4436
  _replSkillCacheLedger =
4436
4437
  _replSkillLoader.getCacheLedger?.() || _replSkillCacheLedger;
4437
- const mcpDefinitions = _adhocMcp?.extraToolDefinitions || [];
4438
+ const mcpDefinitions = _projectMcpToolDefinitions(
4439
+ _adhocMcp?.extraToolDefinitions || [],
4440
+ _adhocMcp?.externalToolExecutors,
4441
+ );
4438
4442
  if (
4439
4443
  mcpDefinitions.length === 0 &&
4440
4444
  _loadedReplPersonaSkills.length === 0 &&
@@ -4656,9 +4660,9 @@ async function startAgentReplInWorkspaceOwned(
4656
4660
  // MCP tool search (context scaling): defer big tool schemas behind the
4657
4661
  // internal tool_search tool. Below-threshold / disabled → no-op.
4658
4662
  try {
4659
- const { maybeApplyToolSearch } = await import(
4660
- "../runtime/mcp-tool-search.js"
4661
- );
4663
+ const { maybeApplyToolSearch, projectMcpToolDefinitions } =
4664
+ await import("../runtime/mcp-tool-search.js");
4665
+ _projectMcpToolDefinitions = projectMcpToolDefinitions;
4662
4666
  const ts = maybeApplyToolSearch(_adhocMcp, {
4663
4667
  model,
4664
4668
  provider,