profclaw 2.0.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +52 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +178 -41
  6. package/config/pricing.yml +26 -2
  7. package/dist/agents/agent-summary.d.ts +44 -0
  8. package/dist/agents/agent-summary.js +176 -0
  9. package/dist/agents/auto-memory.d.ts +59 -0
  10. package/dist/agents/auto-memory.js +310 -0
  11. package/dist/agents/checkpoint-manager.d.ts +76 -0
  12. package/dist/agents/checkpoint-manager.js +156 -0
  13. package/dist/agents/circuit-breaker.d.ts +54 -0
  14. package/dist/agents/circuit-breaker.js +153 -0
  15. package/dist/agents/command-sandbox.d.ts +93 -0
  16. package/dist/agents/command-sandbox.js +235 -0
  17. package/dist/agents/context-compactor.d.ts +70 -0
  18. package/dist/agents/context-compactor.js +361 -0
  19. package/dist/agents/conversation-branch.d.ts +55 -0
  20. package/dist/agents/conversation-branch.js +115 -0
  21. package/dist/agents/error-recovery.d.ts +44 -0
  22. package/dist/agents/error-recovery.js +197 -0
  23. package/dist/agents/events.d.ts +76 -0
  24. package/dist/agents/events.js +8 -0
  25. package/dist/agents/executor-runner.d.ts +135 -0
  26. package/dist/agents/executor-runner.js +303 -0
  27. package/dist/agents/executor.d.ts +37 -1
  28. package/dist/agents/executor.js +606 -124
  29. package/dist/agents/file-snapshots.d.ts +72 -0
  30. package/dist/agents/file-snapshots.js +182 -0
  31. package/dist/agents/index.d.ts +2 -0
  32. package/dist/agents/orchestrator.d.ts +183 -0
  33. package/dist/agents/orchestrator.js +495 -0
  34. package/dist/agents/output-truncator.d.ts +59 -0
  35. package/dist/agents/output-truncator.js +128 -0
  36. package/dist/agents/permissions.d.ts +63 -0
  37. package/dist/agents/permissions.js +138 -0
  38. package/dist/agents/plan-mode.d.ts +71 -0
  39. package/dist/agents/plan-mode.js +186 -0
  40. package/dist/agents/prompt-suggestions.d.ts +33 -0
  41. package/dist/agents/prompt-suggestions.js +208 -0
  42. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  43. package/dist/agents/rate-limit-monitor.js +224 -0
  44. package/dist/agents/receipt/receipt-cli.d.ts +43 -0
  45. package/dist/agents/receipt/receipt-cli.js +82 -0
  46. package/dist/agents/receipt/receipt-types.d.ts +136 -0
  47. package/dist/agents/receipt/receipt-types.js +19 -0
  48. package/dist/agents/receipt/receipt-verify.d.ts +19 -0
  49. package/dist/agents/receipt/receipt-verify.js +176 -0
  50. package/dist/agents/receipt/receipt-view.d.ts +29 -0
  51. package/dist/agents/receipt/receipt-view.js +227 -0
  52. package/dist/agents/receipt/receipt-writer.d.ts +47 -0
  53. package/dist/agents/receipt/receipt-writer.js +186 -0
  54. package/dist/agents/result-store.d.ts +43 -0
  55. package/dist/agents/result-store.js +145 -0
  56. package/dist/agents/session-diff.d.ts +49 -0
  57. package/dist/agents/session-diff.js +249 -0
  58. package/dist/agents/tool-loader.d.ts +65 -0
  59. package/dist/agents/tool-loader.js +273 -0
  60. package/dist/agents/tool-selector.d.ts +123 -0
  61. package/dist/agents/tool-selector.js +321 -0
  62. package/dist/agents/transcript.d.ts +96 -0
  63. package/dist/agents/transcript.js +267 -0
  64. package/dist/agents/verified-run-git.d.ts +49 -0
  65. package/dist/agents/verified-run-git.js +82 -0
  66. package/dist/agents/verified-run.d.ts +149 -0
  67. package/dist/agents/verified-run.js +402 -0
  68. package/dist/agents/verifier.d.ts +64 -0
  69. package/dist/agents/verifier.js +186 -0
  70. package/dist/agents/worktree-manager.d.ts +80 -0
  71. package/dist/agents/worktree-manager.js +203 -0
  72. package/dist/agents/worktree-tools.d.ts +47 -0
  73. package/dist/agents/worktree-tools.js +246 -0
  74. package/dist/auth/middleware.js +14 -0
  75. package/dist/chat/agentic-executor.d.ts +7 -0
  76. package/dist/chat/agentic-executor.js +263 -32
  77. package/dist/chat/conversations.d.ts +2 -0
  78. package/dist/chat/conversations.js +8 -0
  79. package/dist/chat/execution/executor.d.ts +8 -0
  80. package/dist/chat/execution/executor.js +157 -103
  81. package/dist/chat/execution/index.js +5 -1
  82. package/dist/chat/execution/sandbox.d.ts +8 -0
  83. package/dist/chat/execution/sandbox.js +25 -1
  84. package/dist/chat/execution/tool-router.js +40 -14
  85. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  86. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  87. package/dist/chat/execution/tools/code-tools.js +353 -0
  88. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  89. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  90. package/dist/chat/execution/tools/cron-tool.js +48 -3
  91. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  92. package/dist/chat/execution/tools/decompose-task.js +166 -0
  93. package/dist/chat/execution/tools/exec.d.ts +5 -2
  94. package/dist/chat/execution/tools/exec.js +294 -155
  95. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  96. package/dist/chat/execution/tools/feed-tools.js +142 -0
  97. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  98. package/dist/chat/execution/tools/github.d.ts +2 -2
  99. package/dist/chat/execution/tools/index.d.ts +14 -2
  100. package/dist/chat/execution/tools/index.js +86 -12
  101. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  102. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  103. package/dist/chat/execution/tools/multi-patch.js +373 -0
  104. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  105. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  106. package/dist/chat/execution/tools/plan-tools.js +134 -0
  107. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  108. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  109. package/dist/chat/execution/tools/repl-tool.js +207 -0
  110. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  111. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  112. package/dist/chat/execution/tools/system.d.ts +4 -4
  113. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  114. package/dist/chat/execution/tools/todo-tool.js +152 -0
  115. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  116. package/dist/chat/execution/tools/tool-search.js +155 -0
  117. package/dist/chat/execution/tools/tts-speak.d.ts +2 -2
  118. package/dist/chat/execution/types.d.ts +21 -14
  119. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  120. package/dist/chat/execution/workflows/executor.js +99 -1
  121. package/dist/chat/execution/workflows/types.d.ts +35 -2
  122. package/dist/chat/format/index.d.ts +1 -0
  123. package/dist/chat/format/index.js +1 -0
  124. package/dist/chat/format/markdown-convert.d.ts +23 -0
  125. package/dist/chat/format/markdown-convert.js +149 -0
  126. package/dist/chat/index.d.ts +1 -1
  127. package/dist/chat/index.js +1 -1
  128. package/dist/chat/message-handler.js +58 -6
  129. package/dist/chat/meta-tool-handlers.d.ts +18 -0
  130. package/dist/chat/meta-tool-handlers.js +51 -0
  131. package/dist/chat/proactive/index.d.ts +62 -0
  132. package/dist/chat/proactive/index.js +147 -0
  133. package/dist/chat/prompt-adapter.js +2 -0
  134. package/dist/chat/providers/irc/index.d.ts +2 -2
  135. package/dist/chat/providers/telegram/index.d.ts +2 -0
  136. package/dist/chat/providers/telegram/index.js +21 -2
  137. package/dist/chat/system-prompts.d.ts +3 -3
  138. package/dist/chat/system-prompts.js +121 -61
  139. package/dist/chat/tool-handler.d.ts +2 -0
  140. package/dist/chat/tool-handler.js +47 -3
  141. package/dist/chat/tools.d.ts +6 -6
  142. package/dist/cli/commands/auth.js +64 -1
  143. package/dist/cli/commands/chat.js +1327 -138
  144. package/dist/cli/commands/doctor.js +222 -16
  145. package/dist/cli/commands/history.d.ts +3 -0
  146. package/dist/cli/commands/history.js +138 -0
  147. package/dist/cli/commands/import.d.ts +44 -0
  148. package/dist/cli/commands/import.js +526 -0
  149. package/dist/cli/commands/init.d.ts +13 -0
  150. package/dist/cli/commands/init.js +381 -0
  151. package/dist/cli/commands/onboard.js +210 -30
  152. package/dist/cli/commands/plan.d.ts +13 -0
  153. package/dist/cli/commands/plan.js +184 -0
  154. package/dist/cli/commands/receipt.d.ts +7 -0
  155. package/dist/cli/commands/receipt.js +90 -0
  156. package/dist/cli/commands/run.d.ts +28 -0
  157. package/dist/cli/commands/run.js +204 -0
  158. package/dist/cli/commands/serve.d.ts +7 -0
  159. package/dist/cli/commands/serve.js +77 -18
  160. package/dist/cli/commands/setup.js +84 -3
  161. package/dist/cli/commands/status.js +54 -0
  162. package/dist/cli/commands/tools.js +13 -13
  163. package/dist/cli/commands/tui.js +26 -1
  164. package/dist/cli/index.js +23 -0
  165. package/dist/cli/ink/App.d.ts +13 -0
  166. package/dist/cli/ink/App.js +6 -0
  167. package/dist/cli/ink/ChatApp.d.ts +60 -0
  168. package/dist/cli/ink/ChatApp.js +325 -0
  169. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  170. package/dist/cli/ink/DashboardApp.js +143 -0
  171. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  172. package/dist/cli/ink/components/AgentStatus.js +33 -0
  173. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  174. package/dist/cli/ink/components/ChannelList.js +33 -0
  175. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  176. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  177. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  178. package/dist/cli/ink/components/CostBar.js +35 -0
  179. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  180. package/dist/cli/ink/components/HookStatus.js +7 -0
  181. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  182. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  183. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  184. package/dist/cli/ink/components/PlanView.js +26 -0
  185. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  186. package/dist/cli/ink/components/ProviderList.js +16 -0
  187. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  188. package/dist/cli/ink/components/SessionHeader.js +15 -0
  189. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  190. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  191. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  192. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  193. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  194. package/dist/cli/ink/components/SystemHealth.js +39 -0
  195. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  196. package/dist/cli/ink/components/TaskList.js +59 -0
  197. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  198. package/dist/cli/ink/components/ToolCall.js +43 -0
  199. package/dist/cli/ink/index.d.ts +23 -0
  200. package/dist/cli/ink/index.js +15 -0
  201. package/dist/cli/ink/keybindings.d.ts +35 -0
  202. package/dist/cli/ink/keybindings.js +105 -0
  203. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  204. package/dist/cli/ink/markdown-renderer.js +380 -0
  205. package/dist/cli/ink/output-styles.d.ts +39 -0
  206. package/dist/cli/ink/output-styles.js +119 -0
  207. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  208. package/dist/cli/interactive/auto-serve.js +209 -0
  209. package/dist/cli/interactive/index.d.ts +25 -0
  210. package/dist/cli/interactive/index.js +23 -0
  211. package/dist/cli/interactive/picker.d.ts +28 -0
  212. package/dist/cli/interactive/picker.js +153 -0
  213. package/dist/cli/interactive/renderer.d.ts +26 -0
  214. package/dist/cli/interactive/renderer.js +555 -0
  215. package/dist/cli/interactive/repl.d.ts +14 -0
  216. package/dist/cli/interactive/repl.js +1516 -0
  217. package/dist/cli/interactive/stream-client.d.ts +59 -0
  218. package/dist/cli/interactive/stream-client.js +506 -0
  219. package/dist/cli/interactive/types.d.ts +121 -0
  220. package/dist/cli/interactive/types.js +10 -0
  221. package/dist/cli/utils/api.d.ts +9 -0
  222. package/dist/cli/utils/api.js +58 -2
  223. package/dist/costs/token-tracker.d.ts +10 -1
  224. package/dist/costs/token-tracker.js +37 -5
  225. package/dist/cron/natural-language.d.ts +54 -0
  226. package/dist/cron/natural-language.js +569 -0
  227. package/dist/cron/scheduler.d.ts +34 -4
  228. package/dist/cron/scheduler.js +141 -9
  229. package/dist/cron/templates.d.ts +1 -1
  230. package/dist/cron/templates.js +219 -0
  231. package/dist/feeds/feed-engine.d.ts +149 -0
  232. package/dist/feeds/feed-engine.js +600 -0
  233. package/dist/feeds/index.d.ts +9 -0
  234. package/dist/feeds/index.js +8 -0
  235. package/dist/gateway/router.js +6 -1
  236. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  237. package/dist/hooks/built-in/audit-log.js +84 -0
  238. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  239. package/dist/hooks/built-in/cost-warning.js +59 -0
  240. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  241. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  242. package/dist/hooks/built-in/index.d.ts +14 -0
  243. package/dist/hooks/built-in/index.js +20 -0
  244. package/dist/hooks/index.d.ts +3 -0
  245. package/dist/hooks/index.js +6 -0
  246. package/dist/hooks/loader.d.ts +17 -0
  247. package/dist/hooks/loader.js +142 -0
  248. package/dist/hooks/registry.d.ts +62 -0
  249. package/dist/hooks/registry.js +127 -0
  250. package/dist/integrations/web-search.js +6 -3
  251. package/dist/memory/index.d.ts +1 -0
  252. package/dist/memory/index.js +2 -0
  253. package/dist/memory/memory-service.js +14 -13
  254. package/dist/memory/observational.d.ts +62 -0
  255. package/dist/memory/observational.js +396 -0
  256. package/dist/middleware/content-filter.d.ts +22 -0
  257. package/dist/middleware/content-filter.js +69 -0
  258. package/dist/middleware/request-validator.d.ts +159 -0
  259. package/dist/middleware/request-validator.js +93 -0
  260. package/dist/plugins/sdk.d.ts +22 -0
  261. package/dist/plugins/sdk.js +17 -1
  262. package/dist/projects/types.d.ts +10 -10
  263. package/dist/providers/ai-sdk.d.ts +11 -0
  264. package/dist/providers/ai-sdk.js +111 -56
  265. package/dist/providers/core/models.js +114 -6
  266. package/dist/providers/core/types.d.ts +7 -0
  267. package/dist/providers/index.d.ts +1 -0
  268. package/dist/providers/index.js +1 -0
  269. package/dist/providers/prompt-cache.d.ts +68 -0
  270. package/dist/providers/prompt-cache.js +165 -0
  271. package/dist/providers/smart-router.d.ts +118 -0
  272. package/dist/providers/smart-router.js +693 -0
  273. package/dist/providers/types.d.ts +16 -16
  274. package/dist/routes/agents.js +50 -0
  275. package/dist/routes/auth.js +8 -1
  276. package/dist/routes/chat.js +280 -18
  277. package/dist/routes/costs.js +32 -0
  278. package/dist/routes/cron.js +80 -5
  279. package/dist/routes/feeds.d.ts +10 -0
  280. package/dist/routes/feeds.js +168 -0
  281. package/dist/routes/mcp.js +21 -0
  282. package/dist/routes/memory.js +130 -0
  283. package/dist/routes/skills.js +129 -0
  284. package/dist/routes/teams.d.ts +9 -0
  285. package/dist/routes/teams.js +210 -0
  286. package/dist/routes/tools.js +14 -0
  287. package/dist/routes/users.js +2 -0
  288. package/dist/server/route-loader.js +3 -1
  289. package/dist/server/stream-bridge.d.ts +19 -0
  290. package/dist/server/stream-bridge.js +38 -0
  291. package/dist/server.js +313 -36
  292. package/dist/skills/marketplace.d.ts +87 -0
  293. package/dist/skills/marketplace.js +268 -0
  294. package/dist/storage/index.d.ts +14 -0
  295. package/dist/storage/index.js +64 -3
  296. package/dist/storage/schema.d.ts +4 -4
  297. package/dist/storage/schema.js +1 -1
  298. package/dist/teams/index.d.ts +110 -0
  299. package/dist/teams/index.js +365 -0
  300. package/dist/tickets/types.d.ts +39 -39
  301. package/dist/types/summary.d.ts +5 -5
  302. package/dist/utils/auto-update.d.ts +23 -0
  303. package/dist/utils/auto-update.js +157 -0
  304. package/dist/utils/offline-detect.d.ts +55 -0
  305. package/dist/utils/offline-detect.js +121 -0
  306. package/dist/utils/pid-file.d.ts +36 -0
  307. package/dist/utils/pid-file.js +125 -0
  308. package/dist/utils/prevent-sleep.d.ts +27 -0
  309. package/dist/utils/prevent-sleep.js +95 -0
  310. package/dist/utils/sanitizer.d.ts +57 -0
  311. package/dist/utils/sanitizer.js +174 -0
  312. package/docker-compose.yml +13 -137
  313. package/package.json +31 -6
  314. package/skills/deploy-cloudflare/SKILL.md +62 -0
  315. package/skills/deploy-vercel/SKILL.md +67 -0
  316. package/skills/docker-deploy/SKILL.md +158 -0
  317. package/skills/full-stack-builder/SKILL.md +92 -0
  318. package/skills/humanizer/SKILL.md +488 -0
  319. package/skills/profclaw-assistant/SKILL.md +85 -56
  320. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  321. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  322. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  323. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  324. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  325. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  326. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  327. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  328. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  329. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  330. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  331. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  333. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  334. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  335. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  336. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  338. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  341. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  343. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  349. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  350. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  351. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  352. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  353. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  356. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  357. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  358. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  359. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  360. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  361. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  362. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  363. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  364. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  365. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  366. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  367. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  368. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  369. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  370. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  371. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  372. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  373. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  374. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  375. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  376. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  377. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  378. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  379. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  380. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  381. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  382. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  383. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  384. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  385. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  386. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  387. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  388. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  389. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  390. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  391. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  392. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  393. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  394. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  395. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  396. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  397. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  398. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  399. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  400. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  401. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  402. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  403. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  404. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  405. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  406. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  407. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  408. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  409. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  410. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  411. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  412. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  413. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  414. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  415. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  416. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  417. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  418. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  419. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  420. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  421. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  422. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  423. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  424. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  425. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  426. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  427. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  428. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  429. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  430. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  431. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  432. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  433. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  434. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  435. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  436. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  437. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  438. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  439. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  440. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  441. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  442. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  443. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  444. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  445. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  446. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  447. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  448. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  449. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  450. package/ui/dist/assets/select-n108rXny.js +1 -0
  451. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  452. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  453. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  454. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  455. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  456. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  457. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  458. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  459. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  460. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  461. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  462. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  463. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  464. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  465. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  466. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  467. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  468. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  469. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  470. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  471. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  472. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  473. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  474. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  475. package/ui/dist/index.html +5 -2
  476. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  477. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  478. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  479. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  480. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  481. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  482. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  483. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  484. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  485. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  486. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  487. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  488. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  489. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  490. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  491. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  492. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  493. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  494. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  495. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  496. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  497. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  498. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  499. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  500. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  501. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  502. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  503. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  504. package/ui/dist/assets/index-C8N375c2.js +0 -1
  505. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  506. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  507. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  508. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  509. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  510. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  511. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  512. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  513. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  514. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  515. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  516. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  517. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  518. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  519. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Run receipt types (spec: docs/specs/run-receipt-v0.md).
