@fusengine/harness 0.1.89 → 0.1.91

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 (419) hide show
  1. package/dist/adapters/claude/index.d.mts +1 -1
  2. package/dist/adapters/claude/index.mjs +1 -1
  3. package/dist/adapters/cline/index.mjs +1 -1
  4. package/dist/adapters/codex/index.d.mts +2 -2
  5. package/dist/adapters/codex/index.mjs +5 -4
  6. package/dist/adapters/cursor/index.d.mts +15 -28
  7. package/dist/adapters/cursor/index.mjs +35 -46
  8. package/dist/adapters/gemini/index.mjs +1 -1
  9. package/dist/adapters/hermes/index.d.mts +1 -1
  10. package/dist/adapters/hermes/index.mjs +1 -1
  11. package/dist/adapters/kimi/index.d.mts +1 -1
  12. package/dist/adapters/kimi/index.mjs +1 -1
  13. package/dist/{claude-5bC8TDAz.mjs → claude-Ckv2_TgP.mjs} +3 -43
  14. package/dist/cli/bin.mjs +429 -16
  15. package/dist/cli/index.mjs +1 -1
  16. package/dist/command-string-CALMTnwN.mjs +42 -0
  17. package/dist/{evaluate-C1VSI5pb.mjs → evaluate-CMiIqHeH.mjs} +261 -13
  18. package/dist/{handle-DHhukRdh.mjs → handle-C43gA-Pr.mjs} +737 -150
  19. package/dist/{hermes-kP6NUQlG.mjs → hermes-B9-p_3IF.mjs} +3 -2
  20. package/dist/{index-DBgnIZn9.d.mts → index-B8PG82su.d.mts} +1 -1
  21. package/dist/{index-D4C2-IIc.d.mts → index-SmKYkk2N.d.mts} +1 -1
  22. package/dist/index.d.mts +2 -2
  23. package/dist/index.mjs +2 -2
  24. package/dist/init/index.d.mts +1 -1
  25. package/dist/init/index.mjs +1 -1
  26. package/dist/{kimi-D6X7b8wF.mjs → kimi-G2wcSh5-.mjs} +3 -2
  27. package/dist/normalize-BjG6unTj.mjs +317 -0
  28. package/dist/permission-mode-B-SFyR0X.mjs +226 -0
  29. package/dist/policy/index.d.mts +1 -1
  30. package/dist/policy/index.mjs +2 -2
  31. package/dist/prompt/index.d.mts +1 -1
  32. package/dist/{run-CdIlUtjv.mjs → run-DkrzC0gb.mjs} +1 -1
  33. package/dist/{run-TAXNRSpD.mjs → run-GHAMqcOn.mjs} +26 -3
  34. package/dist/runtime/index.d.mts +27 -16
  35. package/dist/runtime/index.mjs +2 -2
  36. package/dist/{types-C0-igRKr.d.mts → types-Bh0jEF3_.d.mts} +2 -0
  37. package/dist/{validate-DZFtAbLP.mjs → validate-KjZ1X9tH.mjs} +1 -1
  38. package/package.json +3 -2
  39. package/src/adapters/claude/index.ts +92 -0
  40. package/src/adapters/cline/index.ts +36 -0
  41. package/src/adapters/codex/apply-patch.ts +94 -0
  42. package/src/adapters/codex/index.ts +84 -0
  43. package/src/adapters/codex/permission-mode.ts +16 -0
  44. package/src/adapters/cursor/context.ts +46 -0
  45. package/src/adapters/cursor/events.ts +38 -0
  46. package/src/adapters/cursor/index.ts +43 -0
  47. package/src/adapters/cursor/interfaces/types.ts +88 -0
  48. package/src/adapters/cursor/native-response.ts +158 -0
  49. package/src/adapters/cursor/normalize.ts +123 -0
  50. package/src/adapters/cursor/respond.ts +123 -0
  51. package/src/adapters/gemini/index.ts +36 -0
  52. package/src/adapters/hermes/index.ts +55 -0
  53. package/src/adapters/hermes/interfaces/types.ts +26 -0
  54. package/src/adapters/kimi/index.ts +96 -0
  55. package/src/adapters/kimi/interfaces/types.ts +55 -0
  56. package/src/cache/compact.ts +55 -0
  57. package/src/cache/index.ts +5 -0
  58. package/src/cache/io.ts +38 -0
  59. package/src/cache/mcp-response.ts +39 -0
  60. package/src/cache/mcp-store.ts +70 -0
  61. package/src/cache/store.ts +93 -0
  62. package/src/changelog/fetch.ts +79 -0
  63. package/src/cli/bin.ts +100 -0
  64. package/src/cli/cursor-event-scanner.ts +175 -0
  65. package/src/cli/cursor-stdin-reader.ts +65 -0
  66. package/src/cli/doctor.ts +96 -0
  67. package/src/cli/hook-io.ts +130 -0
  68. package/src/cli/hook-sound.ts +49 -0
  69. package/src/cli/index.ts +1 -0
  70. package/src/cli/json-primitive-scanner.ts +83 -0
  71. package/src/cli/run.ts +36 -0
  72. package/src/cli/scope.ts +31 -0
  73. package/src/codex-rules/build.ts +63 -0
  74. package/src/codex-rules/index.ts +8 -0
  75. package/src/codex-rules/mapping.ts +42 -0
  76. package/src/codex-rules/rules/absolute-paths.ts +52 -0
  77. package/src/codex-rules/rules/ask.ts +44 -0
  78. package/src/codex-rules/rules/chmod-ask.ts +57 -0
  79. package/src/codex-rules/rules/dd.ts +23 -0
  80. package/src/codex-rules/rules/diskutil.ts +33 -0
  81. package/src/codex-rules/rules/mkfs.ts +42 -0
  82. package/src/codex-rules/rules/privilege.ts +49 -0
  83. package/src/codex-rules/rules/remote-fetch.ts +31 -0
  84. package/src/codex-rules/rules/rm-variants.ts +58 -0
  85. package/src/codex-rules/rules/single-commands.ts +57 -0
  86. package/src/codex-rules/skip-list.ts +25 -0
  87. package/src/codex-rules/starlark.ts +46 -0
  88. package/src/codex-rules/types.ts +36 -0
  89. package/src/config/dotenv.ts +55 -0
  90. package/src/config/env.ts +10 -0
  91. package/src/config/home-dir.ts +36 -0
  92. package/src/config/index.ts +5 -0
  93. package/src/config/layout.ts +52 -0
  94. package/src/config/limits.ts +56 -0
  95. package/src/config/ttl.ts +30 -0
  96. package/src/detect/harness.ts +73 -0
  97. package/src/detect/index.ts +1 -0
  98. package/src/detect/interfaces/types.ts +18 -0
  99. package/src/freshness/agent-evidence-record.ts +95 -0
  100. package/src/freshness/agent-evidence.ts +95 -0
  101. package/src/freshness/codex-spawn-evidence.ts +91 -0
  102. package/src/freshness/doc-helpers.ts +90 -0
  103. package/src/freshness/evidence-harvest-io.ts +72 -0
  104. package/src/freshness/evidence-harvest.ts +61 -0
  105. package/src/freshness/explore-tools.ts +95 -0
  106. package/src/freshness/index.ts +2 -0
  107. package/src/freshness/query-framework.ts +73 -0
  108. package/src/freshness/ref-evidence.ts +49 -0
  109. package/src/freshness/ref-journal.ts +98 -0
  110. package/src/freshness/trivial-edit-counter.ts +30 -0
  111. package/src/index.ts +11 -0
  112. package/src/init/index.ts +2 -0
  113. package/src/init/run.ts +32 -0
  114. package/src/init/templates.ts +75 -0
  115. package/src/memory/gitignore.ts +14 -0
  116. package/src/memory/index.ts +3 -0
  117. package/src/memory/registry.ts +39 -0
  118. package/src/memory/session-roots.ts +99 -0
  119. package/src/memory/state.ts +58 -0
  120. package/src/policy/apex-authorization.ts +100 -0
  121. package/src/policy/apex-gates.ts +91 -0
  122. package/src/policy/apex-target-steps.ts +73 -0
  123. package/src/policy/apex-target.ts +49 -0
  124. package/src/policy/apex-task-context.ts +81 -0
  125. package/src/policy/apex.ts +94 -0
  126. package/src/policy/cartographer/build-tree.ts +69 -0
  127. package/src/policy/cartographer/describe.ts +53 -0
  128. package/src/policy/cartographer/entry.ts +38 -0
  129. package/src/policy/cartographer/frontmatter.ts +48 -0
  130. package/src/policy/cartographer/indicators.ts +34 -0
  131. package/src/policy/claude-md-context.ts +66 -0
  132. package/src/policy/conventions/index.ts +11 -0
  133. package/src/policy/conventions/interfaces.ts +71 -0
  134. package/src/policy/conventions/langs.ts +53 -0
  135. package/src/policy/conventions/query.ts +49 -0
  136. package/src/policy/conventions/react-hooks.ts +18 -0
  137. package/src/policy/conventions/store-or-query.ts +21 -0
  138. package/src/policy/conventions/stores.ts +56 -0
  139. package/src/policy/conventions/strip.ts +87 -0
  140. package/src/policy/conventions/verdict.ts +38 -0
  141. package/src/policy/creation-intent.ts +11 -0
  142. package/src/policy/deny-loop.ts +88 -0
  143. package/src/policy/design/allowed-write.ts +28 -0
  144. package/src/policy/design/content-checks.ts +45 -0
  145. package/src/policy/design/corpus-fs.ts +21 -0
  146. package/src/policy/design/corpus-resolve-cache.ts +49 -0
  147. package/src/policy/design/corpus-resolve.ts +99 -0
  148. package/src/policy/design/corpus.ts +92 -0
  149. package/src/policy/design/design-system-rules.ts +45 -0
  150. package/src/policy/design/flag.ts +30 -0
  151. package/src/policy/design/gates-pipeline.ts +105 -0
  152. package/src/policy/design/gates.ts +87 -0
  153. package/src/policy/design/screenshot-tools.ts +24 -0
  154. package/src/policy/design/skill-evidence.ts +34 -0
  155. package/src/policy/design/skill-gate.ts +81 -0
  156. package/src/policy/design/skill-triggers.ts +51 -0
  157. package/src/policy/design/state.ts +92 -0
  158. package/src/policy/design/template-urls.ts +54 -0
  159. package/src/policy/design/transitions.ts +68 -0
  160. package/src/policy/detect-claude-md-project-type.ts +32 -0
  161. package/src/policy/detect-framework.ts +99 -0
  162. package/src/policy/detect-primitive-checks.ts +100 -0
  163. package/src/policy/detect-primitive-lib.ts +55 -0
  164. package/src/policy/detect-project.ts +99 -0
  165. package/src/policy/edit-outcome.ts +53 -0
  166. package/src/policy/evaluate.ts +81 -0
  167. package/src/policy/expert-agents.ts +60 -0
  168. package/src/policy/file-size-scope.ts +32 -0
  169. package/src/policy/file-size.ts +99 -0
  170. package/src/policy/framework-solid-exclude.ts +52 -0
  171. package/src/policy/framework-solid-extended.ts +93 -0
  172. package/src/policy/framework-solid-gates-systems.ts +99 -0
  173. package/src/policy/framework-solid-gates.ts +98 -0
  174. package/src/policy/framework-solid.ts +88 -0
  175. package/src/policy/gemini-mcp-gate.ts +83 -0
  176. package/src/policy/git-gates.ts +40 -0
  177. package/src/policy/guards/bash-command-anchor.ts +40 -0
  178. package/src/policy/guards/bash-write-patterns.ts +140 -0
  179. package/src/policy/guards/bash-write-redirects.ts +201 -0
  180. package/src/policy/guards/bash-write-safe-paths.ts +62 -0
  181. package/src/policy/guards/bash-write.ts +76 -0
  182. package/src/policy/guards/context.ts +12 -0
  183. package/src/policy/guards/index.ts +61 -0
  184. package/src/policy/guards/install.ts +22 -0
  185. package/src/policy/guards/interface-separation-ext.ts +41 -0
  186. package/src/policy/guards/interface-separation.ts +100 -0
  187. package/src/policy/guards/protected-path.ts +100 -0
  188. package/src/policy/guards/security.ts +97 -0
  189. package/src/policy/index.ts +19 -0
  190. package/src/policy/interfaces/types.ts +46 -0
  191. package/src/policy/js-gate-route.ts +51 -0
  192. package/src/policy/lessons/lesson-gate.ts +0 -0
  193. package/src/policy/lessons/trigger-index.ts +84 -0
  194. package/src/policy/lessons/types.ts +31 -0
  195. package/src/policy/module-layout.ts +31 -0
  196. package/src/policy/nearest-manifest.ts +75 -0
  197. package/src/policy/never-approval.ts +95 -0
  198. package/src/policy/patterns.ts +80 -0
  199. package/src/policy/seo/validate.ts +51 -0
  200. package/src/policy/shadcn-project.ts +22 -0
  201. package/src/policy/shadcn-skill-gate.ts +97 -0
  202. package/src/policy/shell-read-refs.ts +96 -0
  203. package/src/policy/skill-path.ts +46 -0
  204. package/src/policy/skill-patterns/laravel.ts +40 -0
  205. package/src/policy/skill-patterns/nextjs.ts +29 -0
  206. package/src/policy/skill-patterns/react.ts +27 -0
  207. package/src/policy/skill-patterns/shadcn-subskills.ts +33 -0
  208. package/src/policy/skill-patterns/shadcn.ts +66 -0
  209. package/src/policy/skill-patterns/swift.ts +30 -0
  210. package/src/policy/skill-patterns/tailwind.ts +40 -0
  211. package/src/policy/skill-source.ts +52 -0
  212. package/src/policy/skill-trigger-patterns.ts +33 -0
  213. package/src/policy/skill-triggers.ts +108 -0
  214. package/src/policy/tailwind-skill-gate.ts +63 -0
  215. package/src/policy/trivial-edits.ts +52 -0
  216. package/src/policy/verbosity.ts +39 -0
  217. package/src/prompt/index.ts +1 -0
  218. package/src/prompt/types.ts +36 -0
  219. package/src/refs/discover.ts +69 -0
  220. package/src/refs/frontmatter.ts +24 -0
  221. package/src/refs/index.ts +4 -0
  222. package/src/refs/loader.ts +59 -0
  223. package/src/refs/ref-key.ts +41 -0
  224. package/src/refs/router.ts +63 -0
  225. package/src/refs/types.ts +25 -0
  226. package/src/runtime/activity.ts +99 -0
  227. package/src/runtime/apply-patch-gate.ts +41 -0
  228. package/src/runtime/burst-window.ts +21 -0
  229. package/src/runtime/codex-shell-tool.ts +37 -0
  230. package/src/runtime/command-string.ts +37 -0
  231. package/src/runtime/confirm/codex-confirm.ts +126 -0
  232. package/src/runtime/confirm/codex-prompt-origin.ts +16 -0
  233. package/src/runtime/confirm/confirm-code.ts +33 -0
  234. package/src/runtime/confirm/confirm-gate.ts +65 -0
  235. package/src/runtime/confirm/confirm-irreversible.ts +32 -0
  236. package/src/runtime/confirm/confirm-pending.ts +34 -0
  237. package/src/runtime/confirm/confirm-state.ts +56 -0
  238. package/src/runtime/confirm/confirm-subagent.ts +112 -0
  239. package/src/runtime/confirm/confirm-submit.ts +38 -0
  240. package/src/runtime/core-guards-active.ts +84 -0
  241. package/src/runtime/core-guards-wired.ts +47 -0
  242. package/src/runtime/deny-loop-store.ts +94 -0
  243. package/src/runtime/deny-notice.ts +52 -0
  244. package/src/runtime/design-cache-resolve.ts +51 -0
  245. package/src/runtime/design-content-gate.ts +95 -0
  246. package/src/runtime/design-files-gate.ts +114 -0
  247. package/src/runtime/design-helpers.ts +93 -0
  248. package/src/runtime/design-lifecycle.ts +39 -0
  249. package/src/runtime/design-read-credit.ts +28 -0
  250. package/src/runtime/design.ts +116 -0
  251. package/src/runtime/dev-context.ts +43 -0
  252. package/src/runtime/dry-patterns.ts +32 -0
  253. package/src/runtime/dry.ts +96 -0
  254. package/src/runtime/fragment-registry.ts +33 -0
  255. package/src/runtime/framework-skill-gate.ts +79 -0
  256. package/src/runtime/fs-cleanup.ts +71 -0
  257. package/src/runtime/gate-apex.ts +81 -0
  258. package/src/runtime/gate-helpers.ts +52 -0
  259. package/src/runtime/gate-input.ts +26 -0
  260. package/src/runtime/gate.ts +128 -0
  261. package/src/runtime/handle-post.ts +104 -0
  262. package/src/runtime/handle-pre.ts +137 -0
  263. package/src/runtime/handle-scope-async.ts +29 -0
  264. package/src/runtime/handle-types.ts +27 -0
  265. package/src/runtime/handle.ts +116 -0
  266. package/src/runtime/home-state.ts +55 -0
  267. package/src/runtime/index.ts +18 -0
  268. package/src/runtime/inform.ts +28 -0
  269. package/src/runtime/inject-budget-recap.ts +47 -0
  270. package/src/runtime/inject-budget.ts +81 -0
  271. package/src/runtime/inject-context.ts +85 -0
  272. package/src/runtime/inject-dedup-exclusive.ts +98 -0
  273. package/src/runtime/inject-dedup.ts +89 -0
  274. package/src/runtime/is-agent-tool.ts +19 -0
  275. package/src/runtime/lifecycle/agent-files.ts +49 -0
  276. package/src/runtime/lifecycle/agent-memory.ts +82 -0
  277. package/src/runtime/lifecycle/agent-transcript.ts +80 -0
  278. package/src/runtime/lifecycle/aipilot/analytics.ts +99 -0
  279. package/src/runtime/lifecycle/aipilot/apex-task-store.ts +61 -0
  280. package/src/runtime/lifecycle/aipilot/cache-base.ts +48 -0
  281. package/src/runtime/lifecycle/aipilot/cache-doc.ts +100 -0
  282. package/src/runtime/lifecycle/aipilot/cache-lessons.ts +58 -0
  283. package/src/runtime/lifecycle/aipilot/cache-test.ts +70 -0
  284. package/src/runtime/lifecycle/aipilot/curate-lessons.ts +64 -0
  285. package/src/runtime/lifecycle/aipilot/dispatch-aipilot.ts +100 -0
  286. package/src/runtime/lifecycle/aipilot/doc-cache-gate.ts +69 -0
  287. package/src/runtime/lifecycle/aipilot/inject-apex.ts +98 -0
  288. package/src/runtime/lifecycle/aipilot/inject-doc.ts +62 -0
  289. package/src/runtime/lifecycle/aipilot/inject-explore.ts +64 -0
  290. package/src/runtime/lifecycle/aipilot/inject-lessons.ts +61 -0
  291. package/src/runtime/lifecycle/aipilot/inject-test.ts +48 -0
  292. package/src/runtime/lifecycle/aipilot/lesson-archive.ts +60 -0
  293. package/src/runtime/lifecycle/aipilot/lesson-inject.ts +98 -0
  294. package/src/runtime/lifecycle/aipilot/lesson-parse.ts +74 -0
  295. package/src/runtime/lifecycle/aipilot/lessons.ts +72 -0
  296. package/src/runtime/lifecycle/aipilot/promote-global-lessons.ts +92 -0
  297. package/src/runtime/lifecycle/aipilot/solid-compliance.ts +69 -0
  298. package/src/runtime/lifecycle/aipilot/solid-notice.ts +47 -0
  299. package/src/runtime/lifecycle/aipilot/solid-transcript.ts +60 -0
  300. package/src/runtime/lifecycle/aipilot/source-scan.ts +56 -0
  301. package/src/runtime/lifecycle/aipilot/sync-task.ts +75 -0
  302. package/src/runtime/lifecycle/aipilot/transcript.ts +88 -0
  303. package/src/runtime/lifecycle/aipilot/types.ts +72 -0
  304. package/src/runtime/lifecycle/auto-document-reads.ts +73 -0
  305. package/src/runtime/lifecycle/cartographer/detect.ts +57 -0
  306. package/src/runtime/lifecycle/cartographer/ecosystem-map.ts +56 -0
  307. package/src/runtime/lifecycle/cartographer/fs-util.ts +64 -0
  308. package/src/runtime/lifecycle/cartographer/merge.ts +51 -0
  309. package/src/runtime/lifecycle/cartographer/project-map.ts +49 -0
  310. package/src/runtime/lifecycle/cartographer/scan-hooks.ts +48 -0
  311. package/src/runtime/lifecycle/cartographer/scan.ts +81 -0
  312. package/src/runtime/lifecycle/cartographer/session-start.ts +33 -0
  313. package/src/runtime/lifecycle/cartographer/track-enrichment.ts +45 -0
  314. package/src/runtime/lifecycle/cartographer/write-plugin-map.ts +43 -0
  315. package/src/runtime/lifecycle/cartographer/write-tree.ts +44 -0
  316. package/src/runtime/lifecycle/changelog-research.ts +43 -0
  317. package/src/runtime/lifecycle/check-file-size.ts +61 -0
  318. package/src/runtime/lifecycle/codex-resync/fingerprint.ts +63 -0
  319. package/src/runtime/lifecycle/codex-resync/lock.ts +46 -0
  320. package/src/runtime/lifecycle/codex-resync/managed-destination.ts +39 -0
  321. package/src/runtime/lifecycle/codex-resync/materialize-agents.ts +57 -0
  322. package/src/runtime/lifecycle/codex-resync/plugin-files.ts +65 -0
  323. package/src/runtime/lifecycle/codex-resync/plugin-roots.ts +62 -0
  324. package/src/runtime/lifecycle/codex-resync/resync.ts +45 -0
  325. package/src/runtime/lifecycle/codex-resync/symlink-commands.ts +25 -0
  326. package/src/runtime/lifecycle/dispatch.ts +109 -0
  327. package/src/runtime/lifecycle/failure-lesson.ts +51 -0
  328. package/src/runtime/lifecycle/index.ts +34 -0
  329. package/src/runtime/lifecycle/inject-rules.ts +50 -0
  330. package/src/runtime/lifecycle/instructions-loaded.ts +22 -0
  331. package/src/runtime/lifecycle/kimi-rules-native.ts +44 -0
  332. package/src/runtime/lifecycle/lessons/dispatch.ts +88 -0
  333. package/src/runtime/lifecycle/lessons/reminder.ts +89 -0
  334. package/src/runtime/lifecycle/lessons/state.ts +23 -0
  335. package/src/runtime/lifecycle/memory/agent-lesson.ts +35 -0
  336. package/src/runtime/lifecycle/memory/capture-error.ts +41 -0
  337. package/src/runtime/lifecycle/memory/client.ts +65 -0
  338. package/src/runtime/lifecycle/memory/dispatch.ts +42 -0
  339. package/src/runtime/lifecycle/memory/recall.ts +30 -0
  340. package/src/runtime/lifecycle/memory/salience.ts +31 -0
  341. package/src/runtime/lifecycle/memory/state.ts +49 -0
  342. package/src/runtime/lifecycle/memory/track-ops.ts +15 -0
  343. package/src/runtime/lifecycle/post-compact.ts +38 -0
  344. package/src/runtime/lifecycle/post-edit-ts.ts +49 -0
  345. package/src/runtime/lifecycle/post-tracking.ts +40 -0
  346. package/src/runtime/lifecycle/pre-compact.ts +38 -0
  347. package/src/runtime/lifecycle/rules-root.ts +83 -0
  348. package/src/runtime/lifecycle/security/check-skill.ts +63 -0
  349. package/src/runtime/lifecycle/security/scan-patterns.ts +53 -0
  350. package/src/runtime/lifecycle/security/scan.ts +76 -0
  351. package/src/runtime/lifecycle/security/skill-state.ts +47 -0
  352. package/src/runtime/lifecycle/security/track-mcp.ts +29 -0
  353. package/src/runtime/lifecycle/security/track-skill-read.ts +31 -0
  354. package/src/runtime/lifecycle/seo/post-tool-use.ts +45 -0
  355. package/src/runtime/lifecycle/session-end.ts +17 -0
  356. package/src/runtime/lifecycle/session-start.ts +57 -0
  357. package/src/runtime/lifecycle/snapshot/board.ts +27 -0
  358. package/src/runtime/lifecycle/snapshot/format.ts +60 -0
  359. package/src/runtime/lifecycle/snapshot/git.ts +71 -0
  360. package/src/runtime/lifecycle/snapshot/index.ts +52 -0
  361. package/src/runtime/lifecycle/snapshot/version.ts +34 -0
  362. package/src/runtime/lifecycle/solid-detect.ts +56 -0
  363. package/src/runtime/lifecycle/stop-core.ts +35 -0
  364. package/src/runtime/lifecycle/subagent-cache.ts +61 -0
  365. package/src/runtime/lifecycle/task-completed.ts +94 -0
  366. package/src/runtime/lifecycle/teammate-idle-check.ts +63 -0
  367. package/src/runtime/lifecycle/teammate-idle.ts +28 -0
  368. package/src/runtime/lifecycle/tool-failure.ts +24 -0
  369. package/src/runtime/lifecycle/track-changes.ts +61 -0
  370. package/src/runtime/lifecycle/validate-solid.ts +70 -0
  371. package/src/runtime/lifecycle/validate-tailwind.ts +80 -0
  372. package/src/runtime/lifecycle-bridge.ts +74 -0
  373. package/src/runtime/mcp-key.ts +44 -0
  374. package/src/runtime/mcp-tool-name.ts +92 -0
  375. package/src/runtime/mcp.ts +91 -0
  376. package/src/runtime/modular.ts +77 -0
  377. package/src/runtime/normalize.ts +107 -0
  378. package/src/runtime/notices.ts +91 -0
  379. package/src/runtime/notification-sound.ts +49 -0
  380. package/src/runtime/notifications.ts +77 -0
  381. package/src/runtime/paths.ts +59 -0
  382. package/src/runtime/post-fanout.ts +41 -0
  383. package/src/runtime/post-outcome.ts +61 -0
  384. package/src/runtime/pre-allow.ts +97 -0
  385. package/src/runtime/precommit.ts +60 -0
  386. package/src/runtime/prompt-text.ts +38 -0
  387. package/src/runtime/receipt-capture.ts +34 -0
  388. package/src/runtime/record.ts +26 -0
  389. package/src/runtime/respond.ts +92 -0
  390. package/src/runtime/solid-file-size-gate.ts +58 -0
  391. package/src/runtime/solid-pre.ts +53 -0
  392. package/src/runtime/storage.ts +9 -0
  393. package/src/statusline/colors.ts +31 -0
  394. package/src/statusline/constants.ts +17 -0
  395. package/src/statusline/formatters.ts +54 -0
  396. package/src/statusline/index.ts +4 -0
  397. package/src/statusline/progress-bar.ts +46 -0
  398. package/src/tracking/codex-post-failure.ts +73 -0
  399. package/src/tracking/index.ts +2 -0
  400. package/src/tracking/integrity.ts +99 -0
  401. package/src/tracking/one-shot-dedup.ts +34 -0
  402. package/src/tracking/one-shot-failure.ts +42 -0
  403. package/src/tracking/one-shot-store.ts +95 -0
  404. package/src/tracking/one-shot.ts +93 -0
  405. package/src/tracking/receipts.ts +95 -0
  406. package/src/tracking/session-state.ts +94 -0
  407. package/src/tracking/store.ts +96 -0
  408. package/src/tracking/track-compact.ts +100 -0
  409. package/src/tracking/track-diff.ts +50 -0
  410. package/src/tracking/track-journal.ts +97 -0
  411. package/src/tracking/track-lock-sync.ts +83 -0
  412. package/src/tracking/track-lock.ts +67 -0
  413. package/src/util/compact-json.ts +23 -0
  414. package/src/util/index.ts +2 -0
  415. package/src/util/json-io.ts +47 -0
  416. package/src/util/project-root.ts +41 -0
  417. package/src/util/runtime-io.ts +85 -0
  418. package/src/util/semver.ts +30 -0
  419. package/dist/permission-mode-B0MUl7FT.mjs +0 -136
