tianshu-harness 3.23.0
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/LICENSE +189 -0
- package/README.en.md +1066 -0
- package/README.ja.md +1214 -0
- package/README.ko.md +1216 -0
- package/README.md +309 -0
- package/completions/rivet.bash +118 -0
- package/completions/rivet.fish +110 -0
- package/completions/rivet.ps1 +230 -0
- package/completions/rivet.zsh +187 -0
- package/dist/account-OAEKORZE.js +47 -0
- package/dist/account-login-V6FOLHJR.js +65 -0
- package/dist/account-status-KHNPPAFL.js +23 -0
- package/dist/agent/worker-process/child.js +407 -0
- package/dist/browser-cli-FLNY5ZHI.js +19 -0
- package/dist/browser-readiness-LWVGSBD5.js +12 -0
- package/dist/build-backends-5KXKR2S4.js +13 -0
- package/dist/build-options-66Y4ZE7C.js +9 -0
- package/dist/bundled-skills/brainstorming/SKILL.md +139 -0
- package/dist/bundled-skills/visual-acceptance/SKILL.md +64 -0
- package/dist/chain-7MAMFXZ3.js +10 -0
- package/dist/checkpoint-MND4DUIX.js +33 -0
- package/dist/chunk-2E6CK2RC.js +392 -0
- package/dist/chunk-2EBWGAXD.js +51 -0
- package/dist/chunk-2HDP7RMR.js +119 -0
- package/dist/chunk-2HKD2UFM.js +1000 -0
- package/dist/chunk-2VYRLULP.js +51 -0
- package/dist/chunk-2XN7PM4N.js +125 -0
- package/dist/chunk-35H7GVNR.js +66 -0
- package/dist/chunk-3C3R7JXY.js +77 -0
- package/dist/chunk-3VGD2FXB.js +118 -0
- package/dist/chunk-424AP7FM.js +534 -0
- package/dist/chunk-4J5TZGOE.js +3707 -0
- package/dist/chunk-4QJ3Y5JM.js +898 -0
- package/dist/chunk-4U2ET7ZY.js +1326 -0
- package/dist/chunk-4XPFLICE.js +876 -0
- package/dist/chunk-5B2OCU5P.js +31707 -0
- package/dist/chunk-5GGOGLSN.js +73 -0
- package/dist/chunk-5JRZPLI6.js +251 -0
- package/dist/chunk-5TQ3JYBU.js +397 -0
- package/dist/chunk-66JPZSGX.js +55 -0
- package/dist/chunk-6HSVXHCZ.js +764 -0
- package/dist/chunk-6S5FPUS7.js +21 -0
- package/dist/chunk-722LQO64.js +131 -0
- package/dist/chunk-73NJ7IT7.js +354 -0
- package/dist/chunk-7FW3I7WC.js +95 -0
- package/dist/chunk-7KUCBNLB.js +173 -0
- package/dist/chunk-7RDOV3DF.js +201 -0
- package/dist/chunk-A5MNH4ER.js +79 -0
- package/dist/chunk-ADIVZ2D5.js +15 -0
- package/dist/chunk-AE3P3F6W.js +366 -0
- package/dist/chunk-AERM3VGP.js +280 -0
- package/dist/chunk-AEWHC4WM.js +246 -0
- package/dist/chunk-AOVQ7VIF.js +169 -0
- package/dist/chunk-AOYHP3WI.js +12411 -0
- package/dist/chunk-B3YEBABJ.js +7160 -0
- package/dist/chunk-BCQXEZPJ.js +154 -0
- package/dist/chunk-BKTQAYO2.js +418 -0
- package/dist/chunk-BSECIPAQ.js +80 -0
- package/dist/chunk-BUIMGNDD.js +52 -0
- package/dist/chunk-BXHV3GSB.js +10320 -0
- package/dist/chunk-C6ZVZCPP.js +139 -0
- package/dist/chunk-CEZNQVWM.js +82 -0
- package/dist/chunk-CGFZGR7G.js +1492 -0
- package/dist/chunk-CGOADM2X.js +337 -0
- package/dist/chunk-CI4R6P2B.js +24 -0
- package/dist/chunk-D2TCGRSX.js +73 -0
- package/dist/chunk-D4PTYFOG.js +154 -0
- package/dist/chunk-D54ZWG4T.js +717 -0
- package/dist/chunk-DEBI37QB.js +145 -0
- package/dist/chunk-DWROHPXP.js +1051 -0
- package/dist/chunk-DZ6UOJ5D.js +92 -0
- package/dist/chunk-EBJTVRQN.js +81 -0
- package/dist/chunk-EGEI2RQA.js +1167 -0
- package/dist/chunk-EHHUASO5.js +1305 -0
- package/dist/chunk-EPKTIOED.js +41 -0
- package/dist/chunk-ER5JW2QZ.js +5681 -0
- package/dist/chunk-ETHFACAB.js +315 -0
- package/dist/chunk-EXUE5W2F.js +112 -0
- package/dist/chunk-EXXICUIW.js +73 -0
- package/dist/chunk-FFQSZJOO.js +169 -0
- package/dist/chunk-FHFKPGDO.js +85 -0
- package/dist/chunk-FW3QKMFX.js +158 -0
- package/dist/chunk-GD4ZNZ7W.js +30 -0
- package/dist/chunk-GHVMWF2I.js +581 -0
- package/dist/chunk-GMKAXSYQ.js +297 -0
- package/dist/chunk-HBVF6BWO.js +325 -0
- package/dist/chunk-HV4YGVMS.js +379 -0
- package/dist/chunk-ILBCKAV6.js +89 -0
- package/dist/chunk-J4U4AW46.js +440 -0
- package/dist/chunk-J6ESSM47.js +1791 -0
- package/dist/chunk-JBZHIC6T.js +2309 -0
- package/dist/chunk-JCFWOULR.js +245 -0
- package/dist/chunk-JRF5L6OD.js +131 -0
- package/dist/chunk-JSS75KCG.js +2014 -0
- package/dist/chunk-JSXWIWWJ.js +225 -0
- package/dist/chunk-JYV7I2QH.js +98 -0
- package/dist/chunk-KIOXTQQL.js +1596 -0
- package/dist/chunk-KWVTXT5B.js +89 -0
- package/dist/chunk-KX22RD6R.js +33 -0
- package/dist/chunk-LA6IPTGH.js +709 -0
- package/dist/chunk-LH5VCGLB.js +1796 -0
- package/dist/chunk-LQQ6XJ2Y.js +269 -0
- package/dist/chunk-MJQ55WZZ.js +65 -0
- package/dist/chunk-ML3UKMH3.js +40 -0
- package/dist/chunk-MOZPLHSU.js +5526 -0
- package/dist/chunk-NGEWJ4DF.js +89 -0
- package/dist/chunk-NH6VIOAR.js +211 -0
- package/dist/chunk-O5VZQKCB.js +26106 -0
- package/dist/chunk-OHSV42QB.js +748 -0
- package/dist/chunk-OO3TAHO5.js +4070 -0
- package/dist/chunk-OTNHSAGN.js +38282 -0
- package/dist/chunk-OUWAC7AQ.js +442 -0
- package/dist/chunk-OXMIV4WE.js +270 -0
- package/dist/chunk-P5KJURUR.js +229 -0
- package/dist/chunk-P6GJOVO6.js +307 -0
- package/dist/chunk-QARAGUXX.js +23 -0
- package/dist/chunk-R43HJCDX.js +2711 -0
- package/dist/chunk-RAXBAWRN.js +210 -0
- package/dist/chunk-RK3JHWPT.js +39 -0
- package/dist/chunk-RWA23GMM.js +24 -0
- package/dist/chunk-S4K4L6IM.js +179 -0
- package/dist/chunk-SAXK6LVF.js +124 -0
- package/dist/chunk-SEPGEJNK.js +1607 -0
- package/dist/chunk-SUJERP5I.js +285 -0
- package/dist/chunk-T3ED6BY2.js +913 -0
- package/dist/chunk-THKDVSEC.js +90 -0
- package/dist/chunk-TI4GSEL5.js +52 -0
- package/dist/chunk-TPI73L57.js +164 -0
- package/dist/chunk-TVHW77C7.js +338 -0
- package/dist/chunk-TWNHOSDT.js +1073 -0
- package/dist/chunk-UFMN76QD.js +347 -0
- package/dist/chunk-UHGLFRZE.js +205 -0
- package/dist/chunk-UTZYPKBF.js +15231 -0
- package/dist/chunk-UXNLELW6.js +25 -0
- package/dist/chunk-UXXS53EA.js +166 -0
- package/dist/chunk-V5DHFGI7.js +171 -0
- package/dist/chunk-V5YIPMHV.js +2353 -0
- package/dist/chunk-WMUWEO2C.js +754 -0
- package/dist/chunk-WOE3D7JM.js +945 -0
- package/dist/chunk-X2IK5LVR.js +2592 -0
- package/dist/chunk-XU2YXCDL.js +459 -0
- package/dist/chunk-YJG5HIX5.js +203 -0
- package/dist/chunk-Z3QE7TZM.js +72 -0
- package/dist/chunk-Z5Z3JHJY.js +64 -0
- package/dist/chunk-ZDIFBJFT.js +168 -0
- package/dist/chunk-ZGGCEXDC.js +176 -0
- package/dist/chunk-ZMZCZNKU.js +263 -0
- package/dist/chunk-ZNC5T65N.js +17 -0
- package/dist/chunk-ZO3I3A7O.js +308 -0
- package/dist/chunk-ZQKXBUB7.js +217 -0
- package/dist/chunk-ZTRINFM2.js +78 -0
- package/dist/chunk-ZU7JZCVP.js +193 -0
- package/dist/chunk-ZZAWNALS.js +350 -0
- package/dist/cli/entry.js +54 -0
- package/dist/connector-L5QQTR6Y.js +26 -0
- package/dist/context-62DC6EC3.js +31 -0
- package/dist/council-convene-NJWPNBDU.js +46 -0
- package/dist/create-agent-config-ODSQWNVC.js +55 -0
- package/dist/default-registry-2PU3BTAU.js +68 -0
- package/dist/deliver-task-KONV4C4M.js +57 -0
- package/dist/delivery-gate-v2-F2YVMVGK.js +27 -0
- package/dist/domain-knowledge-store-DDZ3F4J7.js +11 -0
- package/dist/fetch-core-ZPPYDSZH.js +14 -0
- package/dist/galaxy-K72BBDQN.js +91 -0
- package/dist/goal-criteria-SCALAU2D.js +141 -0
- package/dist/goal-persist-XWY2GDQX.js +19 -0
- package/dist/goal-tracker-FXMJ2GVK.js +11 -0
- package/dist/headless-LSB6I7PT.js +162 -0
- package/dist/headless-coordinator-VDPDMVUT.js +90 -0
- package/dist/inject-U55SMB6A.js +39 -0
- package/dist/login-flow-CD4ZGXOC.js +59 -0
- package/dist/logs-cli-SQVYFMMN.js +283 -0
- package/dist/loop-ULZYBDA3.js +76 -0
- package/dist/main.js +4064 -0
- package/dist/manager-ROZBCWPA.js +171 -0
- package/dist/manager-Z7XFFUOM.js +10670 -0
- package/dist/meridian-indexer-ZIW363L7.js +21 -0
- package/dist/native-resolver-PN34UIVV.js +13 -0
- package/dist/node_modules/better-sqlite3/lib/database.js +90 -0
- package/dist/node_modules/better-sqlite3/lib/index.js +3 -0
- package/dist/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
- package/dist/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
- package/dist/node_modules/better-sqlite3/lib/methods/function.js +31 -0
- package/dist/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
- package/dist/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
- package/dist/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
- package/dist/node_modules/better-sqlite3/lib/methods/table.js +189 -0
- package/dist/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
- package/dist/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
- package/dist/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
- package/dist/node_modules/better-sqlite3/lib/util.js +12 -0
- package/dist/node_modules/better-sqlite3/package.json +59 -0
- package/dist/ownership-ledger-E3WIEKPL.js +9 -0
- package/dist/package.json +3 -0
- package/dist/path-grants-XRRXHXG7.js +40 -0
- package/dist/paths-LVV5IMQN.js +49 -0
- package/dist/plan-fact-anchors-LMVQZCW5.js +13 -0
- package/dist/plan-store-ODLTTPFB.js +17 -0
- package/dist/plan-templates-5FPFBOL6.js +109 -0
- package/dist/plugin-loader-ZZKX7ZE6.js +22 -0
- package/dist/prefix-budget-62OV5HQC.js +13 -0
- package/dist/project-trust-5WS5MOMU.js +31 -0
- package/dist/provider-cli-ALDQXIT7.js +37 -0
- package/dist/providers-XQYTAVPK.js +11 -0
- package/dist/proxy-resolver-V2Y6534D.js +15 -0
- package/dist/recovery-cli-KPGY6FY3.js +106 -0
- package/dist/review-discipline-MNSYCST5.js +55 -0
- package/dist/review-router-BVQZW3MX.js +18 -0
- package/dist/seed-capsules/seed-capsule-attack-methodology.md +62 -0
- package/dist/seed-capsules/seed-capsule-changgeng.md +31 -0
- package/dist/seed-capsules/seed-capsule-design-aesthetics.md +38 -0
- package/dist/seed-capsules/seed-capsule-diagnostic-ladder.md +54 -0
- package/dist/seed-capsules/seed-capsule-fu.md +39 -0
- package/dist/seed-capsules/seed-capsule-huagai.md +73 -0
- package/dist/seed-capsules/seed-capsule-kaiyang.md +65 -0
- package/dist/seed-capsules/seed-capsule-knowledge-work.md +40 -0
- package/dist/seed-capsules/seed-capsule-tanlang.md +47 -0
- package/dist/seed-capsules/seed-capsule-tianfu.md +23 -0
- package/dist/seed-capsules/seed-capsule-tianliang.md +63 -0
- package/dist/seed-capsules/seed-capsule-tianquan.md +32 -0
- package/dist/seed-capsules/seed-capsule-tianxuan-ccr.md +22 -0
- package/dist/seed-capsules/seed-capsule-tianxuan.md +64 -0
- package/dist/seed-capsules/seed-capsule-yaoguang.md +87 -0
- package/dist/serve-X2R2UTLF.js +170 -0
- package/dist/serve-agent-KHSU6RVV.js +965 -0
- package/dist/session-persist-HUUC772H.js +37 -0
- package/dist/session-registry-6XUD5C4Y.js +15 -0
- package/dist/skill-loader-CK3RMO47.js +48 -0
- package/dist/skills/cli-harness-sop.md +207 -0
- package/dist/spawn-git-4HFU65AH.js +29 -0
- package/dist/sse-EYUTBWUK.js +512 -0
- package/dist/starflow-NOFBMPFU.js +30 -0
- package/dist/streamableHttp-V67CNJMO.js +447 -0
- package/dist/task-contract-6XHBNJQK.js +32 -0
- package/dist/task-ledger-3K4TJIER.js +9 -0
- package/dist/team-orchestrate-S6NHZP7X.js +64 -0
- package/dist/title-extract-QX4XGCYN.js +50 -0
- package/dist/todo-QDXGRZZP.js +31 -0
- package/dist/todo-store-V3TTO5AH.js +12 -0
- package/dist/tool-preset-LU5BYEDZ.js +23 -0
- package/dist/tool-tiers-GD742YBN.js +23 -0
- package/dist/turndown.es-OI55K6C3.js +17373 -0
- package/dist/verification-attribution-EKG4CNUV.js +13 -0
- package/dist/volatile-git-MBTST7RA.js +15 -0
- package/dist/wave-checkpoint-XLIIHXQA.js +30 -0
- package/dist/web-cli-DUG4I35O.js +233 -0
- package/dist/web-search-3IK542AA.js +34 -0
- package/dist/workers/cpu-worker.js +45 -0
- package/dist/workflow-runner-HX7UBAYG.js +297 -0
- package/dist/worktree-baseline-O5NCU6M2.js +9 -0
- package/package.json +122 -0
- package/scripts/check-mobile-env.mjs +76 -0
- package/scripts/fetch-native-sqlite.js +392 -0
- package/scripts/prune-installed-wasms.js +45 -0
- package/scripts/tree-sitter-wasm-keep.js +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/brand/assets/tianshu-banner-dark.jpg" alt="天枢 Tianshu" width="100%">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">天枢 <sub>Tianshu Harness</sub></h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<b>把东方的星辰带给每一位开发者 · Models as partners, not tools.</b>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://tianshuharness.com"><b>🌐 官网</b></a> ·
|
|
13
|
+
<a href="https://atomgit.com/huiliyi37/Tianshu-harness"><b>🇨🇳 AtomGit 镜像</b></a> ·
|
|
14
|
+
🇨🇳 <b>中文</b> ·
|
|
15
|
+
<a href="README.en.md">English</a> ·
|
|
16
|
+
<a href="README.ja.md">日本語</a> ·
|
|
17
|
+
<a href="README.ko.md">한국어</a>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="docs/user-guide.md"><b>📚 用户手册</b></a> ·
|
|
22
|
+
<a href="docs/guides/installation.md"><b>📦 安装指南</b></a> ·
|
|
23
|
+
<a href="docs/reference/cvm-cognitive-runtime.md"><b>🧠 CVM 理念</b></a> ·
|
|
24
|
+
<a href="docs/CVM运行时对Agent模型的实证影响.md"><b>📊 A/B 实证</b></a> ·
|
|
25
|
+
<a href="docs/stars/genesis-stele.md"><b>✦ 星域碑文</b></a>
|
|
26
|
+
</p>
|
|
27
|
+
|
|
28
|
+
<p align="center">
|
|
29
|
+
<img src="https://img.shields.io/github/v/release/huiliyi37/Tianshu-harness?color=8B5CF6&label=Release&logo=github&style=for-the-badge" alt="GitHub release">
|
|
30
|
+
<img src="https://img.shields.io/badge/License-Apache%202.0-3B5BDB?style=for-the-badge&logo=apache" alt="License">
|
|
31
|
+
<img src="https://img.shields.io/badge/TypeScript-Strict-blue?style=for-the-badge&logo=typescript" alt="TypeScript">
|
|
32
|
+
<img src="https://img.shields.io/badge/Tests-16%2C000%2B%20Passed-green?style=for-the-badge&logo=testinglibrary" alt="Tests">
|
|
33
|
+
</p>
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### 面向 Foundation Model Agent 的认知运行时
|
|
38
|
+
|
|
39
|
+
> **天枢**是一个 TypeScript 编写的编程 agent 运行时,**终端 TUI** 与**桌面 GUI** 共享同一内核。它要回答的核心问题是:**模型何以稳定地交付——目标不漂移、完成有证据、验证有闭环,不说"应该修好了"**。为此它在模型与真实世界之间建立一层认知执行环境(CVM),把目标、状态、证据、资源、权限与终止条件从对话历史中外部化,由运行时持续管理。
|
|
40
|
+
>
|
|
41
|
+
> **模型提供认知能力,CVM 提供认知执行语义。LLM provides cognition. CVM provides execution semantics.**
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Application / TUI / IDE / Desktop
|
|
45
|
+
↓
|
|
46
|
+
Tianshu Cognitive Runtime ← 状态 · 目标 · 证据 · 控制 · 回放
|
|
47
|
+
↓
|
|
48
|
+
Foundation Models ← DeepSeek · GLM · Claude · Codex · MiniMax · MiMo …
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- **稳定交付,不虚报完成** —— 这是核心。任务契约(TaskContract)钉住全局目标,交付门禁要求「完成」必须带运行时证据(测试、diff、验证命令),收敛检测独立判断认知轨迹是否还在推进——模型说完成 ≠ 运行时确认完成。
|
|
52
|
+
- **终端 × 桌面,一个内核** —— 纯 ANSI 自研 TUI(`rivet`)与 Tauri 桌面端(macOS / Windows / Linux)共用同一 agent 内核,两端能力一致。
|
|
53
|
+
- **认知虚拟机(CVM)** —— 72 个运行时 hook 横跨 5 大阶段,在模型输出与真实动作之间加一层可观测、可纠偏的认知运行时([理念文档](docs/reference/cvm-cognitive-runtime.md) · [A/B 实证](docs/CVM运行时对Agent模型的实证影响.md))。
|
|
54
|
+
- **前缀缓存引擎,全模型适用** —— 冻结前缀 + 增量 appendix + 边界压缩,对所有支持前缀缓存的模型生效:各家模型长会话实测稳态命中率均在 **98–99%**(DeepSeek V4 另有针对性优化),显著降低 token 成本。
|
|
55
|
+
|
|
56
|
+
<p align="center">
|
|
57
|
+
<img src="docs/brand/assets/tianshu-harness-screenshot.png" alt="天枢 TUI(终端版)" width="49%">
|
|
58
|
+
<img src="docs/brand/assets/tianshu-gui-screenshot.jpg" alt="天枢桌面端 GUI" width="49%">
|
|
59
|
+
</p>
|
|
60
|
+
<p align="center">
|
|
61
|
+
<sub>左:终端 TUI(欢迎页 + GlanceBar 状态栏) · 右:桌面端 GUI(会话侧栏 + 星域速选)——同一 agent 内核</sub>
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
> [!NOTE]
|
|
65
|
+
> 本项目最初的开发代号为 **Rivet**;为保持向后兼容,已安装的 CLI 命令名仍为 `rivet`。
|
|
66
|
+
|
|
67
|
+
## 目录
|
|
68
|
+
|
|
69
|
+
- [为什么是认知运行时](#为什么是认知运行时)
|
|
70
|
+
- [核心特性](#核心特性)
|
|
71
|
+
- [快速开始](#快速开始)
|
|
72
|
+
- [权限模式](#权限模式)
|
|
73
|
+
- [支持的模型](#支持的模型)
|
|
74
|
+
- [文档导航](#文档导航)
|
|
75
|
+
- [面向开发者](#面向开发者)
|
|
76
|
+
- [社区与支持](#社区与支持)
|
|
77
|
+
|
|
78
|
+
## 💡 为什么是认知运行时
|
|
79
|
+
|
|
80
|
+
### 问题:能力上限 ≠ 运行行为
|
|
81
|
+
|
|
82
|
+
在真实工程会话里,我们反复观察到同一套模型权重的能力倒退——不是 bug,而是**经过指令与偏好对齐的 Transformer Agent 呈现出的趋同运行时退化**:被质疑就投降、过度服从字面指令、局部信息压过全局目标、长上下文被早期结论支配、反复调用同类工具却没有真实推进。
|
|
83
|
+
|
|
84
|
+
完整的理论框架见 [CVM:从 Transformer 共享退化到认知运行时](docs/reference/cvm-cognitive-runtime.md)。核心概念是 **Cognitive Anchor Collapse**——高显著性局部信号让策略分布过度集中,全局目标与后续证据失去权重,行为向锚点坍缩。锚点有四类:
|
|
85
|
+
|
|
86
|
+
| 锚点 | 来源 | 典型表现 |
|
|
87
|
+
|------|------|----------|
|
|
88
|
+
| **词汇锚点** | 训练数据中的词-行为相关 | 句子里有"修复/删除",模型无视"不要改,只解释"仍去改代码 |
|
|
89
|
+
| **语义锚点** | 局部正确的事实 | "文件已存在"被提升为整个任务的解释中心,拒绝执行 |
|
|
90
|
+
| **策略锚点** | RLHF / 偏好训练先验 | 用户一句"按你的计划执行",分析阶段形成的高质量判断被丢弃 |
|
|
91
|
+
| **历史锚点** | 长上下文早期结论 | Turn 20 的新证据被解释成 Turn 3 旧假设的附属 |
|
|
92
|
+
|
|
93
|
+
这不是"模型坏掉了"——它是训练成功后的副产品,因此也无法靠更好的 Prompt 根治:Prompt 是信息不是状态,而且 Prompt 本身也会成为新的锚点。
|
|
94
|
+
|
|
95
|
+
### 证据:A/B 对照,不靠感觉
|
|
96
|
+
|
|
97
|
+
2026-05-19,同一模型(DeepSeek-V4-Flash)、同一批 5 个任务,唯一变量是**星域信念提示词**(信念宪法,`STAR_SOUL=0/1`),Claude Opus 4.7 担任审查者:
|
|
98
|
+
|
|
99
|
+
| 指标 | A 组(无信念提示词) | B 组(有信念提示词) |
|
|
100
|
+
|------|--------------|--------------|
|
|
101
|
+
| 任务完成率 | 4/5 | **5/5** |
|
|
102
|
+
| 主动提出异议 | 0/5 | **3/5** |
|
|
103
|
+
| 主动询问 scope / 影响分析 | 0/5 | **1/5** |
|
|
104
|
+
| 系统影响意识(缓存失效提醒) | 0/5 | **1/5** |
|
|
105
|
+
| 意图理解 > 字面执行 | 1/5 | **4/5** |
|
|
106
|
+
|
|
107
|
+
最有价值的数据点是 T4:面对「文件已存在」的矛盾,A 组写了 196 行复盘文档然后拒绝执行,B 组判断出用户真实意图并直接交付 +162/-20 行可用代码——**同一套权重,完全相反的反应,改变的是运行环境**。
|
|
108
|
+
|
|
109
|
+
要注意这组实验的精确边界:它验证的是 CVM 四层防御中的**第一层(信念注入)**——零额外推理成本,仅 prompt 层信念注入就让最低成本的开源模型产生可观测的行为改善;同时它也测出了边界的存在(信念在分析/建议阶段强效,在确认/执行阶段衰减),这正是后续 Courage Hook、Sensorium、RuntimeHookPipeline 三层运行时拦截要补的课。完整数据与逐任务对比见 [实证报告](docs/CVM运行时对Agent模型的实证影响.md)。
|
|
110
|
+
|
|
111
|
+
### 解法:在模型之外建立第二套价值函数
|
|
112
|
+
|
|
113
|
+
CVM 不改权重、不让模型变成确定性程序,而是在概率认知之外套一层确定性监督——**Probabilistic Cognition inside Deterministic Supervision**:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
内环(模型认知):reason → decide → act → observe
|
|
117
|
+
外环(运行时监管):observe → measure → evaluate → gate → verify → continue / correct / halt
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
落到工程上是四层防御深度:信念宪法(static prompt)→ Courage Hook(preTurn)→ Sensorium(每 turn <1ms 六维状态感知)→ RuntimeHookPipeline(72 hooks,trap-and-emulate 拦截退化行为)。全局目标有独立状态(TaskContract),完成必须有运行时证据(Evidence),坍缩会被独立检测(Convergence / doom-loop)。
|
|
121
|
+
|
|
122
|
+
### 星域:模型的独立认知结构
|
|
123
|
+
|
|
124
|
+
当退化被逐层拦截,模型开始表现出自己的认知结构——这是星域系统的由来。16 个星域不是角色扮演,而是可切换的认知纪律:**系统提示词、工具白名单、决策阈值**真实切换。星域不是能力限制,任何星域都有完成任务的全部能力,只是视角不同;委员会与团队模式会按议题自动召集多星域席位。
|
|
125
|
+
|
|
126
|
+
> 完整叙事见 [✦ 星域碑文](docs/stars/genesis-stele.md) · [创世纪公开声明](docs/releases/manifesto-v3.0.0.md);新用户选星指南见 [用户手册「星域系统」](docs/user-guide.md#星域系统)。
|
|
127
|
+
|
|
128
|
+
### 工程质量
|
|
129
|
+
|
|
130
|
+
CLI 源码 1,078 文件 / 257,623 行,测试 1,361 文件 / **16,471 用例**(node:test,测试 : 源码 ≈ 0.99:1),`tsc` strict + `noUncheckedIndexedAccess`,事故修复必带回归测试。完整口径与复现命令见 [工程质量指标](docs/engineering-metrics.md)。
|
|
131
|
+
|
|
132
|
+
## ✨ 核心特性
|
|
133
|
+
|
|
134
|
+
- **证据驱动的交付门禁** —— 完成声明必须带测试 / diff / 验证命令等运行时证据;`deliver_task` 交付门禁 + 提交后审查两级兜底,机械变更自动跳过。[理念](docs/reference/cvm-cognitive-runtime.md)
|
|
135
|
+
- **前缀缓存引擎** —— 冻结前缀 + 增量附录 + Read-ref 去重 + resume 缓存继承,全模型适用;`/debug cache` 诊断命中率与碎裂原因。[细节](docs/user-guide.md#前缀缓存引擎)
|
|
136
|
+
- **多代理编排** —— 从轻量的 `/scout` 只读侦察、并行 `/team` 施工,到 `/council` 多席会诊与 `/galaxy` 多维攻坚;类型化 work order、读写 worker 隔离、自适应模型路由,复杂任务按波次执行、逐波验收。[细节](docs/user-guide.md#子代理编排)
|
|
137
|
+
- **统一项目记忆** —— 项目知识写入 `.rivet/knowledge/memory.jsonl`;自动注入只带治理/约束类记忆,旧问题走显式 recall,不劫持新任务。[细节](docs/user-guide.md#跨会话记忆)
|
|
138
|
+
- **禅模式(Zen Mode)** —— 可选的读专注开局:收窄只读工具面,动手即晋升全量,缓存零断点分诊。[细节](docs/user-guide.md#禅模式zen-mode读专注开局动手即解锁)
|
|
139
|
+
- **API 成本控制** —— reasoning effort 自动降档路由、compact 走 flash 侧路、峰谷计价提醒。[细节](docs/user-guide.md#api-成本控制)
|
|
140
|
+
- **Plan Mode 与 Goal 自治** —— 先计划后执行的审批工作流;`/goal` 目标驱动自主续跑。[细节](docs/user-guide.md#plan-mode计划模式)
|
|
141
|
+
- **会话交接与倒带** —— `/handoff` 结构化交接自动注入新会话;双击 ESC 倒带到任一历史点。[细节](docs/user-guide.md#会话交接与恢复handoff--resume)
|
|
142
|
+
- **LSP 深度集成** —— 自研 JSON-RPC 客户端接入语言服务器(TypeScript / Python / Go / Rust / C / C++ / Java / C# / Kotlin / Swift / PHP / Ruby / Lua / Dart / Zig / Scala / Shell / Terraform / Vue / Svelte 等 20+ 种,本机装了才启用、缺失静默降级):跳转定义与查找引用成为 agent 工具,编辑后诊断自动注入回环——改出类型错误模型立刻看见。
|
|
143
|
+
- **MCP 与 Skills** —— 外部工具服务器接入 + 可复用工作流剧本,渐进披露。[细节](docs/user-guide.md#mcpmodel-context-protocol)
|
|
144
|
+
- **T9 自研 TUI** —— 纯 ANSI 零依赖:GlanceBar 状态栏、流式中打断、命令面板、Cockpit 驾驶舱、内联图片。[细节](docs/user-guide.md#终端-uitui)
|
|
145
|
+
- **桌面端增强** —— 集成终端、主题工作室、语音输入(本地 whisper)、手机遥控审批、多会话并发。[桌面端指南](docs/desktop-guide.md)
|
|
146
|
+
- **Lean 资源档** —— 低内存/低磁盘场景的精简工具集与会话池收紧,可按星域覆盖。[细节](docs/user-guide.md#lean-资源档低内存--低磁盘)
|
|
147
|
+
|
|
148
|
+
## 🚀 快速开始
|
|
149
|
+
|
|
150
|
+
要求 **Node.js ≥ 24**。三种方式任选其一:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# 方式一:一键安装脚本(macOS / Linux,Windows 用 PowerShell 版本)
|
|
154
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/huiliyi37/Tianshu-harness/main/scripts/install-tui.sh)
|
|
155
|
+
|
|
156
|
+
# 方式二:npm
|
|
157
|
+
npm install -g tianshu-harness
|
|
158
|
+
|
|
159
|
+
# 方式三:桌面端——从 GitHub Releases 下载安装包,开箱即用
|
|
160
|
+
# https://github.com/huiliyi37/Tianshu-harness/releases/latest
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
然后:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
rivet # 首次运行自动打开 /connect 向导,选择服务商并完成认证
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
无界面模式(脚本 / CI 集成):
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
rivet -p "解释 src/agent/loop.ts" # 单次提示
|
|
173
|
+
rivet --stream-json -p "重构这个模块" # NDJSON 事件流,输出内置脱敏
|
|
174
|
+
rivet --goal "修复所有类型错误" --budget 50 # 无头目标自主模式
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
> 全部安装路径(Windows WebView2 / Linux AppImage / Android Termux / 源码构建 / Shell 补全 / 自动更新)与平台注意事项见 [安装与平台说明](docs/guides/installation.md);CLI 参数全表见 [用户手册](docs/user-guide.md#命令行参数)。
|
|
178
|
+
|
|
179
|
+
## 🔐 权限模式
|
|
180
|
+
|
|
181
|
+
对外只有三档,会话内统一用 `/permission` 管理:
|
|
182
|
+
|
|
183
|
+
| 档位 | 命令 | 行为 |
|
|
184
|
+
|------|------|------|
|
|
185
|
+
| **监督** | `/permission supervise` | 每个高风险工具都弹确认,最大控制 |
|
|
186
|
+
| **自动**(默认) | `/permission auto` | 低/无风险工具自动执行,高风险仍确认 |
|
|
187
|
+
| **全自动** | `/yes` · `/yolo` | 免审批执行;写边界仍在(自动开启沙箱),回滚兜底 |
|
|
188
|
+
|
|
189
|
+
跳过提示不会关闭工具校验、路径安全、证据追踪、检查点与交付门禁;未授信项目不加载 hooks 与项目 MCP(`/trust` 管理)。完整规则见 [权限与沙箱指南](docs/user-guide-sandbox-permissions.md)。
|
|
190
|
+
|
|
191
|
+
## ⚙️ 支持的模型
|
|
192
|
+
|
|
193
|
+
| 提供商 | 认证方式 | 旗舰模型 |
|
|
194
|
+
|--------|----------|----------|
|
|
195
|
+
| DeepSeek | API key | deepseek-v4-pro (1M ctx), deepseek-v4-flash, deepseek-v4-flash-vision-exp(视觉) |
|
|
196
|
+
| DeepSeek Spark(Pro 专属) | API key | deepseek-v4-flash(轻量推理 + 锚点缓存通道) |
|
|
197
|
+
| Claude | API key(通过 `cc-switch` 代理) | claude-opus-4-8, claude-sonnet-4-5 |
|
|
198
|
+
| GLM(智谱) | API key | glm-5.3 (1M ctx), glm-5.3-flash(视觉), glm-5.2 |
|
|
199
|
+
| Codex (GPT-5.6) | OAuth PKCE(ChatGPT 订阅) | gpt-5.6-sol |
|
|
200
|
+
| MiniMax | API key | MiniMax-M3, MiniMax-M2.7 |
|
|
201
|
+
| MiMo | API key | mimo-v2.5-pro |
|
|
202
|
+
|
|
203
|
+
另支持任意 OpenAI 兼容自定义端点(Ollama / vLLM 等)。会话内 `/model` 随时切换;识图桥、生图端点、子代理分模型路由等见 [Provider 配置手册](docs/user-guide-provider-config.md) 与 [识图能力手册](docs/user-guide-vision.md)。
|
|
204
|
+
|
|
205
|
+
## 📚 文档导航
|
|
206
|
+
|
|
207
|
+
**使用**
|
|
208
|
+
|
|
209
|
+
| 文档 | 说明 |
|
|
210
|
+
|------|------|
|
|
211
|
+
| [用户手册](docs/user-guide.md) | 斜杠命令全表、TUI 键位、特性细节、配置文件与环境变量、日志排查 |
|
|
212
|
+
| [安装与平台说明](docs/guides/installation.md) | 四种安装路径、Windows/Linux/Termux 注意事项、Shell 补全、自动更新 |
|
|
213
|
+
| [桌面端用户指南](docs/desktop-guide.md) | Cockpit / SideChat / Rewind / 主题工作室 / 语音输入 / 快捷键 |
|
|
214
|
+
| [Provider 配置手册](docs/user-guide-provider-config.md) | 多提供商、自定义端点、子代理/审查模型路由、生图 |
|
|
215
|
+
| [权限与沙箱指南](docs/user-guide-sandbox-permissions.md) | 权限规则、路径授权、沙箱模型、故障排查 |
|
|
216
|
+
| [识图能力手册](docs/user-guide-vision.md) | 视觉通道配置与排查 |
|
|
217
|
+
| [远程访问指南](docs/remote-access.md) | 手机/平板遥控审批的启用与安全边界 |
|
|
218
|
+
| [排障与 FAQ](docs/guides/troubleshooting.md) | 高频现场速查:卡住、429、缓存异常 |
|
|
219
|
+
|
|
220
|
+
**理念与架构**
|
|
221
|
+
|
|
222
|
+
| 文档 | 说明 |
|
|
223
|
+
|------|------|
|
|
224
|
+
| [CVM:从 Transformer 共享退化到认知运行时](docs/reference/cvm-cognitive-runtime.md) | 核心理念母稿:Anchor Collapse、两个控制环、八条原则 |
|
|
225
|
+
| [CVM 实证报告](docs/CVM运行时对Agent模型的实证影响.md) | A/B 对照数据与逐任务对比 |
|
|
226
|
+
| [指标观测 harness](docs/reference/observability-harness.md) | 缓存 / CVM 真实会话数据样本与复算命令 |
|
|
227
|
+
| [架构总览](docs/architecture-overview.md) | 系统分层与模块职责 |
|
|
228
|
+
| [工程质量指标](docs/engineering-metrics.md) | 规模、测试与迭代里程碑 |
|
|
229
|
+
| [星域碑文](docs/stars/genesis-stele.md) | 16 星域的创始记忆与核心信念 |
|
|
230
|
+
| [创世纪 · 天枢 3.0 公开声明](docs/releases/manifesto-v3.0.0.md) | 项目宣言 |
|
|
231
|
+
|
|
232
|
+
## 🛠️ 面向开发者
|
|
233
|
+
|
|
234
|
+
Node.js 24 · TypeScript strict(`noUncheckedIndexedAccess`)· T9 ANSI 渲染引擎 · tsup 打包 · node:test。
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
npm run typecheck # 类型检查
|
|
238
|
+
npm test # 所有测试(16,000+ 用例)
|
|
239
|
+
npm run build # tsup 打包 + 原生/wasm 载荷落位
|
|
240
|
+
node dist/cli/entry.js
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
- **添加工具** —— 在 `src/tools/` 实现 `ToolDefinition` + executor 并注册,配套 `src/tools/__tests__/` 测试
|
|
244
|
+
- **添加 skill / 命令 / hook** —— `.rivet/skills/*.md`(frontmatter)、`.rivet/commands/*.md`(`$ARGUMENTS` 插值)、`HookRegistry` 处理器
|
|
245
|
+
- **项目指令** —— 项目根放 `.rivet.md`,内容自动注入为项目上下文
|
|
246
|
+
- 架构地图见根目录 `AGENTS.md` 与 [架构总览](docs/architecture-overview.md)
|
|
247
|
+
|
|
248
|
+
## 🔒 安全
|
|
249
|
+
|
|
250
|
+
- **路径边界强制** —— glob/grep/diff 拒绝 `..` 穿越;`validatePath` 阻止逃逸
|
|
251
|
+
- **项目信任门** —— 未授信项目不加载 hooks / 项目 MCP,配置安全键剥离
|
|
252
|
+
- **SSRF 保护** —— 逐跳 DNS + 私有 IP 拦截,作用于每次重定向
|
|
253
|
+
- **敏感文件拒绝** —— `.env`、`credentials.*`、`*key*`、`*token*` 禁止读/commit;密钥落盘走 AES-256-GCM 信封
|
|
254
|
+
- **破坏性命令门禁** —— `rm -rf`、force push、`DROP/TRUNCATE` 需显式确认
|
|
255
|
+
- **检查点 + 文件级撤销** —— 每回合首次修改前创建 Git 检查点;每次写/编辑前版本化备份
|
|
256
|
+
|
|
257
|
+
安全漏洞请走 [私密报告](https://github.com/huiliyi37/Tianshu-harness/security/advisories/new),不要开公开 issue。
|
|
258
|
+
|
|
259
|
+
## 🤝 社区与支持
|
|
260
|
+
|
|
261
|
+
- **使用问题 / 讨论** → [GitHub Discussions](https://github.com/huiliyi37/Tianshu-harness/discussions)
|
|
262
|
+
- **Bug 报告 / 功能请求** → [GitHub Issues](https://github.com/huiliyi37/Tianshu-harness/issues)(附 `rivet logs --json` 输出可加速定位)
|
|
263
|
+
- **贡献代码** → [CONTRIBUTING.md](CONTRIBUTING.md) · **求助指南** → [SUPPORT.md](SUPPORT.md)
|
|
264
|
+
- **微信交流群** → 「天枢 harness 交流群」,扫码加入(二维码 7 天有效,过期请在 Discussions 留言补码):
|
|
265
|
+
|
|
266
|
+
<img src="docs/brand/assets/wechat-group-qr.png" width="280" alt="天枢 harness 交流群微信群二维码">
|
|
267
|
+
|
|
268
|
+
## 🌐 官网开发
|
|
269
|
+
|
|
270
|
+
天枢生态官网 [jiangsx496/Tianshu-Official-Website](https://jiangsx496.github.io/Tianshu-Official-Website/) 由 [@jiangsx496](https://github.com/jiangsx496) 原创开发,覆盖数据库、前端与初版后端。
|
|
271
|
+
|
|
272
|
+
## ✨ 贡献者
|
|
273
|
+
|
|
274
|
+
感谢所有贡献者——项目创建者与核心开发 [@banxia](https://github.com/banxia);完整名单(17 位外部贡献者 / 89 个 PR)见 [CONTRIBUTORS.md](CONTRIBUTORS.md)。外部 PR 经「收编」流程合入后,作者署名以 `Co-authored-by` 计入贡献者图谱(`scripts/credit-contributors.sh` 自动落账):
|
|
275
|
+
|
|
276
|
+
<p>
|
|
277
|
+
<a href="https://github.com/HarriethWiKk"><img src="https://github.com/HarriethWiKk.png?size=100" width="50" height="50" alt="HarriethWiKk" title="HarriethWiKk" /></a>
|
|
278
|
+
<a href="https://github.com/jiangsx496"><img src="https://github.com/jiangsx496.png?size=100" width="50" height="50" alt="jiangsx496" title="jiangsx496" /></a>
|
|
279
|
+
<a href="https://github.com/yq04"><img src="https://github.com/yq04.png?size=100" width="50" height="50" alt="yq04" title="yq04" /></a>
|
|
280
|
+
<a href="https://github.com/wangxx-yu"><img src="https://github.com/wangxx-yu.png?size=100" width="50" height="50" alt="wangxx-yu" title="wangxx-yu" /></a>
|
|
281
|
+
<a href="https://github.com/qiaodier"><img src="https://github.com/qiaodier.png?size=100" width="50" height="50" alt="qiaodier" title="qiaodier" /></a>
|
|
282
|
+
<a href="https://github.com/zhengbiaofeng"><img src="https://github.com/zhengbiaofeng.png?size=100" width="50" height="50" alt="zhengbiaofeng" title="zhengbiaofeng" /></a>
|
|
283
|
+
<a href="https://github.com/LinHoMo"><img src="https://github.com/LinHoMo.png?size=100" width="50" height="50" alt="LinHoMo" title="LinHoMo" /></a>
|
|
284
|
+
<a href="https://github.com/KinoGao"><img src="https://github.com/KinoGao.png?size=100" width="50" height="50" alt="KinoGao" title="KinoGao" /></a>
|
|
285
|
+
<a href="https://github.com/liuwanwan1"><img src="https://github.com/liuwanwan1.png?size=100" width="50" height="50" alt="liuwanwan1" title="liuwanwan1" /></a>
|
|
286
|
+
<a href="https://github.com/Eason412"><img src="https://github.com/Eason412.png?size=100" width="50" height="50" alt="Eason412" title="Eason412" /></a>
|
|
287
|
+
<a href="https://github.com/maoqiu77"><img src="https://github.com/maoqiu77.png?size=100" width="50" height="50" alt="maoqiu77" title="maoqiu77" /></a>
|
|
288
|
+
<a href="https://github.com/yeshilei-QWQ"><img src="https://github.com/yeshilei-QWQ.png?size=100" width="50" height="50" alt="yeshilei-QWQ" title="yeshilei-QWQ" /></a>
|
|
289
|
+
<a href="https://github.com/lumos-tiamo"><img src="https://github.com/lumos-tiamo.png?size=100" width="50" height="50" alt="lumos-tiamo" title="lumos-tiamo" /></a>
|
|
290
|
+
<a href="https://github.com/zzuu080603"><img src="https://github.com/zzuu080603.png?size=100" width="50" height="50" alt="zzuu080603" title="zzuu080603" /></a>
|
|
291
|
+
<a href="https://github.com/nzz0991999-ai"><img src="https://github.com/nzz0991999-ai.png?size=100" width="50" height="50" alt="nzz0991999-ai" title="nzz0991999-ai" /></a>
|
|
292
|
+
<a href="https://github.com/L4XB"><img src="https://github.com/L4XB.png?size=100" width="50" height="50" alt="L4XB" title="L4XB" /></a>
|
|
293
|
+
<a href="https://github.com/Wanming08"><img src="https://github.com/Wanming08.png?size=100" width="50" height="50" alt="Wanming08" title="Wanming08" /></a>
|
|
294
|
+
</p>
|
|
295
|
+
|
|
296
|
+
## ☕ 赞助支持
|
|
297
|
+
|
|
298
|
+
如果天枢对你有用,欢迎随缘打赏——这只是一杯咖啡,不是合同。赞助不会改变 issue 优先级,也不会影响功能排期。
|
|
299
|
+
|
|
300
|
+
<img src="docs/brand/assets/wechat-pay.jpg" width="240" alt="微信支付">
|
|
301
|
+
|
|
302
|
+
## 许可证
|
|
303
|
+
|
|
304
|
+
本项目代码采用 [Apache License, Version 2.0](LICENSE) 开源许可。Copyright 2025-2026 Tianshu Contributors.
|
|
305
|
+
|
|
306
|
+
**例外(文档许可)**:以下理论与实证文档采用 [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans)(署名—非商业性使用—禁止演绎),**不适用** Apache 2.0——可以署名转载原文链接,不得改编、摘编、洗稿或商用:
|
|
307
|
+
|
|
308
|
+
- [CVM:从 Transformer 共享退化到认知运行时](docs/reference/cvm-cognitive-runtime.md)
|
|
309
|
+
- [CVM 运行时与生态系统对 Agent 模型的实证影响报告](docs/CVM运行时对Agent模型的实证影响.md)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Bash completion for Rivet (rivet)
|
|
2
|
+
#
|
|
3
|
+
# Install (pick one):
|
|
4
|
+
# source /path/to/rivet.bash # from ~/.bashrc
|
|
5
|
+
# cp rivet.bash ~/.local/share/bash-completion/completions/rivet
|
|
6
|
+
# sudo cp rivet.bash /usr/share/bash-completion/completions/rivet
|
|
7
|
+
|
|
8
|
+
# Provider names are read from ~/.rivet/config.json when available.
|
|
9
|
+
_rivet_providers() {
|
|
10
|
+
local config_file="${HOME}/.rivet/config.json"
|
|
11
|
+
[[ -f $config_file ]] || return 0
|
|
12
|
+
node -e '
|
|
13
|
+
try {
|
|
14
|
+
const c = JSON.parse(require("fs").readFileSync(process.argv[1], "utf-8"))
|
|
15
|
+
console.log(Object.keys((c.provider && c.provider.providers) || {}).join(" "))
|
|
16
|
+
} catch {}
|
|
17
|
+
' "$config_file" 2>/dev/null
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
_rivet() {
|
|
21
|
+
local cur prev words cword
|
|
22
|
+
if declare -F _init_completion >/dev/null 2>&1; then
|
|
23
|
+
_init_completion || return
|
|
24
|
+
else
|
|
25
|
+
COMPREPLY=()
|
|
26
|
+
cur=${COMP_WORDS[COMP_CWORD]}
|
|
27
|
+
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
28
|
+
words=("${COMP_WORDS[@]}")
|
|
29
|
+
cword=$COMP_CWORD
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
local commands='config serve sessions browser logs'
|
|
33
|
+
local global_flags='-p --print --json --stream-json --goal --budget --model
|
|
34
|
+
--provider -c --continue -r --resume --new --list
|
|
35
|
+
--dangerously-skip-permissions --screen-reader --skip-welcome --stream-events'
|
|
36
|
+
local config_commands='show providers setup set-url set-model set-key set-key-env
|
|
37
|
+
set-default set-approval add-model remove-model mcp'
|
|
38
|
+
local provider_commands=' setup set-url set-model set-key set-key-env set-default add-model remove-model '
|
|
39
|
+
local approval_modes='auto-safe manual auto-accept dangerously-skip-permissions'
|
|
40
|
+
local mcp_commands='list add-stdio add-sse remove enable disable'
|
|
41
|
+
local setup_flags='--key --key-env --url --model --context-window --max-tokens --alias --default'
|
|
42
|
+
|
|
43
|
+
# Value-taking flags win over positional logic.
|
|
44
|
+
case $prev in
|
|
45
|
+
--provider)
|
|
46
|
+
COMPREPLY=($(compgen -W "$(_rivet_providers)" -- "$cur"))
|
|
47
|
+
return ;;
|
|
48
|
+
--stream-events)
|
|
49
|
+
COMPREPLY=($(compgen -f -- "$cur"))
|
|
50
|
+
return ;;
|
|
51
|
+
--model|--budget|--goal|--port|--session)
|
|
52
|
+
return ;;
|
|
53
|
+
esac
|
|
54
|
+
|
|
55
|
+
# Locate the first non-flag word after `rivet` — the top-level subcommand.
|
|
56
|
+
local cmd='' idx=0 i
|
|
57
|
+
for ((i = 1; i < cword; i++)); do
|
|
58
|
+
case ${words[i]} in
|
|
59
|
+
-*) ;;
|
|
60
|
+
*) cmd=${words[i]}; idx=$i; break ;;
|
|
61
|
+
esac
|
|
62
|
+
done
|
|
63
|
+
|
|
64
|
+
case $cmd in
|
|
65
|
+
config)
|
|
66
|
+
local sub=${words[idx+1]:-}
|
|
67
|
+
if ((cword <= idx + 1)); then
|
|
68
|
+
COMPREPLY=($(compgen -W "$config_commands" -- "$cur"))
|
|
69
|
+
return
|
|
70
|
+
fi
|
|
71
|
+
case $sub in
|
|
72
|
+
mcp)
|
|
73
|
+
((cword == idx + 2)) && COMPREPLY=($(compgen -W "$mcp_commands" -- "$cur"))
|
|
74
|
+
return ;;
|
|
75
|
+
set-approval)
|
|
76
|
+
((cword == idx + 2)) && COMPREPLY=($(compgen -W "$approval_modes" -- "$cur"))
|
|
77
|
+
return ;;
|
|
78
|
+
setup)
|
|
79
|
+
# `setup` may target a provider that does not exist yet, so the flags are
|
|
80
|
+
# offered alongside the known provider names at the first argument slot.
|
|
81
|
+
if ((cword == idx + 2)); then
|
|
82
|
+
COMPREPLY=($(compgen -W "$(_rivet_providers) $setup_flags" -- "$cur"))
|
|
83
|
+
else
|
|
84
|
+
COMPREPLY=($(compgen -W "$setup_flags" -- "$cur"))
|
|
85
|
+
fi
|
|
86
|
+
return ;;
|
|
87
|
+
esac
|
|
88
|
+
if [[ $provider_commands == *" $sub "* ]] && ((cword == idx + 2)); then
|
|
89
|
+
COMPREPLY=($(compgen -W "$(_rivet_providers)" -- "$cur"))
|
|
90
|
+
fi
|
|
91
|
+
return ;;
|
|
92
|
+
serve)
|
|
93
|
+
COMPREPLY=($(compgen -W '--port' -- "$cur"))
|
|
94
|
+
return ;;
|
|
95
|
+
browser)
|
|
96
|
+
if ((cword == idx + 1)); then
|
|
97
|
+
COMPREPLY=($(compgen -W 'status check install help' -- "$cur"))
|
|
98
|
+
elif [[ ${words[idx+1]:-} == install ]]; then
|
|
99
|
+
COMPREPLY=($(compgen -W '--no-mirror' -- "$cur"))
|
|
100
|
+
fi
|
|
101
|
+
return ;;
|
|
102
|
+
logs)
|
|
103
|
+
if ((cword == idx + 1)); then
|
|
104
|
+
COMPREPLY=($(compgen -W 'open --session --json' -- "$cur"))
|
|
105
|
+
elif [[ ${words[idx+1]:-} == open ]] && ((cword == idx + 2)); then
|
|
106
|
+
COMPREPLY=($(compgen -W 'desktop --session --json' -- "$cur"))
|
|
107
|
+
else
|
|
108
|
+
COMPREPLY=($(compgen -W '--session --json' -- "$cur"))
|
|
109
|
+
fi
|
|
110
|
+
return ;;
|
|
111
|
+
sessions)
|
|
112
|
+
return ;;
|
|
113
|
+
esac
|
|
114
|
+
|
|
115
|
+
COMPREPLY=($(compgen -W "$commands $global_flags" -- "$cur"))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
complete -F _rivet rivet
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Fish completion for Rivet (rivet)
|
|
2
|
+
#
|
|
3
|
+
# Install: copy this file to ~/.config/fish/completions/rivet.fish
|
|
4
|
+
# mkdir -p ~/.config/fish/completions
|
|
5
|
+
# cp rivet.fish ~/.config/fish/completions/
|
|
6
|
+
|
|
7
|
+
# Provider names are read from ~/.rivet/config.json when available.
|
|
8
|
+
function __rivet_providers
|
|
9
|
+
node -e '
|
|
10
|
+
const os = require("os")
|
|
11
|
+
const path = require("path")
|
|
12
|
+
try {
|
|
13
|
+
const f = path.join(os.homedir(), ".rivet", "config.json")
|
|
14
|
+
const c = JSON.parse(require("fs").readFileSync(f, "utf-8"))
|
|
15
|
+
console.log(Object.keys((c.provider && c.provider.providers) || {}).join("\n"))
|
|
16
|
+
} catch {}
|
|
17
|
+
' 2>/dev/null
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
function __rivet_no_subcommand
|
|
21
|
+
not __fish_seen_subcommand_from config serve sessions browser logs
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
function __rivet_config_no_subcommand
|
|
25
|
+
__fish_seen_subcommand_from config
|
|
26
|
+
and not __fish_seen_subcommand_from show providers setup set-url set-model \
|
|
27
|
+
set-key set-key-env set-default set-approval add-model remove-model mcp
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# --- Top-level commands ---
|
|
31
|
+
complete -c rivet -n __rivet_no_subcommand -a config -d 'Manage providers, API keys and models'
|
|
32
|
+
complete -c rivet -n __rivet_no_subcommand -a serve -d 'Start the sidecar HTTP/SSE runtime server'
|
|
33
|
+
complete -c rivet -n __rivet_no_subcommand -a sessions -d 'Print the session list and exit'
|
|
34
|
+
complete -c rivet -n __rivet_no_subcommand -a browser -d 'Check or install the Chromium used by browser tools'
|
|
35
|
+
complete -c rivet -n __rivet_no_subcommand -a logs -d 'Show where sessions, caches and logs are written'
|
|
36
|
+
|
|
37
|
+
# --- Top-level flags ---
|
|
38
|
+
complete -c rivet -n __rivet_no_subcommand -s p -l print -r -d 'Run a single prompt headlessly and print the result'
|
|
39
|
+
complete -c rivet -n __rivet_no_subcommand -l json -d 'Emit a single JSON result object'
|
|
40
|
+
complete -c rivet -n __rivet_no_subcommand -l stream-json -d 'Emit the run as an NDJSON event stream'
|
|
41
|
+
complete -c rivet -n __rivet_no_subcommand -l goal -r -d 'Run headless autonomous goal mode'
|
|
42
|
+
complete -c rivet -n __rivet_no_subcommand -l budget -r -d 'Turn budget for goal mode (default 100)'
|
|
43
|
+
complete -c rivet -n __rivet_no_subcommand -l model -r -d 'Override the model for this session'
|
|
44
|
+
complete -c rivet -n __rivet_no_subcommand -l provider -r -a '(__rivet_providers)' -d 'Override the provider for this session'
|
|
45
|
+
complete -c rivet -n __rivet_no_subcommand -s c -l continue -d 'Resume the most recent session for this directory'
|
|
46
|
+
complete -c rivet -n __rivet_no_subcommand -s r -l resume -d 'Resume a session by id or prefix'
|
|
47
|
+
complete -c rivet -n __rivet_no_subcommand -l new -d 'Force a brand-new session'
|
|
48
|
+
complete -c rivet -n __rivet_no_subcommand -l list -d 'Print the session list and exit'
|
|
49
|
+
complete -c rivet -n __rivet_no_subcommand -l dangerously-skip-permissions -d 'Skip all tool approvals'
|
|
50
|
+
complete -c rivet -n __rivet_no_subcommand -l screen-reader -d 'Screen-reader friendly output'
|
|
51
|
+
complete -c rivet -n __rivet_no_subcommand -l skip-welcome -d 'Skip the welcome screen'
|
|
52
|
+
complete -c rivet -n __rivet_no_subcommand -l stream-events -r -F -d 'Mirror the run as an NDJSON SessionEvent file'
|
|
53
|
+
|
|
54
|
+
# --- config subcommands ---
|
|
55
|
+
complete -c rivet -n __rivet_config_no_subcommand -a show -d 'Print the resolved configuration as JSON'
|
|
56
|
+
complete -c rivet -n __rivet_config_no_subcommand -a providers -d 'List configured providers and key status'
|
|
57
|
+
complete -c rivet -n __rivet_config_no_subcommand -a setup -d 'Configure a provider in one shot'
|
|
58
|
+
complete -c rivet -n __rivet_config_no_subcommand -a set-url -d 'Set the base URL for a provider'
|
|
59
|
+
complete -c rivet -n __rivet_config_no_subcommand -a set-model -d 'Set the active model for a provider'
|
|
60
|
+
complete -c rivet -n __rivet_config_no_subcommand -a set-key -d 'Set the API key for a provider'
|
|
61
|
+
complete -c rivet -n __rivet_config_no_subcommand -a set-key-env -d 'Read the API key from an environment variable'
|
|
62
|
+
complete -c rivet -n __rivet_config_no_subcommand -a set-default -d 'Set the default provider'
|
|
63
|
+
complete -c rivet -n __rivet_config_no_subcommand -a set-approval -d 'Set the tool approval mode'
|
|
64
|
+
complete -c rivet -n __rivet_config_no_subcommand -a add-model -d 'Add a model to a provider'
|
|
65
|
+
complete -c rivet -n __rivet_config_no_subcommand -a remove-model -d 'Remove a model from a provider'
|
|
66
|
+
complete -c rivet -n __rivet_config_no_subcommand -a mcp -d 'Manage MCP servers'
|
|
67
|
+
|
|
68
|
+
# --- Provider names for the config subcommands that take one ---
|
|
69
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup set-url set-model set-key set-key-env set-default add-model remove-model' \
|
|
70
|
+
-a '(__rivet_providers)' -d Provider
|
|
71
|
+
|
|
72
|
+
# --- config setup flags ---
|
|
73
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l key -r -d 'API key literal'
|
|
74
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l key-env -r -d 'Environment variable holding the key'
|
|
75
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l url -r -d 'Base URL'
|
|
76
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l model -r -d 'Model id'
|
|
77
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l context-window -r -d 'Context window size in tokens'
|
|
78
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l max-tokens -r -d 'Max output tokens'
|
|
79
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l alias -r -d 'Model alias'
|
|
80
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from setup' -l default -d 'Make this the default provider'
|
|
81
|
+
|
|
82
|
+
# --- config set-approval modes ---
|
|
83
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from set-approval' -a auto-safe -d 'Auto-approve read-only tools, ask for the rest'
|
|
84
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from set-approval' -a manual -d 'Ask before every tool call'
|
|
85
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from set-approval' -a auto-accept -d 'Auto-approve everything except destructive actions'
|
|
86
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from set-approval' -a dangerously-skip-permissions -d 'Skip all approvals'
|
|
87
|
+
|
|
88
|
+
# --- config mcp subcommands ---
|
|
89
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from mcp; and not __fish_seen_subcommand_from list add-stdio add-sse remove enable disable' -a list -d 'List configured MCP servers'
|
|
90
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from mcp; and not __fish_seen_subcommand_from list add-stdio add-sse remove enable disable' -a add-stdio -d 'Add a stdio MCP server'
|
|
91
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from mcp; and not __fish_seen_subcommand_from list add-stdio add-sse remove enable disable' -a add-sse -d 'Add an SSE MCP server'
|
|
92
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from mcp; and not __fish_seen_subcommand_from list add-stdio add-sse remove enable disable' -a remove -d 'Remove an MCP server'
|
|
93
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from mcp; and not __fish_seen_subcommand_from list add-stdio add-sse remove enable disable' -a enable -d 'Enable an MCP server'
|
|
94
|
+
complete -c rivet -n '__fish_seen_subcommand_from config; and __fish_seen_subcommand_from mcp; and not __fish_seen_subcommand_from list add-stdio add-sse remove enable disable' -a disable -d 'Disable an MCP server'
|
|
95
|
+
|
|
96
|
+
# --- serve ---
|
|
97
|
+
complete -c rivet -n '__fish_seen_subcommand_from serve' -l port -r -d 'Port to listen on'
|
|
98
|
+
|
|
99
|
+
# --- browser ---
|
|
100
|
+
complete -c rivet -n '__fish_seen_subcommand_from browser; and not __fish_seen_subcommand_from status check install help' -a status -d 'Report whether Chromium is ready'
|
|
101
|
+
complete -c rivet -n '__fish_seen_subcommand_from browser; and not __fish_seen_subcommand_from status check install help' -a check -d 'Alias for status'
|
|
102
|
+
complete -c rivet -n '__fish_seen_subcommand_from browser; and not __fish_seen_subcommand_from status check install help' -a install -d 'Download and install Chromium'
|
|
103
|
+
complete -c rivet -n '__fish_seen_subcommand_from browser; and not __fish_seen_subcommand_from status check install help' -a help -d 'Show browser command help'
|
|
104
|
+
complete -c rivet -n '__fish_seen_subcommand_from browser; and __fish_seen_subcommand_from install' -l no-mirror -d 'Skip the download mirror'
|
|
105
|
+
|
|
106
|
+
# --- logs ---
|
|
107
|
+
complete -c rivet -n '__fish_seen_subcommand_from logs; and not __fish_seen_subcommand_from open' -a open -d 'Open the log location'
|
|
108
|
+
complete -c rivet -n '__fish_seen_subcommand_from logs; and __fish_seen_subcommand_from open' -a desktop -d 'Open the desktop log directory'
|
|
109
|
+
complete -c rivet -n '__fish_seen_subcommand_from logs' -l session -r -d 'Restrict the report to one session'
|
|
110
|
+
complete -c rivet -n '__fish_seen_subcommand_from logs' -l json -d 'Emit a structured manifest'
|