3
+ * Shared by the writer, verifier and viewer.
4
+ */
5
+ export declare const RECEIPT_VERSION = "0";
6
+ /** `prev` of the first event: 64 zeros. */
7
+ export declare const GENESIS_HASH: string;
8
+ export interface RunStartData {
9
+ goal: string;
10
+ verifyCommand: string;
11
+ repoHead: string | null;
12
+ branch: string;
13
+ tool: {
14
+ name: string;
15
+ version: string;
16
+ };
17
+ }
18
+ export interface AttemptStartData {
19
+ attempt: number;
20
+ model?: string;
21
+ }
22
+ export interface ToolCallData {
23
+ attempt: number;
24
+ name: string;
25
+ argsSummary: string;
26
+ redacted: boolean;
27
+ durationMs: number;
28
+ ok: boolean;
29
+ }
30
+ export type FileChangeKind = 'created' | 'modified' | 'deleted';
31
+ export interface FileChangeData {
32
+ path: string;
33
+ status: FileChangeKind;
34
+ beforeSha256: string | null;
35
+ afterSha256: string | null;
36
+ diffSha256: string;
37
+ diff?: string;
38
+ diffTruncated?: boolean;
39
+ }
40
+ export interface VerifierResultData {
41
+ attempt: number;
42
+ command: string;
43
+ exitCode: number | null;
44
+ passed: boolean;
45
+ output: string;
46
+ failureScore: number;
47
+ durationMs?: number;
48
+ timedOut?: boolean;
49
+ }
50
+ export interface UsageData {
51
+ attempt: number;
52
+ inputTokens: number;
53
+ outputTokens: number;
54
+ cacheReadTokens: number;
55
+ cacheWriteTokens: number;
56
+ totalTokens: number;
57
+ costUsd: number;
58
+ model?: string;
59
+ }
60
+ export interface RollbackData {
61
+ attempt: number;
62
+ reason: string;
63
+ }
64
+ export type ReceiptOutcome = 'verified' | 'improved' | 'unchanged' | 'worse' | 'agent_error';
65
+ export interface AttemptEndData {
66
+ attempt: number;
67
+ outcome: ReceiptOutcome;
68
+ rolledBack: boolean;
69
+ }
70
+ export interface RunEndData {
71
+ stopReason: string;
72
+ verified: boolean;
73
+ totals: {
74
+ attempts: number;
75
+ totalTokens: number;
76
+ costUsd: number;
77
+ filesChanged: number;
78
+ };
79
+ }
80
+ export interface ReceiptDataMap {
81
+ run_start: RunStartData;
82
+ attempt_start: AttemptStartData;
83
+ tool_call: ToolCallData;
84
+ file_change: FileChangeData;
85
+ verifier_result: VerifierResultData;
86
+ usage: UsageData;
87
+ rollback: RollbackData;
88
+ attempt_end: AttemptEndData;
89
+ run_end: RunEndData;
90
+ }
91
+ export type ReceiptEventType = keyof ReceiptDataMap;
92
+ export declare const RECEIPT_EVENT_TYPES: readonly ReceiptEventType[];
93
+ export interface ReceiptSignature {
94
+ alg: 'ed25519';
95
+ /** base64 SPKI DER */
96
+ publicKey: string;
97
+ /** base64 Ed25519 signature over the UTF-8 bytes of the run_end hash */
98
+ sig: string;
99
+ }
100
+ interface EventBase {
101
+ v: typeof RECEIPT_VERSION;
102
+ seq: number;
103
+ ts: string;
104
+ prev: string;
105
+ hash: string;
106
+ }
107
+ export type ReceiptEvent = {
108
+ [K in ReceiptEventType]: EventBase & {
109
+ type: K;
110
+ data: ReceiptDataMap[K];
111
+ signature?: ReceiptSignature;
112
+ };
113
+ }[ReceiptEventType];
114
+ /** Anything that can record receipt events. runVerifiedGoal only needs this. */
115
+ export interface ReceiptSink {
116
+ append<K extends ReceiptEventType>(type: K, data: ReceiptDataMap[K]): ReceiptEvent;
117
+ }
118
+ export type VerifyFailureReason = 'unreadable' | 'empty' | 'invalid_json' | 'invalid_event' | 'seq_mismatch' | 'prev_mismatch' | 'hash_mismatch' | 'bad_first_event' | 'event_after_run_end' | 'truncated' | 'bad_signature' | 'unsigned' | 'untrusted_key';
119
+ export interface SignatureStatus {
120
+ present: boolean;
121
+ valid?: boolean;
122
+ publicKey?: string;
123
+ }
124
+ export interface VerifyResult {
125
+ ok: boolean;
126
+ eventCount: number;
127
+ /** seq of the first bad event, or the seq where an event was expected (truncation) */
128
+ firstBadSeq?: number;
129
+ reason?: VerifyFailureReason;
130
+ message: string;
131
+ signature: SignatureStatus;
132
+ /** Hash of the last event read, when the chain was readable that far */
133
+ lastHash?: string;
134
+ }
135
+ export {};
136
+ //# sourceMappingURL=receipt-types.d.ts.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Run receipt types (spec: docs/specs/run-receipt-v0.md).
3
+ * Shared by the writer, verifier and viewer.
4
+ */
5
+ export const RECEIPT_VERSION = '0';
6
+ /** `prev` of the first event: 64 zeros. */
7
+ export const GENESIS_HASH = '0'.repeat(64);
8
+ export const RECEIPT_EVENT_TYPES = [
9
+ 'run_start',
10
+ 'attempt_start',
11
+ 'tool_call',
12
+ 'file_change',
13
+ 'verifier_result',
14
+ 'usage',
15
+ 'rollback',
16
+ 'attempt_end',
17
+ 'run_end',
18
+ ];
19
+ //# sourceMappingURL=receipt-types.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Receipt verifier: chain integrity, completeness and optional signature.
3
+ * Reports the first bad seq and why. Spec: docs/specs/run-receipt-v0.md
4
+ */
5
+ import type { ReceiptEvent, VerifyResult } from './receipt-types.js';
6
+ export interface VerifyOptions {
7
+ /** Trusted public key (PEM, or base64 SPKI DER). If set, the receipt must be signed by it. */
8
+ expectedPublicKey?: string;
9
+ /** Fail an unsigned receipt. Implied by expectedPublicKey. */
10
+ requireSignature?: boolean;
11
+ }
12
+ /** Normalise a PEM or base64 DER public key to base64 SPKI DER. */
13
+ export declare function normalizePublicKey(input: string): string;
14
+ /** Verify receipt text (JSON Lines). */
15
+ export declare function verifyReceiptText(text: string, options?: VerifyOptions): VerifyResult;
16
+ export declare function verifyReceiptFile(path: string, options?: VerifyOptions): VerifyResult;
17
+ /** Parse events without verifying. For viewers; callers should verify separately. */
18
+ export declare function parseReceiptText(text: string): ReceiptEvent[];
19
+ //# sourceMappingURL=receipt-verify.d.ts.map
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Receipt verifier: chain integrity, completeness and optional signature.
3
+ * Reports the first bad seq and why. Spec: docs/specs/run-receipt-v0.md
4
+ */
5
+ import { createPublicKey, verify as edVerify } from 'node:crypto';
6
+ import { readFileSync } from 'node:fs';
7
+ import { computeEventHash } from './receipt-writer.js';
8
+ import { GENESIS_HASH, RECEIPT_EVENT_TYPES, RECEIPT_VERSION } from './receipt-types.js';
9
+ const HEX64 = /^[0-9a-f]{64}$/;
10
+ function isRecord(v) {
11
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
12
+ }
13
+ /** Normalise a PEM or base64 DER public key to base64 SPKI DER. */
14
+ export function normalizePublicKey(input) {
15
+ const trimmed = input.trim();
16
+ const key = trimmed.includes('-----BEGIN')
17
+ ? createPublicKey(trimmed)
18
+ : createPublicKey({ key: Buffer.from(trimmed, 'base64'), format: 'der', type: 'spki' });
19
+ return key.export({ type: 'spki', format: 'der' }).toString('base64');
20
+ }
21
+ function fail(events, seq, reason, message, extra = {}) {
22
+ return { ok: false, eventCount: events, firstBadSeq: seq, reason, message, signature: { present: false }, ...extra };
23
+ }
24
+ /** Structural check of one parsed line. Returns a problem description or null. */
25
+ function shapeProblem(obj) {
26
+ if (obj['v'] !== RECEIPT_VERSION)
27
+ return `unsupported version ${JSON.stringify(obj['v'])}`;
28
+ if (typeof obj['seq'] !== 'number' || !Number.isInteger(obj['seq']))
29
+ return 'seq is not an integer';
30
+ if (typeof obj['ts'] !== 'string')
31
+ return 'ts is not a string';
32
+ if (typeof obj['type'] !== 'string')
33
+ return 'type is not a string';
34
+ if (!isRecord(obj['data']))
35
+ return 'data is not an object';
36
+ if (typeof obj['prev'] !== 'string' || !HEX64.test(obj['prev']))
37
+ return 'prev is not a sha256 hex string';
38
+ if (typeof obj['hash'] !== 'string' || !HEX64.test(obj['hash']))
39
+ return 'hash is not a sha256 hex string';
40
+ return null;
41
+ }
42
+ /** Verify receipt text (JSON Lines). */
43
+ export function verifyReceiptText(text, options = {}) {
44
+ const lines = text.split('\n');
45
+ if (lines.length > 0 && lines[lines.length - 1] === '')
46
+ lines.pop();
47
+ if (lines.length === 0)
48
+ return fail(0, 0, 'empty', 'Receipt is empty: expected a run_start event at seq 0');
49
+ let prev = GENESIS_HASH;
50
+ let runEnd;
51
+ let count = 0;
52
+ for (let i = 0; i < lines.length; i++) {
53
+ let parsed;
54
+ try {
55
+ parsed = JSON.parse(lines[i]);
56
+ }
57
+ catch {
58
+ return fail(count, i, 'invalid_json', `Line ${i + 1} (seq ${i}) is not valid JSON`);
59
+ }
60
+ if (!isRecord(parsed))
61
+ return fail(count, i, 'invalid_event', `Line ${i + 1} (seq ${i}) is not a JSON object`);
62
+ const problem = shapeProblem(parsed);
63
+ if (problem)
64
+ return fail(count, i, 'invalid_event', `Event at seq ${i}: ${problem}`);
65
+ if (runEnd) {
66
+ return fail(count, i, 'event_after_run_end', `Event at seq ${i} follows run_end`);
67
+ }
68
+ if (parsed['seq'] !== i) {
69
+ return fail(count, i, 'seq_mismatch', `Expected seq ${i} but found seq ${String(parsed['seq'])}: events were reordered, or one was deleted or inserted`);
70
+ }
71
+ if (parsed['prev'] !== prev) {
72
+ return fail(count, i, 'prev_mismatch', `seq ${i}: prev does not match the hash of seq ${i - 1}: the previous event was changed or removed`);
73
+ }
74
+ const expected = computeEventHash(parsed);
75
+ if (parsed['hash'] !== expected) {
76
+ return fail(count, i, 'hash_mismatch', `seq ${i}: hash does not match the event content: the event was edited`);
77
+ }
78
+ if (i === 0 && parsed['type'] !== 'run_start') {
79
+ return fail(count, 0, 'bad_first_event', `seq 0 must be run_start, found ${String(parsed['type'])}`);
80
+ }
81
+ prev = parsed['hash'];
82
+ count++;
83
+ if (parsed['type'] === 'run_end')
84
+ runEnd = parsed;
85
+ }
86
+ if (!runEnd) {
87
+ return fail(count, count, 'truncated', `No run_end event after seq ${count - 1}: the receipt is truncated or the run did not finish`, {
88
+ lastHash: prev,
89
+ });
90
+ }
91
+ return checkSignature(runEnd, count, prev, options);
92
+ }
93
+ function checkSignature(runEnd, count, lastHash, options) {
94
+ const seq = count - 1;
95
+ const sig = runEnd['signature'];
96
+ const wantSigned = options.requireSignature === true || options.expectedPublicKey !== undefined;
97
+ if (sig === undefined) {
98
+ if (wantSigned) {
99
+ return fail(count, seq, 'unsigned', 'Receipt has no signature but one is required', { lastHash });
100
+ }
101
+ return { ok: true, eventCount: count, message: `Chain intact, ${count} events, run complete (unsigned)`, signature: { present: false }, lastHash };
102
+ }
103
+ if (!isRecord(sig) || sig['alg'] !== 'ed25519' || typeof sig['publicKey'] !== 'string' || typeof sig['sig'] !== 'string') {
104
+ return fail(count, seq, 'bad_signature', 'run_end signature block is malformed', { lastHash, signature: { present: true, valid: false } });
105
+ }
106
+ const publicKey = sig['publicKey'];
107
+ let valid = false;
108
+ try {
109
+ const key = createPublicKey({ key: Buffer.from(publicKey, 'base64'), format: 'der', type: 'spki' });
110
+ valid = edVerify(null, Buffer.from(lastHash, 'utf-8'), key, Buffer.from(sig['sig'], 'base64'));
111
+ }
112
+ catch {
113
+ valid = false;
114
+ }
115
+ if (!valid) {
116
+ return fail(count, seq, 'bad_signature', 'Signature does not verify against the last hash', {
117
+ lastHash,
118
+ signature: { present: true, valid: false, publicKey },
119
+ });
120
+ }
121
+ if (options.expectedPublicKey !== undefined) {
122
+ let trusted;
123
+ try {
124
+ trusted = normalizePublicKey(options.expectedPublicKey);
125
+ }
126
+ catch {
127
+ return fail(count, seq, 'untrusted_key', 'The expected public key could not be parsed', { lastHash, signature: { present: true, valid: true, publicKey } });
128
+ }
129
+ if (trusted !== publicKey) {
130
+ return fail(count, seq, 'untrusted_key', 'Signature is valid but the signing key is not the expected key', {
131
+ lastHash,
132
+ signature: { present: true, valid: true, publicKey },
133
+ });
134
+ }
135
+ }
136
+ return {
137
+ ok: true,
138
+ eventCount: count,
139
+ message: `Chain intact, ${count} events, run complete, signature valid`,
140
+ signature: { present: true, valid: true, publicKey },
141
+ lastHash,
142
+ };
143
+ }
144
+ export function verifyReceiptFile(path, options = {}) {
145
+ let text;
146
+ try {
147
+ text = readFileSync(path, 'utf-8');
148
+ }
149
+ catch (error) {
150
+ return fail(0, 0, 'unreadable', `Cannot read ${path}: ${error instanceof Error ? error.message : 'unknown error'}`);
151
+ }
152
+ return verifyReceiptText(text, options);
153
+ }
154
+ /** Parse events without verifying. For viewers; callers should verify separately. */
155
+ export function parseReceiptText(text) {
156
+ const events = [];
157
+ for (const line of text.split('\n')) {
158
+ if (line.trim() === '')
159
+ continue;
160
+ let parsed;
161
+ try {
162
+ parsed = JSON.parse(line);
163
+ }
164
+ catch {
165
+ continue;
166
+ }
167
+ if (isRecord(parsed) && shapeProblem(parsed) === null && isKnownType(parsed['type'])) {
168
+ events.push(parsed);
169
+ }
170
+ }
171
+ return events;
172
+ }
173
+ function isKnownType(t) {
174
+ return typeof t === 'string' && RECEIPT_EVENT_TYPES.includes(t);
175
+ }
176
+ //# sourceMappingURL=receipt-verify.js.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Receipt viewer: a terminal summary and a self-contained single-file HTML page
3
+ * (inline CSS and JS, no external assets). Every piece of receipt data is
4
+ * HTML-escaped, and a CSP meta tag blocks anything not inline.
5
+ */
6
+ import type { AttemptEndData, FileChangeData, ReceiptEvent, RollbackData, RunEndData, RunStartData, ToolCallData, UsageData, VerifierResultData, VerifyResult } from './receipt-types.js';
7
+ export interface AttemptView {
8
+ attempt: number;
9
+ model?: string;
10
+ toolCalls: ToolCallData[];
11
+ verifier?: VerifierResultData;
12
+ usage?: UsageData;
13
+ rollbacks: RollbackData[];
14
+ end?: AttemptEndData;
15
+ }
16
+ export interface ReceiptModel {
17
+ start?: RunStartData;
18
+ baseline?: VerifierResultData;
19
+ attempts: AttemptView[];
20
+ files: FileChangeData[];
21
+ end?: RunEndData;
22
+ startedAt?: string;
23
+ endedAt?: string;
24
+ }
25
+ export declare function buildReceiptModel(events: ReceiptEvent[]): ReceiptModel;
26
+ export declare function renderTerminalSummary(events: ReceiptEvent[], verify?: VerifyResult): string;
27
+ export declare function escapeHtml(input: string): string;
28
+ export declare function renderHtml(events: ReceiptEvent[], verify?: VerifyResult): string;
29
+ //# sourceMappingURL=receipt-view.d.ts.map
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Receipt viewer: a terminal summary and a self-contained single-file HTML page
3
+ * (inline CSS and JS, no external assets). Every piece of receipt data is
4
+ * HTML-escaped, and a CSP meta tag blocks anything not inline.
5
+ */
6
+ import { createHash } from 'node:crypto';
7
+ export function buildReceiptModel(events) {
8
+ const model = { attempts: [], files: [] };
9
+ const byAttempt = new Map();
10
+ const view = (n) => {
11
+ let a = byAttempt.get(n);
12
+ if (!a) {
13
+ a = { attempt: n, toolCalls: [], rollbacks: [] };
14
+ byAttempt.set(n, a);
15
+ model.attempts.push(a);
16
+ }
17
+ return a;
18
+ };
19
+ for (const e of events) {
20
+ switch (e.type) {
21
+ case 'run_start':
22
+ model.start = e.data;
23
+ model.startedAt = e.ts;
24
+ break;
25
+ case 'attempt_start':
26
+ view(e.data.attempt).model = e.data.model;
27
+ break;
28
+ case 'tool_call':
29
+ view(e.data.attempt).toolCalls.push(e.data);
30
+ break;
31
+ case 'file_change':
32
+ model.files.push(e.data);
33
+ break;
34
+ case 'verifier_result':
35
+ if (e.data.attempt === 0)
36
+ model.baseline = e.data;
37
+ else
38
+ view(e.data.attempt).verifier = e.data;
39
+ break;
40
+ case 'usage': {
41
+ const a = view(e.data.attempt);
42
+ a.usage = e.data;
43
+ if (!a.model && e.data.model)
44
+ a.model = e.data.model;
45
+ break;
46
+ }
47
+ case 'rollback':
48
+ view(e.data.attempt).rollbacks.push(e.data);
49
+ break;
50
+ case 'attempt_end':
51
+ view(e.data.attempt).end = e.data;
52
+ break;
53
+ case 'run_end':
54
+ model.end = e.data;
55
+ model.endedAt = e.ts;
56
+ break;
57
+ }
58
+ }
59
+ return model;
60
+ }
61
+ const usd = (n) => `$${n.toFixed(4)}`;
62
+ // Terminal
63
+ export function renderTerminalSummary(events, verify) {
64
+ const m = buildReceiptModel(events);
65
+ const out = [];
66
+ if (verify)
67
+ out.push(`Integrity: ${verify.ok ? 'OK' : 'FAILED'}. ${verify.message}`, '');
68
+ if (m.start) {
69
+ out.push(`Goal: ${m.start.goal}`);
70
+ out.push(`Verifier: ${m.start.verifyCommand}`);
71
+ out.push(`Branch: ${m.start.branch}${m.start.repoHead ? ` (from ${m.start.repoHead.slice(0, 12)})` : ''}`);
72
+ out.push(`Tool: ${m.start.tool.name} ${m.start.tool.version}`);
73
+ }
74
+ if (m.end) {
75
+ out.push(`Result: ${m.end.verified ? 'VERIFIED' : 'NOT VERIFIED'} (${m.end.stopReason}), ${m.end.totals.attempts} attempt(s), ${m.end.totals.totalTokens} tokens, ${usd(m.end.totals.costUsd)}`);
76
+ }
77
+ else {
78
+ out.push('Result: incomplete (no run_end)');
79
+ }
80
+ if (m.baseline)
81
+ out.push(`Baseline: ${m.baseline.passed ? 'pass' : `fail (score ${m.baseline.failureScore})`}`);
82
+ out.push('');
83
+ for (const a of m.attempts) {
84
+ const bits = [`Attempt ${a.attempt}: ${a.end?.outcome ?? 'unfinished'}`];
85
+ if (a.model)
86
+ bits.push(a.model);
87
+ if (a.verifier)
88
+ bits.push(`verifier ${a.verifier.passed ? 'pass' : `fail (score ${a.verifier.failureScore})`}`);
89
+ if (a.toolCalls.length)
90
+ bits.push(`${a.toolCalls.length} tool call(s)`);
91
+ if (a.usage)
92
+ bits.push(`${a.usage.totalTokens} tokens, ${usd(a.usage.costUsd)}`);
93
+ for (const r of a.rollbacks)
94
+ bits.push(`rolled back: ${r.reason}`);
95
+ out.push(bits.join(', '));
96
+ }
97
+ if (m.files.length) {
98
+ out.push('', 'Files changed:');
99
+ for (const f of m.files)
100
+ out.push(` ${f.status} ${f.path}`);
101
+ }
102
+ return out.join('\n') + '\n';
103
+ }
104
+ // HTML
105
+ export function escapeHtml(input) {
106
+ return input
107
+ .replace(/&/g, '&amp;')
108
+ .replace(/</g, '&lt;')
109
+ .replace(/>/g, '&gt;')
110
+ .replace(/"/g, '&quot;')
111
+ .replace(/'/g, '&#39;');
112
+ }
113
+ const CSS = `
114
+ :root{color-scheme:light dark;--bg:#fff;--fg:#1a1a1a;--mut:#666;--line:#ddd;--ok:#127a3a;--bad:#b3261e;--warn:#8a5a00;--code:#f5f5f5}
115
+ @media(prefers-color-scheme:dark){:root{--bg:#141414;--fg:#e8e8e8;--mut:#9a9a9a;--line:#333;--ok:#5fd08a;--bad:#ff8a80;--warn:#e0b050;--code:#1e1e1e}}
116
+ body{font:14px/1.5 system-ui,sans-serif;background:var(--bg);color:var(--fg);margin:0 auto;padding:16px;max-width:960px}
117
+ h1{font-size:20px;margin:0 0 4px}h2{font-size:16px;margin:24px 0 8px}
118
+ .mut{color:var(--mut)}.ok{color:var(--ok)}.bad{color:var(--bad)}.warn{color:var(--warn)}
119
+ .card{border:1px solid var(--line);border-radius:6px;padding:10px 12px;margin:8px 0}
120
+ .row{display:flex;flex-wrap:wrap;gap:4px 16px}
121
+ pre{background:var(--code);padding:8px;overflow:auto;border-radius:4px;margin:6px 0;font:12px/1.4 ui-monospace,monospace;white-space:pre-wrap;word-break:break-word}
122
+ .add{color:var(--ok)}.del{color:var(--bad)}.hunk{color:var(--mut)}
123
+ details>summary{cursor:pointer}
124
+ table{border-collapse:collapse;width:100%}td,th{text-align:left;padding:2px 8px 2px 0;border-bottom:1px solid var(--line);font-size:13px}
125
+ button{font:inherit;padding:2px 8px}
126
+ `;
127
+ const JS = `
128
+ document.getElementById('expand').addEventListener('click',function(){
129
+ var open=this.getAttribute('data-open')!=='1';
130
+ document.querySelectorAll('details').forEach(function(d){d.open=open});
131
+ this.setAttribute('data-open',open?'1':'0');
132
+ this.textContent=open?'Collapse all':'Expand all';
133
+ });
134
+ `;
135
+ const cspHash = (s) => `'sha256-${createHash('sha256').update(s, 'utf-8').digest('base64')}'`;
136
+ function diffHtml(diff) {
137
+ return diff
138
+ .split('\n')
139
+ .map((line) => {
140
+ const cls = line.startsWith('+') && !line.startsWith('+++')
141
+ ? 'add'
142
+ : line.startsWith('-') && !line.startsWith('---')
143
+ ? 'del'
144
+ : line.startsWith('@@')
145
+ ? 'hunk'
146
+ : '';
147
+ const text = escapeHtml(line);
148
+ return cls ? `<span class="${cls}">${text}</span>` : text;
149
+ })
150
+ .join('\n');
151
+ }
152
+ function verifierHtml(v, label) {
153
+ const cls = v.passed ? 'ok' : 'bad';
154
+ return `<details><summary>${escapeHtml(label)}: <span class="${cls}">${v.passed ? 'PASS' : 'FAIL'}</span>, exit ${v.exitCode === null ? 'n/a' : escapeHtml(String(v.exitCode))}, score ${escapeHtml(String(v.failureScore))}${v.timedOut ? ', timed out' : ''}</summary><pre>${escapeHtml(v.output)}</pre></details>`;
155
+ }
156
+ export function renderHtml(events, verify) {
157
+ const m = buildReceiptModel(events);
158
+ const p = [];
159
+ const title = m.start ? `Run receipt: ${m.start.goal}` : 'Run receipt';
160
+ p.push(`<h1>${escapeHtml(title.length > 120 ? `${title.slice(0, 117)}...` : title)}</h1>`);
161
+ if (verify) {
162
+ p.push(`<div class="card"><strong class="${verify.ok ? 'ok' : 'bad'}">Integrity: ${verify.ok ? 'OK' : 'FAILED'}</strong> <span class="mut">${escapeHtml(verify.message)}</span>${verify.signature.present ? ` <span class="${verify.signature.valid ? 'ok' : 'bad'}">signature ${verify.signature.valid ? 'valid' : 'invalid'}</span>` : ' <span class="mut">unsigned</span>'}${verify.signature.publicKey ? `<div class="mut">key ${escapeHtml(verify.signature.publicKey.slice(-24))}</div>` : ''}${verify.lastHash ? `<div class="mut">last hash ${escapeHtml(verify.lastHash)}</div>` : ''}</div>`);
163
+ }
164
+ else {
165
+ p.push('<div class="card mut">Integrity was not checked for this view.</div>');
166
+ }
167
+ if (m.start) {
168
+ p.push(`<div class="card"><div class="row"><span>Verifier <code>${escapeHtml(m.start.verifyCommand)}</code></span><span>Branch <code>${escapeHtml(m.start.branch)}</code></span>` +
169
+ `<span>Head <code>${escapeHtml(m.start.repoHead ?? 'unknown')}</code></span><span>${escapeHtml(m.start.tool.name)} ${escapeHtml(m.start.tool.version)}</span></div></div>`);
170
+ }
171
+ if (m.end) {
172
+ p.push(`<div class="card"><strong class="${m.end.verified ? 'ok' : 'bad'}">${m.end.verified ? 'VERIFIED' : 'NOT VERIFIED'}</strong> (${escapeHtml(m.end.stopReason)})` +
173
+ `<div class="row mut"><span>${escapeHtml(String(m.end.totals.attempts))} attempt(s)</span><span>${escapeHtml(String(m.end.totals.totalTokens))} tokens</span>` +
174
+ `<span>cost ${escapeHtml(usd(m.end.totals.costUsd))}</span><span>${escapeHtml(String(m.end.totals.filesChanged))} file(s) changed</span></div></div>`);
175
+ }
176
+ else {
177
+ p.push('<div class="card warn">Incomplete: no run_end event.</div>');
178
+ }
179
+ p.push('<h2>Timeline</h2><button id="expand" type="button" data-open="0">Expand all</button>');
180
+ if (m.baseline)
181
+ p.push(`<div class="card">${verifierHtml(m.baseline, 'Baseline (before any attempt)')}</div>`);
182
+ for (const a of m.attempts) {
183
+ const outcome = a.end?.outcome ?? 'unfinished';
184
+ const cls = outcome === 'verified' ? 'ok' : outcome === 'improved' || outcome === 'unchanged' ? 'warn' : 'bad';
185
+ const head = [`<strong>Attempt ${escapeHtml(String(a.attempt))}</strong>`, `<span class="${cls}">${escapeHtml(outcome)}</span>`];
186
+ if (a.model)
187
+ head.push(`<span class="mut">${escapeHtml(a.model)}</span>`);
188
+ if (a.usage)
189
+ head.push(`<span class="mut">${escapeHtml(String(a.usage.totalTokens))} tokens, ${escapeHtml(usd(a.usage.costUsd))}</span>`);
190
+ const body = [];
191
+ if (a.toolCalls.length) {
192
+ body.push(`<details><summary>${escapeHtml(String(a.toolCalls.length))} tool call(s)</summary><table><tr><th>Tool</th><th>Args</th><th>ms</th><th>ok</th></tr>` +
193
+ a.toolCalls
194
+ .map((t) => `<tr><td>${escapeHtml(t.name)}</td><td>${escapeHtml(t.argsSummary)}${t.redacted ? ' <span class="warn">(redacted)</span>' : ''}</td><td>${escapeHtml(String(Math.round(t.durationMs)))}</td><td class="${t.ok ? 'ok' : 'bad'}">${t.ok ? 'yes' : 'no'}</td></tr>`)
195
+ .join('') +
196
+ '</table></details>');
197
+ }
198
+ if (a.verifier)
199
+ body.push(verifierHtml(a.verifier, 'Verifier'));
200
+ for (const r of a.rollbacks)
201
+ body.push(`<div class="bad">Rolled back: ${escapeHtml(r.reason)}</div>`);
202
+ p.push(`<div class="card"><div class="row">${head.join('')}</div>${body.join('')}</div>`);
203
+ }
204
+ p.push('<h2>Diff</h2>');
205
+ if (m.files.length === 0)
206
+ p.push('<div class="mut">No files changed.</div>');
207
+ for (const f of m.files) {
208
+ const label = `${escapeHtml(f.status)} <code>${escapeHtml(f.path)}</code>`;
209
+ const detail = f.diff !== undefined
210
+ ? `<pre>${diffHtml(f.diff)}</pre>`
211
+ : `<div class="mut">Diff omitted. sha256 ${escapeHtml(f.diffSha256)}</div>`;
212
+ p.push(`<div class="card"><details open><summary>${label}${f.diffTruncated ? ' <span class="warn">(truncated)</span>' : ''}</summary>${detail}</details></div>`);
213
+ }
214
+ const csp = `default-src 'none'; style-src ${cspHash(CSS)}; script-src ${cspHash(JS)}; base-uri 'none'; form-action 'none'`;
215
+ return [
216
+ '<!doctype html>',
217
+ '<html lang="en"><head><meta charset="utf-8">',
218
+ `<meta http-equiv="Content-Security-Policy" content="${escapeHtml(csp)}">`,
219
+ '<meta name="viewport" content="width=device-width,initial-scale=1">',
220
+ `<title>${escapeHtml(title.slice(0, 120))}</title>`,
221
+ `<style>${CSS}</style></head><body>`,
222
+ p.join('\n'),
223
+ `<script>${JS}</script></body></html>`,
224
+ '',
225
+ ].join('\n');
226
+ }
227
+ //# sourceMappingURL=receipt-view.js.map
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Receipt writer: append-only JSONL, canonical JSON, SHA-256 hash chaining,
3
+ * secret redaction before hashing, optional Ed25519 signature on run_end.
4
+ * Spec: docs/specs/run-receipt-v0.md
5
+ */
6
+ import type { ReceiptDataMap, ReceiptEvent, ReceiptEventType, ReceiptSink } from './receipt-types.js';
7
+ /** Sorted keys, no whitespace, `undefined` members dropped, non-finite numbers rejected. */
8
+ export declare function canonicalJson(value: unknown): string;
9
+ export declare function sha256Hex(input: string | Uint8Array): string;
10
+ /** Hash of an event: canonical JSON without `hash` and `signature`. */
11
+ export declare function computeEventHash(event: Record<string, unknown>): string;
12
+ export declare const REDACTED = "[REDACTED]";
13
+ export declare function redactString(input: string): string;
14
+ /** Deep-redacts strings and values under secret-looking object keys. Returns the changed flag. */
15
+ export declare function redactValue(value: unknown): {
16
+ value: unknown;
17
+ changed: boolean;
18
+ };
19
+ export interface ReceiptSigner {
20
+ publicKey: string;
21
+ sign(hash: string): string;
22
+ }
23
+ /** Signer from a PKCS8 PEM Ed25519 private key. */
24
+ export declare function createSigner(privateKeyPem: string): ReceiptSigner;
25
+ export declare function loadSignerFromFile(path: string): ReceiptSigner;
26
+ export interface ReceiptWriterOptions {
27
+ path: string;
28
+ signer?: ReceiptSigner;
29
+ /** Default true. Only disable for tests of the raw chain. */
30
+ redact?: boolean;
31
+ now?: () => Date;
32
+ }
33
+ /** Default location: <projectRoot>/.profclaw/runs/<runId>/receipt.jsonl (env PROFCLAW_RECEIPT_PATH overrides). */
34
+ export declare function defaultReceiptPath(projectRoot: string, runId: string, env?: NodeJS.ProcessEnv): string;
35
+ export declare class ReceiptWriter implements ReceiptSink {
36
+ readonly path: string;
37
+ private seq;
38
+ private prev;
39
+ private ended;
40
+ private readonly signer?;
41
+ private readonly redact;
42
+ private readonly now;
43
+ constructor(options: ReceiptWriterOptions);
44
+ get lastHash(): string;
45
+ append<K extends ReceiptEventType>(type: K, data: ReceiptDataMap[K]): ReceiptEvent;
46
+ }
47
+ //# sourceMappingURL=receipt-writer.d.ts.map