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.
- package/README.md +25 -1
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DkSOwKNn.js → AIOps-CjPaaF2r.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CaYSnkeR.js → ActionButton-_zlP_Z6z.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D8kEgXLP.js → Analytics-C7X31L8l.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-D43FaO4a.js → AppLayout-BmYa34Se.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-DfxY2Gqs.js → Artifacts-B_YKNjlp.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-0ogv1Zu5.js → Audit-5JsI67XQ.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BhLnn-Gw.js → BackgroundAgents-BL3QbzvS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D4591rlk.js → Backup-BRmg-gTa.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-gK1PjPDZ.js → BaseInput-DNE7mT3K.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CCDmOYwg.js → Chat-OYwAopdM.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Dtxw3Wgt.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DG4PRH9M.js → Checkbox-nMgYkH8H.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DtJxGiSg.js → Codegen-B9G2ngLI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-4wGBC25p.js → Col-i0owJaGP.js} +1 -1
- package/src/assets/web-panel/assets/{Community-dOCSc8t-.js → Community-B3Ta0mI_.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Du4kXsyN.js → Compact-DDXrvvm-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BbI5XMcz.js → Compliance-Bn4Uq6U1.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CbQRpyiK.js → Cowork-CO5NKD6r.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CtWy2bMC.js → Cron-ByjNese0.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CzdM5hF6.js → Crosschain-BN1FUYyi.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CcBboBJN.js → DID-CUFX5RL3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-I7m0oCeC.js → Dashboard-D_2FDPBP.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CKIy2Ikn.js → Dropdown-lGOMtIzb.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BNuxCq89.js → EmailListRenderer-DA3Qf1S2.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BeBovLZs.js → EvolutionSettings-DLcnicCr.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-QThmET-n.js → FamilyGuardDashboard-BPOSaIN1.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Bqf7YYlV.js → Federation-DzJUCQq8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DZAM28ve.js → FormItemContext-DVx1XNKx.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DunXFYML.js → GenericCardRenderer-BkqzO_lh.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BgwOjaMf.js → Git-Dr_rdT_j.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B1za4wCP.js → Governance-DyVkZddw.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DMPqX1oN.js → Inference-IN2YDd4v.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-ChDn3okr.js → KnowledgeGraph-Ceiy4n6N.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BQoPB6-O.js → Logs-d7pIEAX2.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DmSl0MNI.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DZXEaPpe.js → Marketplace-uVE7U14g.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZbVOFaG.js → McpTools-DUfBM--y.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Cl3T8asu.js → Memory-6gkcR02J.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DK_ayU9I.js → MobileBridge-Cl6ys2O9.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DEWAA2gT.js → MobileProjects-5P8jN4gf.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-z-XAWzMh.js → Mtc-DtiT1Kol.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CX7qJvQS.js → MtcAudit-DZz8iiTE.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DiQlKgxx.js → Multisig-DFH3-fBJ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Ciuxcu00.js → NLProgramming-BYNuDOt-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BAvqNw_6.js → Notes-BCY4jgYy.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DkHDTslA.js → NotificationSettings-Bk2ltghU.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer--WZdD2oV.js → OrderTableRenderer-OdeXEGAn.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Bv6bMLCe.js → Organization-CY4_mSiV.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bwoz_oq1.js → Overflow-CaRUAOY_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-De7T0ZeB.js → P2P-Bd96rBWQ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Dblr2x25.js → PdhVaultBrowser-JjnExxan.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C-jAt-cg.js → Permissions-CW1PUJB0.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-yXeXDMgf.js → PersonalDataHub-BNn9alTk.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-C8CYoLOa.js → Pipeline-01_PBiUu.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B-gwnOGT.js → Privacy-BP4DlVGb.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CbNjHiBV.js → ProjectInit-CAMnQj4n.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BMUY0GCP.js → ProjectSettings-DKxV5On_.js} +2 -2
- package/src/assets/web-panel/assets/Projects-B_4kRnM8.js +1 -0
- package/src/assets/web-panel/assets/{Providers-K_tlWkON.js → Providers-DeqqZyUv.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-2RSZDzJI.js → QrScannerModal-fFkycCT4.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-mhbcQRMI.js → QuickAsk-Ln6qQidy.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BXm0uG0q.js → Recommend-DeENA-y0.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-xhOpmNZG.js → RemoteSession-CRxSYxo4.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-CwbCWB-3.js → Reputation-B2kU2F0l.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BdAjmDBO.js → Row-lV_nLlFq.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cq4LZ9WU.js → RssFeed-Df21mCdF.js} +2 -2
- package/src/assets/web-panel/assets/{Search-C_I6B-4l.js → Search-8_Dz4qU9.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CdH6mzL-.js → Security-Cl5-PEcp.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CWu1wqtS.js → Services-C5qgCqA7.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-daw9DiVM.js → Skeleton-ASRgSh_Y.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CmurIxkM.js → Skills-DWx01ZJ7.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-cETA5aPO.js → Sla-I2gbgtW8.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-B1llZgu3.js → SpeechSettings-BqTikzfe.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DufZ-B2q.js → SyncSettings-D3zCpBFV.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-PfRLKTFY.js → Tasks-DjMWII45.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DGtz-vT8.js → Templates-Cq7qDnHX.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-JeKYLN0b.js → Tenant-DEasKDpQ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BiMsF2Y0.js → Terminal-J6fLkTzi.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DhcBAGPg.js → TimelineRenderer-CNvWrWN-.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DpIg-0ju.js → Tokens-BSgHJCKH.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DreKHxyb.js → Trigger-DgGU_D0o.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D7ByQvBQ.js → Trust-BANlv-uB.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-OudyQByy.js → UkeySign-qh8GPRsU.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BhU6nzCF.js → VideoEditing-DBiGTB4H.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BCEpB6E0.js → Wallet-DMUFR7cL.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DwjAM5Mr.js → WebAuthn-DP9nQQzW.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-ChQqlAmY.js → WorkflowEditor-DT_6jDkL.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CzUKWqTy.js → chat-C_kELmV6.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D3Y_Pvu4.js → colors-DE-ZxAv_.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-ByyPRfkA.js → compact-item-BowulLDi.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Dt5PF6VI.js → createContext-DCh8oMBQ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BVvJAp91.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BuIaEKuC.js → hasIn-Be7mK-iw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO29sPX8.js → index-3Ql7xQLn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXZ9lbO.js → index-4KkYmFy5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHzVIQLX.js → index-6OluUVJJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxVLI-Iu.js → index-Ao-LXr-d.js} +1 -1
- package/src/assets/web-panel/assets/{index-COsjgjvP.js → index-B-3EDOlf.js} +1 -1
- package/src/assets/web-panel/assets/index-B7IhCfsh.js +1 -0
- package/src/assets/web-panel/assets/{index-CCBm8_o4.js → index-BDIIR8g6.js} +1 -1
- package/src/assets/web-panel/assets/index-BMrbe_Ey.js +1 -0
- package/src/assets/web-panel/assets/{index-BFQGN97S.js → index-BdzVLz-c.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmrfHS36.js → index-BlzMqaWB.js} +1 -1
- package/src/assets/web-panel/assets/{index-GyTOYTFg.js → index-BwY31W-u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAfX0VyL.js → index-C2pCquZC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdvZNMNm.js → index-CKmC6ugN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgPKUSe4.js → index-CL2hAUWh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmVY2f7I.js → index-CUXfwAhF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di78LDr8.js → index-CXvy8HrM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpAqy6Co.js → index-C_VnSUjh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSXjiZAV.js → index-CecGCLWI.js} +1 -1
- package/src/assets/web-panel/assets/{index-D51wU4q-.js → index-Ck6MYKVN.js} +1 -1
- package/src/assets/web-panel/assets/{index-gg5zO3aD.js → index-Cvy4vdVW.js} +1 -1
- package/src/assets/web-panel/assets/{index-1YgdY0Vq.js → index-CwJfLNqv.js} +1 -1
- package/src/assets/web-panel/assets/{index-NFqKQquS.js → index-D3lOYd9_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDTS4qJm.js → index-DEDVYN7D.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwlY7Yap.js → index-DLCzaLH4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcqZAAr5.js → index-DMDaGPxG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWW5svXU.js → index-DMKo49Um.js} +1 -1
- package/src/assets/web-panel/assets/{index-CByWkXdO.js → index-DN1AT3FH.js} +1 -1
- package/src/assets/web-panel/assets/{index-EtrWRKu2.js → index-DOebEvgn.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7QSTEjb.js → index-DPX3N4T8.js} +1 -1
- package/src/assets/web-panel/assets/{index-F-T8AHeo.js → index-DSRKtgJg.js} +1 -1
- package/src/assets/web-panel/assets/{index-B600riYP.js → index-DSqZBvQM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSWTyRhI.js → index-DbrQO1p9.js} +1 -1
- package/src/assets/web-panel/assets/{index-huWw0XBb.js → index-DjC2TJeH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dlec7Sr4.js → index-LVrxqU88.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZX4_hGp.js → index-OH54KMLN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSgroT-P.js → index-Qx8cTReg.js} +3 -3
- package/src/assets/web-panel/assets/{index-BztqxXMP.js → index-_cYsz4df.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cb7MzML-.js → index-lN916819.js} +1 -1
- package/src/assets/web-panel/assets/{index-_oJnnOnZ.js → index-nLHTuHoT.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Bny6G13G.js → initDefaultProps-BNhziAal.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DRhRj_uM.js → motion-fUkbJz38.js} +1 -1
- package/src/assets/web-panel/assets/{move-D0wKnhYr.js → move-rFx211Cl.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BXXSTJBk.js → mtc-parser-CEP1wN3R.js} +1 -1
- package/src/assets/web-panel/assets/{omit-d8t9Yze4.js → omit-DacHd_Zm.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-nyB6BMe6.js → pickAttrs-Dqp58Ep2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CSFyBNA2.js → placementArrow-Cv6Rm0pV.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DYmiKhJa.js → responsiveObserve-rNE0p9ZW.js} +1 -1
- package/src/assets/web-panel/assets/{slide-D4KZSRmt.js → slide-C97JxD4S.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BcrcPeFm.js → statusUtils-Cxk1gV9M.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BFgOb1vz.js → styleChecker-CbtKKsPo.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DQ5qSQlN.js → useFlexGapSupport-CQATs2JQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cafq069l.js → useFs-6c7qrpE_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DTma9Ary.js → usePersonalDataHub-OjxtBGe7.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-HvC2-bE9.js → vnode-CSlXfUSh.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-AZxADWXu.js → zoom-Cc1qKiSZ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +29 -0
- package/src/commands/setup.js +35 -10
- package/src/constants.js +15 -89
- package/src/data/changelog.json +27 -1
- package/src/lib/bm25-search.js +6 -3
- package/src/lib/codex-app-server-adapter.js +36 -22
- package/src/lib/codex-app-server-support.js +91 -0
- package/src/lib/coding-change-review-context.js +258 -0
- package/src/lib/coding-task-guidance.js +9 -1
- package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
- package/src/lib/context-memory-kernel/provider-context.js +22 -12
- package/src/lib/goal-check-evidence.js +159 -0
- package/src/lib/goal-condition-engine.js +24 -2
- package/src/lib/llm-connection-probe.js +48 -4
- package/src/lib/llm-onboarding-catalog.json +131 -0
- package/src/lib/skill-retrieval-router.js +2 -1
- package/src/lib/skill-search-tokenizer.js +143 -0
- package/src/repl/agent-repl.js +8 -4
- package/src/runtime/agent-core.js +207 -42
- package/src/runtime/headless-runner.js +138 -66
- package/src/runtime/headless-stream.js +1 -0
- package/src/runtime/mcp-tool-search-ranking.js +142 -0
- package/src/runtime/mcp-tool-search.js +198 -60
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CnpWe3dp.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-uS1yHX12.js +0 -1
- package/src/assets/web-panel/assets/Projects-DpCaWXv6.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BgSxkkQ3.js +0 -1
- package/src/assets/web-panel/assets/index-D5v6roiB.js +0 -1
- 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 =
|
|
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
|
-
|
|
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 === "
|
|
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(
|
|
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
|
-
:
|
|
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({
|
|
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
|
+
}
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -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 =
|
|
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 } =
|
|
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,
|