@@ -652,6 +652,257 @@ function securityGuard(ctx) {
652
652
  };
653
653
  }
654
654
  //#endregion
655
+ //#region src/policy/guards/bash-write-redirects.ts
656
+ function closingParen(input, start) {
657
+ let depth = 1;
658
+ let quote = null;
659
+ for (let i = start; i < input.length; i++) {
660
+ const ch = input[i];
661
+ if (ch === "\\" && quote !== "'") {
662
+ i++;
663
+ continue;
664
+ }
665
+ if (quote) {
666
+ if (ch === quote) quote = null;
667
+ continue;
668
+ }
669
+ if (ch === "'" || ch === "\"") {
670
+ quote = ch;
671
+ continue;
672
+ }
673
+ if (ch === "(") {
674
+ depth++;
675
+ continue;
676
+ }
677
+ if (ch === ")" && --depth === 0) return i;
678
+ }
679
+ return input.length;
680
+ }
681
+ function closingBacktick(input, start) {
682
+ for (let i = start; i < input.length; i++) {
683
+ if (input[i] === "\\") {
684
+ i++;
685
+ continue;
686
+ }
687
+ if (input[i] === "`") return i;
688
+ }
689
+ return input.length;
690
+ }
691
+ function closingArithmetic(input, start) {
692
+ let depth = 1;
693
+ let quote = null;
694
+ for (let i = start; i < input.length; i++) {
695
+ const ch = input[i];
696
+ if (ch === "\\" && quote !== "'") {
697
+ i++;
698
+ continue;
699
+ }
700
+ if (quote) {
701
+ if (ch === quote) quote = null;
702
+ continue;
703
+ }
704
+ if (ch === "'" || ch === "\"") {
705
+ quote = ch;
706
+ continue;
707
+ }
708
+ if (ch === "(") {
709
+ depth++;
710
+ continue;
711
+ }
712
+ if (ch !== ")") continue;
713
+ if (depth === 1 && input[i + 1] === ")") return i + 1;
714
+ depth--;
715
+ }
716
+ return input.length;
717
+ }
718
+ function closingConditional(input, start) {
719
+ let quote = null;
720
+ for (let i = start; i < input.length - 1; i++) {
721
+ const ch = input[i];
722
+ if (ch === "\\" && quote !== "'") {
723
+ i++;
724
+ continue;
725
+ }
726
+ if (quote) {
727
+ if (ch === quote) quote = null;
728
+ continue;
729
+ }
730
+ if (ch === "'" || ch === "\"") {
731
+ quote = ch;
732
+ continue;
733
+ }
734
+ if (ch === "]" && input[i + 1] === "]") return i;
735
+ }
736
+ return input.length;
737
+ }
738
+ function commentStart(input, index, start) {
739
+ return input[index] === "#" && (index === start || /[\s;|&()]/.test(input[index - 1] ?? ""));
740
+ }
741
+ function commandPosition(input, index, start) {
742
+ const prefix = input.slice(start, index);
743
+ const segment = prefix.slice(Math.max(prefix.lastIndexOf(";"), prefix.lastIndexOf("|"), prefix.lastIndexOf("&"), prefix.lastIndexOf("\n")) + 1).trim();
744
+ return segment === "" || /^(?:if|elif|while|until|then|do|!)$/.test(segment);
745
+ }
746
+ function readTarget(input, start, end) {
747
+ let out = "";
748
+ let quote = null;
749
+ for (let i = start; i < end; i++) {
750
+ const ch = input[i] ?? "";
751
+ if (ch === "\\" && quote !== "'") {
752
+ if (i + 1 < end) out += input[++i] ?? "";
753
+ continue;
754
+ }
755
+ if (quote) {
756
+ if (ch === quote) quote = null;
757
+ else out += ch;
758
+ continue;
759
+ }
760
+ if (ch === "'" || ch === "\"") {
761
+ quote = ch;
762
+ continue;
763
+ }
764
+ if (/\s|[;&|<>]/.test(ch)) break;
765
+ out += ch;
766
+ }
767
+ return out;
768
+ }
769
+ function scanDoubleQuote(input, start, end, out) {
770
+ for (let i = start; i < end; i++) {
771
+ if (input[i] === "\\") {
772
+ i++;
773
+ continue;
774
+ }
775
+ if (input[i] === "\"") return i;
776
+ if (input[i] === "$" && input[i + 1] === "(" && input[i + 2] === "(") {
777
+ const close = closingArithmetic(input, i + 3);
778
+ scanExpansions(input, i + 3, close - 1, out);
779
+ i = close;
780
+ } else if (input[i] === "$" && input[i + 1] === "(") {
781
+ const close = closingParen(input, i + 2);
782
+ scanRange(input, i + 2, close, out);
783
+ i = close;
784
+ } else if (input[i] === "`") {
785
+ const close = closingBacktick(input, i + 1);
786
+ scanRange(input, i + 1, close, out);
787
+ i = close;
788
+ }
789
+ }
790
+ return end;
791
+ }
792
+ function scanExpansions(input, start, end, out) {
793
+ for (let i = start; i < end; i++) {
794
+ if (input[i] === "\\") {
795
+ i++;
796
+ continue;
797
+ }
798
+ if (commentStart(input, i, start)) {
799
+ const newline = input.indexOf("\n", i + 1);
800
+ i = newline < 0 || newline >= end ? end : newline;
801
+ continue;
802
+ }
803
+ if (input[i] === "'") {
804
+ const close = input.indexOf("'", i + 1);
805
+ i = close < 0 || close >= end ? end : close;
806
+ continue;
807
+ }
808
+ if (input[i] === "\"") {
809
+ i = scanDoubleQuote(input, i + 1, end, out);
810
+ continue;
811
+ }
812
+ if (input[i] === "$" && input[i + 1] === "(" && input[i + 2] === "(") {
813
+ const close = closingArithmetic(input, i + 3);
814
+ scanExpansions(input, i + 3, close - 1, out);
815
+ i = close;
816
+ } else if (input[i] === "$" && input[i + 1] === "(") {
817
+ const close = closingParen(input, i + 2);
818
+ scanRange(input, i + 2, close, out);
819
+ i = close;
820
+ } else if (input[i] === "`") {
821
+ const close = closingBacktick(input, i + 1);
822
+ scanRange(input, i + 1, close, out);
823
+ i = close;
824
+ }
825
+ }
826
+ }
827
+ function scanRange(input, start, end, out) {
828
+ for (let i = start; i < end; i++) {
829
+ const ch = input[i];
830
+ if (ch === "\\") {
831
+ i++;
832
+ continue;
833
+ }
834
+ if (commentStart(input, i, start)) {
835
+ const newline = input.indexOf("\n", i + 1);
836
+ i = newline < 0 || newline >= end ? end : newline;
837
+ continue;
838
+ }
839
+ if (ch === "'") {
840
+ const close = input.indexOf("'", i + 1);
841
+ i = close < 0 || close >= end ? end : close;
842
+ continue;
843
+ }
844
+ if (ch === "\"") {
845
+ i = scanDoubleQuote(input, i + 1, end, out);
846
+ continue;
847
+ }
848
+ if (ch === "[" && input[i + 1] === "[" && commandPosition(input, i, start)) {
849
+ const close = closingConditional(input, i + 2);
850
+ scanExpansions(input, i + 2, close, out);
851
+ i = close + 1;
852
+ continue;
853
+ }
854
+ if (ch === "(" && input[i + 1] === "(" && commandPosition(input, i, start)) {
855
+ const close = closingArithmetic(input, i + 2);
856
+ scanExpansions(input, i + 2, close - 1, out);
857
+ i = close;
858
+ continue;
859
+ }
860
+ if (ch === "$" && input[i + 1] === "(" && input[i + 2] === "(") {
861
+ const close = closingArithmetic(input, i + 3);
862
+ scanExpansions(input, i + 3, close - 1, out);
863
+ i = close;
864
+ continue;
865
+ }
866
+ if (ch === "$" && input[i + 1] === "(") {
867
+ const close = closingParen(input, i + 2);
868
+ scanRange(input, i + 2, close, out);
869
+ i = close;
870
+ continue;
871
+ }
872
+ if (ch === "`") {
873
+ const close = closingBacktick(input, i + 1);
874
+ scanRange(input, i + 1, close, out);
875
+ i = close;
876
+ continue;
877
+ }
878
+ if (ch !== ">") continue;
879
+ if (input[i + 1] === "(") continue;
880
+ if (input[i - 1] === "&") {
881
+ if (input[i + 1] === ">") i++;
882
+ continue;
883
+ }
884
+ let opStart = i;
885
+ while (opStart > start && /\d/.test(input[opStart - 1] ?? "")) opStart--;
886
+ if (input[opStart - 1] === "&") opStart--;
887
+ let cursor = i + (input[i + 1] === ">" || input[i + 1] === "|" ? 2 : 1);
888
+ const operator = input.slice(opStart, cursor);
889
+ while (/\s/.test(input[cursor] ?? "")) cursor++;
890
+ if (input[cursor] === "&") continue;
891
+ const target = readTarget(input, cursor, end);
892
+ if (target) out.push({
893
+ start: opStart,
894
+ operator,
895
+ target
896
+ });
897
+ }
898
+ }
899
+ /** Return active output redirects, excluding quoted/escaped `>` characters. */
900
+ function shellOutputRedirects(command) {
901
+ const out = [];
902
+ scanRange(command, 0, command.length, out);
903
+ return out;
904
+ }
905
+ //#endregion
655
906
  //#region src/policy/guards/protected-path.ts
