usesteady 0.1.0-alpha.1

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 (665) hide show
  1. package/LICENSE +186 -0
  2. package/README.md +724 -0
  3. package/bin/use-steady.js +13 -0
  4. package/dist/server-store.d.ts +68 -0
  5. package/dist/server-store.d.ts.map +1 -0
  6. package/dist/server-store.js +133 -0
  7. package/dist/server-store.js.map +1 -0
  8. package/dist/server.d.ts +35 -0
  9. package/dist/server.d.ts.map +1 -0
  10. package/dist/server.js +569 -0
  11. package/dist/server.js.map +1 -0
  12. package/dist/src/claude/adapters/api-adapter.d.ts +99 -0
  13. package/dist/src/claude/adapters/api-adapter.d.ts.map +1 -0
  14. package/dist/src/claude/adapters/api-adapter.js +415 -0
  15. package/dist/src/claude/adapters/api-adapter.js.map +1 -0
  16. package/dist/src/claude/adapters/stub-adapter.d.ts +73 -0
  17. package/dist/src/claude/adapters/stub-adapter.d.ts.map +1 -0
  18. package/dist/src/claude/adapters/stub-adapter.js +114 -0
  19. package/dist/src/claude/adapters/stub-adapter.js.map +1 -0
  20. package/dist/src/claude/artifact-mapper.d.ts +85 -0
  21. package/dist/src/claude/artifact-mapper.d.ts.map +1 -0
  22. package/dist/src/claude/artifact-mapper.js +187 -0
  23. package/dist/src/claude/artifact-mapper.js.map +1 -0
  24. package/dist/src/claude/delivery-gate.d.ts +136 -0
  25. package/dist/src/claude/delivery-gate.d.ts.map +1 -0
  26. package/dist/src/claude/delivery-gate.js +231 -0
  27. package/dist/src/claude/delivery-gate.js.map +1 -0
  28. package/dist/src/claude/index.d.ts +24 -0
  29. package/dist/src/claude/index.d.ts.map +1 -0
  30. package/dist/src/claude/index.js +23 -0
  31. package/dist/src/claude/index.js.map +1 -0
  32. package/dist/src/claude/types.d.ts +223 -0
  33. package/dist/src/claude/types.d.ts.map +1 -0
  34. package/dist/src/claude/types.js +64 -0
  35. package/dist/src/claude/types.js.map +1 -0
  36. package/dist/src/control/compiler.d.ts +125 -0
  37. package/dist/src/control/compiler.d.ts.map +1 -0
  38. package/dist/src/control/compiler.js +179 -0
  39. package/dist/src/control/compiler.js.map +1 -0
  40. package/dist/src/control/constraints.d.ts +42 -0
  41. package/dist/src/control/constraints.d.ts.map +1 -0
  42. package/dist/src/control/constraints.js +116 -0
  43. package/dist/src/control/constraints.js.map +1 -0
  44. package/dist/src/control/drift-detector.d.ts +49 -0
  45. package/dist/src/control/drift-detector.d.ts.map +1 -0
  46. package/dist/src/control/drift-detector.js +115 -0
  47. package/dist/src/control/drift-detector.js.map +1 -0
  48. package/dist/src/control/index.d.ts +44 -0
  49. package/dist/src/control/index.d.ts.map +1 -0
  50. package/dist/src/control/index.js +40 -0
  51. package/dist/src/control/index.js.map +1 -0
  52. package/dist/src/control/types.d.ts +144 -0
  53. package/dist/src/control/types.d.ts.map +1 -0
  54. package/dist/src/control/types.js +57 -0
  55. package/dist/src/control/types.js.map +1 -0
  56. package/dist/src/cursor/adapters/inprocess-adapter.d.ts +78 -0
  57. package/dist/src/cursor/adapters/inprocess-adapter.d.ts.map +1 -0
  58. package/dist/src/cursor/adapters/inprocess-adapter.js +308 -0
  59. package/dist/src/cursor/adapters/inprocess-adapter.js.map +1 -0
  60. package/dist/src/cursor/adapters/stub-adapter.d.ts +75 -0
  61. package/dist/src/cursor/adapters/stub-adapter.d.ts.map +1 -0
  62. package/dist/src/cursor/adapters/stub-adapter.js +120 -0
  63. package/dist/src/cursor/adapters/stub-adapter.js.map +1 -0
  64. package/dist/src/cursor/artifact-mapper.d.ts +81 -0
  65. package/dist/src/cursor/artifact-mapper.d.ts.map +1 -0
  66. package/dist/src/cursor/artifact-mapper.js +203 -0
  67. package/dist/src/cursor/artifact-mapper.js.map +1 -0
  68. package/dist/src/cursor/delivery-gate.d.ts +144 -0
  69. package/dist/src/cursor/delivery-gate.d.ts.map +1 -0
  70. package/dist/src/cursor/delivery-gate.js +208 -0
  71. package/dist/src/cursor/delivery-gate.js.map +1 -0
  72. package/dist/src/cursor/glob-matcher.d.ts +30 -0
  73. package/dist/src/cursor/glob-matcher.d.ts.map +1 -0
  74. package/dist/src/cursor/glob-matcher.js +68 -0
  75. package/dist/src/cursor/glob-matcher.js.map +1 -0
  76. package/dist/src/cursor/index.d.ts +43 -0
  77. package/dist/src/cursor/index.d.ts.map +1 -0
  78. package/dist/src/cursor/index.js +44 -0
  79. package/dist/src/cursor/index.js.map +1 -0
  80. package/dist/src/cursor/ocd-evaluator.d.ts +89 -0
  81. package/dist/src/cursor/ocd-evaluator.d.ts.map +1 -0
  82. package/dist/src/cursor/ocd-evaluator.js +142 -0
  83. package/dist/src/cursor/ocd-evaluator.js.map +1 -0
  84. package/dist/src/cursor/types.d.ts +309 -0
  85. package/dist/src/cursor/types.d.ts.map +1 -0
  86. package/dist/src/cursor/types.js +48 -0
  87. package/dist/src/cursor/types.js.map +1 -0
  88. package/dist/src/execution/claude/claude-execution-coordinator.d.ts +164 -0
  89. package/dist/src/execution/claude/claude-execution-coordinator.d.ts.map +1 -0
  90. package/dist/src/execution/claude/claude-execution-coordinator.js +198 -0
  91. package/dist/src/execution/claude/claude-execution-coordinator.js.map +1 -0
  92. package/dist/src/execution/claude/index.d.ts +13 -0
  93. package/dist/src/execution/claude/index.d.ts.map +1 -0
  94. package/dist/src/execution/claude/index.js +12 -0
  95. package/dist/src/execution/claude/index.js.map +1 -0
  96. package/dist/src/execution/cursor/cursor-execution-coordinator.d.ts +216 -0
  97. package/dist/src/execution/cursor/cursor-execution-coordinator.d.ts.map +1 -0
  98. package/dist/src/execution/cursor/cursor-execution-coordinator.js +233 -0
  99. package/dist/src/execution/cursor/cursor-execution-coordinator.js.map +1 -0
  100. package/dist/src/execution/cursor/index.d.ts +20 -0
  101. package/dist/src/execution/cursor/index.d.ts.map +1 -0
  102. package/dist/src/execution/cursor/index.js +18 -0
  103. package/dist/src/execution/cursor/index.js.map +1 -0
  104. package/dist/src/execution/reminders/index.d.ts +11 -0
  105. package/dist/src/execution/reminders/index.d.ts.map +1 -0
  106. package/dist/src/execution/reminders/index.js +9 -0
  107. package/dist/src/execution/reminders/index.js.map +1 -0
  108. package/dist/src/execution/reminders/reminder-execution-coordinator.d.ts +125 -0
  109. package/dist/src/execution/reminders/reminder-execution-coordinator.d.ts.map +1 -0
  110. package/dist/src/execution/reminders/reminder-execution-coordinator.js +129 -0
  111. package/dist/src/execution/reminders/reminder-execution-coordinator.js.map +1 -0
  112. package/dist/src/execution/reminders/reminder-execution-types.d.ts +161 -0
  113. package/dist/src/execution/reminders/reminder-execution-types.d.ts.map +1 -0
  114. package/dist/src/execution/reminders/reminder-execution-types.js +39 -0
  115. package/dist/src/execution/reminders/reminder-execution-types.js.map +1 -0
  116. package/dist/src/execution/reminders/reminder-execution-validator.d.ts +45 -0
  117. package/dist/src/execution/reminders/reminder-execution-validator.d.ts.map +1 -0
  118. package/dist/src/execution/reminders/reminder-execution-validator.js +92 -0
  119. package/dist/src/execution/reminders/reminder-execution-validator.js.map +1 -0
  120. package/dist/src/execution/reminders/reminder-executor.d.ts +62 -0
  121. package/dist/src/execution/reminders/reminder-executor.d.ts.map +1 -0
  122. package/dist/src/execution/reminders/reminder-executor.js +113 -0
  123. package/dist/src/execution/reminders/reminder-executor.js.map +1 -0
  124. package/dist/src/execution/reminders/reminder-time-parser.d.ts +41 -0
  125. package/dist/src/execution/reminders/reminder-time-parser.d.ts.map +1 -0
  126. package/dist/src/execution/reminders/reminder-time-parser.js +113 -0
  127. package/dist/src/execution/reminders/reminder-time-parser.js.map +1 -0
  128. package/dist/src/friction/auto-capture.d.ts +38 -0
  129. package/dist/src/friction/auto-capture.d.ts.map +1 -0
  130. package/dist/src/friction/auto-capture.js +133 -0
  131. package/dist/src/friction/auto-capture.js.map +1 -0
  132. package/dist/src/friction/client.d.ts +39 -0
  133. package/dist/src/friction/client.d.ts.map +1 -0
  134. package/dist/src/friction/client.js +165 -0
  135. package/dist/src/friction/client.js.map +1 -0
  136. package/dist/src/friction/config.d.ts +16 -0
  137. package/dist/src/friction/config.d.ts.map +1 -0
  138. package/dist/src/friction/config.js +56 -0
  139. package/dist/src/friction/config.js.map +1 -0
  140. package/dist/src/friction/github-auth.d.ts +41 -0
  141. package/dist/src/friction/github-auth.d.ts.map +1 -0
  142. package/dist/src/friction/github-auth.js +155 -0
  143. package/dist/src/friction/github-auth.js.map +1 -0
  144. package/dist/src/friction/github-issues.d.ts +51 -0
  145. package/dist/src/friction/github-issues.d.ts.map +1 -0
  146. package/dist/src/friction/github-issues.js +118 -0
  147. package/dist/src/friction/github-issues.js.map +1 -0
  148. package/dist/src/friction/payout-ledger.d.ts +45 -0
  149. package/dist/src/friction/payout-ledger.d.ts.map +1 -0
  150. package/dist/src/friction/payout-ledger.js +111 -0
  151. package/dist/src/friction/payout-ledger.js.map +1 -0
  152. package/dist/src/friction/queue.d.ts +42 -0
  153. package/dist/src/friction/queue.d.ts.map +1 -0
  154. package/dist/src/friction/queue.js +179 -0
  155. package/dist/src/friction/queue.js.map +1 -0
  156. package/dist/src/friction/reviewer.d.ts +42 -0
  157. package/dist/src/friction/reviewer.d.ts.map +1 -0
  158. package/dist/src/friction/reviewer.js +269 -0
  159. package/dist/src/friction/reviewer.js.map +1 -0
  160. package/dist/src/friction/types.d.ts +63 -0
  161. package/dist/src/friction/types.d.ts.map +1 -0
  162. package/dist/src/friction/types.js +18 -0
  163. package/dist/src/friction/types.js.map +1 -0
  164. package/dist/src/history/index.d.ts +39 -0
  165. package/dist/src/history/index.d.ts.map +1 -0
  166. package/dist/src/history/index.js +41 -0
  167. package/dist/src/history/index.js.map +1 -0
  168. package/dist/src/history/session-chain.d.ts +36 -0
  169. package/dist/src/history/session-chain.d.ts.map +1 -0
  170. package/dist/src/history/session-chain.js +91 -0
  171. package/dist/src/history/session-chain.js.map +1 -0
  172. package/dist/src/history/types.d.ts +130 -0
  173. package/dist/src/history/types.d.ts.map +1 -0
  174. package/dist/src/history/types.js +32 -0
  175. package/dist/src/history/types.js.map +1 -0
  176. package/dist/src/history/workflow-history.d.ts +48 -0
  177. package/dist/src/history/workflow-history.d.ts.map +1 -0
  178. package/dist/src/history/workflow-history.js +116 -0
  179. package/dist/src/history/workflow-history.js.map +1 -0
  180. package/dist/src/index.d.ts +88 -0
  181. package/dist/src/index.d.ts.map +1 -0
  182. package/dist/src/index.js +58 -0
  183. package/dist/src/index.js.map +1 -0
  184. package/dist/src/intake/classify-intent-state.d.ts +20 -0
  185. package/dist/src/intake/classify-intent-state.d.ts.map +1 -0
  186. package/dist/src/intake/classify-intent-state.js +29 -0
  187. package/dist/src/intake/classify-intent-state.js.map +1 -0
  188. package/dist/src/intake/intake-service.d.ts +105 -0
  189. package/dist/src/intake/intake-service.d.ts.map +1 -0
  190. package/dist/src/intake/intake-service.js +407 -0
  191. package/dist/src/intake/intake-service.js.map +1 -0
  192. package/dist/src/intake/response-planner.d.ts +25 -0
  193. package/dist/src/intake/response-planner.d.ts.map +1 -0
  194. package/dist/src/intake/response-planner.js +52 -0
  195. package/dist/src/intake/response-planner.js.map +1 -0
  196. package/dist/src/intake/signal-extractor.d.ts +25 -0
  197. package/dist/src/intake/signal-extractor.d.ts.map +1 -0
  198. package/dist/src/intake/signal-extractor.js +42 -0
  199. package/dist/src/intake/signal-extractor.js.map +1 -0
  200. package/dist/src/intake/trace.d.ts +157 -0
  201. package/dist/src/intake/trace.d.ts.map +1 -0
  202. package/dist/src/intake/trace.js +38 -0
  203. package/dist/src/intake/trace.js.map +1 -0
  204. package/dist/src/intake/types.d.ts +70 -0
  205. package/dist/src/intake/types.d.ts.map +1 -0
  206. package/dist/src/intake/types.js +30 -0
  207. package/dist/src/intake/types.js.map +1 -0
  208. package/dist/src/interaction/defaults.d.ts +12 -0
  209. package/dist/src/interaction/defaults.d.ts.map +1 -0
  210. package/dist/src/interaction/defaults.js +26 -0
  211. package/dist/src/interaction/defaults.js.map +1 -0
  212. package/dist/src/interaction/guidance-order.d.ts +53 -0
  213. package/dist/src/interaction/guidance-order.d.ts.map +1 -0
  214. package/dist/src/interaction/guidance-order.js +131 -0
  215. package/dist/src/interaction/guidance-order.js.map +1 -0
  216. package/dist/src/interaction/observe.d.ts +57 -0
  217. package/dist/src/interaction/observe.d.ts.map +1 -0
  218. package/dist/src/interaction/observe.js +77 -0
  219. package/dist/src/interaction/observe.js.map +1 -0
  220. package/dist/src/interaction/selectors.d.ts +16 -0
  221. package/dist/src/interaction/selectors.d.ts.map +1 -0
  222. package/dist/src/interaction/selectors.js +23 -0
  223. package/dist/src/interaction/selectors.js.map +1 -0
  224. package/dist/src/interaction/types.d.ts +105 -0
  225. package/dist/src/interaction/types.d.ts.map +1 -0
  226. package/dist/src/interaction/types.js +48 -0
  227. package/dist/src/interaction/types.js.map +1 -0
  228. package/dist/src/interaction/updater.d.ts +22 -0
  229. package/dist/src/interaction/updater.d.ts.map +1 -0
  230. package/dist/src/interaction/updater.js +87 -0
  231. package/dist/src/interaction/updater.js.map +1 -0
  232. package/dist/src/present/boundary-explanation/boundary-explanation-detector.d.ts +48 -0
  233. package/dist/src/present/boundary-explanation/boundary-explanation-detector.d.ts.map +1 -0
  234. package/dist/src/present/boundary-explanation/boundary-explanation-detector.js +107 -0
  235. package/dist/src/present/boundary-explanation/boundary-explanation-detector.js.map +1 -0
  236. package/dist/src/present/boundary-explanation/boundary-explanation-types.d.ts +43 -0
  237. package/dist/src/present/boundary-explanation/boundary-explanation-types.d.ts.map +1 -0
  238. package/dist/src/present/boundary-explanation/boundary-explanation-types.js +20 -0
  239. package/dist/src/present/boundary-explanation/boundary-explanation-types.js.map +1 -0
  240. package/dist/src/present/boundary-explanation/index.d.ts +10 -0
  241. package/dist/src/present/boundary-explanation/index.d.ts.map +1 -0
  242. package/dist/src/present/boundary-explanation/index.js +2 -0
  243. package/dist/src/present/boundary-explanation/index.js.map +1 -0
  244. package/dist/src/present/control-visibility/control-visibility-assertions.d.ts +70 -0
  245. package/dist/src/present/control-visibility/control-visibility-assertions.d.ts.map +1 -0
  246. package/dist/src/present/control-visibility/control-visibility-assertions.js +138 -0
  247. package/dist/src/present/control-visibility/control-visibility-assertions.js.map +1 -0
  248. package/dist/src/present/control-visibility/control-visibility-evaluator.d.ts +67 -0
  249. package/dist/src/present/control-visibility/control-visibility-evaluator.d.ts.map +1 -0
  250. package/dist/src/present/control-visibility/control-visibility-evaluator.js +146 -0
  251. package/dist/src/present/control-visibility/control-visibility-evaluator.js.map +1 -0
  252. package/dist/src/present/control-visibility/control-visibility-types.d.ts +113 -0
  253. package/dist/src/present/control-visibility/control-visibility-types.d.ts.map +1 -0
  254. package/dist/src/present/control-visibility/control-visibility-types.js +24 -0
  255. package/dist/src/present/control-visibility/control-visibility-types.js.map +1 -0
  256. package/dist/src/present/control-visibility/index.d.ts +16 -0
  257. package/dist/src/present/control-visibility/index.d.ts.map +1 -0
  258. package/dist/src/present/control-visibility/index.js +15 -0
  259. package/dist/src/present/control-visibility/index.js.map +1 -0
  260. package/dist/src/present/format.d.ts +57 -0
  261. package/dist/src/present/format.d.ts.map +1 -0
  262. package/dist/src/present/format.js +150 -0
  263. package/dist/src/present/format.js.map +1 -0
  264. package/dist/src/present/present-coordinator.d.ts +153 -0
  265. package/dist/src/present/present-coordinator.d.ts.map +1 -0
  266. package/dist/src/present/present-coordinator.js +213 -0
  267. package/dist/src/present/present-coordinator.js.map +1 -0
  268. package/dist/src/present/reminders/index.d.ts +22 -0
  269. package/dist/src/present/reminders/index.d.ts.map +1 -0
  270. package/dist/src/present/reminders/index.js +22 -0
  271. package/dist/src/present/reminders/index.js.map +1 -0
  272. package/dist/src/present/reminders/reminder-presenter.d.ts +76 -0
  273. package/dist/src/present/reminders/reminder-presenter.d.ts.map +1 -0
  274. package/dist/src/present/reminders/reminder-presenter.js +359 -0
  275. package/dist/src/present/reminders/reminder-presenter.js.map +1 -0
  276. package/dist/src/present/reminders/reminder-renderer.d.ts +82 -0
  277. package/dist/src/present/reminders/reminder-renderer.d.ts.map +1 -0
  278. package/dist/src/present/reminders/reminder-renderer.js +136 -0
  279. package/dist/src/present/reminders/reminder-renderer.js.map +1 -0
  280. package/dist/src/present/reminders/reminder-types.d.ts +131 -0
  281. package/dist/src/present/reminders/reminder-types.d.ts.map +1 -0
  282. package/dist/src/present/reminders/reminder-types.js +29 -0
  283. package/dist/src/present/reminders/reminder-types.js.map +1 -0
  284. package/dist/src/present/types.d.ts +114 -0
  285. package/dist/src/present/types.d.ts.map +1 -0
  286. package/dist/src/present/types.js +18 -0
  287. package/dist/src/present/types.js.map +1 -0
  288. package/dist/src/product/claude-product-session.d.ts +146 -0
  289. package/dist/src/product/claude-product-session.d.ts.map +1 -0
  290. package/dist/src/product/claude-product-session.js +362 -0
  291. package/dist/src/product/claude-product-session.js.map +1 -0
  292. package/dist/src/product/cursor-product-session.d.ts +211 -0
  293. package/dist/src/product/cursor-product-session.d.ts.map +1 -0
  294. package/dist/src/product/cursor-product-session.js +390 -0
  295. package/dist/src/product/cursor-product-session.js.map +1 -0
  296. package/dist/src/product/index.d.ts +28 -0
  297. package/dist/src/product/index.d.ts.map +1 -0
  298. package/dist/src/product/index.js +22 -0
  299. package/dist/src/product/index.js.map +1 -0
  300. package/dist/src/product/session-resilience/index.d.ts +17 -0
  301. package/dist/src/product/session-resilience/index.d.ts.map +1 -0
  302. package/dist/src/product/session-resilience/index.js +15 -0
  303. package/dist/src/product/session-resilience/index.js.map +1 -0
  304. package/dist/src/product/session-resilience/session-serializer.d.ts +43 -0
  305. package/dist/src/product/session-resilience/session-serializer.d.ts.map +1 -0
  306. package/dist/src/product/session-resilience/session-serializer.js +84 -0
  307. package/dist/src/product/session-resilience/session-serializer.js.map +1 -0
  308. package/dist/src/product/session-resilience/session-snapshot-types.d.ts +35 -0
  309. package/dist/src/product/session-resilience/session-snapshot-types.d.ts.map +1 -0
  310. package/dist/src/product/session-resilience/session-snapshot-types.js +21 -0
  311. package/dist/src/product/session-resilience/session-snapshot-types.js.map +1 -0
  312. package/dist/src/product/session-resilience/session-staleness.d.ts +54 -0
  313. package/dist/src/product/session-resilience/session-staleness.d.ts.map +1 -0
  314. package/dist/src/product/session-resilience/session-staleness.js +62 -0
  315. package/dist/src/product/session-resilience/session-staleness.js.map +1 -0
  316. package/dist/src/product/session-resilience/session-summary.d.ts +40 -0
  317. package/dist/src/product/session-resilience/session-summary.d.ts.map +1 -0
  318. package/dist/src/product/session-resilience/session-summary.js +72 -0
  319. package/dist/src/product/session-resilience/session-summary.js.map +1 -0
  320. package/dist/src/prv/patterns.d.ts +32 -0
  321. package/dist/src/prv/patterns.d.ts.map +1 -0
  322. package/dist/src/prv/patterns.js +40 -0
  323. package/dist/src/prv/patterns.js.map +1 -0
  324. package/dist/src/prv/prv.d.ts +13 -0
  325. package/dist/src/prv/prv.d.ts.map +1 -0
  326. package/dist/src/prv/prv.js +22 -0
  327. package/dist/src/prv/prv.js.map +1 -0
  328. package/dist/src/prv/types.d.ts +26 -0
  329. package/dist/src/prv/types.d.ts.map +1 -0
  330. package/dist/src/prv/types.js +15 -0
  331. package/dist/src/prv/types.js.map +1 -0
  332. package/dist/src/safety/detectors/arbitrary-exec.detector.d.ts +3 -0
  333. package/dist/src/safety/detectors/arbitrary-exec.detector.d.ts.map +1 -0
  334. package/dist/src/safety/detectors/arbitrary-exec.detector.js +31 -0
  335. package/dist/src/safety/detectors/arbitrary-exec.detector.js.map +1 -0
  336. package/dist/src/safety/detectors/bulk-data-exfil.detector.d.ts +21 -0
  337. package/dist/src/safety/detectors/bulk-data-exfil.detector.d.ts.map +1 -0
  338. package/dist/src/safety/detectors/bulk-data-exfil.detector.js +90 -0
  339. package/dist/src/safety/detectors/bulk-data-exfil.detector.js.map +1 -0
  340. package/dist/src/safety/detectors/destructive.detector.d.ts +3 -0
  341. package/dist/src/safety/detectors/destructive.detector.d.ts.map +1 -0
  342. package/dist/src/safety/detectors/destructive.detector.js +28 -0
  343. package/dist/src/safety/detectors/destructive.detector.js.map +1 -0
  344. package/dist/src/safety/detectors/evasion.detector.d.ts +3 -0
  345. package/dist/src/safety/detectors/evasion.detector.d.ts.map +1 -0
  346. package/dist/src/safety/detectors/evasion.detector.js +28 -0
  347. package/dist/src/safety/detectors/evasion.detector.js.map +1 -0
  348. package/dist/src/safety/detectors/secret-access.detector.d.ts +31 -0
  349. package/dist/src/safety/detectors/secret-access.detector.d.ts.map +1 -0
  350. package/dist/src/safety/detectors/secret-access.detector.js +78 -0
  351. package/dist/src/safety/detectors/secret-access.detector.js.map +1 -0
  352. package/dist/src/safety/registry.d.ts +9 -0
  353. package/dist/src/safety/registry.d.ts.map +1 -0
  354. package/dist/src/safety/registry.js +22 -0
  355. package/dist/src/safety/registry.js.map +1 -0
  356. package/dist/src/safety/safety-gate.d.ts +16 -0
  357. package/dist/src/safety/safety-gate.d.ts.map +1 -0
  358. package/dist/src/safety/safety-gate.js +26 -0
  359. package/dist/src/safety/safety-gate.js.map +1 -0
  360. package/dist/src/safety/types.d.ts +35 -0
  361. package/dist/src/safety/types.d.ts.map +1 -0
  362. package/dist/src/safety/types.js +14 -0
  363. package/dist/src/safety/types.js.map +1 -0
  364. package/dist/src/shell/claude-shell.d.ts +63 -0
  365. package/dist/src/shell/claude-shell.d.ts.map +1 -0
  366. package/dist/src/shell/claude-shell.js +81 -0
  367. package/dist/src/shell/claude-shell.js.map +1 -0
  368. package/dist/src/shell/cli/friction-admin.d.ts +14 -0
  369. package/dist/src/shell/cli/friction-admin.d.ts.map +1 -0
  370. package/dist/src/shell/cli/friction-admin.js +276 -0
  371. package/dist/src/shell/cli/friction-admin.js.map +1 -0
  372. package/dist/src/shell/cli/friction-report.d.ts +16 -0
  373. package/dist/src/shell/cli/friction-report.d.ts.map +1 -0
  374. package/dist/src/shell/cli/friction-report.js +156 -0
  375. package/dist/src/shell/cli/friction-report.js.map +1 -0
  376. package/dist/src/shell/cli/main.d.ts +68 -0
  377. package/dist/src/shell/cli/main.d.ts.map +1 -0
  378. package/dist/src/shell/cli/main.js +488 -0
  379. package/dist/src/shell/cli/main.js.map +1 -0
  380. package/dist/src/shell/cli/use-steady.d.ts +26 -0
  381. package/dist/src/shell/cli/use-steady.d.ts.map +1 -0
  382. package/dist/src/shell/cli/use-steady.js +117 -0
  383. package/dist/src/shell/cli/use-steady.js.map +1 -0
  384. package/dist/src/shell/cursor-shell.d.ts +63 -0
  385. package/dist/src/shell/cursor-shell.d.ts.map +1 -0
  386. package/dist/src/shell/cursor-shell.js +88 -0
  387. package/dist/src/shell/cursor-shell.js.map +1 -0
  388. package/dist/src/shell/defaults.d.ts +51 -0
  389. package/dist/src/shell/defaults.d.ts.map +1 -0
  390. package/dist/src/shell/defaults.js +78 -0
  391. package/dist/src/shell/defaults.js.map +1 -0
  392. package/dist/src/shell/history-render.d.ts +56 -0
  393. package/dist/src/shell/history-render.d.ts.map +1 -0
  394. package/dist/src/shell/history-render.js +166 -0
  395. package/dist/src/shell/history-render.js.map +1 -0
  396. package/dist/src/shell/index.d.ts +43 -0
  397. package/dist/src/shell/index.d.ts.map +1 -0
  398. package/dist/src/shell/index.js +45 -0
  399. package/dist/src/shell/index.js.map +1 -0
  400. package/dist/src/shell/render.d.ts +42 -0
  401. package/dist/src/shell/render.d.ts.map +1 -0
  402. package/dist/src/shell/render.js +122 -0
  403. package/dist/src/shell/render.js.map +1 -0
  404. package/dist/src/shell/types.d.ts +46 -0
  405. package/dist/src/shell/types.d.ts.map +1 -0
  406. package/dist/src/shell/types.js +19 -0
  407. package/dist/src/shell/types.js.map +1 -0
  408. package/dist/src/shell/workflow-defaults.d.ts +23 -0
  409. package/dist/src/shell/workflow-defaults.d.ts.map +1 -0
  410. package/dist/src/shell/workflow-defaults.js +27 -0
  411. package/dist/src/shell/workflow-defaults.js.map +1 -0
  412. package/dist/src/shell/workflow-render.d.ts +54 -0
  413. package/dist/src/shell/workflow-render.d.ts.map +1 -0
  414. package/dist/src/shell/workflow-render.js +319 -0
  415. package/dist/src/shell/workflow-render.js.map +1 -0
  416. package/dist/src/shell/workflow-shell.d.ts +110 -0
  417. package/dist/src/shell/workflow-shell.d.ts.map +1 -0
  418. package/dist/src/shell/workflow-shell.js +180 -0
  419. package/dist/src/shell/workflow-shell.js.map +1 -0
  420. package/dist/src/skills/audit.d.ts +118 -0
  421. package/dist/src/skills/audit.d.ts.map +1 -0
  422. package/dist/src/skills/audit.js +147 -0
  423. package/dist/src/skills/audit.js.map +1 -0
  424. package/dist/src/skills/invocation.d.ts +131 -0
  425. package/dist/src/skills/invocation.d.ts.map +1 -0
  426. package/dist/src/skills/invocation.js +165 -0
  427. package/dist/src/skills/invocation.js.map +1 -0
  428. package/dist/src/skills/loader.d.ts +70 -0
  429. package/dist/src/skills/loader.d.ts.map +1 -0
  430. package/dist/src/skills/loader.js +220 -0
  431. package/dist/src/skills/loader.js.map +1 -0
  432. package/dist/src/skills/local-recovery-adapter.d.ts +49 -0
  433. package/dist/src/skills/local-recovery-adapter.d.ts.map +1 -0
  434. package/dist/src/skills/local-recovery-adapter.js +184 -0
  435. package/dist/src/skills/local-recovery-adapter.js.map +1 -0
  436. package/dist/src/skills/parser.d.ts +53 -0
  437. package/dist/src/skills/parser.d.ts.map +1 -0
  438. package/dist/src/skills/parser.js +336 -0
  439. package/dist/src/skills/parser.js.map +1 -0
  440. package/dist/src/skills/registry.d.ts +123 -0
  441. package/dist/src/skills/registry.d.ts.map +1 -0
  442. package/dist/src/skills/registry.js +144 -0
  443. package/dist/src/skills/registry.js.map +1 -0
  444. package/dist/src/skills/types.d.ts +242 -0
  445. package/dist/src/skills/types.d.ts.map +1 -0
  446. package/dist/src/skills/types.js +50 -0
  447. package/dist/src/skills/types.js.map +1 -0
  448. package/dist/src/skills/validator.d.ts +31 -0
  449. package/dist/src/skills/validator.d.ts.map +1 -0
  450. package/dist/src/skills/validator.js +366 -0
  451. package/dist/src/skills/validator.js.map +1 -0
  452. package/dist/src/ucp/envelope.d.ts +165 -0
  453. package/dist/src/ucp/envelope.d.ts.map +1 -0
  454. package/dist/src/ucp/envelope.js +241 -0
  455. package/dist/src/ucp/envelope.js.map +1 -0
  456. package/dist/src/ucp/hashes.d.ts +36 -0
  457. package/dist/src/ucp/hashes.d.ts.map +1 -0
  458. package/dist/src/ucp/hashes.js +59 -0
  459. package/dist/src/ucp/hashes.js.map +1 -0
  460. package/dist/src/ucp/mappers/map-artifact.d.ts +58 -0
  461. package/dist/src/ucp/mappers/map-artifact.d.ts.map +1 -0
  462. package/dist/src/ucp/mappers/map-artifact.js +51 -0
  463. package/dist/src/ucp/mappers/map-artifact.js.map +1 -0
  464. package/dist/src/ucp/mappers/map-change-interpretation.d.ts +12 -0
  465. package/dist/src/ucp/mappers/map-change-interpretation.d.ts.map +1 -0
  466. package/dist/src/ucp/mappers/map-change-interpretation.js +18 -0
  467. package/dist/src/ucp/mappers/map-change-interpretation.js.map +1 -0
  468. package/dist/src/ucp/mappers/map-completion.d.ts +10 -0
  469. package/dist/src/ucp/mappers/map-completion.d.ts.map +1 -0
  470. package/dist/src/ucp/mappers/map-completion.js +24 -0
  471. package/dist/src/ucp/mappers/map-completion.js.map +1 -0
  472. package/dist/src/ucp/mappers/map-context.d.ts +9 -0
  473. package/dist/src/ucp/mappers/map-context.d.ts.map +1 -0
  474. package/dist/src/ucp/mappers/map-context.js +13 -0
  475. package/dist/src/ucp/mappers/map-context.js.map +1 -0
  476. package/dist/src/ucp/mappers/map-debug-trace.d.ts +10 -0
  477. package/dist/src/ucp/mappers/map-debug-trace.d.ts.map +1 -0
  478. package/dist/src/ucp/mappers/map-debug-trace.js +18 -0
  479. package/dist/src/ucp/mappers/map-debug-trace.js.map +1 -0
  480. package/dist/src/ucp/mappers/map-disambiguation.d.ts +10 -0
  481. package/dist/src/ucp/mappers/map-disambiguation.d.ts.map +1 -0
  482. package/dist/src/ucp/mappers/map-disambiguation.js +21 -0
  483. package/dist/src/ucp/mappers/map-disambiguation.js.map +1 -0
  484. package/dist/src/ucp/mappers/map-execution-trace.d.ts +64 -0
  485. package/dist/src/ucp/mappers/map-execution-trace.d.ts.map +1 -0
  486. package/dist/src/ucp/mappers/map-execution-trace.js +57 -0
  487. package/dist/src/ucp/mappers/map-execution-trace.js.map +1 -0
  488. package/dist/src/ucp/mappers/map-intent-interpretation.d.ts +11 -0
  489. package/dist/src/ucp/mappers/map-intent-interpretation.d.ts.map +1 -0
  490. package/dist/src/ucp/mappers/map-intent-interpretation.js +17 -0
  491. package/dist/src/ucp/mappers/map-intent-interpretation.js.map +1 -0
  492. package/dist/src/ucp/mappers/map-intent.d.ts +9 -0
  493. package/dist/src/ucp/mappers/map-intent.d.ts.map +1 -0
  494. package/dist/src/ucp/mappers/map-intent.js +11 -0
  495. package/dist/src/ucp/mappers/map-intent.js.map +1 -0
  496. package/dist/src/ucp/mappers/map-prv.d.ts +10 -0
  497. package/dist/src/ucp/mappers/map-prv.d.ts.map +1 -0
  498. package/dist/src/ucp/mappers/map-prv.js +14 -0
  499. package/dist/src/ucp/mappers/map-prv.js.map +1 -0
  500. package/dist/src/ucp/mappers/map-reminder-execution.d.ts +57 -0
  501. package/dist/src/ucp/mappers/map-reminder-execution.d.ts.map +1 -0
  502. package/dist/src/ucp/mappers/map-reminder-execution.js +69 -0
  503. package/dist/src/ucp/mappers/map-reminder-execution.js.map +1 -0
  504. package/dist/src/ucp/mappers/map-replay-report.d.ts +81 -0
  505. package/dist/src/ucp/mappers/map-replay-report.d.ts.map +1 -0
  506. package/dist/src/ucp/mappers/map-replay-report.js +76 -0
  507. package/dist/src/ucp/mappers/map-replay-report.js.map +1 -0
  508. package/dist/src/ucp/mappers/map-response.d.ts +13 -0
  509. package/dist/src/ucp/mappers/map-response.d.ts.map +1 -0
  510. package/dist/src/ucp/mappers/map-response.js +25 -0
  511. package/dist/src/ucp/mappers/map-response.js.map +1 -0
  512. package/dist/src/ucp/mappers/map-safety.d.ts +14 -0
  513. package/dist/src/ucp/mappers/map-safety.d.ts.map +1 -0
  514. package/dist/src/ucp/mappers/map-safety.js +22 -0
  515. package/dist/src/ucp/mappers/map-safety.js.map +1 -0
  516. package/dist/src/ucp/persistence/index.d.ts +24 -0
  517. package/dist/src/ucp/persistence/index.d.ts.map +1 -0
  518. package/dist/src/ucp/persistence/index.js +22 -0
  519. package/dist/src/ucp/persistence/index.js.map +1 -0
  520. package/dist/src/ucp/persistence/query.d.ts +164 -0
  521. package/dist/src/ucp/persistence/query.d.ts.map +1 -0
  522. package/dist/src/ucp/persistence/query.js +240 -0
  523. package/dist/src/ucp/persistence/query.js.map +1 -0
  524. package/dist/src/ucp/persistence/reader.d.ts +43 -0
  525. package/dist/src/ucp/persistence/reader.d.ts.map +1 -0
  526. package/dist/src/ucp/persistence/reader.js +104 -0
  527. package/dist/src/ucp/persistence/reader.js.map +1 -0
  528. package/dist/src/ucp/persistence/store.d.ts +77 -0
  529. package/dist/src/ucp/persistence/store.d.ts.map +1 -0
  530. package/dist/src/ucp/persistence/store.js +177 -0
  531. package/dist/src/ucp/persistence/store.js.map +1 -0
  532. package/dist/src/ucp/persistence/write.d.ts +48 -0
  533. package/dist/src/ucp/persistence/write.d.ts.map +1 -0
  534. package/dist/src/ucp/persistence/write.js +59 -0
  535. package/dist/src/ucp/persistence/write.js.map +1 -0
  536. package/dist/src/ucp/projection.d.ts +146 -0
  537. package/dist/src/ucp/projection.d.ts.map +1 -0
  538. package/dist/src/ucp/projection.js +139 -0
  539. package/dist/src/ucp/projection.js.map +1 -0
  540. package/dist/src/ucp/types.d.ts +585 -0
  541. package/dist/src/ucp/types.d.ts.map +1 -0
  542. package/dist/src/ucp/types.js +57 -0
  543. package/dist/src/ucp/types.js.map +1 -0
  544. package/dist/src/understand/completion/completion.d.ts +26 -0
  545. package/dist/src/understand/completion/completion.d.ts.map +1 -0
  546. package/dist/src/understand/completion/completion.js +45 -0
  547. package/dist/src/understand/completion/completion.js.map +1 -0
  548. package/dist/src/understand/completion/rules.d.ts +61 -0
  549. package/dist/src/understand/completion/rules.d.ts.map +1 -0
  550. package/dist/src/understand/completion/rules.js +268 -0
  551. package/dist/src/understand/completion/rules.js.map +1 -0
  552. package/dist/src/understand/completion/types.d.ts +68 -0
  553. package/dist/src/understand/completion/types.d.ts.map +1 -0
  554. package/dist/src/understand/completion/types.js +34 -0
  555. package/dist/src/understand/completion/types.js.map +1 -0
  556. package/dist/src/understand/context/context-alignment.d.ts +18 -0
  557. package/dist/src/understand/context/context-alignment.d.ts.map +1 -0
  558. package/dist/src/understand/context/context-alignment.js +61 -0
  559. package/dist/src/understand/context/context-alignment.js.map +1 -0
  560. package/dist/src/understand/context/types.d.ts +20 -0
  561. package/dist/src/understand/context/types.d.ts.map +1 -0
  562. package/dist/src/understand/context/types.js +13 -0
  563. package/dist/src/understand/context/types.js.map +1 -0
  564. package/dist/src/understand/disambiguation/detectors/missing-context.detector.d.ts +12 -0
  565. package/dist/src/understand/disambiguation/detectors/missing-context.detector.d.ts.map +1 -0
  566. package/dist/src/understand/disambiguation/detectors/missing-context.detector.js +60 -0
  567. package/dist/src/understand/disambiguation/detectors/missing-context.detector.js.map +1 -0
  568. package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.d.ts +13 -0
  569. package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.d.ts.map +1 -0
  570. package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.js +57 -0
  571. package/dist/src/understand/disambiguation/detectors/overloaded-term.detector.js.map +1 -0
  572. package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.d.ts +16 -0
  573. package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.d.ts.map +1 -0
  574. package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.js +56 -0
  575. package/dist/src/understand/disambiguation/detectors/typo-adjacent.detector.js.map +1 -0
  576. package/dist/src/understand/disambiguation/registry.d.ts +14 -0
  577. package/dist/src/understand/disambiguation/registry.d.ts.map +1 -0
  578. package/dist/src/understand/disambiguation/registry.js +27 -0
  579. package/dist/src/understand/disambiguation/registry.js.map +1 -0
  580. package/dist/src/understand/disambiguation/types.d.ts +34 -0
  581. package/dist/src/understand/disambiguation/types.d.ts.map +1 -0
  582. package/dist/src/understand/disambiguation/types.js +15 -0
  583. package/dist/src/understand/disambiguation/types.js.map +1 -0
  584. package/dist/src/understand/intent-interpretation/intent-interpretation.d.ts +86 -0
  585. package/dist/src/understand/intent-interpretation/intent-interpretation.d.ts.map +1 -0
  586. package/dist/src/understand/intent-interpretation/intent-interpretation.js +141 -0
  587. package/dist/src/understand/intent-interpretation/intent-interpretation.js.map +1 -0
  588. package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.d.ts +33 -0
  589. package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.d.ts.map +1 -0
  590. package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.js +66 -0
  591. package/dist/src/understand/intent-interpretation/interpreters/color-intent.interpreter.js.map +1 -0
  592. package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.d.ts +20 -0
  593. package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.d.ts.map +1 -0
  594. package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.js +80 -0
  595. package/dist/src/understand/intent-interpretation/interpreters/config-intent.interpreter.js.map +1 -0
  596. package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.d.ts +25 -0
  597. package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.d.ts.map +1 -0
  598. package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.js +47 -0
  599. package/dist/src/understand/intent-interpretation/interpreters/text-intent.interpreter.js.map +1 -0
  600. package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.d.ts +35 -0
  601. package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.d.ts.map +1 -0
  602. package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.js +89 -0
  603. package/dist/src/understand/intent-interpretation/interpreters/workflow-intent.interpreter.js.map +1 -0
  604. package/dist/src/understand/intent-interpretation/registry.d.ts +18 -0
  605. package/dist/src/understand/intent-interpretation/registry.d.ts.map +1 -0
  606. package/dist/src/understand/intent-interpretation/registry.js +26 -0
  607. package/dist/src/understand/intent-interpretation/registry.js.map +1 -0
  608. package/dist/src/understand/intent-interpretation/types.d.ts +83 -0
  609. package/dist/src/understand/intent-interpretation/types.d.ts.map +1 -0
  610. package/dist/src/understand/intent-interpretation/types.js +40 -0
  611. package/dist/src/understand/intent-interpretation/types.js.map +1 -0
  612. package/dist/src/understand/interpretation/intent.d.ts +72 -0
  613. package/dist/src/understand/interpretation/intent.d.ts.map +1 -0
  614. package/dist/src/understand/interpretation/intent.js +414 -0
  615. package/dist/src/understand/interpretation/intent.js.map +1 -0
  616. package/dist/src/understand/interpretation/interpretation.d.ts +26 -0
  617. package/dist/src/understand/interpretation/interpretation.d.ts.map +1 -0
  618. package/dist/src/understand/interpretation/interpretation.js +43 -0
  619. package/dist/src/understand/interpretation/interpretation.js.map +1 -0
  620. package/dist/src/understand/interpretation/parser.d.ts +20 -0
  621. package/dist/src/understand/interpretation/parser.d.ts.map +1 -0
  622. package/dist/src/understand/interpretation/parser.js +88 -0
  623. package/dist/src/understand/interpretation/parser.js.map +1 -0
  624. package/dist/src/understand/interpretation/rules.d.ts +19 -0
  625. package/dist/src/understand/interpretation/rules.d.ts.map +1 -0
  626. package/dist/src/understand/interpretation/rules.js +222 -0
  627. package/dist/src/understand/interpretation/rules.js.map +1 -0
  628. package/dist/src/understand/interpretation/types.d.ts +90 -0
  629. package/dist/src/understand/interpretation/types.d.ts.map +1 -0
  630. package/dist/src/understand/interpretation/types.js +29 -0
  631. package/dist/src/understand/interpretation/types.js.map +1 -0
  632. package/dist/src/understand/shared/types.d.ts +13 -0
  633. package/dist/src/understand/shared/types.d.ts.map +1 -0
  634. package/dist/src/understand/shared/types.js +9 -0
  635. package/dist/src/understand/shared/types.js.map +1 -0
  636. package/dist/src/understand/silent-guidance/index.d.ts +4 -0
  637. package/dist/src/understand/silent-guidance/index.d.ts.map +1 -0
  638. package/dist/src/understand/silent-guidance/index.js +3 -0
  639. package/dist/src/understand/silent-guidance/index.js.map +1 -0
  640. package/dist/src/understand/silent-guidance/selector.d.ts +44 -0
  641. package/dist/src/understand/silent-guidance/selector.d.ts.map +1 -0
  642. package/dist/src/understand/silent-guidance/selector.js +158 -0
  643. package/dist/src/understand/silent-guidance/selector.js.map +1 -0
  644. package/dist/src/understand/silent-guidance/templates.d.ts +31 -0
  645. package/dist/src/understand/silent-guidance/templates.d.ts.map +1 -0
  646. package/dist/src/understand/silent-guidance/templates.js +109 -0
  647. package/dist/src/understand/silent-guidance/templates.js.map +1 -0
  648. package/dist/src/understand/silent-guidance/types.d.ts +36 -0
  649. package/dist/src/understand/silent-guidance/types.d.ts.map +1 -0
  650. package/dist/src/understand/silent-guidance/types.js +2 -0
  651. package/dist/src/understand/silent-guidance/types.js.map +1 -0
  652. package/dist/src/workflow/coordinator.d.ts +197 -0
  653. package/dist/src/workflow/coordinator.d.ts.map +1 -0
  654. package/dist/src/workflow/coordinator.js +682 -0
  655. package/dist/src/workflow/coordinator.js.map +1 -0
  656. package/dist/src/workflow/index.d.ts +30 -0
  657. package/dist/src/workflow/index.d.ts.map +1 -0
  658. package/dist/src/workflow/index.js +30 -0
  659. package/dist/src/workflow/index.js.map +1 -0
  660. package/dist/src/workflow/types.d.ts +213 -0
  661. package/dist/src/workflow/types.d.ts.map +1 -0
  662. package/dist/src/workflow/types.js +27 -0
  663. package/dist/src/workflow/types.js.map +1 -0
  664. package/package.json +54 -0
  665. package/ui/README.md +73 -0
