chainlesschain 0.166.126 → 0.166.128
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 +31 -3
- 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/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C6HzxpS_.js → AIOps-BmGA5zXX.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Ba2WP_mo.js → ActionButton-B7WXwoF0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-MEZ-eSYO.js → Analytics-IvJG43B5.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B1F4dMJl.js → AppLayout-DWY017_e.js} +5 -5
- package/src/assets/web-panel/assets/Artifacts-BOyohM_-.js +1 -0
- package/src/assets/web-panel/assets/{Audit-GzrP6OYx.js → Audit-CD9sTnBN.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-PJ3RWIS5.js → BackgroundAgents-J6gg5z0U.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DV0wK73Y.js → Backup-D7ik3lse.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BqWPlsK1.js → BaseInput-MrDd5zcz.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-D0yNPOid.js → Chat-DbxRqGiK.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0De01yM.js → ChatBubbleRenderer-DbeJAwMg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-GOdS6Fpz.js → Checkbox-CditB77B.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CcvPMAwP.js → Codegen-Ds0UZWZG.js} +1 -1
- package/src/assets/web-panel/assets/{Col-07yH3vgP.js → Col-CZlj1XI2.js} +1 -1
- package/src/assets/web-panel/assets/{Community-cZI0W7u_.js → Community-j4B2SoT6.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BP6fwhXB.js → Compact-BuKQutaO.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BvwQCjXA.js → Compliance-DAgDyS-p.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-yhhvyKZU.js → Cowork-DX2-I6V3.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bpji2uez.js → Cron-dJpc-FxX.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BZ7XwkuS.js → Crosschain-7m8euM3v.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BJ-Fw-Uk.js → DID-CLoYoCe1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-3FbsaKoR.js → Dashboard-DR1rRMb7.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DP8yuWyM.js → Dropdown-BsKhCfvH.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Co3i-4ca.js → EmailListRenderer-BAGexzJu.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BqYYmC01.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CPjecSCb.js → FamilyGuardDashboard-BIpueefy.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CJkZPulM.js → Federation-BluNep6d.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CU0YWiAZ.js → FormItemContext-CerdM3am.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-kTxvvpiU.js → GenericCardRenderer-DXh4tOjU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cs6SFvMq.js → Git-CEE0cGmf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CSs_8thn.js → Governance-Bc-XNDhM.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-D7yCromD.js → Inference-CiBzXyZ-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C6BcMDRm.js → KnowledgeGraph-CV2IiyuN.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Cz20G07I.js → Logs-fbQYKuSz.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B73ZyMRI.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BZIopTsG.js → Marketplace-C5utdpxZ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-OHaHium7.js → McpTools-CPE4SaF3.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DBNBmoM9.js → Memory-DTFDszzk.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BH-ajP-j.js → MobileBridge-DxqPmTzP.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DwiFGqpp.js → MobileProjects-CwcK8l2y.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BmT_VyZL.js → Mtc-DrjECLGO.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-D24wmjmR.js → MtcAudit-4IURCa-3.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-DwWj1F8f.js → Multisig-CggLV1Cp.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DXBRBwhU.js → NLProgramming-DkOQJT73.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C1QG3x5c.js → Notes-Dodcva6s.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BnlSMFBJ.js → NotificationSettings-CQ3HeTs6.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-uuW0wQc0.js → OrderTableRenderer-pT2nzmIO.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CXGC9RYr.js → Organization-B6HFsIfU.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C3RxcBqQ.js → Overflow-G9dju55N.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DTh-AqFm.js → P2P-C1BCE155.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-IX0sEKne.js → PdhVaultBrowser-BFAxXn5D.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CpcyEP_G.js → Permissions-DWg7cw9Q.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-I5zN_SIn.js → PersonalDataHub-BQxuOQOO.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CVg3gNFN.js → Pipeline-C3Gse9Ne.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Dffk2pq9.js → Privacy-Dcsjx6Oi.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B8Y3VsbN.js → ProjectInit-DeYlnXJQ.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ds_4fCFG.js → ProjectSettings-D7kbZ_K7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BlyQuiCs.js → Projects-C5m3NGzM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CI9tKh8S.js → Providers-oT6jy83z.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DOrmL6X3.js → QrScannerModal-NZ11GEBa.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CSSlopeF.js → QuickAsk-CtQU4Tx0.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-fKDWVJgw.js → Recommend-3CoXYu3O.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BKlbq1C0.js → RemoteSession-C2d4LzBM.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DhOFTKRG.js → Reputation-WZQHrGwl.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ckVQk62z.js → Row-ChiqY7Hg.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CShivptZ.js → RssFeed-Cjwl2Kum.js} +2 -2
- package/src/assets/web-panel/assets/{Search-PJpI8T9h.js → Search-DRDMZxTF.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CVQPej3p.js → Security-D0y4LlQ4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CWJj07ru.js → Services-ChpkqWm0.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CNxdd41V.js → Skeleton-D3WGZ8yO.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AD-xWT2V.js → Skills-Bv_7HaUW.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BuDuN1ak.js → Sla-crZMKyX0.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-WYryugQK.js → SpeechSettings-ByWn5XDZ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dxz8z_yO.js → SyncSettings--R55vxvj.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BCQFGo6S.js → Tasks-BZA_Via_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CNU1xhuV.js → Templates-9eJ9yY8Q.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CFsqv744.js → Tenant-CfWX2jqj.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal--7FxkXMc.js → Terminal-CUXUF4kL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Cqtg4CN-.js → TimelineRenderer-77y9bkYN.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DQD8oVJ3.js → Tokens-CvyrdLH6.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BujLIIRO.js → Trigger-MNRl_YNr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-_3yRNM57.js → Trust-BHOXK-Mp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C_QKp9Ig.js → UkeySign-Bz1oZNyQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BkgP1c6L.js → VideoEditing-DlqmXyZv.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CTHaNBha.js → Wallet-Dg1rnqEG.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CbXcDn_T.js → WebAuthn-DJtGeaOk.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BUOyHiTN.js → WorkflowEditor-DJPubjX5.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DTG5Geyv.js → chat-BWweDuIV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BAdqWSlv.js → colors-BX5ViADF.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DYh7YdLa.js → compact-item-Df8MLbXp.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-mPOA80GV.js → createContext-C0FDTwdV.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BgM5vq1s.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Gzp3HIXP.js → hasIn-PpL6GdNk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLuIQO9d.js → index-7VyVOEf7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BL46pkYn.js → index-B3K1uZ7R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXlLyEF.js → index-B4UxFB2N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Diwevwx7.js → index-B8-pSyP7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Brr8ALy2.js → index-B982oUKN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsgxUKpZ.js → index-BF0ERucU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BjRl7Jhc.js → index-BMIEWinN.js} +1 -1
- package/src/assets/web-panel/assets/{index-X1iyU-gh.js → index-BWSCphaT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYbMpkmP.js → index-BeFhy4BX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGQfiMVc.js → index-Beh1kLwx.js} +1 -1
- package/src/assets/web-panel/assets/index-Bl-HTXWn.js +1 -0
- package/src/assets/web-panel/assets/{index-CR3ZvuY6.js → index-C0PqPK-8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzkgWUAt.js → index-C2JU-gdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-z3FnuAKK.js → index-C8wl7Ica.js} +1 -1
- package/src/assets/web-panel/assets/{index-og41WNLX.js → index-C9FOwTgX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQZVcznI.js → index-C9N1u8jV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqSb5LAk.js → index-Cf86RSQk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxpX3q8j.js → index-ChV82mzs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdleQSUU.js → index-Cj00JSqq.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByUjSWIg.js → index-Cm7vZvA3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbdMPF9D.js → index-CmMzB4C-.js} +3 -3
- package/src/assets/web-panel/assets/{index-Ch0qsp2p.js → index-CxY_U5RT.js} +1 -1
- package/src/assets/web-panel/assets/index-Cxf0YfM5.js +1 -0
- package/src/assets/web-panel/assets/{index-BYE61P6D.js → index-D5Ei75Wt.js} +1 -1
- package/src/assets/web-panel/assets/{index-OkiNUps8.js → index-DBzaRg4E.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKYYncej.js → index-DFtzEEYe.js} +1 -1
- package/src/assets/web-panel/assets/{index-C52u0SKj.js → index-DGLbojjx.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_65ERlZ.js → index-D_6XIMVV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Byln7kVS.js → index-DddQd0_V.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcZz24sL.js → index-DwZkBGXd.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5MHbkbK.js → index-DxJqyIP8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMScSzoi.js → index-Dy8K2laU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BH067bfd.js → index-FAZH69my.js} +1 -1
- package/src/assets/web-panel/assets/{index-y-TWtPEX.js → index-NdEUFm32.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfsFQ-DX.js → index-P1ERNJla.js} +1 -1
- package/src/assets/web-panel/assets/{index-CchNIYmQ.js → index-R0LQ3fgq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCw8rGv8.js → index-UXM5vpt4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1UsX4Hx.js → index-iif2A1eL.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9uyUX6z.js → index-itNn6pW1.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DmksOjaL.js → initDefaultProps-DeMthvi4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cb3y_Vsi.js → motion-_7kbkzE0.js} +1 -1
- package/src/assets/web-panel/assets/{move-DP-3qcfq.js → move-gCI04pLw.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BCDUfUEO.js → mtc-parser-D5UWHv2U.js} +1 -1
- package/src/assets/web-panel/assets/{omit-MH-O2PY6.js → omit-CDCZcqeS.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BaZORqPr.js → pickAttrs-DGMDLi3S.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Dkp_5tvw.js → placementArrow-C-3vC1Vh.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DBJSmMkS.js → responsiveObserve-vdoYucvi.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Cc6qGIgj.js → slide-B62FhgyZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-FundADw-.js → statusUtils-DCLlfnym.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-qOO9jMdb.js → styleChecker-CGvQ4LRR.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BYbRYwok.js → useFlexGapSupport-BqkGoKwe.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D6PqFBtt.js → useFs-Bkr_nU3q.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-mJpur_zt.js → usePersonalDataHub-CYxMIUEq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-ZFVHKenK.js → vnode-sAbcY1FX.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Ca_KBv2o.js → zoom-Dm2pLrXi.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/ask.js +23 -23
- package/src/commands/chat.js +1 -5
- package/src/commands/session.js +92 -61
- package/src/commands/setup.js +35 -10
- package/src/commands/ui.js +18 -5
- package/src/constants.js +18 -89
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/action-protocol.js +22 -14
- package/src/gateways/ws/chat-intent-protocol.js +7 -3
- package/src/gateways/ws/llm-chat-protocol.js +9 -2
- package/src/gateways/ws/ws-server.js +24 -12
- package/src/lib/bm25-search.js +6 -3
- package/src/lib/chat-intent-service.js +28 -4
- package/src/lib/coding-task-guidance.js +6 -1
- package/src/lib/config-manager.js +49 -16
- package/src/lib/config-schema.js +5 -0
- package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
- package/src/lib/evolution/evolution-deployment-config.js +48 -5
- package/src/lib/evolution/evolution-deployment-loader.js +26 -11
- package/src/lib/evolution/evolution-enabled.js +27 -0
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/optional-ui-model-turn.js +26 -0
- 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/paths.js +2 -2
- 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/repl/chat-repl.js +15 -9
- package/src/runtime/agent-core.js +87 -7
- package/src/runtime/agent-runtime.js +18 -6
- 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/Artifacts-D50kNasl.js +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BKWKDok5.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-vialawkx.js +0 -1
- package/src/assets/web-panel/assets/devWarning-ChcomtaV.js +0 -1
- package/src/assets/web-panel/assets/index-CXxCC-4V.js +0 -1
- package/src/assets/web-panel/assets/index-CZYLUp6g.js +0 -1
package/src/lib/paths.js
CHANGED
|
@@ -278,8 +278,8 @@ export function getBinDir() {
|
|
|
278
278
|
return join(getHomeDir(), "bin");
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
-
export function getConfigPath() {
|
|
282
|
-
return join(
|
|
281
|
+
export function getConfigPath(options = {}) {
|
|
282
|
+
return join(resolveConfigDataRoot(options).path, "config.json");
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
export function getStatePath() {
|
|
@@ -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,
|
package/src/repl/chat-repl.js
CHANGED
|
@@ -103,17 +103,20 @@ export async function startChatRepl(options = {}) {
|
|
|
103
103
|
options.evolutionIngress == null
|
|
104
104
|
? null
|
|
105
105
|
: captureAgentEvolutionIngress(options.evolutionIngress);
|
|
106
|
-
if (evolutionIngress === null) {
|
|
107
|
-
const error = new Error(
|
|
108
|
-
"Chat REPL model egress requires an authenticated evolution ingress",
|
|
109
|
-
);
|
|
110
|
-
error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
111
|
-
throw error;
|
|
112
|
-
}
|
|
113
106
|
const admittedSessionId = options.sessionId
|
|
114
107
|
? assertChatSessionUsageAdmission(options.sessionId)
|
|
115
108
|
: null;
|
|
116
|
-
const evolutionSession =
|
|
109
|
+
const evolutionSession =
|
|
110
|
+
evolutionIngress === null
|
|
111
|
+
? null
|
|
112
|
+
: createAgentEvolutionSessionLifecycle(evolutionIngress);
|
|
113
|
+
let resolveFinished;
|
|
114
|
+
let rejectFinished;
|
|
115
|
+
const finished = new Promise((resolve, reject) => {
|
|
116
|
+
resolveFinished = resolve;
|
|
117
|
+
rejectFinished = reject;
|
|
118
|
+
});
|
|
119
|
+
void finished.catch(() => {});
|
|
117
120
|
const llmConfig = loadConfig().llm || {};
|
|
118
121
|
const connection = resolveLlmConnection(options, [llmConfig], {
|
|
119
122
|
defaultModel:
|
|
@@ -510,7 +513,10 @@ export async function startChatRepl(options = {}) {
|
|
|
510
513
|
? 0
|
|
511
514
|
: 1
|
|
512
515
|
: exitCode;
|
|
516
|
+
if (finalExitCode === 0) resolveFinished();
|
|
517
|
+
else rejectFinished(outputFailure);
|
|
513
518
|
process.exit(finalExitCode);
|
|
514
519
|
});
|
|
515
|
-
|
|
520
|
+
// Keep owners alive until readline closes even when Evolution is off.
|
|
521
|
+
return evolutionSession?.handle ?? Object.freeze({ finished });
|
|
516
522
|
}
|
|
@@ -65,7 +65,10 @@ import {
|
|
|
65
65
|
copyHostToolOutputIdentity,
|
|
66
66
|
} from "../lib/tool-result-preview.js";
|
|
67
67
|
import { DIAGNOSTIC_WORKFLOW_GUIDANCE } from "../lib/diagnostic-workflow.js";
|
|
68
|
-
import {
|
|
68
|
+
import {
|
|
69
|
+
CODING_TASK_QUALITY_GUIDANCE,
|
|
70
|
+
CODING_CHANGE_REVIEW_PROMPT,
|
|
71
|
+
} from "../lib/coding-task-guidance.js";
|
|
69
72
|
import { RemoteReadLoopGuard } from "../lib/remote-read-loop-guard.js";
|
|
70
73
|
import {
|
|
71
74
|
isPrActionRequest,
|
|
@@ -198,7 +201,11 @@ import {
|
|
|
198
201
|
toOllamaMessages,
|
|
199
202
|
imageUrlBlockToAnthropic,
|
|
200
203
|
} from "../lib/image-input.js";
|
|
201
|
-
import {
|
|
204
|
+
import {
|
|
205
|
+
executeToolSearch,
|
|
206
|
+
gateDeferredMcpCall,
|
|
207
|
+
projectMcpToolDefinitions,
|
|
208
|
+
} from "./mcp-tool-search.js";
|
|
202
209
|
import {
|
|
203
210
|
emitHooksV2Event,
|
|
204
211
|
executeHooksV2Event,
|
|
@@ -9669,7 +9676,9 @@ async function executeToolInner(
|
|
|
9669
9676
|
// local — same risk class as list_skills, so no approval gate.
|
|
9670
9677
|
if (localToolExecutor?.kind === "tool-search") {
|
|
9671
9678
|
return attachDescriptor(
|
|
9672
|
-
executeToolSearch(localToolExecutor.registry, args || {}
|
|
9679
|
+
executeToolSearch(localToolExecutor.registry, args || {}, {
|
|
9680
|
+
allowedToolNames: effectiveAllowedToolNames,
|
|
9681
|
+
}),
|
|
9673
9682
|
);
|
|
9674
9683
|
}
|
|
9675
9684
|
|
|
@@ -12010,6 +12019,13 @@ function getEffectiveToolDefinitions(options = {}) {
|
|
|
12010
12019
|
});
|
|
12011
12020
|
}
|
|
12012
12021
|
|
|
12022
|
+
function getProviderToolDefinitions(options = {}) {
|
|
12023
|
+
return projectMcpToolDefinitions(
|
|
12024
|
+
getEffectiveToolDefinitions(options),
|
|
12025
|
+
options.externalToolExecutors,
|
|
12026
|
+
);
|
|
12027
|
+
}
|
|
12028
|
+
|
|
12013
12029
|
const PROVIDER_REQUEST_ID_RE = /^[\x21-\x7e]{1,512}$/;
|
|
12014
12030
|
|
|
12015
12031
|
function _normalizeProviderRequestId(value) {
|
|
@@ -12109,7 +12125,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12109
12125
|
options.providerRequestId,
|
|
12110
12126
|
);
|
|
12111
12127
|
|
|
12112
|
-
let tools =
|
|
12128
|
+
let tools = getProviderToolDefinitions(options);
|
|
12113
12129
|
if (Array.isArray(options.contextMemorySelectedToolNames)) {
|
|
12114
12130
|
const selected = new Set(options.contextMemorySelectedToolNames);
|
|
12115
12131
|
tools = tools.filter((tool) => selected.has(tool?.function?.name));
|
|
@@ -14704,6 +14720,9 @@ export async function* agentLoop(messages, options) {
|
|
|
14704
14720
|
// obligation outside transcript compaction and never replay it automatically.
|
|
14705
14721
|
const pendingSubtreeMutations = new Map();
|
|
14706
14722
|
let subtreeMutationReprompted = false;
|
|
14723
|
+
let hasFileContentChanges = false;
|
|
14724
|
+
// Headless outer turns share this object; a new user turn gets a fresh one.
|
|
14725
|
+
const changeReviewState = options._changeReviewState || { requested: false };
|
|
14707
14726
|
const recordSubtreeMutation = (tool, args, result) => {
|
|
14708
14727
|
if (!GUARDED_FILE_MUTATION_TOOLS.has(tool)) return;
|
|
14709
14728
|
if (!args || typeof args !== "object" || Array.isArray(args)) return;
|
|
@@ -14747,6 +14766,7 @@ export async function* agentLoop(messages, options) {
|
|
|
14747
14766
|
result.mutationPerformed !== false
|
|
14748
14767
|
) {
|
|
14749
14768
|
pendingSubtreeMutations.delete(key);
|
|
14769
|
+
if (effect === "file-content") hasFileContentChanges = true;
|
|
14750
14770
|
}
|
|
14751
14771
|
};
|
|
14752
14772
|
const signal = options.signal || null;
|
|
@@ -16209,7 +16229,7 @@ export async function* agentLoop(messages, options) {
|
|
|
16209
16229
|
{
|
|
16210
16230
|
...options,
|
|
16211
16231
|
contextMemoryToolDefinitions:
|
|
16212
|
-
|
|
16232
|
+
getProviderToolDefinitions(iterationToolOptions),
|
|
16213
16233
|
contextMemoryTrustedSystemIndexes,
|
|
16214
16234
|
},
|
|
16215
16235
|
);
|
|
@@ -16237,15 +16257,29 @@ export async function* agentLoop(messages, options) {
|
|
|
16237
16257
|
"model",
|
|
16238
16258
|
budget.consumed,
|
|
16239
16259
|
);
|
|
16260
|
+
// A review may replace the first completion. Keep streaming transport but
|
|
16261
|
+
// discard live text/thinking in this opt-in mode; only the accepted final
|
|
16262
|
+
// response is published. This avoids concatenating drafts in IDE clients
|
|
16263
|
+
// without buffering unbounded provider output or changing the protocol.
|
|
16264
|
+
const outputOptions =
|
|
16265
|
+
options.reviewChanges === true
|
|
16266
|
+
? {
|
|
16267
|
+
...iterationToolOptions,
|
|
16268
|
+
onToken:
|
|
16269
|
+
typeof options.onToken === "function" ? () => {} : undefined,
|
|
16270
|
+
onThinking:
|
|
16271
|
+
typeof options.onThinking === "function" ? () => {} : undefined,
|
|
16272
|
+
}
|
|
16273
|
+
: iterationToolOptions;
|
|
16240
16274
|
const plannedProviderOptions = canonicalProviderContext?.plan
|
|
16241
16275
|
? {
|
|
16242
|
-
...
|
|
16276
|
+
...outputOptions,
|
|
16243
16277
|
contextEngine: null,
|
|
16244
16278
|
contextMemoryPreplanned: true,
|
|
16245
16279
|
contextMemorySelectedToolNames:
|
|
16246
16280
|
canonicalProviderContext.selectedToolNames,
|
|
16247
16281
|
}
|
|
16248
|
-
:
|
|
16282
|
+
: outputOptions;
|
|
16249
16283
|
const requestOptions = providerRequestId
|
|
16250
16284
|
? { ...plannedProviderOptions, providerRequestId }
|
|
16251
16285
|
: plannedProviderOptions;
|
|
@@ -16258,6 +16292,23 @@ export async function* agentLoop(messages, options) {
|
|
|
16258
16292
|
? { ...requestOptions, evolutionIngress }
|
|
16259
16293
|
: requestOptions),
|
|
16260
16294
|
};
|
|
16295
|
+
const originalExtraTools = requestOptions.extraToolDefinitions;
|
|
16296
|
+
if (Array.isArray(originalExtraTools)) {
|
|
16297
|
+
const projectedExtraTools = projectMcpToolDefinitions(
|
|
16298
|
+
originalExtraTools,
|
|
16299
|
+
requestOptions.externalToolExecutors,
|
|
16300
|
+
);
|
|
16301
|
+
if (projectedExtraTools !== originalExtraTools) {
|
|
16302
|
+
const admittedNames = new Set(
|
|
16303
|
+
getEffectiveToolDefinitions(requestOptions).map(
|
|
16304
|
+
(tool) => tool.function.name,
|
|
16305
|
+
),
|
|
16306
|
+
);
|
|
16307
|
+
providerCallOptions.extraToolDefinitions = projectedExtraTools.filter(
|
|
16308
|
+
(tool) => admittedNames.has(tool.function.name),
|
|
16309
|
+
);
|
|
16310
|
+
}
|
|
16311
|
+
}
|
|
16261
16312
|
const modelUsageCall = {
|
|
16262
16313
|
type: "model-usage-started",
|
|
16263
16314
|
callId: _newModelUsageCallId("model"),
|
|
@@ -16414,6 +16465,7 @@ export async function* agentLoop(messages, options) {
|
|
|
16414
16465
|
contextWindow: requestContextWindow,
|
|
16415
16466
|
};
|
|
16416
16467
|
} else {
|
|
16468
|
+
changeReviewState.usageKnown = false;
|
|
16417
16469
|
yield {
|
|
16418
16470
|
type: "model-usage-unknown",
|
|
16419
16471
|
callId: modelUsageCall.callId,
|
|
@@ -16602,6 +16654,34 @@ export async function* agentLoop(messages, options) {
|
|
|
16602
16654
|
};
|
|
16603
16655
|
return;
|
|
16604
16656
|
}
|
|
16657
|
+
// Opt-in review uses the same loop, tools, usage settlement and budget.
|
|
16658
|
+
// Never emit a provisional completion or turn this self-check into an
|
|
16659
|
+
// acceptance verdict. Failed/deferred writes do not arm the review.
|
|
16660
|
+
if (
|
|
16661
|
+
options.reviewChanges === true &&
|
|
16662
|
+
hasFileContentChanges &&
|
|
16663
|
+
!changeReviewState.requested &&
|
|
16664
|
+
changeReviewState.usageKnown !== false &&
|
|
16665
|
+
budget.hasRemaining()
|
|
16666
|
+
) {
|
|
16667
|
+
throwIfAborted(signal);
|
|
16668
|
+
changeReviewState.requested = true;
|
|
16669
|
+
messages.push(
|
|
16670
|
+
markRuntimeOnlySessionMessage({
|
|
16671
|
+
role: "assistant",
|
|
16672
|
+
content: msg.content || "",
|
|
16673
|
+
}),
|
|
16674
|
+
markRuntimeOnlySessionMessage({
|
|
16675
|
+
role: "user",
|
|
16676
|
+
content: CODING_CHANGE_REVIEW_PROMPT,
|
|
16677
|
+
}),
|
|
16678
|
+
);
|
|
16679
|
+
yield {
|
|
16680
|
+
type: "iteration-warning",
|
|
16681
|
+
message: "Reviewing changed files against the task before finishing.",
|
|
16682
|
+
};
|
|
16683
|
+
continue;
|
|
16684
|
+
}
|
|
16605
16685
|
// Surface the final answer's extended-thinking reasoning (Anthropic, when
|
|
16606
16686
|
// --think is on) so non-streaming consumers (the REPL) can show it. The
|
|
16607
16687
|
// streaming path forwards reasoning live via onThinking instead.
|
|
@@ -189,6 +189,9 @@ export class AgentRuntime {
|
|
|
189
189
|
resolveAgentBundle: deps.resolveAgentBundle || null,
|
|
190
190
|
openBrowser: deps.openBrowser || openBrowser,
|
|
191
191
|
runTurn: deps.runTurn || null,
|
|
192
|
+
prepareUiModelTurn: deps.prepareUiModelTurn || null,
|
|
193
|
+
resolveEvolutionCompositionFactory:
|
|
194
|
+
deps.resolveEvolutionCompositionFactory || null,
|
|
192
195
|
evolutionCompositionFactory:
|
|
193
196
|
deps.evolutionCompositionFactory == null
|
|
194
197
|
? null
|
|
@@ -415,6 +418,9 @@ export class AgentRuntime {
|
|
|
415
418
|
? {}
|
|
416
419
|
: { evolutionIngress: this.evolutionIngress }),
|
|
417
420
|
});
|
|
421
|
+
if (this.evolutionIngress === null && result?.finished) {
|
|
422
|
+
await result.finished;
|
|
423
|
+
}
|
|
418
424
|
if (this.evolutionIngress !== null) {
|
|
419
425
|
if (result?.schema === AGENT_EVOLUTION_SESSION_SCHEMA) {
|
|
420
426
|
return await waitForAgentEvolutionSession(
|
|
@@ -489,10 +495,12 @@ export class AgentRuntime {
|
|
|
489
495
|
typeof loadBundle !== "function" ||
|
|
490
496
|
typeof resolveBundle !== "function"
|
|
491
497
|
) {
|
|
492
|
-
({ loadBundle } =
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
498
|
+
({ loadBundle } = await import(
|
|
499
|
+
"@chainlesschain/session-core/agent-bundle-loader"
|
|
500
|
+
));
|
|
501
|
+
({ resolveBundle } = await import(
|
|
502
|
+
"@chainlesschain/session-core/agent-bundle-resolver"
|
|
503
|
+
));
|
|
496
504
|
}
|
|
497
505
|
const bundle = loadBundle(this.policy.bundlePath);
|
|
498
506
|
bundleResolved = resolveBundle(bundle);
|
|
@@ -557,8 +565,9 @@ export class AgentRuntime {
|
|
|
557
565
|
if (Number.isNaN(httpPort) || httpPort < 1 || httpPort > 65535) {
|
|
558
566
|
throw new Error("Invalid --http-port. Must be between 1 and 65535.");
|
|
559
567
|
}
|
|
560
|
-
const { createEnvelopeBus, createEnvelopeHttpServer } =
|
|
561
|
-
|
|
568
|
+
const { createEnvelopeBus, createEnvelopeHttpServer } = await import(
|
|
569
|
+
"../gateways/http/envelope-http-server.js"
|
|
570
|
+
);
|
|
562
571
|
envelopeBus = createEnvelopeBus();
|
|
563
572
|
httpServer = createEnvelopeHttpServer({
|
|
564
573
|
bus: envelopeBus,
|
|
@@ -766,6 +775,9 @@ export class AgentRuntime {
|
|
|
766
775
|
sessionManager,
|
|
767
776
|
projectRoot: workspacePolicyCwd,
|
|
768
777
|
evolutionCompositionFactory: this.deps.evolutionCompositionFactory,
|
|
778
|
+
prepareUiModelTurn: this.deps.prepareUiModelTurn,
|
|
779
|
+
resolveEvolutionCompositionFactory:
|
|
780
|
+
this.deps.resolveEvolutionCompositionFactory,
|
|
769
781
|
});
|
|
770
782
|
// ChainlessChainWSServer extends EventEmitter and emits "error"
|
|
771
783
|
// synchronously on bind failure (in addition to rejecting start()).
|