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,155 @@
1
+ // Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
2
+ /**
3
+ * src/friction/github-auth.ts
4
+ *
5
+ * GitHub Device Flow OAuth — no browser redirect needed.
6
+ *
7
+ * Flow:
8
+ * 1. POST /login/device/code → get device_code + user_code + verification_uri
9
+ * 2. Show user_code to the user; they visit verification_uri and enter it
10
+ * 3. Poll /login/oauth/access_token until user approves or timeout
11
+ * 4. Exchange token for GitHub user profile
12
+ * 5. Store token in ~/.usesteady/auth.json
13
+ *
14
+ * Required GitHub OAuth App settings:
15
+ * - Client ID: set via USESTEADY_GITHUB_CLIENT_ID env var or ~/.usesteady/config.json
16
+ * - Scopes: user:email (read public profile + email)
17
+ * - Device flow: enabled in GitHub App / OAuth App settings
18
+ *
19
+ * Register a free GitHub OAuth App at:
20
+ * https://github.com/settings/developers → "New OAuth App"
21
+ * Set Authorization callback URL to: http://localhost (unused for device flow)
22
+ * Enable "Device Authorization flow" checkbox
23
+ */
24
+ import { writeAuth } from "./config.js";
25
+ // ─── GitHub OAuth endpoints ────────────────────────────────────────────────────
26
+ const GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
27
+ const GITHUB_TOKEN_URL = "https://github.com/login/oauth/access_token";
28
+ const GITHUB_USER_URL = "https://api.github.com/user";
29
+ const GITHUB_EMAILS_URL = "https://api.github.com/user/emails";
30
+ // The client ID for the UseSteady GitHub OAuth App.
31
+ // Alpha testers either have this set via env var or it ships in their config.
32
+ function getClientId() {
33
+ const fromEnv = process.env["USESTEADY_GITHUB_CLIENT_ID"];
34
+ if (fromEnv)
35
+ return fromEnv;
36
+ throw new Error("USESTEADY_GITHUB_CLIENT_ID is not set.\n" +
37
+ "Set it in your environment or run: usesteady report --setup");
38
+ }
39
+ // ─── Step 1: Request device code ──────────────────────────────────────────────
40
+ async function requestDeviceCode() {
41
+ const resp = await fetch(GITHUB_DEVICE_CODE_URL, {
42
+ method: "POST",
43
+ headers: {
44
+ "Accept": "application/json",
45
+ "Content-Type": "application/json",
46
+ },
47
+ body: JSON.stringify({
48
+ client_id: getClientId(),
49
+ scope: "user:email",
50
+ }),
51
+ });
52
+ if (!resp.ok) {
53
+ throw new Error(`Device code request failed: ${resp.status} ${resp.statusText}`);
54
+ }
55
+ return resp.json();
56
+ }
57
+ // ─── Step 2: Poll for token ───────────────────────────────────────────────────
58
+ async function pollForToken(deviceCode, intervalSec, expiresInSec, onWaiting) {
59
+ const deadline = Date.now() + expiresInSec * 1000;
60
+ const intervalMs = Math.max(intervalSec, 5) * 1000;
61
+ while (Date.now() < deadline) {
62
+ await new Promise((r) => setTimeout(r, intervalMs));
63
+ const resp = await fetch(GITHUB_TOKEN_URL, {
64
+ method: "POST",
65
+ headers: {
66
+ "Accept": "application/json",
67
+ "Content-Type": "application/json",
68
+ },
69
+ body: JSON.stringify({
70
+ client_id: getClientId(),
71
+ device_code: deviceCode,
72
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
73
+ }),
74
+ });
75
+ const data = await resp.json();
76
+ if (data.access_token) {
77
+ return data.access_token;
78
+ }
79
+ if (data.error === "authorization_pending") {
80
+ onWaiting?.();
81
+ continue;
82
+ }
83
+ if (data.error === "slow_down") {
84
+ await new Promise((r) => setTimeout(r, 5000));
85
+ continue;
86
+ }
87
+ if (data.error === "expired_token") {
88
+ throw new Error("Device code expired. Run `usesteady report` again.");
89
+ }
90
+ if (data.error === "access_denied") {
91
+ throw new Error("Authorization denied by user.");
92
+ }
93
+ throw new Error(`Unexpected error: ${data.error ?? "unknown"} — ${data.error_description ?? ""}`);
94
+ }
95
+ throw new Error("Authorization timed out. Run `usesteady report` again.");
96
+ }
97
+ // ─── Step 3: Fetch user profile ───────────────────────────────────────────────
98
+ async function fetchUserProfile(token) {
99
+ const [userResp, emailsResp] = await Promise.all([
100
+ fetch(GITHUB_USER_URL, {
101
+ headers: {
102
+ "Authorization": `Bearer ${token}`,
103
+ "Accept": "application/vnd.github+json",
104
+ "X-GitHub-Api-Version": "2022-11-28",
105
+ "User-Agent": "usesteady",
106
+ },
107
+ }),
108
+ fetch(GITHUB_EMAILS_URL, {
109
+ headers: {
110
+ "Authorization": `Bearer ${token}`,
111
+ "Accept": "application/vnd.github+json",
112
+ "X-GitHub-Api-Version": "2022-11-28",
113
+ "User-Agent": "usesteady",
114
+ },
115
+ }),
116
+ ]);
117
+ const user = await userResp.json();
118
+ let email = user.email ?? undefined;
119
+ if (emailsResp.ok) {
120
+ const emails = await emailsResp.json();
121
+ const primary = emails.find((e) => e.primary && e.verified);
122
+ if (primary)
123
+ email = primary.email;
124
+ }
125
+ return { login: user.login, ...(email ? { email } : {}) };
126
+ }
127
+ // ─── Public: run the full device flow ────────────────────────────────────────
128
+ /**
129
+ * Run the GitHub device-flow OAuth dance interactively.
130
+ *
131
+ * Prints the user code and verification URL to stdout, then polls
132
+ * until the user approves. Stores the resulting token in
133
+ * ~/.usesteady/auth.json and returns the AuthToken.
134
+ *
135
+ * @param onCode called with { userCode, verificationUri } when ready to display
136
+ * @param onWaiting called each poll cycle while waiting for user
137
+ */
138
+ export async function runDeviceFlow(opts) {
139
+ const codeResp = await requestDeviceCode();
140
+ opts?.onCode?.({
141
+ userCode: codeResp.user_code,
142
+ verificationUri: codeResp.verification_uri,
143
+ });
144
+ const token = await pollForToken(codeResp.device_code, codeResp.interval, codeResp.expires_in, opts?.onWaiting);
145
+ const { login, email } = await fetchUserProfile(token);
146
+ const authToken = {
147
+ githubToken: token,
148
+ githubLogin: login,
149
+ obtainedAt: new Date().toISOString(),
150
+ ...(email ? { githubEmail: email } : {}),
151
+ };
152
+ writeAuth(authToken);
153
+ return authToken;
154
+ }
155
+ //# sourceMappingURL=github-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-auth.js","sourceRoot":"","sources":["../../../src/friction/github-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * src/friction/github-issues.ts
3
+ *
4
+ * Thin GitHub REST API client used by the friction admin reviewer.
5
+ * All operations target the collection repo configured in FrictionConfig.
6
+ */
7
+ export interface GitHubIssue {
8
+ readonly number: number;
9
+ readonly title: string;
10
+ readonly body: string;
11
+ readonly html_url: string;
12
+ readonly state: "open" | "closed";
13
+ readonly labels: ReadonlyArray<{
14
+ name: string;
15
+ }>;
16
+ readonly user: {
17
+ login: string;
18
+ };
19
+ readonly created_at: string;
20
+ }
21
+ /**
22
+ * Fetch all open issues labelled `status/pending` from the collection repo.
23
+ * Pages up to 200 issues (2 pages of 100).
24
+ */
25
+ export declare function fetchPendingIssues(repo: string, token: string): Promise<GitHubIssue[]>;
26
+ /** Post a comment to an issue. */
27
+ export declare function postComment(repo: string, issueNum: number, body: string, token: string): Promise<void>;
28
+ /**
29
+ * Remove `removeLabel` from an issue and add `addLabel`.
30
+ * Silently ignores 404 on remove (label may already be absent).
31
+ */
32
+ export declare function swapLabel(repo: string, issueNum: number, removeLabel: string, addLabel: string, token: string): Promise<void>;
33
+ /** Close an issue (used when rejecting a friction report). */
34
+ export declare function closeIssue(repo: string, issueNum: number, token: string): Promise<void>;
35
+ /**
36
+ * Extract the structured metadata JSON block from an issue body.
37
+ * Returns null if the body doesn't contain a parseable block.
38
+ */
39
+ export declare function parseIssueMetadata(body: string): Record<string, unknown> | null;
40
+ /**
41
+ * Extract the plain-text context lines from the issue body.
42
+ * Returns an object with the human-readable fields.
43
+ */
44
+ export declare function parseIssueContext(body: string): {
45
+ kind?: string;
46
+ taskInputs?: string[];
47
+ failureNote?: string;
48
+ phase?: string;
49
+ notes?: string;
50
+ };
51
+ //# sourceMappingURL=github-issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-issues.d.ts","sourceRoot":"","sources":["../../../src/friction/github-issues.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAIH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAO,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAQ,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAI,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAO,MAAM,GAAG,QAAQ,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAM,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAQ;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA4BD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAG,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,EAAE,CAAC,CAYxB;AAID,kCAAkC;AAClC,wBAAsB,WAAW,CAC/B,IAAI,EAAQ,MAAM,EAClB,QAAQ,EAAI,MAAM,EAClB,IAAI,EAAQ,MAAM,EAClB,KAAK,EAAO,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAS,MAAM,EACnB,QAAQ,EAAK,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAK,MAAM,EACnB,KAAK,EAAQ,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,8DAA8D;AAC9D,wBAAsB,UAAU,CAC9B,IAAI,EAAM,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAK,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ/E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAC/C,IAAI,CAAC,EAAS,MAAM,CAAC;IACrB,UAAU,CAAC,EAAG,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,KAAK,CAAC,EAAQ,MAAM,CAAC;CACtB,CA0BA"}
@@ -0,0 +1,118 @@
1
+ // Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
2
+ /**
3
+ * src/friction/github-issues.ts
4
+ *
5
+ * Thin GitHub REST API client used by the friction admin reviewer.
6
+ * All operations target the collection repo configured in FrictionConfig.
7
+ */
8
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
9
+ function ghHeaders(token) {
10
+ return {
11
+ "Authorization": `Bearer ${token}`,
12
+ "Accept": "application/vnd.github+json",
13
+ "Content-Type": "application/json",
14
+ "X-GitHub-Api-Version": "2022-11-28",
15
+ "User-Agent": "usesteady/friction-reviewer",
16
+ };
17
+ }
18
+ async function ghFetch(url, token, init = {}) {
19
+ const resp = await fetch(url, {
20
+ ...init,
21
+ headers: { ...ghHeaders(token), ...(init.headers ?? {}) },
22
+ });
23
+ if (!resp.ok) {
24
+ const text = await resp.text().catch(() => resp.statusText);
25
+ throw new Error(`GitHub API ${resp.status} ${resp.url}: ${text}`);
26
+ }
27
+ return resp;
28
+ }
29
+ // ─── Read ─────────────────────────────────────────────────────────────────────
30
+ /**
31
+ * Fetch all open issues labelled `status/pending` from the collection repo.
32
+ * Pages up to 200 issues (2 pages of 100).
33
+ */
34
+ export async function fetchPendingIssues(repo, token) {
35
+ const issues = [];
36
+ for (let page = 1; page <= 2; page++) {
37
+ const url = `https://api.github.com/repos/${repo}/issues?labels=status%2Fpending&state=open&per_page=100&page=${page}`;
38
+ const resp = await ghFetch(url, token);
39
+ const batch = await resp.json();
40
+ issues.push(...batch);
41
+ if (batch.length < 100)
42
+ break;
43
+ }
44
+ return issues;
45
+ }
46
+ // ─── Write ────────────────────────────────────────────────────────────────────
47
+ /** Post a comment to an issue. */
48
+ export async function postComment(repo, issueNum, body, token) {
49
+ await ghFetch(`https://api.github.com/repos/${repo}/issues/${issueNum}/comments`, token, { method: "POST", body: JSON.stringify({ body }) });
50
+ }
51
+ /**
52
+ * Remove `removeLabel` from an issue and add `addLabel`.
53
+ * Silently ignores 404 on remove (label may already be absent).
54
+ */
55
+ export async function swapLabel(repo, issueNum, removeLabel, addLabel, token) {
56
+ // Add new label
57
+ await ghFetch(`https://api.github.com/repos/${repo}/issues/${issueNum}/labels`, token, { method: "POST", body: JSON.stringify({ labels: [addLabel] }) });
58
+ // Remove old label (ignore 404 if already missing)
59
+ const delUrl = `https://api.github.com/repos/${repo}/issues/${issueNum}/labels/${encodeURIComponent(removeLabel)}`;
60
+ const delResp = await fetch(delUrl, { method: "DELETE", headers: ghHeaders(token) });
61
+ if (!delResp.ok && delResp.status !== 404) {
62
+ const text = await delResp.text().catch(() => delResp.statusText);
63
+ throw new Error(`GitHub API ${delResp.status} on label delete: ${text}`);
64
+ }
65
+ }
66
+ /** Close an issue (used when rejecting a friction report). */
67
+ export async function closeIssue(repo, issueNum, token) {
68
+ await ghFetch(`https://api.github.com/repos/${repo}/issues/${issueNum}`, token, { method: "PATCH", body: JSON.stringify({ state: "closed", state_reason: "not_planned" }) });
69
+ }
70
+ // ─── Issue body parser ────────────────────────────────────────────────────────
71
+ /**
72
+ * Extract the structured metadata JSON block from an issue body.
73
+ * Returns null if the body doesn't contain a parseable block.
74
+ */
75
+ export function parseIssueMetadata(body) {
76
+ try {
77
+ const match = body.match(/```json\s*(\{[\s\S]*?\})\s*```/);
78
+ if (!match?.[1])
79
+ return null;
80
+ return JSON.parse(match[1]);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ /**
87
+ * Extract the plain-text context lines from the issue body.
88
+ * Returns an object with the human-readable fields.
89
+ */
90
+ export function parseIssueContext(body) {
91
+ const kindMatch = body.match(/\*\*Type:\*\*\s*(.+)/);
92
+ const phaseMatch = body.match(/\*\*Phase:\*\*\s*(.+)/);
93
+ const failMatch = body.match(/\*\*Failure note:\*\*\s*(.+)/);
94
+ const notesMatch = body.match(/### Notes from reporter\s+\n+([\s\S]+?)\n+###/);
95
+ // Task inputs: each line after "- **Task inputs:**" that starts with " - "
96
+ const taskSection = body.match(/\*\*Task inputs:\*\*\n((?: - .+\n?)+)/);
97
+ const taskSection1 = taskSection?.[1];
98
+ const taskInputs = taskSection1
99
+ ? taskSection1.split("\n").map(l => l.replace(/^ - /, "").trim()).filter(Boolean)
100
+ : undefined;
101
+ const result = {};
102
+ const kind = kindMatch?.[1]?.trim();
103
+ const phase = phaseMatch?.[1]?.trim();
104
+ const failureNote = failMatch?.[1]?.trim();
105
+ const notes = notesMatch?.[1]?.trim();
106
+ if (kind !== undefined)
107
+ result.kind = kind;
108
+ if (phase !== undefined)
109
+ result.phase = phase;
110
+ if (failureNote !== undefined)
111
+ result.failureNote = failureNote;
112
+ if (taskInputs !== undefined)
113
+ result.taskInputs = taskInputs;
114
+ if (notes !== undefined)
115
+ result.notes = notes;
116
+ return result;
117
+ }
118
+ //# sourceMappingURL=github-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-issues.js","sourceRoot":"","sources":["../../../src/friction/github-issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * src/friction/payout-ledger.ts
3
+ *
4
+ * Local SQLite ledger that records every admin decision (approved / rejected)
5
+ * made against a friction GitHub Issue.
6
+ *
7
+ * Approved entries accumulate until a payout batch is triggered.
8
+ * Rejected entries are kept for audit trail but excluded from payouts.
9
+ *
10
+ * DB path: ~/.usesteady/payout-ledger.sqlite
11
+ */
12
+ export interface PayoutRecord {
13
+ readonly id: string;
14
+ readonly githubLogin: string;
15
+ readonly issueNumber: number;
16
+ readonly issueUrl: string;
17
+ readonly verdict: "approved" | "rejected";
18
+ readonly verdictReason: string;
19
+ readonly confidence: number;
20
+ readonly decidedAt: string;
21
+ readonly paidAt: string | null;
22
+ }
23
+ /** Record an approved or rejected decision. Idempotent on issue_number. */
24
+ export declare function recordDecision(opts: {
25
+ githubLogin: string;
26
+ issueNumber: number;
27
+ issueUrl: string;
28
+ verdict: "approved" | "rejected";
29
+ verdictReason: string;
30
+ confidence: number;
31
+ }): PayoutRecord;
32
+ /** Return all approved, unpaid entries — the pending payout queue. */
33
+ export declare function pendingPayouts(): PayoutRecord[];
34
+ /** Return all entries (for display in `usesteady admin friction payouts`). */
35
+ export declare function allDecisions(limit?: number): PayoutRecord[];
36
+ /** Mark an approved entry as paid (after payment confirmation). */
37
+ export declare function markPaid(id: string): void;
38
+ /** Summary counts for display. */
39
+ export declare function ledgerStats(): {
40
+ approved: number;
41
+ rejected: number;
42
+ paid: number;
43
+ pendingPayout: number;
44
+ };
45
+ //# sourceMappingURL=payout-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-ledger.d.ts","sourceRoot":"","sources":["../../../src/friction/payout-ledger.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAyCH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAa,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAI,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAI,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAO,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAQ,UAAU,GAAG,UAAU,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAK,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAM,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAS,MAAM,GAAG,IAAI,CAAC;CACvC;AA8BD,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,WAAW,EAAI,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IACtB,QAAQ,EAAO,MAAM,CAAC;IACtB,OAAO,EAAQ,UAAU,GAAG,UAAU,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAK,MAAM,CAAC;CACvB,GAAG,YAAY,CAkBf;AAED,sEAAsE;AACtE,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAO/C;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,SAAM,GAAG,YAAY,EAAE,CAOxD;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAKzC;AAED,kCAAkC;AAClC,wBAAgB,WAAW,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CASzG"}
@@ -0,0 +1,111 @@
1
+ // Copyright 2026 Shortgigs LLC. Licensed under the Apache License, Version 2.0.
2
+ /**
3
+ * src/friction/payout-ledger.ts
4
+ *
5
+ * Local SQLite ledger that records every admin decision (approved / rejected)
6
+ * made against a friction GitHub Issue.
7
+ *
8
+ * Approved entries accumulate until a payout batch is triggered.
9
+ * Rejected entries are kept for audit trail but excluded from payouts.
10
+ *
11
+ * DB path: ~/.usesteady/payout-ledger.sqlite
12
+ */
13
+ import Database from "better-sqlite3";
14
+ import { existsSync, mkdirSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { randomUUID } from "node:crypto";
18
+ // ─── Setup ────────────────────────────────────────────────────────────────────
19
+ const USESTEADY_DIR = join(homedir(), ".usesteady");
20
+ const LEDGER_PATH = join(USESTEADY_DIR, "payout-ledger.sqlite");
21
+ function openLedger() {
22
+ if (!existsSync(USESTEADY_DIR))
23
+ mkdirSync(USESTEADY_DIR, { recursive: true });
24
+ const db = new Database(LEDGER_PATH);
25
+ db.pragma("journal_mode = WAL");
26
+ db.exec(`
27
+ CREATE TABLE IF NOT EXISTS payout_ledger (
28
+ id TEXT PRIMARY KEY,
29
+ github_login TEXT NOT NULL,
30
+ issue_number INTEGER NOT NULL UNIQUE,
31
+ issue_url TEXT NOT NULL,
32
+ verdict TEXT NOT NULL CHECK(verdict IN ('approved','rejected')),
33
+ verdict_reason TEXT NOT NULL,
34
+ confidence INTEGER NOT NULL DEFAULT 0,
35
+ decided_at TEXT NOT NULL,
36
+ paid_at TEXT NULL
37
+ );
38
+
39
+ CREATE INDEX IF NOT EXISTS idx_ledger_verdict ON payout_ledger(verdict);
40
+ CREATE INDEX IF NOT EXISTS idx_ledger_paid ON payout_ledger(paid_at);
41
+ `);
42
+ return db;
43
+ }
44
+ function rowToRecord(row) {
45
+ return {
46
+ id: row.id,
47
+ githubLogin: row.github_login,
48
+ issueNumber: row.issue_number,
49
+ issueUrl: row.issue_url,
50
+ verdict: row.verdict,
51
+ verdictReason: row.verdict_reason,
52
+ confidence: row.confidence,
53
+ decidedAt: row.decided_at,
54
+ paidAt: row.paid_at ?? null,
55
+ };
56
+ }
57
+ // ─── Public API ───────────────────────────────────────────────────────────────
58
+ /** Record an approved or rejected decision. Idempotent on issue_number. */
59
+ export function recordDecision(opts) {
60
+ const db = openLedger();
61
+ const id = randomUUID();
62
+ const now = new Date().toISOString();
63
+ // INSERT OR IGNORE ensures the UNIQUE(issue_number) constraint is the single
64
+ // guard against double-payouts, even under concurrent admin runs.
65
+ db.prepare(`
66
+ INSERT OR IGNORE INTO payout_ledger
67
+ (id, github_login, issue_number, issue_url, verdict, verdict_reason, confidence, decided_at)
68
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
69
+ `).run(id, opts.githubLogin, opts.issueNumber, opts.issueUrl, opts.verdict, opts.verdictReason, opts.confidence, now);
70
+ const row = db
71
+ .prepare("SELECT * FROM payout_ledger WHERE issue_number = ?")
72
+ .get(opts.issueNumber);
73
+ db.close();
74
+ return rowToRecord(row);
75
+ }
76
+ /** Return all approved, unpaid entries — the pending payout queue. */
77
+ export function pendingPayouts() {
78
+ const db = openLedger();
79
+ const rows = db
80
+ .prepare("SELECT * FROM payout_ledger WHERE verdict = 'approved' AND paid_at IS NULL ORDER BY decided_at ASC")
81
+ .all();
82
+ db.close();
83
+ return rows.map(rowToRecord);
84
+ }
85
+ /** Return all entries (for display in `usesteady admin friction payouts`). */
86
+ export function allDecisions(limit = 100) {
87
+ const db = openLedger();
88
+ const rows = db
89
+ .prepare("SELECT * FROM payout_ledger ORDER BY decided_at DESC LIMIT ?")
90
+ .all(limit);
91
+ db.close();
92
+ return rows.map(rowToRecord);
93
+ }
94
+ /** Mark an approved entry as paid (after payment confirmation). */
95
+ export function markPaid(id) {
96
+ const db = openLedger();
97
+ const now = new Date().toISOString();
98
+ db.prepare("UPDATE payout_ledger SET paid_at = ? WHERE id = ? AND verdict = 'approved'").run(now, id);
99
+ db.close();
100
+ }
101
+ /** Summary counts for display. */
102
+ export function ledgerStats() {
103
+ const db = openLedger();
104
+ const total = db.prepare("SELECT verdict, COUNT(*) as n FROM payout_ledger GROUP BY verdict").all();
105
+ const paid = db.prepare("SELECT COUNT(*) as n FROM payout_ledger WHERE paid_at IS NOT NULL").get().n;
106
+ db.close();
107
+ const approved = total.find(r => r.verdict === "approved")?.n ?? 0;
108
+ const rejected = total.find(r => r.verdict === "rejected")?.n ?? 0;
109
+ return { approved, rejected, paid, pendingPayout: approved - paid };
110
+ }
111
+ //# sourceMappingURL=payout-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-ledger.js","sourceRoot":"","sources":["../../../src/friction/payout-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * src/friction/queue.ts
3
+ *
4
+ * SQLite-backed local queue for friction events.
5
+ *
6
+ * Events are written here first (synchronously, fire-and-forget),
7
+ * then flushed to the collection backend asynchronously with retries.
8
+ * This ensures the core workflow path is never blocked or slowed.
9
+ *
10
+ * Storage: ~/.usesteady/friction-queue.db
11
+ * Schema: one table — friction_queue
12
+ */
13
+ import type { QueueEntry, FrictionEvent, QueueStatus } from "./types.js";
14
+ /**
15
+ * Add a new friction event to the queue.
16
+ * Called synchronously (no await) from auto-capture hooks so the
17
+ * core workflow path is never delayed.
18
+ */
19
+ export declare function enqueue(event: FrictionEvent): string;
20
+ /**
21
+ * Return all entries with the given status.
22
+ */
23
+ export declare function listByStatus(status: QueueStatus): QueueEntry[];
24
+ /**
25
+ * Return pending entries older than `olderThanMs` milliseconds,
26
+ * up to `limit`. Used by the flush loop to pick retry candidates.
27
+ */
28
+ export declare function pendingEntries(limit?: number): QueueEntry[];
29
+ /**
30
+ * Mark an entry as successfully submitted.
31
+ */
32
+ export declare function markSubmitted(id: string): void;
33
+ export declare function markFailed(id: string, error: string): void;
34
+ /**
35
+ * Delete submitted entries older than `keepDays` to keep the DB small.
36
+ */
37
+ export declare function pruneSubmitted(keepDays?: number): number;
38
+ /**
39
+ * Total counts by status — useful for CLI status display.
40
+ */
41
+ export declare function queueStats(): Record<QueueStatus, number>;
42
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/friction/queue.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuDzE;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAgBpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,EAAE,CAS9D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,SAAK,GAAG,UAAU,EAAE,CAYvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAU9C;AAQD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiB1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,SAAK,GAAG,MAAM,CAWpD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAYxD"}