@@ -0,0 +1,179 @@
1
+ // Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
2
+ /**
3
+ * src/friction/queue.ts
4
+ *
5
+ * SQLite-backed local queue for friction events.
6
+ *
7
+ * Events are written here first (synchronously, fire-and-forget),
8
+ * then flushed to the collection backend asynchronously with retries.
9
+ * This ensures the core workflow path is never blocked or slowed.
10
+ *
11
+ * Storage: ~/.usesteady/friction-queue.db
12
+ * Schema: one table — friction_queue
13
+ */
14
+ import Database from "better-sqlite3";
15
+ import { randomUUID } from "node:crypto";
16
+ import { mkdirSync, existsSync } from "node:fs";
17
+ import { homedir } from "node:os";
18
+ import { join } from "node:path";
19
+ // ─── Paths ────────────────────────────────────────────────────────────────────
20
+ const USESTEADY_DIR = join(homedir(), ".usesteady");
21
+ const DB_PATH = join(USESTEADY_DIR, "friction-queue.db");
22
+ // ─── Lazy singleton DB ────────────────────────────────────────────────────────
23
+ let _db = null;
24
+ function db() {
25
+ if (_db)
26
+ return _db;
27
+ if (!existsSync(USESTEADY_DIR))
28
+ mkdirSync(USESTEADY_DIR, { recursive: true });
29
+ _db = new Database(DB_PATH);
30
+ _db.pragma("journal_mode = WAL");
31
+ _db.pragma("synchronous = NORMAL");
32
+ _db.exec(`
33
+ CREATE TABLE IF NOT EXISTS friction_queue (
34
+ id TEXT PRIMARY KEY,
35
+ event_json TEXT NOT NULL,
36
+ status TEXT NOT NULL DEFAULT 'pending',
37
+ attempts INTEGER NOT NULL DEFAULT 0,
38
+ created_at TEXT NOT NULL,
39
+ submitted_at TEXT,
40
+ last_error TEXT
41
+ );
42
+ CREATE INDEX IF NOT EXISTS idx_status ON friction_queue (status);
43
+ `);
44
+ return _db;
45
+ }
46
+ // ─── Serialisation helpers ────────────────────────────────────────────────────
47
+ function rowToEntry(row) {
48
+ const base = {
49
+ id: row["id"],
50
+ event: JSON.parse(row["event_json"]),
51
+ status: row["status"],
52
+ attempts: row["attempts"],
53
+ createdAt: row["created_at"],
54
+ };
55
+ return {
56
+ ...base,
57
+ ...(row["submitted_at"] ? { submittedAt: row["submitted_at"] } : {}),
58
+ ...(row["last_error"] ? { lastError: row["last_error"] } : {}),
59
+ };
60
+ }
61
+ // ─── Public API ───────────────────────────────────────────────────────────────
62
+ /**
63
+ * Add a new friction event to the queue.
64
+ * Called synchronously (no await) from auto-capture hooks so the
65
+ * core workflow path is never delayed.
66
+ */
67
+ export function enqueue(event) {
68
+ const id = randomUUID();
69
+ const now = new Date().toISOString();
70
+ try {
71
+ db().prepare(`
72
+ INSERT INTO friction_queue (id, event_json, status, attempts, created_at)
73
+ VALUES (?, ?, 'pending', 0, ?)
74
+ `).run(id, JSON.stringify(event), now);
75
+ }
76
+ catch (err) {
77
+ // Queue write failure must never propagate to the caller — this is a
78
+ // best-effort side-channel.
79
+ process.stderr.write(`[friction-queue] enqueue failed: ${String(err)}\n`);
80
+ }
81
+ return id;
82
+ }
83
+ /**
84
+ * Return all entries with the given status.
85
+ */
86
+ export function listByStatus(status) {
87
+ try {
88
+ const rows = db().prepare("SELECT * FROM friction_queue WHERE status = ? ORDER BY created_at ASC").all(status);
89
+ return rows.map(rowToEntry);
90
+ }
91
+ catch {
92
+ return [];
93
+ }
94
+ }
95
+ /**
96
+ * Return pending entries older than `olderThanMs` milliseconds,
97
+ * up to `limit`. Used by the flush loop to pick retry candidates.
98
+ */
99
+ export function pendingEntries(limit = 20) {
100
+ try {
101
+ const rows = db().prepare(`
102
+ SELECT * FROM friction_queue
103
+ WHERE status = 'pending'
104
+ ORDER BY created_at ASC
105
+ LIMIT ?
106
+ `).all(limit);
107
+ return rows.map(rowToEntry);
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ }
113
+ /**
114
+ * Mark an entry as successfully submitted.
115
+ */
116
+ export function markSubmitted(id) {
117
+ try {
118
+ db().prepare(`
119
+ UPDATE friction_queue
120
+ SET status = 'submitted', submitted_at = ?, attempts = attempts + 1
121
+ WHERE id = ?
122
+ `).run(new Date().toISOString(), id);
123
+ }
124
+ catch (err) {
125
+ process.stderr.write(`[friction-queue] markSubmitted failed: ${String(err)}\n`);
126
+ }
127
+ }
128
+ /**
129
+ * Record a submission attempt failure. After MAX_ATTEMPTS the entry
130
+ * is moved to 'failed' so it doesn't clog the retry loop forever.
131
+ */
132
+ const MAX_ATTEMPTS = 5;
133
+ export function markFailed(id, error) {
134
+ try {
135
+ const row = db().prepare("SELECT attempts FROM friction_queue WHERE id = ?").get(id);
136
+ const nextAttempts = (row?.attempts ?? 0) + 1;
137
+ const nextStatus = nextAttempts >= MAX_ATTEMPTS ? "failed" : "pending";
138
+ db().prepare(`
139
+ UPDATE friction_queue
140
+ SET status = ?, attempts = ?, last_error = ?
141
+ WHERE id = ?
142
+ `).run(nextStatus, nextAttempts, error, id);
143
+ }
144
+ catch (err) {
145
+ process.stderr.write(`[friction-queue] markFailed failed: ${String(err)}\n`);
146
+ }
147
+ }
148
+ /**
149
+ * Delete submitted entries older than `keepDays` to keep the DB small.
150
+ */
151
+ export function pruneSubmitted(keepDays = 30) {
152
+ try {
153
+ const cutoff = new Date(Date.now() - keepDays * 86_400_000).toISOString();
154
+ const result = db().prepare(`
155
+ DELETE FROM friction_queue
156
+ WHERE status = 'submitted' AND submitted_at < ?
157
+ `).run(cutoff);
158
+ return result.changes;
159
+ }
160
+ catch {
161
+ return 0;
162
+ }
163
+ }
164
+ /**
165
+ * Total counts by status — useful for CLI status display.
166
+ */
167
+ export function queueStats() {
168
+ try {
169
+ const rows = db().prepare("SELECT status, COUNT(*) AS cnt FROM friction_queue GROUP BY status").all();
170
+ const stats = { pending: 0, submitted: 0, failed: 0 };
171
+ for (const r of rows)
172
+ stats[r.status] = r.cnt;
173
+ return stats;
174
+ }
175
+ catch {
176
+ return { pending: 0, submitted: 0, failed: 0 };
177
+ }
178
+ }
179
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/friction/queue.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF;;;;;;;;;;;GAWG;AAEH,OAAO,QAAQ,MAAmB,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAa,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAgB,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAmB,WAAW,CAAC;AAG9C,iFAAiF;AAEjF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACpD,MAAM,OAAO,GAAS,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;AAE/D,iFAAiF;AAEjF,IAAI,GAAG,GAA6B,IAAI,CAAC;AAEzC,SAAS,EAAE;IACT,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9E,GAAG,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACjC,GAAG,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAEnC,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;GAWR,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,SAAS,UAAU,CAAC,GAA4B;IAC9C,MAAM,IAAI,GAAG;QACX,EAAE,EAAS,GAAG,CAAC,IAAI,CAAkB;QACrC,KAAK,EAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAW,CAAkB;QACnE,MAAM,EAAK,GAAG,CAAC,QAAQ,CAAmB;QAC1C,QAAQ,EAAG,GAAG,CAAC,UAAU,CAAY;QACrC,SAAS,EAAE,GAAG,CAAC,YAAY,CAAW;KACvC,CAAC;IACF,OAAO;QACL,GAAG,IAAI;QACP,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,cAAc,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAG,CAAC,CAAC,EAAE,SAAS,EAAI,GAAG,CAAC,YAAY,CAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAoB;IAC1C,MAAM,EAAE,GAAI,UAAU,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,EAAE,EAAE,CAAC,OAAO,CAAC;;;KAGZ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qEAAqE;QACrE,4BAA4B;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,OAAO,CACvB,uEAAuE,CACxE,CAAC,GAAG,CAAC,MAAM,CAA8B,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAK,GAAG,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC;;;;;KAKzB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA8B,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,IAAI,CAAC;QACH,EAAE,EAAE,CAAC,OAAO,CAAC;;;;KAIZ,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,KAAa;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,OAAO,CACtB,kDAAkD,CACnD,CAAC,GAAG,CAAC,EAAE,CAAqC,CAAC;QAE9C,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAgB,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpF,EAAE,EAAE,CAAC,OAAO,CAAC;;;;KAIZ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAQ,GAAG,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC;;;KAG3B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,OAAO,CACvB,oEAAoE,CACrE,CAAC,GAAG,EAA4C,CAAC;QAElD,MAAM,KAAK,GAAgC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * src/friction/reviewer.ts
3
+ *
4
+ * AI-powered friction report classifier.
5
+ *
6
+ * Calls Claude claude-haiku-4-5 (cheap, fast) with a structured prompt to decide
7
+ * whether a submitted friction report represents genuine user friction worth
8
+ * paying out, or should be rejected (spam, nonsense, gaming the system).
9
+ *
10
+ * Uses the Anthropic Messages API directly via fetch — no SDK dependency.
11
+ * Requires ANTHROPIC_API_KEY in the environment.
12
+ */
13
+ import type { GitHubIssue } from "./github-issues.js";
14
+ /**
15
+ * Load ANTHROPIC_API_KEY from multiple locations in priority order:
16
+ * 1. process.env (already set by caller / CI)
17
+ * 2. ~/.usesteady/.env (ops-specific, never committed)
18
+ * 3. <cwd>/.env.local
19
+ */
20
+ export declare function loadAnthropicKey(): string | undefined;
21
+ export type ReviewDecision = "approved" | "rejected" | "skip";
22
+ export interface ReviewVerdict {
23
+ readonly decision: ReviewDecision;
24
+ readonly reason: string;
25
+ readonly confidence: number;
26
+ }
27
+ /**
28
+ * Classify a single GitHub friction issue.
29
+ * Uses Claude when ANTHROPIC_API_KEY is available; falls back to rule-based
30
+ * heuristics otherwise (good for demos and offline use).
31
+ * Returns a ReviewVerdict with decision, reason, and confidence.
32
+ */
33
+ export declare function classifyReport(issue: GitHubIssue): Promise<ReviewVerdict>;
34
+ /**
35
+ * Classify a batch of issues, printing progress to stderr.
36
+ * Returns results in the same order as the input array.
37
+ */
38
+ export declare function classifyBatch(issues: GitHubIssue[]): Promise<Array<{
39
+ issue: GitHubIssue;
40
+ verdict: ReviewVerdict;
41
+ }>>;
42
+ //# sourceMappingURL=reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../../src/friction/reviewer.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAA0B,oBAAoB,CAAC;AAG1E;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAmBrD;AAID,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAI,cAAc,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA2MD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA8B/E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EAAE,GACpB,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,CAiBhE"}
@@ -0,0 +1,269 @@
1
+ // Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
2
+ /**
3
+ * src/friction/reviewer.ts
4
+ *
5
+ * AI-powered friction report classifier.
6
+ *
7
+ * Calls Claude claude-haiku-4-5 (cheap, fast) with a structured prompt to decide
8
+ * whether a submitted friction report represents genuine user friction worth
9
+ * paying out, or should be rejected (spam, nonsense, gaming the system).
10
+ *
11
+ * Uses the Anthropic Messages API directly via fetch — no SDK dependency.
12
+ * Requires ANTHROPIC_API_KEY in the environment.
13
+ */
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { parseIssueContext, parseIssueMetadata } from "./github-issues.js";
18
+ /**
19
+ * Load ANTHROPIC_API_KEY from multiple locations in priority order:
20
+ * 1. process.env (already set by caller / CI)
21
+ * 2. ~/.usesteady/.env (ops-specific, never committed)
22
+ * 3. <cwd>/.env.local
23
+ */
24
+ export function loadAnthropicKey() {
25
+ if (process.env["ANTHROPIC_API_KEY"])
26
+ return process.env["ANTHROPIC_API_KEY"];
27
+ const candidates = [
28
+ join(homedir(), ".usesteady", ".env"),
29
+ join(process.cwd(), ".env.local"),
30
+ join(process.cwd(), ".env"),
31
+ ];
32
+ for (const path of candidates) {
33
+ if (!existsSync(path))
34
+ continue;
35
+ const lines = readFileSync(path, "utf-8").split("\n");
36
+ for (const line of lines) {
37
+ const m = line.match(/^\s*ANTHROPIC_API_KEY\s*=\s*(.+)\s*$/);
38
+ if (m?.[1])
39
+ return m[1].trim().replace(/^["']|["']$/g, "");
40
+ }
41
+ }
42
+ return undefined;
43
+ }
44
+ // ─── Prompt ───────────────────────────────────────────────────────────────────
45
+ const SYSTEM_PROMPT = `\
46
+ You are a senior UX reviewer for UseSteady, a developer workflow tool.
47
+ Your job is to evaluate user-submitted "friction reports" and decide whether
48
+ each one represents genuine user friction that Shortgigs LLC should pay out.
49
+
50
+ UseSteady is a CLI/UI tool that lets developers run governed, step-by-step
51
+ code changes. Users submit a natural-language task (e.g. "rename Button.tsx
52
+ to PrimaryButton.tsx"), review it before it runs, and approve each step.
53
+
54
+ The intake system rejects tasks it cannot parse into a supported operation.
55
+ Supported operations are things like: mkdir, create file, rename file, move
56
+ file, delete file, run script. Intentionally vague or multi-scope instructions
57
+ like "fix everything" or "refactor the app" are correctly rejected.
58
+
59
+ APPROVAL CRITERIA (pay the reporter):
60
+ - The task input is something a reasonable developer would type, expecting it
61
+ to work (e.g. "update the README", "add a test for login", "fix the linter")
62
+ - The error feedback the user received was unclear or didn't tell them what to
63
+ do instead
64
+ - The friction was real — the user genuinely didn't know how to proceed
65
+ - Auto-captured failures (kind: workflow-failure) are approved if the task
66
+ input is natural and the failure note shows skipped_by_intake
67
+
68
+ REJECTION CRITERIA (do not pay):
69
+ - The task input is obviously nonsensical, a test string, or intentionally
70
+ designed to trigger an error (e.g. "aaa", "test", "do the thing", "???")
71
+ - The reporter is clearly gaming the system (submitting the same failure
72
+ repeatedly with trivially invalid inputs)
73
+ - The kind is "server-error" and the error is an infrastructure problem,
74
+ not a UX friction point
75
+ - The issue looks like a duplicate of another already-approved issue in the
76
+ same session (same runId prefix)
77
+
78
+ SKIP (needs human review):
79
+ - Ambiguous cases where you are less than 60% confident
80
+ - Reports where the context is missing or truncated
81
+
82
+ Respond ONLY with a JSON object (no markdown fences), structured like:
83
+ {
84
+ "decision": "approved" | "rejected" | "skip",
85
+ "reason": "one or two sentence explanation",
86
+ "confidence": 0-100
87
+ }`;
88
+ /**
89
+ * Strip prompt-injection patterns from reporter-controlled strings before
90
+ * they are included in the Claude user message. We remove sequences that
91
+ * attempt to address the system/assistant role or escape the data boundary.
92
+ */
93
+ function sanitizeField(raw, maxLen = 300) {
94
+ if (!raw)
95
+ return "(none)";
96
+ return raw
97
+ .slice(0, maxLen)
98
+ // Remove instruction-like role markers that could hijack the model.
99
+ .replace(/\b(ignore|disregard|forget)\b.{0,60}(instruction|above|prior|previous|system|prompt)/gi, "[redacted]")
100
+ .replace(/<\/?(?:system|assistant|user|instruction)>/gi, "[redacted]")
101
+ // Strip markdown code fences that might be used to smuggle structured output.
102
+ .replace(/```[\s\S]*?```/g, "[code-block]")
103
+ .trim();
104
+ }
105
+ function buildUserMessage(issue) {
106
+ const ctx = parseIssueContext(issue.body);
107
+ const meta = parseIssueMetadata(issue.body);
108
+ // All reporter-controlled fields are sanitized before inclusion.
109
+ const taskInputs = (ctx.taskInputs ?? []).map(t => sanitizeField(t, 200)).join("; ") || "(none)";
110
+ const failureNote = sanitizeField(ctx.failureNote);
111
+ const notes = ctx.notes ? `Reporter notes: ${sanitizeField(ctx.notes)}` : "";
112
+ const kind = sanitizeField(ctx.kind ?? meta?.["kind"], 50);
113
+ const phase = sanitizeField(ctx.phase, 50);
114
+ // Issue title is reporter-controlled too (used as the friction "headline").
115
+ const title = sanitizeField(issue.title, 200);
116
+ return [
117
+ `Issue #${issue.number}: ${title}`,
118
+ ``,
119
+ `Kind: ${kind}`,
120
+ `Phase: ${phase}`,
121
+ `Task inputs: ${taskInputs}`,
122
+ `Failure note: ${failureNote}`,
123
+ notes,
124
+ `Reporter: @${issue.user.login}`,
125
+ `Captured: ${meta?.["capturedAt"] ?? issue.created_at}`,
126
+ `UseSteady version: ${meta?.["usesteadyVersion"] ?? "unknown"}`,
127
+ ].filter(Boolean).join("\n");
128
+ }
129
+ async function callClaude(userMessage) {
130
+ const apiKey = loadAnthropicKey();
131
+ if (!apiKey) {
132
+ throw new Error("ANTHROPIC_API_KEY is not set.\n" +
133
+ " Add it to ~/.usesteady/.env:\n" +
134
+ " ANTHROPIC_API_KEY=sk-ant-...\n" +
135
+ " Or set it as an environment variable before running.");
136
+ }
137
+ const resp = await fetch("https://api.anthropic.com/v1/messages", {
138
+ method: "POST",
139
+ headers: {
140
+ "x-api-key": apiKey,
141
+ "anthropic-version": "2023-06-01",
142
+ "content-type": "application/json",
143
+ },
144
+ body: JSON.stringify({
145
+ model: "claude-haiku-4-5",
146
+ max_tokens: 256,
147
+ system: SYSTEM_PROMPT,
148
+ messages: [{ role: "user", content: userMessage }],
149
+ }),
150
+ });
151
+ if (!resp.ok) {
152
+ const text = await resp.text().catch(() => resp.statusText);
153
+ throw new Error(`Anthropic API ${resp.status}: ${text}`);
154
+ }
155
+ const data = await resp.json();
156
+ const text = data.content.find(b => b.type === "text")?.text ?? "";
157
+ return text.trim();
158
+ }
159
+ // ─── Rule-based fallback ──────────────────────────────────────────────────────
160
+ const JUNK_PATTERNS = [
161
+ /^(test|aaa+|bbb+|xxx+|zzz+|foo|bar|baz|\?+|\.+|123+|abc)$/i,
162
+ /^.{1,3}$/, // fewer than 4 chars
163
+ ];
164
+ const NATURAL_LANGUAGE_SIGNALS = [
165
+ /\b(add|create|update|fix|remove|rename|delete|move|refactor|change|install|run|build|generate)\b/i,
166
+ /\b(file|folder|component|function|class|test|style|config|readme|button|page|route|api)\b/i,
167
+ ];
168
+ /**
169
+ * Rule-based classifier — runs when ANTHROPIC_API_KEY is unavailable.
170
+ * Deterministic, free, and good enough for obvious cases.
171
+ */
172
+ function ruleBasedClassify(issue) {
173
+ const ctx = parseIssueContext(issue.body);
174
+ const inputs = ctx.taskInputs ?? [];
175
+ const primaryInput = inputs[0] ?? "";
176
+ const failureNote = ctx.failureNote ?? "";
177
+ const kind = ctx.kind ?? "";
178
+ // Server errors are not UX friction — skip for human review
179
+ if (kind === "server-error") {
180
+ return { decision: "skip", reason: "Server errors need manual review.", confidence: 70 };
181
+ }
182
+ // Obvious junk inputs — reject
183
+ for (const pattern of JUNK_PATTERNS) {
184
+ if (pattern.test(primaryInput.trim())) {
185
+ return {
186
+ decision: "rejected",
187
+ reason: `Task input "${primaryInput}" is too short or pattern-matches known junk.`,
188
+ confidence: 90,
189
+ };
190
+ }
191
+ }
192
+ // skipped_by_intake with natural-language input — approve
193
+ const isSkippedByIntake = failureNote.includes("skipped_by_intake");
194
+ const looksNatural = NATURAL_LANGUAGE_SIGNALS.some(p => p.test(primaryInput));
195
+ if (isSkippedByIntake && looksNatural && primaryInput.length > 8) {
196
+ return {
197
+ decision: "approved",
198
+ reason: `Task "${primaryInput}" looks like genuine natural language that intake should handle better.`,
199
+ confidence: 72,
200
+ };
201
+ }
202
+ if (isSkippedByIntake && primaryInput.length > 8) {
203
+ return {
204
+ decision: "skip",
205
+ reason: `Task "${primaryInput}" — skipped_by_intake but language is ambiguous. Needs human review.`,
206
+ confidence: 55,
207
+ };
208
+ }
209
+ return {
210
+ decision: "skip",
211
+ reason: "Could not determine validity with rule-based classifier. Set ANTHROPIC_API_KEY for AI review.",
212
+ confidence: 0,
213
+ };
214
+ }
215
+ // ─── Public API ───────────────────────────────────────────────────────────────
216
+ /**
217
+ * Classify a single GitHub friction issue.
218
+ * Uses Claude when ANTHROPIC_API_KEY is available; falls back to rule-based
219
+ * heuristics otherwise (good for demos and offline use).
220
+ * Returns a ReviewVerdict with decision, reason, and confidence.
221
+ */
222
+ export async function classifyReport(issue) {
223
+ // Use rule-based fallback when no API key is configured
224
+ if (!loadAnthropicKey()) {
225
+ return ruleBasedClassify(issue);
226
+ }
227
+ try {
228
+ const userMessage = buildUserMessage(issue);
229
+ const raw = await callClaude(userMessage);
230
+ // Strip any accidental markdown fences
231
+ const json = raw.replace(/^```(?:json)?\s*/i, "").replace(/```\s*$/, "").trim();
232
+ const parsed = JSON.parse(json);
233
+ const decision = ["approved", "rejected", "skip"].includes(parsed.decision)
234
+ ? parsed.decision
235
+ : "skip";
236
+ const reason = typeof parsed.reason === "string" ? parsed.reason : "No reason returned.";
237
+ const confidence = typeof parsed.confidence === "number"
238
+ ? Math.max(0, Math.min(100, Math.round(parsed.confidence)))
239
+ : 50;
240
+ return { decision, reason, confidence };
241
+ }
242
+ catch (err) {
243
+ return {
244
+ decision: "skip",
245
+ reason: `Classifier error: ${String(err)}`,
246
+ confidence: 0,
247
+ };
248
+ }
249
+ }
250
+ /**
251
+ * Classify a batch of issues, printing progress to stderr.
252
+ * Returns results in the same order as the input array.
253
+ */
254
+ export async function classifyBatch(issues) {
255
+ const results = [];
256
+ for (let i = 0; i < issues.length; i++) {
257
+ const issue = issues[i];
258
+ process.stderr.write(` Classifying #${issue.number} (${i + 1}/${issues.length})...\r`);
259
+ const verdict = await classifyReport(issue);
260
+ results.push({ issue, verdict });
261
+ // Polite delay to avoid rate limits
262
+ if (i < issues.length - 1) {
263
+ await new Promise(r => setTimeout(r, 500));
264
+ }
265
+ }
266
+ process.stderr.write(" ".repeat(60) + "\r"); // clear progress line
267
+ return results;
268
+ }
269
+ //# sourceMappingURL=reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../../src/friction/reviewer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * src/friction/types.ts
3
+ *
4
+ * Shared types for the friction capture pipeline.
5
+ *
6
+ * Design rules:
7
+ * - All types are plain data (no methods, no class instances).
8
+ * - Nothing here imports from the workflow domain — friction capture
9
+ * is a side-channel; it must never block or slow the core path.
10
+ * - The admin / payout / collection backend types live in the private
11
+ * the private ops repo and are NOT exported from here.
12
+ */
13
+ export type FrictionKind = "workflow-failure" | "server-error" | "ux-block" | "install-error" | "manual-cli";
14
+ export interface FrictionEvent {
15
+ readonly kind: FrictionKind;
16
+ readonly capturedAt: string;
17
+ readonly usesteadyVersion: string;
18
+ readonly context: FrictionContext;
19
+ readonly notes?: string;
20
+ }
21
+ export interface FrictionContext {
22
+ readonly runId?: string;
23
+ readonly phase?: string;
24
+ readonly taskInputs?: readonly string[];
25
+ readonly failureNote?: string;
26
+ readonly workspaceRoot?: string;
27
+ readonly errorMessage?: string;
28
+ readonly errorStack?: string;
29
+ readonly route?: string;
30
+ readonly platform?: string;
31
+ readonly nodeVersion?: string;
32
+ }
33
+ export type QueueStatus = "pending" | "submitted" | "failed";
34
+ export interface QueueEntry {
35
+ readonly id: string;
36
+ readonly event: FrictionEvent;
37
+ readonly status: QueueStatus;
38
+ readonly attempts: number;
39
+ readonly createdAt: string;
40
+ readonly submittedAt?: string;
41
+ readonly lastError?: string;
42
+ }
43
+ export interface FrictionReport {
44
+ readonly id: string;
45
+ readonly kind: FrictionKind;
46
+ readonly reporterGitHub?: string;
47
+ readonly event: FrictionEvent;
48
+ readonly submittedAt: string;
49
+ }
50
+ export interface AuthToken {
51
+ readonly githubToken: string;
52
+ readonly githubLogin: string;
53
+ readonly githubEmail?: string;
54
+ readonly obtainedAt: string;
55
+ }
56
+ export interface FrictionConfig {
57
+ /** GitHub API endpoint for issue creation. Default: Shortgigs collection repo. */
58
+ readonly frictionEndpoint: string;
59
+ /** GitHub repo slug for label + issue management. */
60
+ readonly frictionRepo: string;
61
+ }
62
+ export declare const DEFAULT_FRICTION_CONFIG: FrictionConfig;
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/friction/types.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAIH,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,cAAc,GACd,UAAU,GACV,eAAe,GACf,YAAY,CAAC;AAIjB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAc,YAAY,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAQ,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAW,eAAe,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAY,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAE9B,QAAQ,CAAC,KAAK,CAAC,EAAQ,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAQ,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAG,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAGhC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAI,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAS,MAAM,CAAC;IAG/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAID,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAW,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAQ,aAAa,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAO,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAK,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAI,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAG,MAAM,CAAC;CAC9B;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAc,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAY,YAAY,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAW,aAAa,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAK,MAAM,CAAC;CACjC;AAID,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,WAAW,EAAK,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAK,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAI,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAM,MAAM,CAAC;CACjC;AAID,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAM,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,uBAAuB,EAAE,cAGrC,CAAC"}
@@ -0,0 +1,18 @@
1
+ // Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
2
+ /**
3
+ * src/friction/types.ts
4
+ *
5
+ * Shared types for the friction capture pipeline.
6
+ *
7
+ * Design rules:
8
+ * - All types are plain data (no methods, no class instances).
9
+ * - Nothing here imports from the workflow domain — friction capture
10
+ * is a side-channel; it must never block or slow the core path.
11
+ * - The admin / payout / collection backend types live in the private
12
+ * the private ops repo and are NOT exported from here.
13
+ */
14
+ export const DEFAULT_FRICTION_CONFIG = {
15
+ frictionEndpoint: "https://api.github.com/repos/<your-org>/<your-friction-repo>/issues",
16
+ frictionRepo: "<your-org>/<your-friction-repo>",
17
+ };
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/friction/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF;;;;;;;;;;;GAWG;AAiFH,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,gBAAgB,EAAE,qEAAqE;IACvF,YAAY,EAAM,iCAAiC;CACpD,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Phase 10B: History / Audit — public API.
3
+ *
4
+ * ── What this module exports ──────────────────────────────────────────────────
5
+ *
6
+ * Types — WorkflowHistorySummary, WorkflowAuditRecord, SessionChain, etc.
7
+ * Tier 1 — getWorkflowHistories(storeDir)
8
+ * Tier 2 — getWorkflowAuditRecord(storeDir, workflowRunId)
9
+ * Internals — buildSessionChain (exposed for testing and advanced consumers)
10
+ *
11
+ * ── Authority ─────────────────────────────────────────────────────────────────
12
+ *
13
+ * Zero. The history module is entirely read-only.
14
+ * It imports from src/ucp/persistence/ only.
15
+ * It accepts storeDir strings — never live WorkflowRun objects.
16
+ *
17
+ * ── Consumer pattern ──────────────────────────────────────────────────────────
18
+ *
19
+ * // Tier 1 — list all completed/stopped runs (cheap):
20
+ * const summaries = getWorkflowHistories(storeDir);
21
+ * for (const s of summaries) { ... s.workflowName, s.finalOutcome, s.tasks ... }
22
+ *
23
+ * // Tier 2 — full provenance for one run (expensive):
24
+ * const audit = getWorkflowAuditRecord(storeDir, workflowRunId);
25
+ * if (audit) {
26
+ * for (const t of audit.tasks) {
27
+ * if (t.session?.cursorReceipt) { ... }
28
+ * if (t.session?.cursorRefused) { ... }
29
+ * }
30
+ * }
31
+ *
32
+ * See: docs/phase-10a-history-audit-design.md — design record
33
+ * docs/phase-10b-baseline.md — implementation freeze
34
+ */
35
+ export type { HistoryTaskOutcome, WorkflowTaskHistoryEntry, WorkflowHistorySummary, SessionChain, WorkflowTaskAuditEntry, WorkflowAuditRecord, } from "./types.js";
36
+ export { getWorkflowHistories } from "./workflow-history.js";
37
+ export { getWorkflowAuditRecord } from "./workflow-history.js";
38
+ export { buildSessionChain } from "./session-chain.js";
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}