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,307 @@
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
+ TASK_ANCHOR_MAX_ITEMS
5
+ } from "./chunk-TPI73L57.js";
6
+ import {
7
+ init_esm_shims
8
+ } from "./chunk-5GGOGLSN.js";
9
+
10
+ // src/context/task-contract.ts
11
+ init_esm_shims();
12
+ var FILE_PATTERN = /(?:^|\s)((?:src|lib|test|tests|pkg|cmd|internal|docs|scripts)\/[\w./-]+\.\w+)/g;
13
+ var CONSTRAINT_MARKER_PATTERN = /\b(?:don'?t|must(?:n'?t)?|never)\b|不要|禁止|必须|不可以|不能/i;
14
+ var CLAUSE_SPLIT_PATTERN = /[。.!?!?]+|[\n\r]+/g;
15
+ var GREETING_WORDS = "hi|hello|hey|\u4F60\u597D|\u60A8\u597D|\u8C22\u8C22|\u591A\u8C22|\u8C22\u8C22\u4F60|ok|okay|\u4E86\u89E3|\u6536\u5230|\u8F9B\u82E6\u4E86|thanks|thank you";
16
+ var CONTINUATION_PATTERN = /^(?:继续|然后呢|然后|接着|下一步|做\s*[PpTtSs]\d+|go|continue|next|好\s*(?:继续|做|的\s*(?:继续|做)))[。.!\uff01??\s]*$/i;
17
+ var NON_ACTIONABLE_PATTERN = new RegExp("^(?:" + GREETING_WORDS + ")[\u3002.!\uFF01\uFF1F?s]*$", "i");
18
+ var GREETING_PREFIX_RE = new RegExp("^(?:" + GREETING_WORDS + ")[\u3002.,!\uFF01\uFF1F?s]*(?:\n|$)", "i");
19
+ var STATUS_RANK = {
20
+ exploring: 0,
21
+ planning: 1,
22
+ executing: 2,
23
+ verifying: 3,
24
+ ready_to_deliver: 4
25
+ };
26
+ function escapeXml(value) {
27
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;");
28
+ }
29
+ function stripGreetingPrefix(userMessage) {
30
+ return userMessage.replace(GREETING_PREFIX_RE, "").trim();
31
+ }
32
+ function normalizeObjective(userMessage) {
33
+ const stripped = stripGreetingPrefix(userMessage);
34
+ const msg = stripped || userMessage;
35
+ const firstLine = msg.split("\n")[0]?.trim() ?? "";
36
+ return firstLine.length > 200 ? firstLine.slice(0, 197).trimEnd() + "..." : firstLine;
37
+ }
38
+ function makeContractId(objective, turn) {
39
+ const slug = objective.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fff]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32);
40
+ return `task-${turn}-${slug || "untitled"}`;
41
+ }
42
+ function cjkAwareWeight(text) {
43
+ return [...text].reduce((sum, ch) => {
44
+ const cp = ch.codePointAt(0) ?? 0;
45
+ return sum + (cp >= 19968 && cp <= 40959 || cp >= 13312 && cp <= 19903 ? 2 : 1);
46
+ }, 0);
47
+ }
48
+ function isSocialOrTrivial(text) {
49
+ const stripped = text.trim();
50
+ if (stripped.length === 0) return true;
51
+ if (NON_ACTIONABLE_PATTERN.test(stripped)) return true;
52
+ const cjkChars = (stripped.match(/[\u4e00-\u9fff\u3400-\u4dbf]/g) || []).length;
53
+ if (cjkChars > 0 && cjkChars <= 4 && stripped.replace(/[\u4e00-\u9fff\u3400-\u4dbf\s!?!?。,,.]/g, "").length === 0) return true;
54
+ const wordCount = stripped.split(/\s+/).filter(Boolean).length;
55
+ if (wordCount > 0 && wordCount <= 3) {
56
+ if (/^(hi|hello|hey|yo|sup|ok|okay|thanks|thx|bye|goodbye|morning|evening|night|greetings?)(\s+(there|you|all|everyone|folks))?$/i.test(stripped.toLowerCase())) return true;
57
+ }
58
+ return false;
59
+ }
60
+ function isActionableObjective(objective, mentionedFiles, constraints) {
61
+ if (mentionedFiles.length > 0 || constraints.length > 0) return true;
62
+ if (cjkAwareWeight(objective) < 6) return false;
63
+ return !NON_ACTIONABLE_PATTERN.test(objective);
64
+ }
65
+ function classifyTurnMode(userMessage, activeContract) {
66
+ const objective = normalizeObjective(userMessage);
67
+ if (activeContract && activeContract.status !== "ready_to_deliver" && CONTINUATION_PATTERN.test(objective)) {
68
+ return "followUp";
69
+ }
70
+ if (isSocialOrTrivial(objective)) {
71
+ if (!activeContract || activeContract.status === "ready_to_deliver" || NON_ACTIONABLE_PATTERN.test(objective.trim())) {
72
+ return "chat";
73
+ }
74
+ return "followUp";
75
+ }
76
+ if (activeContract && activeContract.status !== "ready_to_deliver") {
77
+ const hasNewFiles = FILE_PATTERN.test(userMessage);
78
+ FILE_PATTERN.lastIndex = 0;
79
+ const hasNewConstraints = CONSTRAINT_MARKER_PATTERN.test(objective);
80
+ if (!hasNewFiles && !hasNewConstraints) {
81
+ const weight = cjkAwareWeight(objective);
82
+ if (weight < 20) return "followUp";
83
+ }
84
+ }
85
+ const mentionedFiles = [];
86
+ for (const match of userMessage.matchAll(FILE_PATTERN)) {
87
+ const file = match[1];
88
+ if (file && !mentionedFiles.includes(file)) mentionedFiles.push(file);
89
+ }
90
+ const constraints = extractConstraints(userMessage);
91
+ if (isActionableObjective(objective, mentionedFiles, constraints)) return "task";
92
+ if (activeContract && activeContract.status !== "ready_to_deliver") return "followUp";
93
+ return "chat";
94
+ }
95
+ function defaultSuccessCriteria(objective) {
96
+ if (!objective) return [];
97
+ return [
98
+ "requested behavior addressed",
99
+ "relevant verification completed or explicitly marked unverified"
100
+ ];
101
+ }
102
+ function extractConstraints(userMessage) {
103
+ const constraints = [];
104
+ for (const rawClause of userMessage.split(CLAUSE_SPLIT_PATTERN)) {
105
+ const clause = rawClause.trim();
106
+ if (!clause || !CONSTRAINT_MARKER_PATTERN.test(clause)) continue;
107
+ const text = clause.slice(0, 120);
108
+ if (!constraints.includes(text)) constraints.push(text);
109
+ }
110
+ return constraints;
111
+ }
112
+ function extractTaskContract(userMessage, turn = 0) {
113
+ const objective = normalizeObjective(userMessage);
114
+ const mentionedFiles = [];
115
+ for (const match of userMessage.matchAll(FILE_PATTERN)) {
116
+ const file = match[1];
117
+ if (file && !mentionedFiles.includes(file)) mentionedFiles.push(file);
118
+ }
119
+ const constraints = extractConstraints(userMessage);
120
+ return {
121
+ id: makeContractId(objective, turn),
122
+ objective,
123
+ scope: { mentionedFiles },
124
+ constraints,
125
+ successCriteria: defaultSuccessCriteria(objective),
126
+ status: "exploring",
127
+ createdAtTurn: turn,
128
+ updatedAtTurn: turn,
129
+ isActionable: isActionableObjective(objective, mentionedFiles, constraints)
130
+ };
131
+ }
132
+ function mergeFollowUpIntoContract(contract, userMessage, turn = contract.updatedAtTurn) {
133
+ const newConstraints = extractConstraints(userMessage);
134
+ const newFiles = [];
135
+ for (const match of userMessage.matchAll(FILE_PATTERN)) {
136
+ const file = match[1];
137
+ if (file) newFiles.push(file);
138
+ }
139
+ if (newConstraints.length === 0 && newFiles.length === 0) return contract;
140
+ const constraints = [...contract.constraints];
141
+ for (const c of newConstraints) if (!constraints.includes(c)) constraints.push(c);
142
+ const mentionedFiles = [...contract.scope.mentionedFiles];
143
+ for (const f of newFiles) if (!mentionedFiles.includes(f)) mentionedFiles.push(f);
144
+ const constraintsChanged = constraints.length !== contract.constraints.length;
145
+ const filesChanged = mentionedFiles.length !== contract.scope.mentionedFiles.length;
146
+ if (!constraintsChanged && !filesChanged) return contract;
147
+ return {
148
+ ...contract,
149
+ constraints,
150
+ scope: { mentionedFiles },
151
+ updatedAtTurn: turn,
152
+ isActionable: contract.isActionable || isActionableObjective(contract.objective, mentionedFiles, constraints)
153
+ };
154
+ }
155
+ function advanceContractStatus(contract, nextStatus, turn = contract.updatedAtTurn) {
156
+ if (contract.status === nextStatus) return contract;
157
+ if (nextStatus === "blocked") return { ...contract, status: "blocked", updatedAtTurn: turn };
158
+ if (contract.status === "blocked") return { ...contract, status: nextStatus, updatedAtTurn: turn };
159
+ if (contract.status === "ready_to_deliver" && nextStatus === "executing") {
160
+ return { ...contract, status: "executing", updatedAtTurn: turn };
161
+ }
162
+ const currentRank = STATUS_RANK[contract.status];
163
+ const nextRank = STATUS_RANK[nextStatus];
164
+ if (nextRank < currentRank) return contract;
165
+ return { ...contract, status: nextStatus, updatedAtTurn: turn };
166
+ }
167
+ function contractStatusFromPhaseClass(phaseClass) {
168
+ switch (phaseClass) {
169
+ case "explore":
170
+ return "exploring";
171
+ case "plan":
172
+ return "planning";
173
+ case "execute":
174
+ return "executing";
175
+ case "verify":
176
+ return "verifying";
177
+ case "deliver":
178
+ return "ready_to_deliver";
179
+ default:
180
+ return void 0;
181
+ }
182
+ }
183
+ function renderContractProjection(contract, projectionMode) {
184
+ if (projectionMode === "none" || projectionMode === "light") return "";
185
+ if (!contract.isActionable) return "";
186
+ const parts = [`<task-contract id="${escapeXml(contract.id)}" status="${contract.status}">`];
187
+ parts.push(` <objective>${escapeXml(contract.objective)}</objective>`);
188
+ if (contract.scope.mentionedFiles.length > 0) {
189
+ parts.push(` <scope>${contract.scope.mentionedFiles.map(escapeXml).join(", ")}</scope>`);
190
+ }
191
+ for (const constraint of contract.constraints.slice(0, 3)) {
192
+ parts.push(` <constraint>${escapeXml(constraint)}</constraint>`);
193
+ }
194
+ for (const criterion of contract.successCriteria.slice(0, 2)) {
195
+ parts.push(` <success>${escapeXml(criterion)}</success>`);
196
+ }
197
+ parts.push("</task-contract>");
198
+ return parts.join("\n");
199
+ }
200
+ function renderTaskAnchor(contract, progress = {}, projectionMode) {
201
+ if (projectionMode === "none" || projectionMode === "light") return "";
202
+ if (!contract.isActionable) return "";
203
+ const lines = [
204
+ `<task-anchor authoritative="true" status="${contract.status}">`,
205
+ "AUTHORITATIVE task definition \u2014 survives compaction verbatim. If any summary above conflicts with this block, THIS block is ground truth.",
206
+ ` <objective>${escapeXml(contract.objective)}</objective>`
207
+ ];
208
+ if (contract.scope.mentionedFiles.length > 0) {
209
+ lines.push(` <scope>${contract.scope.mentionedFiles.slice(0, TASK_ANCHOR_MAX_ITEMS).map(escapeXml).join(", ")}</scope>`);
210
+ }
211
+ for (const constraint of contract.constraints.slice(0, TASK_ANCHOR_MAX_ITEMS)) {
212
+ lines.push(` <constraint>${escapeXml(constraint)}</constraint>`);
213
+ }
214
+ for (const criterion of contract.successCriteria.slice(0, 2)) {
215
+ lines.push(` <success>${escapeXml(criterion)}</success>`);
216
+ }
217
+ const completed = (progress.completed ?? []).filter(Boolean);
218
+ const remaining = (progress.remaining ?? []).filter(Boolean);
219
+ for (const item of completed.slice(-TASK_ANCHOR_MAX_ITEMS)) {
220
+ lines.push(` <completed>${escapeXml(item)}</completed>`);
221
+ }
222
+ for (const item of remaining.slice(0, TASK_ANCHOR_MAX_ITEMS)) {
223
+ lines.push(` <remaining>${escapeXml(item)}</remaining>`);
224
+ }
225
+ lines.push("</task-anchor>");
226
+ return lines.join("\n");
227
+ }
228
+ function isActionableTurn(userMessage) {
229
+ const contract = extractTaskContract(userMessage);
230
+ return contract.isActionable;
231
+ }
232
+ var WIRING_VERB_PATTERN = /接通|对接|串联|接线|打通|wire|integrat|hook.*up|connect.*to|pipe.*through/i;
233
+ var SYSTEM_VERB_PATTERN = /端到端|全链路|end.to.end|\bE2E\b|full.path|cross.layer/i;
234
+ function classifyTaskDepth(contract, impact, taskKinds) {
235
+ const obj = contract.objective;
236
+ if (SYSTEM_VERB_PATTERN.test(obj)) return "system";
237
+ if (WIRING_VERB_PATTERN.test(obj)) return "wiring";
238
+ const fileCount = contract.scope.mentionedFiles.length;
239
+ const directDeps = impact?.directCount ?? 0;
240
+ const transitiveDeps = impact?.transitiveCount ?? 0;
241
+ if (directDeps >= 9 || directDeps >= 5 && transitiveDeps >= 10) return "system";
242
+ if (directDeps >= 3 || fileCount >= 3) return "wiring";
243
+ if (fileCount >= 2) {
244
+ const dirs = new Set(contract.scope.mentionedFiles.map((f) => f.split("/").slice(0, 2).join("/")));
245
+ if (dirs.size >= 2) return "wiring";
246
+ }
247
+ if (taskKinds && taskKinds.length > 0) {
248
+ const kinds = new Set(taskKinds);
249
+ if (kinds.has("architecture_design")) return "system";
250
+ if (kinds.has("refactor") && fileCount >= 2) return "wiring";
251
+ }
252
+ return "unit";
253
+ }
254
+ var ENFORCEMENT_SUBSYSTEM_FILES = /* @__PURE__ */ new Set([
255
+ // File-tool gate
256
+ "src/tools/path-validate.ts",
257
+ "src/tools/path-grants.ts",
258
+ // Kernel sandbox gate
259
+ "src/tools/sandbox-profile.ts",
260
+ // Approval perimeter
261
+ "src/agent/permissions.ts",
262
+ "src/agent/approval-risk.ts",
263
+ // Sandbox wrapper (bash tool)
264
+ "src/tools/bash.ts"
265
+ ]);
266
+ var MULTI_GATE_VERB_PATTERN = /双门|多门|两个.*gate|both.*enforcement|sandbox.*file.*tool|file.*sandbox|enforcement.*sync|授权.*同步|安全.*接通/i;
267
+ var SAFETY_KEYWORD_PATTERN = /(security|permission|sandbox|安全|权限|沙箱|auth(?:orization)?|validate\s*safe|writable\s*root|policy)/i;
268
+ var REFACTOR_PATTERN = /\b(refactor|rewrite|migrat(?:e|ion))\b|重构|重写|迁移改造|架构迁移/i;
269
+ function isRefactorObjective(text) {
270
+ return REFACTOR_PATTERN.test(text);
271
+ }
272
+ function classifyPlanMethodology(contract, depthLayer, _impact, override, collabBranches) {
273
+ if (override !== void 0) return override;
274
+ if (collabBranches?.some((branch) => branch === "B" || branch === "C" || branch === "D")) {
275
+ return "full";
276
+ }
277
+ const obj = contract.objective;
278
+ const files = contract.scope.mentionedFiles;
279
+ if (depthLayer === "system") return "full";
280
+ const enforcementFiles = files.filter((f) => ENFORCEMENT_SUBSYSTEM_FILES.has(f));
281
+ const enforcementFileCount = enforcementFiles.length;
282
+ if (MULTI_GATE_VERB_PATTERN.test(obj)) return "full";
283
+ if (enforcementFileCount >= 2) return "full";
284
+ const hasSafetyConstraint = contract.constraints.some((c) => SAFETY_KEYWORD_PATTERN.test(c));
285
+ if (hasSafetyConstraint) return "full";
286
+ if (REFACTOR_PATTERN.test(obj) && depthLayer !== "unit") return "full";
287
+ if (depthLayer === "wiring" && enforcementFileCount === 1 && SAFETY_KEYWORD_PATTERN.test(obj)) {
288
+ return "full";
289
+ }
290
+ if (depthLayer === "unit") return "lightweight";
291
+ return "lightweight";
292
+ }
293
+
294
+ export {
295
+ isSocialOrTrivial,
296
+ classifyTurnMode,
297
+ extractTaskContract,
298
+ mergeFollowUpIntoContract,
299
+ advanceContractStatus,
300
+ contractStatusFromPhaseClass,
301
+ renderContractProjection,
302
+ renderTaskAnchor,
303
+ isActionableTurn,
304
+ classifyTaskDepth,
305
+ isRefactorObjective,
306
+ classifyPlanMethodology
307
+ };
@@ -0,0 +1,23 @@
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/api/stable-json.ts
8
+ init_esm_shims();
9
+ function stableStringify(value) {
10
+ if (value === null || value === void 0) return JSON.stringify(value);
11
+ if (typeof value !== "object") return JSON.stringify(value);
12
+ if (Array.isArray(value)) {
13
+ return "[" + value.map(stableStringify).join(",") + "]";
14
+ }
15
+ const obj = value;
16
+ const keys = Object.keys(obj).sort();
17
+ const pairs = keys.filter((k) => obj[k] !== void 0).map((k) => JSON.stringify(k) + ":" + stableStringify(obj[k]));
18
+ return "{" + pairs.join(",") + "}";
19
+ }
20
+
21
+ export {
22
+ stableStringify
23
+ };