656
907
  /**
657
908
  * Path fragments that mark a location as internal/generated state.
@@ -709,7 +960,7 @@ function extractWriteTargets(cmd) {
709
960
  const v = unquote((t ?? "").trim());
710
961
  if (v && v !== "/dev/null") out.push(v);
711
962
  };
712
- for (const m of cmd.matchAll(/(?<![2&\d])>{1,2}\s*('[^']+'|"[^"]+"|\S+)/g)) push(m[1]);
963
+ for (const redirect of shellOutputRedirects(cmd)) push(redirect.target);
713
964
  for (const m of cmd.matchAll(/\btee\b(?:\s+-\S+)*\s+('[^']+'|"[^"]+"|\S+)/g)) push(m[1]);
714
965
  for (const m of cmd.matchAll(/\bdd\b[^|;&]*\bof=('[^']+'|"[^"]+"|\S+)/g)) push(m[1]);
715
966
  for (const seg of cmd.split(/[;&|]+/)) {
@@ -755,15 +1006,10 @@ function resolvePath(raw) {
755
1006
  const stripped = raw.trim().replace(/^['"]|['"]$/g, "");
756
1007
  return normalize((stripped === "~" || stripped.startsWith("~/") ? homedir() + stripped.slice(1) : stripped).replace(/\$HOME/g, homedir()));
757
1008
  }
758
- /** Extract the file path after a `>`/`>>` redirect (parity extract_redirect_target). */
759
- function extractRedirectTarget(cmd) {
760
- const m = cmd.match(/>>\s*(\S+)|(?<![0-9&])>\s*(\S+)/);
761
- return m ? resolvePath(m[1] ?? m[2] ?? "") : null;
762
- }
763
1009
  /** True when a `>`/`>>` redirect targets a harness-owned safe path (parity is_safe_write_path). */
