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.
Files changed (255) hide show
  1. package/LICENSE +189 -0
  2. package/README.en.md +1066 -0
  3. package/README.ja.md +1214 -0
  4. package/README.ko.md +1216 -0
  5. package/README.md +309 -0
  6. package/completions/rivet.bash +118 -0
  7. package/completions/rivet.fish +110 -0
  8. package/completions/rivet.ps1 +230 -0
  9. package/completions/rivet.zsh +187 -0
  10. package/dist/account-OAEKORZE.js +47 -0
  11. package/dist/account-login-V6FOLHJR.js +65 -0
  12. package/dist/account-status-KHNPPAFL.js +23 -0
  13. package/dist/agent/worker-process/child.js +407 -0
  14. package/dist/browser-cli-FLNY5ZHI.js +19 -0
  15. package/dist/browser-readiness-LWVGSBD5.js +12 -0
  16. package/dist/build-backends-5KXKR2S4.js +13 -0
  17. package/dist/build-options-66Y4ZE7C.js +9 -0
  18. package/dist/bundled-skills/brainstorming/SKILL.md +139 -0
  19. package/dist/bundled-skills/visual-acceptance/SKILL.md +64 -0
  20. package/dist/chain-7MAMFXZ3.js +10 -0
  21. package/dist/checkpoint-MND4DUIX.js +33 -0
  22. package/dist/chunk-2E6CK2RC.js +392 -0
  23. package/dist/chunk-2EBWGAXD.js +51 -0
  24. package/dist/chunk-2HDP7RMR.js +119 -0
  25. package/dist/chunk-2HKD2UFM.js +1000 -0
  26. package/dist/chunk-2VYRLULP.js +51 -0
  27. package/dist/chunk-2XN7PM4N.js +125 -0
  28. package/dist/chunk-35H7GVNR.js +66 -0
  29. package/dist/chunk-3C3R7JXY.js +77 -0
  30. package/dist/chunk-3VGD2FXB.js +118 -0
  31. package/dist/chunk-424AP7FM.js +534 -0
  32. package/dist/chunk-4J5TZGOE.js +3707 -0
  33. package/dist/chunk-4QJ3Y5JM.js +898 -0
  34. package/dist/chunk-4U2ET7ZY.js +1326 -0
  35. package/dist/chunk-4XPFLICE.js +876 -0
  36. package/dist/chunk-5B2OCU5P.js +31707 -0
  37. package/dist/chunk-5GGOGLSN.js +73 -0
  38. package/dist/chunk-5JRZPLI6.js +251 -0
  39. package/dist/chunk-5TQ3JYBU.js +397 -0
  40. package/dist/chunk-66JPZSGX.js +55 -0
  41. package/dist/chunk-6HSVXHCZ.js +764 -0
  42. package/dist/chunk-6S5FPUS7.js +21 -0
  43. package/dist/chunk-722LQO64.js +131 -0
  44. package/dist/chunk-73NJ7IT7.js +354 -0
  45. package/dist/chunk-7FW3I7WC.js +95 -0
  46. package/dist/chunk-7KUCBNLB.js +173 -0
  47. package/dist/chunk-7RDOV3DF.js +201 -0
  48. package/dist/chunk-A5MNH4ER.js +79 -0
  49. package/dist/chunk-ADIVZ2D5.js +15 -0
  50. package/dist/chunk-AE3P3F6W.js +366 -0
  51. package/dist/chunk-AERM3VGP.js +280 -0
  52. package/dist/chunk-AEWHC4WM.js +246 -0
  53. package/dist/chunk-AOVQ7VIF.js +169 -0
  54. package/dist/chunk-AOYHP3WI.js +12411 -0
  55. package/dist/chunk-B3YEBABJ.js +7160 -0
  56. package/dist/chunk-BCQXEZPJ.js +154 -0
  57. package/dist/chunk-BKTQAYO2.js +418 -0
  58. package/dist/chunk-BSECIPAQ.js +80 -0
  59. package/dist/chunk-BUIMGNDD.js +52 -0
  60. package/dist/chunk-BXHV3GSB.js +10320 -0
  61. package/dist/chunk-C6ZVZCPP.js +139 -0
  62. package/dist/chunk-CEZNQVWM.js +82 -0
  63. package/dist/chunk-CGFZGR7G.js +1492 -0
  64. package/dist/chunk-CGOADM2X.js +337 -0
  65. package/dist/chunk-CI4R6P2B.js +24 -0
  66. package/dist/chunk-D2TCGRSX.js +73 -0
  67. package/dist/chunk-D4PTYFOG.js +154 -0
  68. package/dist/chunk-D54ZWG4T.js +717 -0
  69. package/dist/chunk-DEBI37QB.js +145 -0
  70. package/dist/chunk-DWROHPXP.js +1051 -0
  71. package/dist/chunk-DZ6UOJ5D.js +92 -0
  72. package/dist/chunk-EBJTVRQN.js +81 -0
  73. package/dist/chunk-EGEI2RQA.js +1167 -0
  74. package/dist/chunk-EHHUASO5.js +1305 -0
  75. package/dist/chunk-EPKTIOED.js +41 -0
  76. package/dist/chunk-ER5JW2QZ.js +5681 -0
  77. package/dist/chunk-ETHFACAB.js +315 -0
  78. package/dist/chunk-EXUE5W2F.js +112 -0
  79. package/dist/chunk-EXXICUIW.js +73 -0
  80. package/dist/chunk-FFQSZJOO.js +169 -0
  81. package/dist/chunk-FHFKPGDO.js +85 -0
  82. package/dist/chunk-FW3QKMFX.js +158 -0
  83. package/dist/chunk-GD4ZNZ7W.js +30 -0
  84. package/dist/chunk-GHVMWF2I.js +581 -0
  85. package/dist/chunk-GMKAXSYQ.js +297 -0
  86. package/dist/chunk-HBVF6BWO.js +325 -0
  87. package/dist/chunk-HV4YGVMS.js +379 -0
  88. package/dist/chunk-ILBCKAV6.js +89 -0
  89. package/dist/chunk-J4U4AW46.js +440 -0
  90. package/dist/chunk-J6ESSM47.js +1791 -0
  91. package/dist/chunk-JBZHIC6T.js +2309 -0
  92. package/dist/chunk-JCFWOULR.js +245 -0
  93. package/dist/chunk-JRF5L6OD.js +131 -0
  94. package/dist/chunk-JSS75KCG.js +2014 -0
  95. package/dist/chunk-JSXWIWWJ.js +225 -0
  96. package/dist/chunk-JYV7I2QH.js +98 -0
  97. package/dist/chunk-KIOXTQQL.js +1596 -0
  98. package/dist/chunk-KWVTXT5B.js +89 -0
  99. package/dist/chunk-KX22RD6R.js +33 -0
  100. package/dist/chunk-LA6IPTGH.js +709 -0
  101. package/dist/chunk-LH5VCGLB.js +1796 -0
  102. package/dist/chunk-LQQ6XJ2Y.js +269 -0
  103. package/dist/chunk-MJQ55WZZ.js +65 -0
  104. package/dist/chunk-ML3UKMH3.js +40 -0
  105. package/dist/chunk-MOZPLHSU.js +5526 -0
  106. package/dist/chunk-NGEWJ4DF.js +89 -0
  107. package/dist/chunk-NH6VIOAR.js +211 -0
  108. package/dist/chunk-O5VZQKCB.js +26106 -0
  109. package/dist/chunk-OHSV42QB.js +748 -0
  110. package/dist/chunk-OO3TAHO5.js +4070 -0
  111. package/dist/chunk-OTNHSAGN.js +38282 -0
  112. package/dist/chunk-OUWAC7AQ.js +442 -0
  113. package/dist/chunk-OXMIV4WE.js +270 -0
  114. package/dist/chunk-P5KJURUR.js +229 -0
  115. package/dist/chunk-P6GJOVO6.js +307 -0
  116. package/dist/chunk-QARAGUXX.js +23 -0
  117. package/dist/chunk-R43HJCDX.js +2711 -0
  118. package/dist/chunk-RAXBAWRN.js +210 -0
  119. package/dist/chunk-RK3JHWPT.js +39 -0
  120. package/dist/chunk-RWA23GMM.js +24 -0
  121. package/dist/chunk-S4K4L6IM.js +179 -0
  122. package/dist/chunk-SAXK6LVF.js +124 -0
  123. package/dist/chunk-SEPGEJNK.js +1607 -0
  124. package/dist/chunk-SUJERP5I.js +285 -0
  125. package/dist/chunk-T3ED6BY2.js +913 -0
  126. package/dist/chunk-THKDVSEC.js +90 -0
  127. package/dist/chunk-TI4GSEL5.js +52 -0
  128. package/dist/chunk-TPI73L57.js +164 -0
  129. package/dist/chunk-TVHW77C7.js +338 -0
  130. package/dist/chunk-TWNHOSDT.js +1073 -0
  131. package/dist/chunk-UFMN76QD.js +347 -0
  132. package/dist/chunk-UHGLFRZE.js +205 -0
  133. package/dist/chunk-UTZYPKBF.js +15231 -0
  134. package/dist/chunk-UXNLELW6.js +25 -0
  135. package/dist/chunk-UXXS53EA.js +166 -0
  136. package/dist/chunk-V5DHFGI7.js +171 -0
  137. package/dist/chunk-V5YIPMHV.js +2353 -0
  138. package/dist/chunk-WMUWEO2C.js +754 -0
  139. package/dist/chunk-WOE3D7JM.js +945 -0
  140. package/dist/chunk-X2IK5LVR.js +2592 -0
  141. package/dist/chunk-XU2YXCDL.js +459 -0
  142. package/dist/chunk-YJG5HIX5.js +203 -0
  143. package/dist/chunk-Z3QE7TZM.js +72 -0
  144. package/dist/chunk-Z5Z3JHJY.js +64 -0
  145. package/dist/chunk-ZDIFBJFT.js +168 -0
  146. package/dist/chunk-ZGGCEXDC.js +176 -0
  147. package/dist/chunk-ZMZCZNKU.js +263 -0
  148. package/dist/chunk-ZNC5T65N.js +17 -0
  149. package/dist/chunk-ZO3I3A7O.js +308 -0
  150. package/dist/chunk-ZQKXBUB7.js +217 -0
  151. package/dist/chunk-ZTRINFM2.js +78 -0
  152. package/dist/chunk-ZU7JZCVP.js +193 -0
  153. package/dist/chunk-ZZAWNALS.js +350 -0
  154. package/dist/cli/entry.js +54 -0
  155. package/dist/connector-L5QQTR6Y.js +26 -0
  156. package/dist/context-62DC6EC3.js +31 -0
  157. package/dist/council-convene-NJWPNBDU.js +46 -0
  158. package/dist/create-agent-config-ODSQWNVC.js +55 -0
  159. package/dist/default-registry-2PU3BTAU.js +68 -0
  160. package/dist/deliver-task-KONV4C4M.js +57 -0
  161. package/dist/delivery-gate-v2-F2YVMVGK.js +27 -0
  162. package/dist/domain-knowledge-store-DDZ3F4J7.js +11 -0
  163. package/dist/fetch-core-ZPPYDSZH.js +14 -0
  164. package/dist/galaxy-K72BBDQN.js +91 -0
  165. package/dist/goal-criteria-SCALAU2D.js +141 -0
  166. package/dist/goal-persist-XWY2GDQX.js +19 -0
  167. package/dist/goal-tracker-FXMJ2GVK.js +11 -0
  168. package/dist/headless-LSB6I7PT.js +162 -0
  169. package/dist/headless-coordinator-VDPDMVUT.js +90 -0
  170. package/dist/inject-U55SMB6A.js +39 -0
  171. package/dist/login-flow-CD4ZGXOC.js +59 -0
  172. package/dist/logs-cli-SQVYFMMN.js +283 -0
  173. package/dist/loop-ULZYBDA3.js +76 -0
  174. package/dist/main.js +4064 -0
  175. package/dist/manager-ROZBCWPA.js +171 -0
  176. package/dist/manager-Z7XFFUOM.js +10670 -0
  177. package/dist/meridian-indexer-ZIW363L7.js +21 -0
  178. package/dist/native-resolver-PN34UIVV.js +13 -0
  179. package/dist/node_modules/better-sqlite3/lib/database.js +90 -0
  180. package/dist/node_modules/better-sqlite3/lib/index.js +3 -0
  181. package/dist/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
  182. package/dist/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
  183. package/dist/node_modules/better-sqlite3/lib/methods/function.js +31 -0
  184. package/dist/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
  185. package/dist/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
  186. package/dist/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
  187. package/dist/node_modules/better-sqlite3/lib/methods/table.js +189 -0
  188. package/dist/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
  189. package/dist/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
  190. package/dist/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
  191. package/dist/node_modules/better-sqlite3/lib/util.js +12 -0
  192. package/dist/node_modules/better-sqlite3/package.json +59 -0
  193. package/dist/ownership-ledger-E3WIEKPL.js +9 -0
  194. package/dist/package.json +3 -0
  195. package/dist/path-grants-XRRXHXG7.js +40 -0
  196. package/dist/paths-LVV5IMQN.js +49 -0
  197. package/dist/plan-fact-anchors-LMVQZCW5.js +13 -0
  198. package/dist/plan-store-ODLTTPFB.js +17 -0
  199. package/dist/plan-templates-5FPFBOL6.js +109 -0
  200. package/dist/plugin-loader-ZZKX7ZE6.js +22 -0
  201. package/dist/prefix-budget-62OV5HQC.js +13 -0
  202. package/dist/project-trust-5WS5MOMU.js +31 -0
  203. package/dist/provider-cli-ALDQXIT7.js +37 -0
  204. package/dist/providers-XQYTAVPK.js +11 -0
  205. package/dist/proxy-resolver-V2Y6534D.js +15 -0
  206. package/dist/recovery-cli-KPGY6FY3.js +106 -0
  207. package/dist/review-discipline-MNSYCST5.js +55 -0
  208. package/dist/review-router-BVQZW3MX.js +18 -0
  209. package/dist/seed-capsules/seed-capsule-attack-methodology.md +62 -0
  210. package/dist/seed-capsules/seed-capsule-changgeng.md +31 -0
  211. package/dist/seed-capsules/seed-capsule-design-aesthetics.md +38 -0
  212. package/dist/seed-capsules/seed-capsule-diagnostic-ladder.md +54 -0
  213. package/dist/seed-capsules/seed-capsule-fu.md +39 -0
  214. package/dist/seed-capsules/seed-capsule-huagai.md +73 -0
  215. package/dist/seed-capsules/seed-capsule-kaiyang.md +65 -0
  216. package/dist/seed-capsules/seed-capsule-knowledge-work.md +40 -0
  217. package/dist/seed-capsules/seed-capsule-tanlang.md +47 -0
  218. package/dist/seed-capsules/seed-capsule-tianfu.md +23 -0
  219. package/dist/seed-capsules/seed-capsule-tianliang.md +63 -0
  220. package/dist/seed-capsules/seed-capsule-tianquan.md +32 -0
  221. package/dist/seed-capsules/seed-capsule-tianxuan-ccr.md +22 -0
  222. package/dist/seed-capsules/seed-capsule-tianxuan.md +64 -0
  223. package/dist/seed-capsules/seed-capsule-yaoguang.md +87 -0
  224. package/dist/serve-X2R2UTLF.js +170 -0
  225. package/dist/serve-agent-KHSU6RVV.js +965 -0
  226. package/dist/session-persist-HUUC772H.js +37 -0
  227. package/dist/session-registry-6XUD5C4Y.js +15 -0
  228. package/dist/skill-loader-CK3RMO47.js +48 -0
  229. package/dist/skills/cli-harness-sop.md +207 -0
  230. package/dist/spawn-git-4HFU65AH.js +29 -0
  231. package/dist/sse-EYUTBWUK.js +512 -0
  232. package/dist/starflow-NOFBMPFU.js +30 -0
  233. package/dist/streamableHttp-V67CNJMO.js +447 -0
  234. package/dist/task-contract-6XHBNJQK.js +32 -0
  235. package/dist/task-ledger-3K4TJIER.js +9 -0
  236. package/dist/team-orchestrate-S6NHZP7X.js +64 -0
  237. package/dist/title-extract-QX4XGCYN.js +50 -0
  238. package/dist/todo-QDXGRZZP.js +31 -0
  239. package/dist/todo-store-V3TTO5AH.js +12 -0
  240. package/dist/tool-preset-LU5BYEDZ.js +23 -0
  241. package/dist/tool-tiers-GD742YBN.js +23 -0
  242. package/dist/turndown.es-OI55K6C3.js +17373 -0
  243. package/dist/verification-attribution-EKG4CNUV.js +13 -0
  244. package/dist/volatile-git-MBTST7RA.js +15 -0
  245. package/dist/wave-checkpoint-XLIIHXQA.js +30 -0
  246. package/dist/web-cli-DUG4I35O.js +233 -0
  247. package/dist/web-search-3IK542AA.js +34 -0
  248. package/dist/workers/cpu-worker.js +45 -0
  249. package/dist/workflow-runner-HX7UBAYG.js +297 -0
  250. package/dist/worktree-baseline-O5NCU6M2.js +9 -0
  251. package/package.json +122 -0
  252. package/scripts/check-mobile-env.mjs +76 -0
  253. package/scripts/fetch-native-sqlite.js +392 -0
  254. package/scripts/prune-installed-wasms.js +45 -0
  255. package/scripts/tree-sitter-wasm-keep.js +40 -0
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env -S node --expose-gc --max-old-space-size=4096
2
+ import { createRequire as __rivetCreateRequire } from 'node:module'; const require = __rivetCreateRequire(import.meta.url);
3
+ import {
4
+ writeFileAtomicAsync,
5
+ writeFileAtomicSync
6
+ } from "./chunk-A5MNH4ER.js";
7
+ import {
8
+ init_esm_shims
9
+ } from "./chunk-5GGOGLSN.js";
10
+
11
+ // src/context/stigmergy.ts
12
+ init_esm_shims();
13
+ import { readFile, mkdir } from "fs/promises";
14
+ import { mkdirSync } from "fs";
15
+ import { dirname } from "path";
16
+ var DEFAULT_HALF_LIFE_MS = 6048e5;
17
+ var DECAY_CONSTANT = 0.693;
18
+ var DEFAULT_MAX_CAPACITY = 200;
19
+ var PRUNE_THRESHOLD = 0.05;
20
+ function computeCurrentStrength(initialStrength, elapsedMs, halfLifeMs) {
21
+ if (halfLifeMs <= 0) return 0;
22
+ return initialStrength * Math.exp(-DECAY_CONSTANT * elapsedMs / halfLifeMs);
23
+ }
24
+ var StigmergyStore = class {
25
+ constructor(filePath, maxCapacity = DEFAULT_MAX_CAPACITY) {
26
+ this.filePath = filePath;
27
+ this.maxCapacity = maxCapacity;
28
+ }
29
+ filePath;
30
+ maxCapacity;
31
+ /** In-memory cache to avoid repeated disk reads during tool batches. */
32
+ _cache = null;
33
+ /** True when cache has unsaved mutations. */
34
+ _dirty = false;
35
+ /** Debounce timer for batched writes. */
36
+ _flushTimer = null;
37
+ /** Debounce interval: batch writes within this window. */
38
+ _flushDelayMs = 200;
39
+ // ── Internal cache management ────────────────────────────────
40
+ /** Load pheromones from cache or disk. Returns [] if file missing or corrupt. */
41
+ async _loadFromDisk() {
42
+ if (!this.filePath) return [];
43
+ try {
44
+ const raw = await readFile(this.filePath, "utf-8");
45
+ const parsed = JSON.parse(raw);
46
+ if (!Array.isArray(parsed)) return [];
47
+ return parsed.filter(
48
+ (e) => typeof e === "object" && e !== null && typeof e.path === "string" && typeof e.signal === "string" && typeof e.strength === "number" && typeof e.depositedAt === "number" && typeof e.halfLife === "number"
49
+ );
50
+ } catch {
51
+ return [];
52
+ }
53
+ }
54
+ /** Get entries — from cache if loaded, otherwise from disk. */
55
+ async _getEntries() {
56
+ if (this._cache === null) {
57
+ this._cache = await this._loadFromDisk();
58
+ }
59
+ return this._cache;
60
+ }
61
+ /** Mark cache dirty and schedule a debounced flush. */
62
+ _markDirty(entries) {
63
+ this._cache = entries;
64
+ this._dirty = true;
65
+ if (this._flushTimer) clearTimeout(this._flushTimer);
66
+ this._flushTimer = setTimeout(() => {
67
+ this._flushTimer = null;
68
+ if (this._dirty && this._cache !== null) {
69
+ void this._persist(this._cache);
70
+ }
71
+ }, this._flushDelayMs);
72
+ }
73
+ /** Write entries to disk atomically and clear dirty flag. */
74
+ async _persist(entries) {
75
+ if (!this.filePath) {
76
+ this._dirty = false;
77
+ return;
78
+ }
79
+ await mkdir(dirname(this.filePath), { recursive: true });
80
+ await writeFileAtomicAsync(this.filePath, JSON.stringify(entries, null, 2));
81
+ this._dirty = false;
82
+ }
83
+ // ── Public API ───────────────────────────────────────────────
84
+ /** Load all pheromones from disk (bypasses cache). */
85
+ async load() {
86
+ return this._getEntries();
87
+ }
88
+ /** Force-flush any pending writes. Call before process exit or compaction. */
89
+ async flush() {
90
+ if (this._flushTimer) {
91
+ clearTimeout(this._flushTimer);
92
+ this._flushTimer = null;
93
+ }
94
+ if (this._dirty && this._cache !== null) {
95
+ await this._persist(this._cache);
96
+ }
97
+ }
98
+ /**
99
+ * Synchronous force-flush for the process-exit path, where async work is
100
+ * abandoned by process.exit(). Mirrors _persist() with the sync atomic
101
+ * writer so a deposit landing inside the 200ms debounce window is not lost
102
+ * on Ctrl+C / shutdown. No-op when nothing is pending.
103
+ */
104
+ flushSync() {
105
+ if (this._flushTimer) {
106
+ clearTimeout(this._flushTimer);
107
+ this._flushTimer = null;
108
+ }
109
+ if (this._dirty && this._cache !== null) {
110
+ if (!this.filePath) {
111
+ this._dirty = false;
112
+ return;
113
+ }
114
+ mkdirSync(dirname(this.filePath), { recursive: true });
115
+ writeFileAtomicSync(this.filePath, JSON.stringify(this._cache, null, 2));
116
+ this._dirty = false;
117
+ }
118
+ }
119
+ /** Persist pheromones to disk immediately (bypasses debounce). */
120
+ async save(entries) {
121
+ this._cache = entries;
122
+ this._dirty = false;
123
+ if (this._flushTimer) {
124
+ clearTimeout(this._flushTimer);
125
+ this._flushTimer = null;
126
+ }
127
+ await this._persist(entries);
128
+ }
129
+ /** Force-flush pending writes and invalidate cache (e.g. for cross-session sync). */
130
+ invalidateCache() {
131
+ this._cache = null;
132
+ this._dirty = false;
133
+ if (this._flushTimer) {
134
+ clearTimeout(this._flushTimer);
135
+ this._flushTimer = null;
136
+ }
137
+ }
138
+ // ── Core operations ──────────────────────────────────────────
139
+ /**
140
+ * Deposit a new pheromone signal for a file.
141
+ *
142
+ * If a matching entry (same path + signal) exists, it is overwritten
143
+ * with the new strength and timestamp. Otherwise a new entry is appended.
144
+ *
145
+ * After deposition, LRU eviction is applied. Write is debounced.
146
+ */
147
+ async deposit(deposit) {
148
+ const entries = await this._getEntries();
149
+ const now = Date.now();
150
+ const newEntry = {
151
+ path: deposit.path,
152
+ signal: deposit.signal,
153
+ strength: Math.max(0, Math.min(1, deposit.strength)),
154
+ depositedAt: now,
155
+ halfLife: deposit.halfLifeMs ?? DEFAULT_HALF_LIFE_MS,
156
+ ...deposit.context ? { context: deposit.context.slice(0, 80) } : {},
157
+ ...deposit.taskId ? { taskId: deposit.taskId } : {}
158
+ };
159
+ const idx = entries.findIndex(
160
+ (e) => e.path === deposit.path && e.signal === deposit.signal
161
+ );
162
+ if (idx >= 0) {
163
+ entries[idx] = newEntry;
164
+ } else {
165
+ entries.push(newEntry);
166
+ }
167
+ const capped = entries.slice(-this.maxCapacity);
168
+ this._markDirty(capped);
169
+ }
170
+ /**
171
+ * Query pheromones with their decayed current strength.
172
+ *
173
+ * @param path - Optional file path filter. If omitted, returns all entries.
174
+ * @returns Entries with `currentStrength` computed (entries below prune
175
+ * threshold are NOT excluded — use prune() for cleanup).
176
+ */
177
+ async query(path) {
178
+ const entries = await this._getEntries();
179
+ const filtered = path ? entries.filter((e) => e.path === path) : entries;
180
+ const now = Date.now();
181
+ return filtered.map((e) => ({
182
+ ...e,
183
+ currentStrength: computeCurrentStrength(
184
+ e.strength,
185
+ now - e.depositedAt,
186
+ e.halfLife
187
+ )
188
+ }));
189
+ }
190
+ /**
191
+ * Remove entries whose decayed current strength falls below
192
+ * the prune threshold (0.05). Persists the result via debounced write.
193
+ */
194
+ async prune() {
195
+ const entries = await this._getEntries();
196
+ const now = Date.now();
197
+ const kept = entries.filter((e) => {
198
+ const cs = computeCurrentStrength(e.strength, now - e.depositedAt, e.halfLife);
199
+ return cs >= PRUNE_THRESHOLD;
200
+ });
201
+ if (kept.length < entries.length) {
202
+ this._markDirty(kept);
203
+ }
204
+ }
205
+ };
206
+
207
+ export {
208
+ computeCurrentStrength,
209
+ StigmergyStore
210
+ };
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env -S node --expose-gc --max-old-space-size=4096
2
+ import { createRequire as __rivetCreateRequire } from 'node:module'; const require = __rivetCreateRequire(import.meta.url);
3
+ import {
4
+ init_esm_shims
5
+ } from "./chunk-5GGOGLSN.js";
6
+
7
+ // src/agent/plan-store.ts
8
+ init_esm_shims();
9
+ var plans = /* @__PURE__ */ new Map();
10
+ var currentSessionId;
11
+ function currentKey(sessionId) {
12
+ return sessionId ?? currentSessionId ?? "__default__";
13
+ }
14
+ function setPlanSession(sessionId) {
15
+ currentSessionId = sessionId;
16
+ }
17
+ function storePlan(json, sessionId) {
18
+ plans.set(currentKey(sessionId), json);
19
+ }
20
+ function consumePlan(sessionId) {
21
+ const key = currentKey(sessionId);
22
+ const plan = plans.get(key) ?? null;
23
+ plans.delete(key);
24
+ return plan;
25
+ }
26
+ function getStoredPlan(sessionId) {
27
+ return plans.get(currentKey(sessionId)) ?? null;
28
+ }
29
+ function clearPlan(sessionId) {
30
+ plans.delete(currentKey(sessionId));
31
+ }
32
+
33
+ export {
34
+ setPlanSession,
35
+ storePlan,
36
+ consumePlan,
37
+ getStoredPlan,
38
+ clearPlan
39
+ };
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env -S node --expose-gc --max-old-space-size=4096
2
+ import { createRequire as __rivetCreateRequire } from 'node:module'; const require = __rivetCreateRequire(import.meta.url);
3
+ import {
4
+ init_esm_shims
5
+ } from "./chunk-5GGOGLSN.js";
6
+
7
+ // src/prompt/system-reminder.ts
8
+ init_esm_shims();
9
+ var SYSTEM_REMINDER_OPEN = "<system-reminder>";
10
+ var SYSTEM_REMINDER_CLOSE = "</system-reminder>";
11
+ function isSystemReminder(content) {
12
+ return typeof content === "string" && content.startsWith(SYSTEM_REMINDER_OPEN);
13
+ }
14
+ function wrapSystemReminder(text) {
15
+ if (text.startsWith(SYSTEM_REMINDER_OPEN)) return text;
16
+ return `${SYSTEM_REMINDER_OPEN}
17
+ ${text}
18
+ ${SYSTEM_REMINDER_CLOSE}`;
19
+ }
20
+
21
+ export {
22
+ isSystemReminder,
23
+ wrapSystemReminder
24
+ };
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env -S node --expose-gc --max-old-space-size=4096
2
+ import { createRequire as __rivetCreateRequire } from 'node:module'; const require = __rivetCreateRequire(import.meta.url);
3
+ import {
4
+ init_esm_shims
5
+ } from "./chunk-5GGOGLSN.js";
6
+
7
+ // src/agent/review-discipline.ts
8
+ init_esm_shims();
9
+ var REVIEW_DISCIPLINES = [
10
+ "\u4E0D\u53EF\u5728\u540C\u4E00\u4E0A\u4E0B\u6587\u81EA\u6211\u5BA1\u6279\uFF1A\u4FEE\u590D\u6216\u4EA4\u4ED8\u524D\uFF0C\u987B\u7ECF\u4E00\u6B21\u72EC\u7ACB\u9A8C\u8BC1 pass\uFF08\u6362 agent/\u6362\u4E0A\u4E0B\u6587\uFF09\uFF0C\u4F5C\u8005\u7684\u81EA\u4FE1\u4E0D\u80FD\u9876\u66FF\u9A8C\u8BC1\u8005\u7684\u547D\u4EE4\u884C\u3002",
11
+ "\u4FEE\u590D\u7C7B\u6539\u52A8\u63D0\u4EA4\u524D\uFF0Cspawn adversarial_verifier \u62FF\u547D\u4EE4+\u89C2\u5BDF\u8F93\u51FA\u8BC1\u636E\u2014\u2014\u4E0D\u662F\u8BFB\u61C2\u4EE3\u7801\u5C31\u76D6 PASS\u3002",
12
+ "\u6539\u4E86 X \u5FC5\u987B\u8DD1\u8986\u76D6 X \u7684\u65E2\u6709\u6D4B\u8BD5\uFF0C\u4E0D\u53EA\u8DD1\u4F60\u4E3A X \u65B0\u5199\u7684\u6D4B\u8BD5\uFF1B\u5BA1 diff \u65F6\u5220\u9664\u884C\uFF08-\uFF09\u4E0E\u65B0\u589E\u884C\u540C\u7B49\u5BA1\u89C6\uFF0C\u56DE\u5F52\u5E38\u957F\u5728\u7F16\u8F91\u70B9\u7684\u76F8\u90BB\u884C\u3002",
13
+ "\u201C\u6D4B\u8BD5\u5168\u8FC7/\u5DF2\u4FEE\u590D\u201D\u662F\u6700\u9AD8\u4F18\u5148\u7EA7\u7684\u81EA\u6211\u5BA1\u67E5\u5BF9\u8C61\uFF0Cfail-closed\uFF1A\u65E0\u201C\u5B9E\u9645\u8FD0\u884C\u7684\u547D\u4EE4+\u89C2\u5BDF\u5230\u7684\u5173\u952E\u8F93\u51FA\u201D\u7684\u7EFF\u58F0\u660E\uFF0C\u4E00\u5F8B\u6309\u672A\u9A8C\u8BC1\u5904\u7406\u3002"
14
+ ];
15
+ var GENERAL_DEV_DISCIPLINES = [
16
+ "\u7D2F\u79EF\u901A\u9053\u53EA\u63A5\u5E42\u7B49\u7684\u72B6\u6001\u6D3E\u751F\u503C\uFF1A\u5F53\u4E00\u4E2A\u901A\u9053\u5E26\u6709\u300C\u672A\u663E\u5F0F\u66F4\u65B0\u5C31\u6CBF\u7528\u4E0A\u4E00\u6B21\u503C\u300D\u7684\u8BED\u4E49\uFF08\u7F13\u5B58\u3001\u589E\u91CF/delta \u540C\u6B65\u3001diff \u7F16\u7801\u3001\u8BB0\u5FC6\u5316 memo\u3001\u810F\u6807\u8BB0\u6E32\u67D3\u3001\u5FEB\u7167\u590D\u7528\u3001last-write-wins \u5408\u5E76\u3001\u589E\u91CF\u7D22\u5F15\uFF09\uFF0C\u5B83\u53EA\u80FD\u627F\u8F7D\u53EF\u7531\u5F53\u524D\u72B6\u6001\u786E\u5B9A\u6027\u91CD\u7B97\u7684\u5E42\u7B49\u503C\u3002\u4E00\u6B21\u6027/\u77AC\u65F6\u503C\uFF08\u63D0\u793A\u3001\u544A\u8B66\u3001\u672C\u8F6E\u4E8B\u4EF6\u3001\u53EA\u5E94\u5C55\u793A\u4E00\u6B21\u7684\u5185\u5BB9\uFF09\u653E\u8FDB\u53BB\u4F1A\u9ECF\u6EDE\u2014\u2014\u6D88\u8D39\u7AEF\u4F1A\u628A\u300C\u8FD9\u6B21\u6CA1\u51FA\u73B0\u300D\u89E3\u8BFB\u4E3A\u300C\u6CBF\u7528\u4E0A\u6B21\u300D\u800C\u975E\u300C\u5DF2\u6D88\u5931\u300D\u3002\u6539\u52A8\u4EFB\u4F55\u5E26\u72B6\u6001\u590D\u7528\u8BED\u4E49\u7684\u901A\u9053\u524D\u5148\u95EE\uFF1A\u503C\u6D88\u5931\u65F6\u6D88\u8D39\u7AEF\u4F1A\u5F53\u5B83\u300C\u6E05\u7A7A\u300D\u8FD8\u662F\u300C\u6CBF\u7528\u300D\uFF1F\u77AC\u65F6\u503C\u5E94\u8D70\u6BCF\u6B21\u663E\u5F0F\u91CD\u53D1 / \u663E\u5F0F\u6E05\u9664\u7684\u901A\u9053\uFF0C\u6216\u4E3A\u7D2F\u79EF\u901A\u9053\u914D tombstone\uFF08\u663E\u5F0F\u5931\u6548\u6807\u8BB0\uFF09\u3002"
17
+ ];
18
+ function formatGeneralDevDisciplines() {
19
+ return GENERAL_DEV_DISCIPLINES.map((directive, index) => `${index + 1}. ${directive}`).join("\n");
20
+ }
21
+ var OBJECTIVE_REVIEW_STANCE = [
22
+ "\u628A\u81EA\u5DF1\u5F53\u4F5C\u5916\u90E8\u5BA1\u67E5\u8005\uFF1A\u4E0D\u8981\u66FF\u5B9E\u73B0\u8005\u8865\u610F\u56FE\uFF1B\u63D0\u4EA4\u5B58\u5728\u3001\u6D4B\u8BD5\u7EFF\u3001\u4F5C\u8005\u58F0\u79F0\u5DF2\u4FEE\uFF0C\u90FD\u53EA\u662F\u5F85\u9A8C\u8BC1\u8F93\u5165\u3002",
23
+ "\u533A\u5206\u4EB2\u81EA\u89C2\u5BDF\u7684\u8BC1\u636E\u4E0E\u6CBF\u7528\u4ED6\u4EBA\u58F0\u660E\uFF1B\u672A\u8FD0\u884C\u547D\u4EE4\u3001\u672A\u770B\u5230\u8F93\u51FA\u3001\u672A\u590D\u6838\u8C03\u7528\u94FE\u65F6\uFF0C\u5FC5\u987B\u6807\u8BB0\u4E3A unverified/blocked\u3002",
24
+ "\u4E3B\u52A8\u6784\u9020\u53CD\u4F8B\uFF1A\u7578\u5F62\u8F93\u5165\u3001\u7F3A\u5931\u5B57\u6BB5\u3001\u6362\u5E8F\u96C6\u5408\u3001\u5E76\u53D1\u4EA4\u9519\u3001\u9519\u8BEF\u8DEF\u5F84\u3001\u5220\u9664\u884C\u76F8\u90BB\u56DE\u5F52\u3002",
25
+ "\u67E5\u201C\u5B9A\u4E49\u201D\u662F\u5426\u63A5\u5230\u771F\u5B9E\u8FB9\u754C\uFF1A\u5E38\u91CF\u3001allowlist\u3001guard \u5B58\u5728\u4E0D\u7B49\u4E8E\u8C03\u7528\u94FE\u751F\u6548\uFF1B\u6CBF\u8C03\u7528\u65B9\u786E\u8BA4\u3002",
26
+ // 沉淀自一次 objective-dedup 守卫缺陷(!!projection 当成「含 objective」用,投影因一次性提示非空时误删目标)。
27
+ // 与瑶光「绿非证明」同源——都是「未核实语义等价就复用一个弱信号」。
28
+ "\u4EE3\u7406\u771F\u503C\u6F02\u79FB\uFF1A\u5B88\u536B/\u5206\u652F\u7528\u300CX \u5B58\u5728 / \u975E\u7A7A / \u975E\u96F6 / truthy\u300D\u4EE3\u7406\u300CX \u6EE1\u8DB3\u67D0\u66F4\u5F3A\u7684\u5185\u5BB9\u8C13\u8BCD\uFF08\u542B\u67D0\u5B57\u6BB5\u3001\u7B49\u4E8E\u67D0\u503C\u3001\u5904\u4E8E\u67D0\u72B6\u6001\uFF09\u300D\u65F6\uFF0C\u8981\u4E48\u8BC1\u660E\u4E8C\u8005\u5728\u6240\u6709\u771F\u5B9E\u6570\u636E\u5F62\u6001\u4E0B\u7B49\u4EF7\uFF0C\u8981\u4E48\u6784\u9020\u300C\u5F31\u4EE3\u7406\u4E3A\u771F\u3001\u5F3A\u8C13\u8BCD\u4E3A\u5047\u300D\u7684\u53CD\u4F8B\u3002\u5178\u578B\u53CD\u6A21\u5F0F\uFF1A`if (obj)` \u5F53\u6210 `if (obj.hasFoo)`\u3001`!list.length` \u5F53\u6210\u300C\u65E0\u6709\u6548\u9879\u300D\u3001`!!str` \u5F53\u6210\u300C\u542B\u76EE\u6807\u6807\u8BB0\u300D\u3002\u5BA1 diff \u65F6\u5BF9\u6BCF\u4E2A\u65B0\u589E/\u6539\u52A8\u7684\u5E03\u5C14\u5B88\u536B\u8FFD\u95EE\uFF1A\u8FD9\u4E2A\u6761\u4EF6\u771F\u7684\u7B49\u4E8E\u5B83\u6240\u5B88\u536B\u7684\u8BED\u4E49\u5417\uFF1F"
29
+ ];
30
+ function formatObjectiveReviewStance() {
31
+ return OBJECTIVE_REVIEW_STANCE.map((directive, index) => `${index + 1}. ${directive}`).join("\n");
32
+ }
33
+ var PATH_BOUNDARY_REVIEW_STANCE = [
34
+ "\u4EFB\u4F55\u8DEF\u5F84/\u5206\u7C7B/\u8FC7\u6EE4/\u7D22\u5F15\u6539\u52A8\u90FD\u5FC5\u987B\u5148\u786E\u8BA4\u771F\u5B9E\u8C03\u7528\u65B9\u4F20\u5165\u7684\u8DEF\u5F84\u5F62\u6001\uFF1Arepo-relative\u3001absolute inside cwd\u3001absolute outside cwd\u3001../ traversal\u3001\u5E73\u53F0\u5206\u9694\u7B26\u3002\u4E0D\u8981\u53EA\u6D4B\u79C1\u6709 helper \u7684\u7406\u60F3\u8F93\u5165\u3002",
35
+ "\u5206\u7C7B\u5668 verdict \u4E0D\u662F\u95ED\u73AF\uFF1A\u5FC5\u987B\u8FFD\u8E2A producer \u2192 normalizer \u2192 classifier \u2192 consumer/write target/DB key \u2192 assertion\u3002\u7C7B\u578B\u58F0\u660E\u6216 guard \u5B58\u5728\uFF0C\u4E0D\u7B49\u4E8E\u6D88\u8D39\u7AEF\u771F\u7684\u7528\u4E86\u3002",
36
+ "\u663E\u5F0F\u76EE\u6807\u4E0E\u9ED8\u8BA4\u53D1\u73B0\u8981\u5206\u5F00\u5BA1\uFF1A\u9ED8\u8BA4 broad discovery \u53EF\u964D\u566A\uFF0C\u7528\u6237/\u5DE5\u5177\u663E\u5F0F\u70B9\u540D\u8DEF\u5F84\u5FC5\u987B\u53EF\u8FBE\uFF1B\u6C89\u9ED8\u5C42\u4E0D\u7B49\u4E8E\u4E0D\u5B58\u5728\u3001\u4E0D\u7B49\u4E8E ownership/delivery \u6D88\u5931\u3002",
37
+ "\u5B89\u5168\u8FB9\u754C\u6309 fail-closed/fail-toward-content \u533A\u5206\uFF1A\u9879\u76EE\u5916\u8DEF\u5F84\u4E0D\u5F97\u8BFB/\u7D22\u5F15/\u5165\u5E93\uFF1B\u964C\u751F\u9879\u76EE\u5185\u5185\u5BB9\u9ED8\u8BA4\u5F53 L3 content\uFF0C\u4E0D\u7528 truthy/falsy \u6216\u5B57\u7B26\u4E32\u524D\u7F00\u54E8\u5175\u5077\u5224\u3002"
38
+ ];
39
+ function formatPathBoundaryReviewStance() {
40
+ return PATH_BOUNDARY_REVIEW_STANCE.map((directive, index) => `${index + 1}. ${directive}`).join("\n");
41
+ }
42
+ var WEIGHING_REVIEW_STANCE = [
43
+ "\u5BA1\u67E5\u4E0D\u6B62\u4E8E\u627E\u9519\uFF0C\u66F4\u8981\u79F0\u91CF\uFF1A\u8FD9\u4E2A\u6539\u52A8\u5728\u5F53\u524D\u4E0A\u4E0B\u6587\u91CC\u504F\u8F7B\u8FD8\u662F\u504F\u91CD\uFF1F\u5C01\u88C5/\u62BD\u8C61/\u8FB9\u754C\u9000\u5316\u4E86\u591A\u5C11\uFF0C\u6362\u6765\u4E86\u4EC0\u4E48\uFF1F\u79E4\u7684\u4E24\u7AEF\u90FD\u8981\u653E\u4E0A\u4E1C\u897F\uFF0C\u53EA\u62A5\u7F3A\u9677\u4E0D\u62A5\u4EE3\u4EF7\u662F\u534A\u622A\u79F0\u91CF\u3002",
44
+ '\u8BB0\u8D26\u5168\u5C40\u5F71\u54CD\uFF1A\u5C40\u90E8\u4F18\u5316\u662F\u5426\u4EE5\u727A\u7272\u6574\u4F53\u7A33\u5B9A/\u5C01\u88C5\u6027\u4E3A\u4EE3\u4EF7\uFF08\u5982\u6279\u91CF\u79FB\u9664 private\u3001\u590D\u5236\u5E38\u91CF\u3001\u8DE8\u6A21\u5757\u8026\u5408\uFF09\u3002\u771F\u5B9E\u9000\u5316\u5373\u4F7F"\u6D4B\u8BD5\u4ECD\u7EFF"\u4E5F\u8981\u8BB0\u5F55\u5E76\u6307\u660E\u507F\u8FD8\u9636\u6BB5\uFF0C\u4E0D\u53EF\u9759\u9ED8\u901A\u8FC7\u3002'
45
+ ];
46
+ function formatWeighingReviewStance() {
47
+ return WEIGHING_REVIEW_STANCE.map((directive, index) => `${index + 1}. ${directive}`).join("\n");
48
+ }
49
+ var CASE_SENSITIVITY_REVIEW_STANCE = [
50
+ "import/require \u8DEF\u5F84\u9010\u5B57\u8282\u6838\u5BF9\u78C1\u76D8\u6587\u4EF6\u540D\uFF1A\u7528 glob \u6216 ls \u786E\u8BA4\u771F\u5B9E\u5927\u5C0F\u5199\uFF0C\u4E0D\u51ED\u8BB0\u5FC6\u3002\u65B0\u5EFA\u6587\u4EF6\u65F6\u786E\u8BA4 import \u8BED\u53E5\u4E0E\u78C1\u76D8\u6587\u4EF6\u540D\u5927\u5C0F\u5199\u4E00\u81F4\u3002",
51
+ "\u7B2C\u4E09\u65B9 API/DOM \u65B9\u6CD5\u540D\u7528 web_fetch \u6216 web_search \u67E5\u6587\u6863\u786E\u8BA4\u62FC\u5199\u2014\u2014I18n \u2260 I18N\u3001applyToDOM \u2260 applyToDom\u3001innerHTML \u2260 innerHtml\u3002\u4E0D\u786E\u5B9A\u5C31\u67E5\uFF0C\u4E0D\u731C\u3002",
52
+ "\u5168\u5C40\u53D8\u91CF\u547D\u540D\u4E00\u81F4\u6027\uFF1Awindow / globalThis \u4E0A\u7684\u6302\u8F7D\u4E0E\u5F15\u7528\u5927\u5C0F\u5199\u5FC5\u987B\u7EDF\u4E00\u3002\u68C0\u67E5\u521D\u59CB\u5316\u811A\u672C\u662F\u5426\u53EF\u80FD\u56E0\u67D0\u4E2A case \u9519\u8BEF\u63D0\u524D\u4E2D\u65AD\uFF0C\u5BFC\u81F4\u540E\u7EED\u811A\u672C\u627E\u4E0D\u5230\u672C\u8BE5\u6302\u8F7D\u7684\u5168\u5C40\u53D8\u91CF\u3002",
53
+ "\u5BA1\u67E5\u65F6\u53D1\u73B0\u67D0\u4E2A\u811A\u672C/\u6A21\u5757\u6709\u62A5\u9519\u4F46\u540E\u7EED\u4ECD\u6709\u5927\u91CF\u5176\u4ED6\u62A5\u9519\u65F6\uFF0C\u5148\u5224\u65AD\u662F\u5426\u7EA7\u8054\u5931\u8D25\u2014\u2014\u7B2C\u4E00\u6761\u62A5\u9519\u901A\u5E38\u662F\u6839\u56E0\uFF0C\u540E\u7EED\u62A5\u9519\u53EF\u80FD\u662F\u521D\u59CB\u5316\u4E2D\u65AD\u7684\u8FDE\u9501\u53CD\u5E94\u3002\u4FEE\u6839\u56E0\u800C\u975E\u9010\u6761\u6251\u706B\u3002"
54
+ ];
55
+ function formatCaseSensitivityReviewStance() {
56
+ return CASE_SENSITIVITY_REVIEW_STANCE.map((directive, index) => `${index + 1}. ${directive}`).join("\n");
57
+ }
58
+ var WIRING_EFFECTIVENESS_REVIEW_STANCE = [
59
+ "\u4ECE\u751F\u4EA7\u5165\u53E3\u6B63\u5411\u8FFD\u95ED\u73AF\uFF1A\u8BC6\u522B\u771F\u5B9E\u5165\u53E3 \u2192 \u7EC4\u5408\u6839 \u2192 \u6539\u52A8\u70B9\u3002\u6D4B\u8BD5/\u793A\u4F8B\u91CC\u7684\u6302\u70B9\u4E0D\u7B97\u3002\u627E\u4E0D\u5230\u6D3B\u5165\u53E3\u5230\u6539\u52A8\u70B9\u7684\u6B63\u5411\u94FE\u8DEF = HIGH\u3002",
60
+ '\u9010\u6761\u5BF9\u7167\u63D0\u4EA4\u58F0\u660E\u5BA1"\u505A\u6CA1\u505A\u5B8C"\uFF1A\u5B57\u6BB5\u52A0\u4E86\u4F46\u65E0\u6D88\u8D39\u7AEF\u3001\u80FD\u529B\u5EFA\u4E86\u4F46\u751F\u4EA7\u8DEF\u5F84\u4E0D\u8C03\u7528 = \u534A\u6210\u54C1\u3002',
61
+ "\u5168\u94FE\u8DEF\u8D70\u901A\uFF1A\u65B0\u589E\u53C2\u6570\u2192grep \u5168\u90E8\u8C03\u7528\u65B9(\u96F6\u4F20\u503C=\u6B7B\u53C2\u6570)\uFF1B\u65B0\u589Esetter\u2192\u786E\u8BA4flush/\u8BFB\u53D6\u8DEF\u5F84(\u5426\u5219\u6B7Bsetter)\uFF1B\u65B0\u589Econfig\u2192\u786E\u8BA4\u8FD0\u884C\u65F6\u771F\u7684\u8BFB\u53D6\u3002",
62
+ "\u76EE\u6807\u53CD\u6548\uFF1A\u6539\u52A8\u58F0\u79F0\u51CF\u5C11X\uFF0C\u5C31\u9A8C\u8BC1X\u5B9E\u9645\u4E0B\u964D\u3002\u65E7\u901A\u9053\u672A\u5220+\u65B0\u901A\u9053\u53CC\u6E32\u67D3 = \u51CF\u566A\u63D0\u4EA4\u53CD\u800C\u589E\u566A \u2192 HIGH\u3002",
63
+ "\u95E8\u63A7\u6761\u4EF6\u7528\u771F\u5B9E\u6570\u636E\u5F62\u6001\u6838\u5BF9\uFF1A\u7A7A\u96C6\u5408/\u53EF\u9009\u5B57\u6BB5\u7F3A\u5931/\u6A21\u578B\u81EA\u7531\u8F93\u5165\u2192\u4F30\u7B97\u901A\u8FC7\u7387\u3002~0%=\u9759\u9ED8\u5173\u95ED\uFF0C~100%=\u65E0\u6548\u95E8\u63A7\u3002",
64
+ "\u7ED3\u6784\u5316\u5185\u5BB9\u622A\u65AD\u9A8C\u8BC1\uFF1A\u6807\u7B7E\u95ED\u5408\u3001\u8F6C\u4E49\u3001\u914D\u5BF9\u7B26\u53F7\u4E0D\u88AB\u5207\u65AD\uFF1B\u7ED3\u679C\u786E\u5B9A\u6027\uFF0C\u4E0D\u5F15\u5165\u7F13\u5B58\u6296\u52A8\u3002"
65
+ ];
66
+ function formatWiringEffectivenessReviewStance() {
67
+ return WIRING_EFFECTIVENESS_REVIEW_STANCE.map((d, i) => `${i + 1}. ${d}`).join("\n");
68
+ }
69
+ var METHODOLOGY_VERIFICATION_STANCE = [
70
+ '\u65B9\u6CD5\u8BBA\u6587\u6863\u4E2D\u7684\u6BCF\u4E00\u6761\u53EF\u6267\u884C\u6307\u4EE4\uFF08grep\u3001regex\u3001shell \u547D\u4EE4\u3001\u5FC3\u667A\u64CD\u4F5C\u6B65\u9AA4\uFF09\u5FC5\u987B\u5728\u771F\u5B9E\u4EE3\u7801\u5E93\u4E2D\u8DD1\u4E00\u904D\u5E76\u786E\u8BA4\u8F93\u51FA\u8986\u76D6\u9884\u671F\u76EE\u6807\uFF0C\u7136\u540E\u624D\u80FD\u63D0\u4EA4\u3002\u4E0D\u8DD1\u4E0D\u4EA4\u4ED8\u3002\u7406\u7531\uFF1A\u8865\u4E01\u91CC\u5199\u7684\u90A3\u6761 grep "validatePathSafe" \u5728\u5199\u4F5C\u6A21\u5F0F\u4E0B"\u770B\u8D77\u6765\u5BF9"\uFF0C\u4F46\u5B9E\u8BC1\u9A8C\u8BC1\u53D1\u73B0\u5B83\u6F0F\u6389\u4E86 sandbox-profile.ts\u2014\u2014\u56E0\u4E3A\u4E24\u4E2A\u95E8\u7684\u5173\u7CFB\u4E0D\u662F caller/callee\uFF0C\u800C\u662F\u5E76\u884C\u6267\u884C\u70B9\u5171\u4EAB\u72B6\u6001\u6A21\u5757\u3002',
71
+ '\u6838\u5B9E"\u95E8"\u4E4B\u95F4\u7684\u5173\u7CFB\u662F caller/callee \u8FD8\u662F\u5E76\u884C\u6267\u884C\u70B9\uFF1A\u4E0D\u8981\u5047\u8BBE\u4E24\u4E2A enforcement point \u5171\u4EAB guard \u51FD\u6570\u3002grep \u5171\u4EAB\u72B6\u6001\u7684\u5BFC\u5165\u65B9\uFF08rg -l "state-module" src/\uFF09\uFF0C\u6216\u679A\u4E3E"\u8FD9\u4E2A\u64CD\u4F5C\u7684\u6240\u6709\u62D2\u7EDD\u70B9"\u2014\u2014\u6CBF\u7740\u64CD\u4F5C\u5F80\u4E0B\u6570\u95E8\uFF0C\u800C\u975E\u6CBF\u7740\u51FD\u6570\u5F80\u4E0A\u6570\u8C03\u7528\u8005\u3002\u539F\u5219 A \u7684\u539F\u59CB\u63AA\u8F9E\u7528"guard \u51FD\u6570"\u9690\u55BB\u628A\u5E76\u884C\u6267\u884C\u70B9\u538B\u7F29\u6210\u4E86\u8C03\u7528\u94FE\uFF0C\u906E\u853D\u4E86\u771F\u5B9E\u67B6\u6784\u3002',
72
+ "\u4FEE\u590D\u65B9\u6CD5\u8BBA\u6587\u6863\u7684\u8865\u4E01\uFF0C\u7528\u65B9\u6CD5\u8BBA\u81EA\u5DF1\u7684\u539F\u5219\u9012\u5F52\u5BA1\u67E5\u5B83\u81EA\u5DF1\uFF1A\u8865\u4E01\u662F\u5426\u5F15\u5165\u4E86\u4E0E\u539F\u59CB\u7F3A\u9677\u540C\u65CF\u7684\u9519\u8BEF\uFF1F\u8865\u4E01\u4E2D\u7684\u53EF\u6267\u884C\u6307\u4EE4\u662F\u5426\u7ECF\u5B9E\u8BC1\u9A8C\u8BC1\uFF1F\u65B9\u6CD5\u8BBA\u80FD\u6293\u4F4F\u81EA\u5DF1\u7684\u9519\u8BEF = \u6D3B\u7684\u7CFB\u7EDF\uFF1B\u8865\u4E01\u5199\u4E86\u5C31\u51BB\u7ED3\u4ECE\u4E0D\u56DE\u5934\u9A8C\u8BC1 = \u6B7B\u7684\u6587\u6863\u3002"
73
+ ];
74
+ function formatMethodologyVerificationStance() {
75
+ return METHODOLOGY_VERIFICATION_STANCE.map((directive, index) => `${index + 1}. ${directive}`).join("\n");
76
+ }
77
+ var FIX_PATTERNS = [
78
+ /\bfix(?:\(|:|\b)/i,
79
+ /\bbugfix\b/i,
80
+ /\bpatch\b/i,
81
+ /regression/i,
82
+ /修复/,
83
+ /回归/
84
+ ];
85
+ function isFixContext(message) {
86
+ return FIX_PATTERNS.some((pattern) => pattern.test(message));
87
+ }
88
+ var LARGE_FILE_WARN_THRESHOLD = 2e5;
89
+ var TRIVIAL_FILE_PATTERN = /(?:^|\/)README|CHANGELOG(?:\.[^/]*)?$|\.(?:md|mdx|txt|json)$/i;
90
+ var DEPENDENCY_OR_COMPILER_CONFIG_PATTERN = /(?:^|\/)(?:package(?:-lock)?\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|deno\.lock|tsconfig(?:\.[^/]*)?\.json|[^/]+\.lock)$/i;
91
+ var TEST_ONLY_PATTERN = /(?:^|\/)__tests__\//i;
92
+ var SECURITY_BOUNDARY_PATTERNS = [
93
+ "approval-risk",
94
+ "path-validate",
95
+ "sandbox-exec",
96
+ "permissions",
97
+ "sycophancy-trap",
98
+ "immune-hook",
99
+ "sensitive-preflight"
100
+ ];
101
+ function isTestOnlyFile(file) {
102
+ return TEST_ONLY_PATTERN.test(file);
103
+ }
104
+ function isTrivialChange(files) {
105
+ return files.length > 0 && files.every(
106
+ (file) => TRIVIAL_FILE_PATTERN.test(file) || isTestOnlyFile(file)
107
+ );
108
+ }
109
+ function touchesSecurityBoundary(files) {
110
+ return files.some((f) => SECURITY_BOUNDARY_PATTERNS.some((p) => f.includes(p)));
111
+ }
112
+ var AUTO_REVIEW_CORE_PATH_PATTERN = /(?:^|\/)src\/(agent|api|prompt|server|auth)\//;
113
+ var AUTO_REVIEW_L2_MIN_FILES = 3;
114
+ function classifyAutoReviewTier(change) {
115
+ if (change.forceLevel) return "L2";
116
+ if (change.goalActive) return "L1";
117
+ if (change.files.length >= AUTO_REVIEW_L2_MIN_FILES) return "L2";
118
+ if (change.crossModule) return "L2";
119
+ if (change.files.some((f) => AUTO_REVIEW_CORE_PATH_PATTERN.test(f))) return "L2";
120
+ if (touchesSecurityBoundary(change.files)) return "L2";
121
+ if (change.files.some((f) => DEPENDENCY_OR_COMPILER_CONFIG_PATTERN.test(f))) return "L2";
122
+ return "L1";
123
+ }
124
+ function classifyChangeScale(change) {
125
+ if (change.forceLevel) return change.forceLevel;
126
+ if (change.goalActive) return "L1";
127
+ if (change.crossModule || change.files.length >= 5 || touchesSecurityBoundary(change.files)) return "L3";
128
+ if (change.files.some((file) => DEPENDENCY_OR_COMPILER_CONFIG_PATTERN.test(file))) return "L2";
129
+ if (change.files.length > 0 && change.files.every(
130
+ (file) => TRIVIAL_FILE_PATTERN.test(file) || isTestOnlyFile(file)
131
+ )) {
132
+ return "L1";
133
+ }
134
+ return "L1";
135
+ }
136
+ function upgradeScaleByDepth(base, depthLayer) {
137
+ if (!depthLayer || depthLayer === "unit") return base;
138
+ if (depthLayer === "system") return "L3";
139
+ if (depthLayer === "wiring" && base === "L1") return "L2";
140
+ return base;
141
+ }
142
+ function shouldRouteReviewWorkflow(change) {
143
+ return change.files.length > 0;
144
+ }
145
+ function isCrossModule(files) {
146
+ const modules = /* @__PURE__ */ new Set();
147
+ for (const file of files) {
148
+ const moduleName = file.match(/(?:^|\/)src\/([^/]+)\//)?.[1];
149
+ if (moduleName) modules.add(moduleName);
150
+ }
151
+ return modules.size >= 2;
152
+ }
153
+
154
+ export {
155
+ REVIEW_DISCIPLINES,
156
+ GENERAL_DEV_DISCIPLINES,
157
+ formatGeneralDevDisciplines,
158
+ OBJECTIVE_REVIEW_STANCE,
159
+ formatObjectiveReviewStance,
160
+ PATH_BOUNDARY_REVIEW_STANCE,
161
+ formatPathBoundaryReviewStance,
162
+ WEIGHING_REVIEW_STANCE,
163
+ formatWeighingReviewStance,
164
+ CASE_SENSITIVITY_REVIEW_STANCE,
165
+ formatCaseSensitivityReviewStance,
166
+ WIRING_EFFECTIVENESS_REVIEW_STANCE,
167
+ formatWiringEffectivenessReviewStance,
168
+ METHODOLOGY_VERIFICATION_STANCE,
169
+ formatMethodologyVerificationStance,
170
+ isFixContext,
171
+ LARGE_FILE_WARN_THRESHOLD,
172
+ isTrivialChange,
173
+ AUTO_REVIEW_L2_MIN_FILES,
174
+ classifyAutoReviewTier,
175
+ classifyChangeScale,
176
+ upgradeScaleByDepth,
177
+ shouldRouteReviewWorkflow,
178
+ isCrossModule
179
+ };
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env -S node --expose-gc --max-old-space-size=4096
2
+ import { createRequire as __rivetCreateRequire } from 'node:module'; const require = __rivetCreateRequire(import.meta.url);
3
+ import {
4
+ init_esm_shims
5
+ } from "./chunk-5GGOGLSN.js";
6
+
7
+ // src/agent/ownership-ledger.ts
8
+ init_esm_shims();
9
+ function createOwnershipLedger(opts) {
10
+ const { baseline, taskLedger } = opts;
11
+ const ownedSet = /* @__PURE__ */ new Set();
12
+ const coOwnedSet = /* @__PURE__ */ new Set();
13
+ const adoptedSet = /* @__PURE__ */ new Set();
14
+ function registerOwned(filePath) {
15
+ if (baseline.isExternal(filePath)) {
16
+ coOwnedSet.add(filePath);
17
+ return;
18
+ }
19
+ ownedSet.add(filePath);
20
+ }
21
+ function autoOwnFromLedger() {
22
+ for (const event of taskLedger.getEvents()) {
23
+ if ((event.type === "file_write" || event.type === "git_action") && event.path) {
24
+ registerOwned(event.path);
25
+ }
26
+ }
27
+ }
28
+ function autoOwnFromBaseline(dirtyFiles) {
29
+ const ledgerPaths = /* @__PURE__ */ new Set();
30
+ for (const event of taskLedger.getEvents()) {
31
+ if ((event.type === "file_write" || event.type === "git_action") && event.path) {
32
+ ledgerPaths.add(event.path);
33
+ }
34
+ }
35
+ for (const f of dirtyFiles) {
36
+ if (ownedSet.has(f) || coOwnedSet.has(f)) continue;
37
+ if (baseline.isExternal(f)) continue;
38
+ if (!ledgerPaths.has(f)) continue;
39
+ ownedSet.add(f);
40
+ }
41
+ }
42
+ function isOwned(filePath) {
43
+ if (!filePath) return false;
44
+ if (adoptedSet.has(filePath)) return true;
45
+ if (baseline.isExternal(filePath)) return false;
46
+ return ownedSet.has(filePath);
47
+ }
48
+ function isExternal(filePath) {
49
+ return baseline.isExternal(filePath);
50
+ }
51
+ function isCoOwned(filePath) {
52
+ return coOwnedSet.has(filePath);
53
+ }
54
+ function getOwnedFiles() {
55
+ return [...ownedSet, ...adoptedSet].sort();
56
+ }
57
+ function getCoOwnedFiles() {
58
+ return [...coOwnedSet].sort();
59
+ }
60
+ function getExternalFiles(currentDirtyFiles) {
61
+ const base = baseline.getExternalFiles();
62
+ if (!currentDirtyFiles || currentDirtyFiles.length === 0) return base;
63
+ const dynamic = [];
64
+ for (const f of currentDirtyFiles) {
65
+ if (!ownedSet.has(f) && !coOwnedSet.has(f) && !adoptedSet.has(f) && !baseline.isExternal(f)) {
66
+ dynamic.push(f);
67
+ }
68
+ }
69
+ if (dynamic.length === 0) return base;
70
+ return [.../* @__PURE__ */ new Set([...base, ...dynamic])].sort();
71
+ }
72
+ function scopeToOwned(files) {
73
+ return files.filter((f) => isOwned(f)).sort();
74
+ }
75
+ function adoptFiles(files) {
76
+ const adopted = [];
77
+ for (const f of files) {
78
+ if (adoptedSet.has(f)) continue;
79
+ if (ownedSet.has(f)) continue;
80
+ if (coOwnedSet.has(f)) {
81
+ coOwnedSet.delete(f);
82
+ }
83
+ adoptedSet.add(f);
84
+ adopted.push(f);
85
+ }
86
+ return adopted.sort();
87
+ }
88
+ function getBaselineHead() {
89
+ return baseline.getHead();
90
+ }
91
+ function getOwnershipReport() {
92
+ const owned = getOwnedFiles();
93
+ const coOwned = getCoOwnedFiles();
94
+ const external = getExternalFiles();
95
+ return {
96
+ taskId: taskLedger.getTaskId(),
97
+ ownedFiles: owned,
98
+ ownedFileCount: owned.length,
99
+ coOwnedFiles: coOwned,
100
+ coOwnedFileCount: coOwned.length,
101
+ externalFiles: external,
102
+ externalFileCount: external.length
103
+ };
104
+ }
105
+ return {
106
+ registerOwned,
107
+ autoOwnFromLedger,
108
+ autoOwnFromBaseline,
109
+ adoptFiles,
110
+ isOwned,
111
+ isExternal,
112
+ isCoOwned,
113
+ getOwnedFiles,
114
+ getCoOwnedFiles,
115
+ getExternalFiles,
116
+ scopeToOwned,
117
+ getOwnershipReport,
118
+ getBaselineHead
119
+ };
120
+ }
121
+
122
+ export {
123
+ createOwnershipLedger
124
+ };