764
1010
  function isSafeWritePath(cmd) {
765
- const target = extractRedirectTarget(cmd);
766
- return target !== null && SAFE_WRITE_PATHS.some((safe) => target === safe || target.startsWith(safe + "/"));
1011
+ const targets = shellOutputRedirects(cmd).map((redirect) => resolvePath(redirect.target)).filter((target) => target !== "/dev/null");
1012
+ return targets.length > 0 && targets.every((target) => SAFE_WRITE_PATHS.some((safe) => target === safe || target.startsWith(safe + "/")));
767
1013
  }
768
1014
  /** Extract the file argument of `tee`/`dd of=` (parity extract_command_target). */
769
1015
  function extractCommandTarget(cmd) {
@@ -976,9 +1222,10 @@ function blockCodeWrite(reason) {
976
1222
  actions: ["Use the Write/Edit tool instead"]
977
1223
  };
978
1224
  }
979
- function askFileWrite(reason) {
1225
+ function askFileWrite(reason, ruleId = "bash-write:file-write") {
980
1226
  return {
981
1227
  kind: "ask",
1228
+ ruleId,
982
1229
  title: "Bash file write",
983
1230
  reason,
984
1231
  actions: ["Use the Write/Edit tool instead"]
@@ -1002,20 +1249,21 @@ function bashWriteGuard(ctx) {
1002
1249
  if (ctx.tool !== "Bash" || !ctx.command) return null;
1003
1250
  const cmd = ctx.command;
1004
1251
  const stripped = cmd.trim();
1252
+ const redirects = shellOutputRedirects(cmd).filter((redirect) => redirect.target !== "/dev/null");
1005
1253
  const mutator = CODE_MUTATORS.find((m) => m.re.test(cmd));
1006
1254
  if (mutator) return blockCodeWrite(`${mutator.desc} — Use Edit/Write tools instead`);
1007
1255
  if (CODE_COMMAND_WRITE.test(cmd)) return blockCodeWrite("tee/dd into a code file — Use Edit/Write tools instead");
1008
1256
  if (PYTHON_C_ANCHOR.test(cmd) && PYTHON_WRITES.test(cmd)) return blockCodeWrite("Python inline script mutates files/spawns a process — Use Edit/Write tools instead");
1009
- if (SAFE_PREFIXES.some((p) => stripped.startsWith(p)) && !FILE_REDIRECT.test(stripped)) return null;
1257
+ if (SAFE_PREFIXES.some((p) => stripped.startsWith(p)) && redirects.length === 0) return null;
1010
1258
  if (cmd.includes(".fuse-harness/cache/sessions")) return {
1011
1259
  kind: "block",
1012
1260
  title: "Session-state tampering",
1013
1261
  reason: "Bash access to the harness session-state directory is a hook-bypass vector — the freshness/APEX enforcement reads it to decide block/allow.",
1014
1262
  actions: ["Never read or write session state from the shell"]
1015
1263
  };
1016
- if (FILE_REDIRECT.test(cmd)) {
1264
+ if (redirects.length > 0) {
1017
1265
  if (isSafeWritePath(cmd)) return null;
1018
- return CODE_REDIRECT.test(cmd) ? blockCodeWrite("Bash redirect to code file — Use Write/Edit tools (enforces APEX + SOLID specs)") : askFileWrite("Shell redirect to file detected. Authorize?");
1266
+ return redirects.some((redirect) => /\.(?:ts|tsx|js|jsx|py|go|rb|rs|java|kt|php|swift|vue|svelte|astro|css|c|cpp|h)\b/.test(redirect.target)) ? blockCodeWrite("Bash redirect to code file — Use Write/Edit tools (enforces APEX + SOLID specs)") : askFileWrite("Shell redirect to file detected. Authorize?", "bash-write:file-redirect");
1019
1267
  }
1020
1268
  if (/\bnode\s+-e\b/.test(cmd) && NODE_WRITES.test(cmd)) return hasSafeWriteTarget(cmd) ? null : askFileWrite("Node.js write operation detected. Authorize?");
1021
1269
  if (/\bruby\s+-e\b/.test(cmd) && RUBY_WRITES.test(cmd)) return askFileWrite("Ruby write operation detected. Authorize?");
@@ -1541,4 +1789,4 @@ function evaluate(ctx) {
1541
1789
  };
1542
1790
  }
1543
1791
  //#endregion
1544
- export { matchPatterns as $, moduleAwarePath as A, protectedPathGuard as B, isInterfacesPath as C, isVendorPath as D, isTypesPath as E, FILE_REDIRECT as F, isFileSizeScoped as G, CRITICAL_PATTERNS as H, SAFE_PREFIXES as I, GIT_BLOCKED as J, resolveSolidRefFramework as K, SESSION_STATE_FRAGMENT as L, ASK_WRITERS as M, CODE_MUTATORS as N, langOfPath as O, CODE_REDIRECT as P, isRalphMode as Q, PROTECTED_FRAGMENTS as R, isHooksPath as S, isStoresPath as T, securityGuard as U, ASK_PATTERNS as V, computeEditResultLines as W, RALPH_SAFE as X, PROJECT_INSTALL as Y, SYSTEM_INSTALL as Z, rolloutVerdict as _, registerGuard as a, DEV_KEYWORDS as at, interfaceDeclLevel as b, GO_DECL_RE as c, isApexCommand as ct, PY_MODEL_RE as d, detectFramework as et, RUST_DECL_RE as f, conventionsMode as g, interfaceSeparationGuard as h, clearUserGuards as i, maskCommentsOnly as it, bashWriteGuard as j, lexProfileOf as k, JAVA_DECL_RE as l, requiredArchSkill as lt, TS_DECL_RE as m, FAIL_CLOSED as n, projectCaps as nt, runGuards as o, detectModularArchitecture as ot, SWIFT_PROTO_RE as p, GIT_ASK as q, GUARDS as r, maskCommentsAndStrings as rt, installGuard as s, detectProjectType as st, evaluate as t, nearestManifestDir as tt, PHP_DECL_RE as u, declaresExportedTypeAlias as v, isQueryPath as w, isComponentsPath as x, declaresInterface as y, PROTECTED_GIT_RE as z };
1792
+ export { isRalphMode as $, moduleAwarePath as A, protectedPathGuard as B, isInterfacesPath as C, isVendorPath as D, isTypesPath as E, FILE_REDIRECT as F, computeEditResultLines as G, ASK_PATTERNS as H, SAFE_PREFIXES as I, GIT_ASK as J, isFileSizeScoped as K, SESSION_STATE_FRAGMENT as L, ASK_WRITERS as M, CODE_MUTATORS as N, langOfPath as O, CODE_REDIRECT as P, SYSTEM_INSTALL as Q, PROTECTED_FRAGMENTS as R, isHooksPath as S, isStoresPath as T, CRITICAL_PATTERNS as U, shellOutputRedirects as V, securityGuard as W, PROJECT_INSTALL as X, GIT_BLOCKED as Y, RALPH_SAFE as Z, rolloutVerdict as _, registerGuard as a, maskCommentsOnly as at, interfaceDeclLevel as b, GO_DECL_RE as c, detectProjectType as ct, PY_MODEL_RE as d, matchPatterns as et, RUST_DECL_RE as f, conventionsMode as g, interfaceSeparationGuard as h, clearUserGuards as i, maskCommentsAndStrings as it, bashWriteGuard as j, lexProfileOf as k, JAVA_DECL_RE as l, isApexCommand as lt, TS_DECL_RE as m, FAIL_CLOSED as n, nearestManifestDir as nt, runGuards as o, DEV_KEYWORDS as ot, SWIFT_PROTO_RE as p, resolveSolidRefFramework as q, GUARDS as r, projectCaps as rt, installGuard as s, detectModularArchitecture as st, evaluate as t, detectFramework as tt, PHP_DECL_RE as u, requiredArchSkill as ut, declaresExportedTypeAlias as v, isQueryPath as w, isComponentsPath as x, declaresInterface as y, PROTECTED_GIT_RE as z };