@jinn-network/client 0.1.8 → 0.1.9-canary.02befda9

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 (537) hide show
  1. package/README.md +6 -0
  2. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
  3. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
  4. package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
  5. package/dist/adapters/mech/adapter.d.ts +21 -1
  6. package/dist/adapters/mech/adapter.js +107 -52
  7. package/dist/adapters/mech/adapter.js.map +1 -1
  8. package/dist/adapters/mech/contracts.d.ts +174 -13
  9. package/dist/adapters/mech/contracts.js +99 -49
  10. package/dist/adapters/mech/contracts.js.map +1 -1
  11. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  12. package/dist/adapters/mech/safe-revert.js +5 -1
  13. package/dist/adapters/mech/safe-revert.js.map +1 -1
  14. package/dist/adapters/mech/safe.js +77 -1
  15. package/dist/adapters/mech/safe.js.map +1 -1
  16. package/dist/adapters/mech/types.d.ts +4 -42
  17. package/dist/adapters/mech/types.js +8 -20
  18. package/dist/adapters/mech/types.js.map +1 -1
  19. package/dist/adapters/mech/verdict-code.js +1 -1
  20. package/dist/adapters/mech/verdict-code.js.map +1 -1
  21. package/dist/api/bootstrap-endpoint.d.ts +1 -0
  22. package/dist/api/bootstrap-endpoint.js +1 -0
  23. package/dist/api/bootstrap-endpoint.js.map +1 -1
  24. package/dist/api/discovery-endpoint.d.ts +1 -0
  25. package/dist/api/discovery-endpoint.js +24 -0
  26. package/dist/api/discovery-endpoint.js.map +1 -1
  27. package/dist/api/fleet-build.d.ts +1 -7
  28. package/dist/api/fleet-build.js +0 -7
  29. package/dist/api/fleet-build.js.map +1 -1
  30. package/dist/api/gather-status.d.ts +26 -17
  31. package/dist/api/gather-status.js +57 -516
  32. package/dist/api/gather-status.js.map +1 -1
  33. package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
  34. package/dist/api/harness-auth-status-endpoint.js +17 -0
  35. package/dist/api/harness-auth-status-endpoint.js.map +1 -0
  36. package/dist/api/loop-completion-build.d.ts +79 -0
  37. package/dist/api/loop-completion-build.js +155 -0
  38. package/dist/api/loop-completion-build.js.map +1 -0
  39. package/dist/api/operator-artifacts-endpoint.js +1 -1
  40. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  41. package/dist/api/peers.js +2 -0
  42. package/dist/api/peers.js.map +1 -1
  43. package/dist/api/rewards-build.d.ts +8 -1
  44. package/dist/api/rewards-build.js +32 -4
  45. package/dist/api/rewards-build.js.map +1 -1
  46. package/dist/api/rewards-endpoint.d.ts +12 -0
  47. package/dist/api/rewards-endpoint.js +46 -0
  48. package/dist/api/rewards-endpoint.js.map +1 -0
  49. package/dist/api/server.d.ts +6 -16
  50. package/dist/api/server.js +29 -26
  51. package/dist/api/server.js.map +1 -1
  52. package/dist/api/setup-endpoints.d.ts +41 -0
  53. package/dist/api/setup-endpoints.js +258 -45
  54. package/dist/api/setup-endpoints.js.map +1 -1
  55. package/dist/api/solvernets-endpoints.js +4 -1
  56. package/dist/api/solvernets-endpoints.js.map +1 -1
  57. package/dist/api/status-build.d.ts +71 -94
  58. package/dist/api/status-build.js +11 -77
  59. package/dist/api/status-build.js.map +1 -1
  60. package/dist/api/status-rollup-build.d.ts +0 -4
  61. package/dist/api/status-rollup-build.js +0 -4
  62. package/dist/api/status-rollup-build.js.map +1 -1
  63. package/dist/api/stop-hook.d.ts +1 -1
  64. package/dist/api/stop-hook.js +1 -1
  65. package/dist/api/stop-hook.js.map +1 -1
  66. package/dist/build-info.json +4 -4
  67. package/dist/build-meta.json +1 -1
  68. package/dist/captures/live-publisher.d.ts +9 -0
  69. package/dist/captures/live-publisher.js +1 -0
  70. package/dist/captures/live-publisher.js.map +1 -1
  71. package/dist/captures/publish.d.ts +11 -0
  72. package/dist/captures/publish.js +15 -5
  73. package/dist/captures/publish.js.map +1 -1
  74. package/dist/cli/commands/codedigest-revert-check.js +6 -2
  75. package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
  76. package/dist/cli/commands/doctor.d.ts +3 -0
  77. package/dist/cli/commands/doctor.js +36 -4
  78. package/dist/cli/commands/doctor.js.map +1 -1
  79. package/dist/cli/commands/eval.d.ts +87 -0
  80. package/dist/cli/commands/eval.js +481 -0
  81. package/dist/cli/commands/eval.js.map +1 -0
  82. package/dist/cli/commands/rewards.d.ts +2 -0
  83. package/dist/cli/commands/rewards.js +39 -10
  84. package/dist/cli/commands/rewards.js.map +1 -1
  85. package/dist/cli/commands/solver-nets.js +68 -0
  86. package/dist/cli/commands/solver-nets.js.map +1 -1
  87. package/dist/cli/commands/status.js +0 -1
  88. package/dist/cli/commands/status.js.map +1 -1
  89. package/dist/cli/commands/update.js +8 -0
  90. package/dist/cli/commands/update.js.map +1 -1
  91. package/dist/cli/commands/version.js +4 -0
  92. package/dist/cli/commands/version.js.map +1 -1
  93. package/dist/cli/index.js +2 -0
  94. package/dist/cli/index.js.map +1 -1
  95. package/dist/cli/introspection-context.js +0 -3
  96. package/dist/cli/introspection-context.js.map +1 -1
  97. package/dist/config.d.ts +158 -541
  98. package/dist/config.js +189 -196
  99. package/dist/config.js.map +1 -1
  100. package/dist/corpus/acquire.d.ts +7 -6
  101. package/dist/corpus/acquire.js +10 -10
  102. package/dist/corpus/acquire.js.map +1 -1
  103. package/dist/corpus/fetch-artifact.d.ts +21 -0
  104. package/dist/corpus/fetch-artifact.js +33 -0
  105. package/dist/corpus/fetch-artifact.js.map +1 -0
  106. package/dist/corpus/index.d.ts +2 -2
  107. package/dist/corpus/route-resolver.d.ts +3 -3
  108. package/dist/corpus/route-resolver.js +3 -3
  109. package/dist/daemon/ai-units-gate.d.ts +6 -6
  110. package/dist/daemon/ai-units-gate.js +11 -10
  111. package/dist/daemon/ai-units-gate.js.map +1 -1
  112. package/dist/daemon/balance-topup-loop.js +3 -0
  113. package/dist/daemon/balance-topup-loop.js.map +1 -1
  114. package/dist/daemon/checkpoint-loop.js +2 -2
  115. package/dist/daemon/creator.d.ts +1 -0
  116. package/dist/daemon/creator.js +26 -14
  117. package/dist/daemon/creator.js.map +1 -1
  118. package/dist/daemon/daemon.d.ts +15 -10
  119. package/dist/daemon/daemon.js +71 -39
  120. package/dist/daemon/daemon.js.map +1 -1
  121. package/dist/daemon/delivery-watcher.d.ts +9 -0
  122. package/dist/daemon/delivery-watcher.js +24 -1
  123. package/dist/daemon/delivery-watcher.js.map +1 -1
  124. package/dist/daemon/eviction-loop.d.ts +7 -0
  125. package/dist/daemon/eviction-loop.js +19 -3
  126. package/dist/daemon/eviction-loop.js.map +1 -1
  127. package/dist/daemon/join-applier.d.ts +35 -0
  128. package/dist/daemon/join-applier.js +49 -0
  129. package/dist/daemon/join-applier.js.map +1 -0
  130. package/dist/daemon/loop-heartbeat.d.ts +34 -0
  131. package/dist/daemon/loop-heartbeat.js +38 -0
  132. package/dist/daemon/loop-heartbeat.js.map +1 -0
  133. package/dist/daemon/reward-claim-loop.js +4 -1
  134. package/dist/daemon/reward-claim-loop.js.map +1 -1
  135. package/dist/daemon/skip-log-dedup.d.ts +1 -1
  136. package/dist/daemon/skip-log-dedup.js +3 -0
  137. package/dist/daemon/skip-log-dedup.js.map +1 -1
  138. package/dist/daemon/watchdog-loop.d.ts +84 -0
  139. package/dist/daemon/watchdog-loop.js +91 -0
  140. package/dist/daemon/watchdog-loop.js.map +1 -0
  141. package/dist/dashboard/assets/index-BsrAAmvC.js +171 -0
  142. package/dist/dashboard/assets/index-DQOWJ2SF.css +1 -0
  143. package/dist/dashboard/index.html +2 -2
  144. package/dist/discovery/http.d.ts +17 -0
  145. package/dist/discovery/http.js +295 -25
  146. package/dist/discovery/http.js.map +1 -1
  147. package/dist/discovery/onchain.js +158 -2
  148. package/dist/discovery/onchain.js.map +1 -1
  149. package/dist/discovery/types.d.ts +106 -0
  150. package/dist/discovery/types.js +40 -0
  151. package/dist/discovery/types.js.map +1 -1
  152. package/dist/discovery/with-fallback.js +14 -0
  153. package/dist/discovery/with-fallback.js.map +1 -1
  154. package/dist/earning/bootstrap.d.ts +25 -0
  155. package/dist/earning/bootstrap.js +79 -28
  156. package/dist/earning/bootstrap.js.map +1 -1
  157. package/dist/earning/contracts.d.ts +0 -229
  158. package/dist/earning/contracts.js +4 -184
  159. package/dist/earning/contracts.js.map +1 -1
  160. package/dist/earning/faucet-topup-store.d.ts +41 -0
  161. package/dist/earning/faucet-topup-store.js +89 -0
  162. package/dist/earning/faucet-topup-store.js.map +1 -0
  163. package/dist/earning/faucet.d.ts +1 -1
  164. package/dist/earning/faucet.js +2 -2
  165. package/dist/earning/faucet.js.map +1 -1
  166. package/dist/earning/safe-adapter.js +11 -0
  167. package/dist/earning/safe-adapter.js.map +1 -1
  168. package/dist/earning/stolas-claim.js +8 -8
  169. package/dist/earning/stolas-claim.js.map +1 -1
  170. package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
  171. package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
  172. package/dist/earning/stolas-staking.js.map +1 -0
  173. package/dist/earning/testnet-setup-migration.d.ts +1 -0
  174. package/dist/earning/testnet-setup-migration.js +7 -2
  175. package/dist/earning/testnet-setup-migration.js.map +1 -1
  176. package/dist/earning/types.d.ts +1 -1
  177. package/dist/earning/types.js +1 -1
  178. package/dist/earning/types.js.map +1 -1
  179. package/dist/earning/viem-clients.d.ts +3 -19
  180. package/dist/earning/viem-clients.js +4 -31
  181. package/dist/earning/viem-clients.js.map +1 -1
  182. package/dist/eval/eval-harness-run.d.ts +63 -0
  183. package/dist/eval/eval-harness-run.js +123 -0
  184. package/dist/eval/eval-harness-run.js.map +1 -0
  185. package/dist/eval/orchestrator.d.ts +224 -0
  186. package/dist/eval/orchestrator.js +250 -0
  187. package/dist/eval/orchestrator.js.map +1 -0
  188. package/dist/eval/paired.d.ts +68 -0
  189. package/dist/eval/paired.js +93 -0
  190. package/dist/eval/paired.js.map +1 -0
  191. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  192. package/dist/eval/resolve-slate-tasks.js +56 -0
  193. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  194. package/dist/eval/screen-discovery.d.ts +22 -0
  195. package/dist/eval/screen-discovery.js +71 -0
  196. package/dist/eval/screen-discovery.js.map +1 -0
  197. package/dist/eval/screen-progress.d.ts +41 -0
  198. package/dist/eval/screen-progress.js +60 -0
  199. package/dist/eval/screen-progress.js.map +1 -0
  200. package/dist/eval/screen-runner.d.ts +30 -0
  201. package/dist/eval/screen-runner.js +289 -0
  202. package/dist/eval/screen-runner.js.map +1 -0
  203. package/dist/eval/screen.d.ts +107 -0
  204. package/dist/eval/screen.js +159 -0
  205. package/dist/eval/screen.js.map +1 -0
  206. package/dist/eval/slope.d.ts +29 -0
  207. package/dist/eval/slope.js +46 -0
  208. package/dist/eval/slope.js.map +1 -0
  209. package/dist/eval/train-sequence.d.ts +35 -0
  210. package/dist/eval/train-sequence.js +59 -0
  211. package/dist/eval/train-sequence.js.map +1 -0
  212. package/dist/eval/wilson.d.ts +45 -0
  213. package/dist/eval/wilson.js +48 -0
  214. package/dist/eval/wilson.js.map +1 -0
  215. package/dist/events/types.d.ts +1 -1
  216. package/dist/events/types.js +1 -1
  217. package/dist/events/types.js.map +1 -1
  218. package/dist/harnesses/auth-source.d.ts +51 -0
  219. package/dist/harnesses/auth-source.js +155 -0
  220. package/dist/harnesses/auth-source.js.map +1 -0
  221. package/dist/harnesses/engine/canonical-json.js +5 -3
  222. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  223. package/dist/harnesses/engine/engine.d.ts +32 -0
  224. package/dist/harnesses/engine/engine.js +76 -9
  225. package/dist/harnesses/engine/engine.js.map +1 -1
  226. package/dist/harnesses/engine/packaging.js +5 -5
  227. package/dist/harnesses/engine/packaging.js.map +1 -1
  228. package/dist/harnesses/engine/persistence.d.ts +17 -0
  229. package/dist/harnesses/engine/persistence.js +28 -0
  230. package/dist/harnesses/engine/persistence.js.map +1 -1
  231. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
  232. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
  233. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
  234. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  235. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  236. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  237. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  238. package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
  239. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  240. package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
  241. package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
  242. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  243. package/dist/harnesses/impls/index.d.ts +2 -0
  244. package/dist/harnesses/impls/index.js +10 -1
  245. package/dist/harnesses/impls/index.js.map +1 -1
  246. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
  247. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
  248. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
  249. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
  250. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
  251. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
  252. package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
  253. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
  254. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
  255. package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
  256. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
  257. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
  258. package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
  259. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  260. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +8 -0
  261. package/dist/harnesses/impls/learner/adapters/codex-code.js +91 -11
  262. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  263. package/dist/harnesses/impls/learner/harness.d.ts +29 -1
  264. package/dist/harnesses/impls/learner/harness.js +85 -1
  265. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  266. package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
  267. package/dist/harnesses/impls/learner/harvest.js +51 -1
  268. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  269. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  270. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  271. package/dist/harnesses/impls/stub.d.ts +2 -2
  272. package/dist/harnesses/impls/stub.js +2 -2
  273. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  274. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  275. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  276. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  277. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  278. package/dist/harnesses/readiness-registry.d.ts +16 -0
  279. package/dist/harnesses/readiness-registry.js +28 -6
  280. package/dist/harnesses/readiness-registry.js.map +1 -1
  281. package/dist/harnesses/types.d.ts +26 -0
  282. package/dist/learner/revert-decision.d.ts +16 -1
  283. package/dist/learner/revert-decision.js +38 -18
  284. package/dist/learner/revert-decision.js.map +1 -1
  285. package/dist/learner/revert-stats.d.ts +14 -0
  286. package/dist/learner/revert-stats.js +42 -0
  287. package/dist/learner/revert-stats.js.map +1 -1
  288. package/dist/local-provider-url.d.ts +3 -0
  289. package/dist/local-provider-url.js +28 -0
  290. package/dist/local-provider-url.js.map +1 -0
  291. package/dist/main.js +125 -120
  292. package/dist/main.js.map +1 -1
  293. package/dist/mcp/acquire-artifact.d.ts +3 -3
  294. package/dist/mcp/acquire-artifact.js +3 -3
  295. package/dist/mcp/operator-server.js +1 -1
  296. package/dist/mcp/operator-server.js.map +1 -1
  297. package/dist/mcp/server.js +5 -6
  298. package/dist/mcp/server.js.map +1 -1
  299. package/dist/observability/emit-event.d.ts +1 -1
  300. package/dist/observability/emit-event.js +0 -4
  301. package/dist/observability/emit-event.js.map +1 -1
  302. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  303. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  304. package/dist/plugins/learner/hooks/session-start +30 -1
  305. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  306. package/dist/preflight/deployment-readiness.d.ts +127 -0
  307. package/dist/preflight/deployment-readiness.js +308 -0
  308. package/dist/preflight/deployment-readiness.js.map +1 -0
  309. package/dist/preflight/pidfile-liveness.d.ts +7 -1
  310. package/dist/preflight/pidfile-liveness.js +14 -0
  311. package/dist/preflight/pidfile-liveness.js.map +1 -1
  312. package/dist/rpc/transport.d.ts +43 -5
  313. package/dist/rpc/transport.js +131 -30
  314. package/dist/rpc/transport.js.map +1 -1
  315. package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
  316. package/dist/solver-nets/registry.d.ts +19 -0
  317. package/dist/solver-nets/registry.js +95 -66
  318. package/dist/solver-nets/registry.js.map +1 -1
  319. package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
  320. package/dist/solver-types/_jinn-repo-pool.js +27 -0
  321. package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
  322. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  323. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  324. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  325. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  326. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  327. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  328. package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
  329. package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
  330. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  331. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
  332. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
  333. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  334. package/dist/solver-types/index.js +2 -0
  335. package/dist/solver-types/index.js.map +1 -1
  336. package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
  337. package/dist/solver-types/jinn-repo-admit.js +16 -0
  338. package/dist/solver-types/jinn-repo-admit.js.map +1 -0
  339. package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
  340. package/dist/solver-types/jinn-repo-auto.js +163 -0
  341. package/dist/solver-types/jinn-repo-auto.js.map +1 -0
  342. package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
  343. package/dist/solver-types/jinn-repo-definition.js +34 -0
  344. package/dist/solver-types/jinn-repo-definition.js.map +1 -0
  345. package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
  346. package/dist/solver-types/jinn-repo-extract.js +32 -0
  347. package/dist/solver-types/jinn-repo-extract.js.map +1 -0
  348. package/dist/solver-types/jinn-repo.d.ts +21 -0
  349. package/dist/solver-types/jinn-repo.js +23 -0
  350. package/dist/solver-types/jinn-repo.js.map +1 -0
  351. package/dist/solver-types/learner-loop-test.js +1 -1
  352. package/dist/solver-types/learner-loop-test.js.map +1 -1
  353. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  354. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  355. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  356. package/dist/solver-types/solver-type.d.ts +8 -0
  357. package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
  358. package/dist/solver-types/swe-rebench-v2.js +115 -10
  359. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  360. package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
  361. package/dist/solvernets/launched-record-dispatcher.js +8 -1
  362. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  363. package/dist/solvernets/registry-client-erc8004.js +29 -37
  364. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  365. package/dist/solvernets/registry-client.d.ts +6 -0
  366. package/dist/solvernets/store.d.ts +1 -1
  367. package/dist/solvernets/store.js +8 -3
  368. package/dist/solvernets/store.js.map +1 -1
  369. package/dist/spend/ai-units-config.d.ts +10 -0
  370. package/dist/spend/ai-units-config.js +7 -1
  371. package/dist/spend/ai-units-config.js.map +1 -1
  372. package/dist/spend/ai-units.d.ts +51 -0
  373. package/dist/spend/ai-units.js +73 -0
  374. package/dist/spend/ai-units.js.map +1 -1
  375. package/dist/spend/record.js +12 -5
  376. package/dist/spend/record.js.map +1 -1
  377. package/dist/spend/usage.js +39 -3
  378. package/dist/spend/usage.js.map +1 -1
  379. package/dist/store/store.d.ts +92 -5
  380. package/dist/store/store.js +184 -7
  381. package/dist/store/store.js.map +1 -1
  382. package/dist/trajectory/emit.d.ts +6 -0
  383. package/dist/trajectory/emit.js +9 -1
  384. package/dist/trajectory/emit.js.map +1 -1
  385. package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
  386. package/dist/trajectory/harness-bundle-schema.js +1 -1
  387. package/dist/trajectory/harness-bundle-schema.js.map +1 -1
  388. package/dist/trajectory/schema.d.ts +1 -1
  389. package/dist/trajectory/schema.js +1 -1
  390. package/dist/trajectory/schema.js.map +1 -1
  391. package/dist/trajectory/scrub/build.d.ts +27 -0
  392. package/dist/trajectory/scrub/build.js +43 -0
  393. package/dist/trajectory/scrub/build.js.map +1 -0
  394. package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
  395. package/dist/trajectory/scrub/emit-scrub.js +88 -0
  396. package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
  397. package/dist/trajectory/scrub/key-policy.d.ts +20 -0
  398. package/dist/trajectory/scrub/key-policy.js +43 -0
  399. package/dist/trajectory/scrub/key-policy.js.map +1 -0
  400. package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
  401. package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
  402. package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
  403. package/dist/trajectory/scrub/openredaction-stage.d.ts +14 -0
  404. package/dist/trajectory/scrub/openredaction-stage.js +36 -0
  405. package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
  406. package/dist/trajectory/scrub/pii-build.d.ts +31 -0
  407. package/dist/trajectory/scrub/pii-build.js +64 -0
  408. package/dist/trajectory/scrub/pii-build.js.map +1 -0
  409. package/dist/trajectory/scrub/pipeline.d.ts +16 -0
  410. package/dist/trajectory/scrub/pipeline.js +26 -0
  411. package/dist/trajectory/scrub/pipeline.js.map +1 -0
  412. package/dist/trajectory/scrub/secretlint-stage.d.ts +13 -0
  413. package/dist/trajectory/scrub/secretlint-stage.js +121 -0
  414. package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
  415. package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
  416. package/dist/trajectory/scrub/transformers-detector.js +68 -0
  417. package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
  418. package/dist/trajectory/scrub/types.d.ts +25 -0
  419. package/dist/trajectory/scrub/types.js +2 -0
  420. package/dist/trajectory/scrub/types.js.map +1 -0
  421. package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
  422. package/dist/trajectory/transcript-parsers/types.js +1 -1
  423. package/dist/trajectory/transcript-parsers/types.js.map +1 -1
  424. package/dist/tx-retry.d.ts +12 -0
  425. package/dist/tx-retry.js +41 -12
  426. package/dist/tx-retry.js.map +1 -1
  427. package/dist/types/envelope.d.ts +1 -1
  428. package/dist/types/envelope.js +1 -1
  429. package/dist/types/envelope.js.map +1 -1
  430. package/dist/types/payloads/index.d.ts +1 -1
  431. package/dist/types/payloads/index.js +7 -1
  432. package/dist/types/payloads/index.js.map +1 -1
  433. package/dist/types/payloads/portfolio-v0.d.ts +1 -1
  434. package/dist/types/payloads/portfolio-v0.js +1 -1
  435. package/dist/types/payloads/portfolio-v0.js.map +1 -1
  436. package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
  437. package/dist/types/payloads/prediction-apy-v0.js +1 -1
  438. package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
  439. package/dist/types/payloads/prediction-v0.d.ts +1 -1
  440. package/dist/types/payloads/prediction-v0.js +1 -1
  441. package/dist/types/payloads/prediction-v0.js.map +1 -1
  442. package/dist/types/portfolio.d.ts +1 -1
  443. package/dist/types/portfolio.js +1 -1
  444. package/dist/types/portfolio.js.map +1 -1
  445. package/dist/types/prediction-apy.d.ts +1 -1
  446. package/dist/types/prediction-apy.js +1 -1
  447. package/dist/types/prediction-apy.js.map +1 -1
  448. package/dist/types/prediction.d.ts +1 -1
  449. package/dist/types/prediction.js +1 -1
  450. package/dist/types/prediction.js.map +1 -1
  451. package/dist/types/session-provenance.d.ts +1 -1
  452. package/dist/types/session-provenance.js +1 -1
  453. package/dist/types/session-provenance.js.map +1 -1
  454. package/dist/types/task-document.d.ts +315 -1
  455. package/dist/types/task-document.js +9 -1
  456. package/dist/types/task-document.js.map +1 -1
  457. package/dist/types/task.d.ts +29 -1
  458. package/dist/types/task.js +1 -1
  459. package/dist/types/task.js.map +1 -1
  460. package/dist/types/window.d.ts +1 -1
  461. package/dist/types/window.js +1 -1
  462. package/dist/types/window.js.map +1 -1
  463. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
  464. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
  465. package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
  466. package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
  467. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
  468. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
  469. package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
  470. package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
  471. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
  472. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
  473. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
  474. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
  475. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
  476. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
  477. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
  478. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
  479. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
  480. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
  481. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
  482. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
  483. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
  484. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
  485. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  486. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  487. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  488. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  489. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
  490. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
  491. package/dist/vendor/@jinn-network/sdk/package.json +9 -1
  492. package/docker-compose.yml +3 -2
  493. package/package.json +36 -26
  494. package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
  495. package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
  496. package/plugins/jinn-repo-runtime/README.md +27 -0
  497. package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
  498. package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
  499. package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
  500. package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
  501. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  502. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  503. package/plugins/learner/hooks/session-start +30 -1
  504. package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  505. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  506. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  507. package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
  508. package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
  509. package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
  510. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
  511. package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
  512. package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
  513. package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
  514. package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
  515. package/dist/daemon/jinn-claim-loop-mock.js +0 -122
  516. package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
  517. package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
  518. package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
  519. package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
  520. package/dist/daemon/jinn-claim-loop.d.ts +0 -130
  521. package/dist/daemon/jinn-claim-loop.js +0 -328
  522. package/dist/daemon/jinn-claim-loop.js.map +0 -1
  523. package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
  524. package/dist/dashboard/assets/index-yVemxHot.js +0 -351
  525. package/dist/earning/jinn-rewards.js.map +0 -1
  526. package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
  527. package/dist/scripts/donation-consumption-acceptance.js +0 -1382
  528. package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
  529. package/dist/x402/acquire.d.ts +0 -17
  530. package/dist/x402/acquire.js +0 -49
  531. package/dist/x402/acquire.js.map +0 -1
  532. package/dist/x402/facilitator.d.ts +0 -11
  533. package/dist/x402/facilitator.js +0 -52
  534. package/dist/x402/facilitator.js.map +0 -1
  535. package/dist/x402/handler.d.ts +0 -27
  536. package/dist/x402/handler.js +0 -236
  537. package/dist/x402/handler.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ import { ScrubPipeline } from './pipeline.js';
2
+ import { keyPolicyStage } from './key-policy.js';
3
+ import { openredactionStage } from './openredaction-stage.js';
4
+ import { secretlintStage } from './secretlint-stage.js';
5
+ import { mlPiiStage } from './ml-pii-stage.js';
6
+ /**
7
+ * Default key policy. `jinn.*` identity/chain attributes are structural and pass
8
+ * raw. The `drop` tier deletes the spec's stage-1 high-confidence keys outright
9
+ * (auth headers, cookies, env dumps — see `spec/2026-06-15-ts-trajectory-scrub-stack.md`):
10
+ * these never carry sellable content and are never safe to publish. Globs use the
11
+ * trailing-`*` prefix form `classifyKey` supports; the HTTP header keys are listed
12
+ * per request/response direction (a leading `*.header.…` glob is not matched, so
13
+ * we enumerate the concrete keys). Everything else is `content` and flows through
14
+ * the value-scrubbing stages.
15
+ */
16
+ export const DEFAULT_KEY_POLICY = {
17
+ safe: ['jinn.*'],
18
+ drop: [
19
+ 'http.request.header.authorization',
20
+ 'http.response.header.authorization',
21
+ 'http.request.header.cookie',
22
+ 'http.response.header.cookie',
23
+ 'http.request.header.set-cookie',
24
+ 'http.response.header.set-cookie',
25
+ 'env.*',
26
+ ],
27
+ };
28
+ /**
29
+ * Assembles the seller-side scrub pipeline (cost-ascending): structural key
30
+ * policy → openredaction (structured PII) → secretlint + entropy (secrets) →
31
+ * optional GLiNER (ML PII). The GLiNER stage is added only when a detector is
32
+ * supplied, so the daemon degrades gracefully (regex + secrets still scrub) when
33
+ * the ML model is unavailable.
34
+ */
35
+ export function buildScrubPipeline(opts = {}) {
36
+ const policy = opts.policy ?? DEFAULT_KEY_POLICY;
37
+ const stages = [keyPolicyStage(policy), openredactionStage(policy), secretlintStage(policy)];
38
+ if (opts.piiDetector) {
39
+ stages.push(mlPiiStage(policy, opts.piiDetector));
40
+ }
41
+ return new ScrubPipeline(stages);
42
+ }
43
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE;QACJ,mCAAmC;QACnC,oCAAoC;QACpC,4BAA4B;QAC5B,6BAA6B;QAC7B,gCAAgC;QAChC,iCAAiC;QACjC,OAAO;KACR;CACF,CAAC;AAQF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC,EAAE;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { RedactionManifest, Span } from '../schema.js';
2
+ import type { ScrubPipeline } from './pipeline.js';
3
+ /**
4
+ * Seller-side scrub applied at emit time, before a trajectory is signed and
5
+ * published. Runs every span's attributes (and each event's attributes) through
6
+ * the pipeline, rebuilds the prev-span hash chain over the scrubbed spans, and
7
+ * produces the redaction manifest (one entry per span listing the keys touched;
8
+ * `event.<key>` for event-attribute redactions).
9
+ */
10
+ export declare function scrubSpansForEmit(spans: Span[], pipeline: ScrubPipeline, taskCid: string): Promise<{
11
+ spans: Span[];
12
+ redactionManifest: RedactionManifest;
13
+ }>;
14
+ /**
15
+ * Minimal structural shape of a capture span (jinn.capture-trajectory.v1): a
16
+ * flat attribute bag plus the keys already redacted at ingest. Captures have no
17
+ * events array and no in-run hash chain, so they cannot go through
18
+ * {@link scrubSpansForEmit}; this is their dedicated seller-side scrub.
19
+ */
20
+ export interface ScrubbableCaptureSpan {
21
+ attributes: Record<string, unknown>;
22
+ redactedKeys: string[];
23
+ }
24
+ /**
25
+ * Seller-side scrub for capture spans, applied at publish time before the
26
+ * capture trajectory is uploaded. Runs each span's attributes through the
27
+ * pipeline, replacing them with the scrubbed values, and unions the pipeline's
28
+ * redactions into the span's existing `redactedKeys`. Unlike
29
+ * {@link scrubSpansForEmit} it does NOT touch events or inject a hash chain —
30
+ * capture spans carry neither. Generic over the span type so the concrete
31
+ * `SpanRow` (with its extra columns) is returned unchanged apart from
32
+ * `attributes` and `redactedKeys`.
33
+ */
34
+ export declare function scrubCaptureSpans<T extends ScrubbableCaptureSpan>(spans: T[], pipeline: ScrubPipeline): Promise<T[]>;
35
+ /**
36
+ * Unions two redaction manifests by spanId (dedup redactedKeys per span). Used
37
+ * when an ingestion-time manifest (e.g. a capture's stored redactedKeys) is
38
+ * combined with the emit-time pipeline manifest. Keeps the
39
+ * `totalRedactions === sum(redactedKeys)` invariant the schema enforces.
40
+ */
41
+ export declare function mergeRedactionManifests(a: RedactionManifest, b: RedactionManifest): RedactionManifest;
@@ -0,0 +1,88 @@
1
+ import { computeGenesisHash, computePrevSpanHash } from '../hash-chain.js';
2
+ /**
3
+ * Seller-side scrub applied at emit time, before a trajectory is signed and
4
+ * published. Runs every span's attributes (and each event's attributes) through
5
+ * the pipeline, rebuilds the prev-span hash chain over the scrubbed spans, and
6
+ * produces the redaction manifest (one entry per span listing the keys touched;
7
+ * `event.<key>` for event-attribute redactions).
8
+ */
9
+ export async function scrubSpansForEmit(spans, pipeline, taskCid) {
10
+ const out = [];
11
+ const manifestSpans = [];
12
+ let total = 0;
13
+ let prev = computeGenesisHash(taskCid);
14
+ for (const span of spans) {
15
+ const redactedKeys = new Set();
16
+ const attrResult = await pipeline.run(span.attributes ?? {});
17
+ for (const r of attrResult.redactions)
18
+ redactedKeys.add(r.key);
19
+ const events = [];
20
+ for (const event of span.events) {
21
+ if (event.attributes && Object.keys(event.attributes).length > 0) {
22
+ const evResult = await pipeline.run(event.attributes);
23
+ events.push({ ...event, attributes: evResult.attributes });
24
+ for (const r of evResult.redactions)
25
+ redactedKeys.add(`event.${r.key}`);
26
+ }
27
+ else {
28
+ events.push(event);
29
+ }
30
+ }
31
+ const scrubbed = {
32
+ ...span,
33
+ attributes: { ...attrResult.attributes, 'jinn.prevSpanHash': prev },
34
+ events,
35
+ };
36
+ out.push(scrubbed);
37
+ prev = computePrevSpanHash(scrubbed);
38
+ if (redactedKeys.size > 0) {
39
+ const keys = [...redactedKeys];
40
+ manifestSpans.push({ spanId: span.spanId, redactedKeys: keys });
41
+ total += keys.length;
42
+ }
43
+ }
44
+ return { spans: out, redactionManifest: { spans: manifestSpans, totalRedactions: total } };
45
+ }
46
+ /**
47
+ * Seller-side scrub for capture spans, applied at publish time before the
48
+ * capture trajectory is uploaded. Runs each span's attributes through the
49
+ * pipeline, replacing them with the scrubbed values, and unions the pipeline's
50
+ * redactions into the span's existing `redactedKeys`. Unlike
51
+ * {@link scrubSpansForEmit} it does NOT touch events or inject a hash chain —
52
+ * capture spans carry neither. Generic over the span type so the concrete
53
+ * `SpanRow` (with its extra columns) is returned unchanged apart from
54
+ * `attributes` and `redactedKeys`.
55
+ */
56
+ export async function scrubCaptureSpans(spans, pipeline) {
57
+ const out = [];
58
+ for (const span of spans) {
59
+ const result = await pipeline.run(span.attributes ?? {});
60
+ const redactedKeys = new Set(span.redactedKeys);
61
+ for (const r of result.redactions)
62
+ redactedKeys.add(r.key);
63
+ out.push({ ...span, attributes: result.attributes, redactedKeys: [...redactedKeys] });
64
+ }
65
+ return out;
66
+ }
67
+ /**
68
+ * Unions two redaction manifests by spanId (dedup redactedKeys per span). Used
69
+ * when an ingestion-time manifest (e.g. a capture's stored redactedKeys) is
70
+ * combined with the emit-time pipeline manifest. Keeps the
71
+ * `totalRedactions === sum(redactedKeys)` invariant the schema enforces.
72
+ */
73
+ export function mergeRedactionManifests(a, b) {
74
+ const bySpan = new Map();
75
+ for (const m of [a, b]) {
76
+ for (const s of m.spans) {
77
+ const set = bySpan.get(s.spanId) ?? new Set();
78
+ for (const k of s.redactedKeys)
79
+ set.add(k);
80
+ bySpan.set(s.spanId, set);
81
+ }
82
+ }
83
+ const spans = [...bySpan]
84
+ .map(([spanId, keys]) => ({ spanId, redactedKeys: [...keys] }))
85
+ .filter((s) => s.redactedKeys.length > 0);
86
+ return { spans, totalRedactions: spans.reduce((n, s) => n + s.redactedKeys.length, 0) };
87
+ }
88
+ //# sourceMappingURL=emit-scrub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-scrub.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/emit-scrub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ScrubStage } from './types.js';
2
+ export interface KeyPolicy {
3
+ /** keys whose values are structural and safe to publish raw */
4
+ safe: string[];
5
+ /** keys to delete entirely (never published) */
6
+ drop: string[];
7
+ }
8
+ export type KeyClass = 'safe' | 'content' | 'drop';
9
+ /**
10
+ * Classify an attribute key against the policy. `drop` wins over `safe` (a key
11
+ * matching both is dropped — fail safe). Unmatched keys are `content` and flow
12
+ * to the value-scrubbing stages.
13
+ */
14
+ export declare function classifyKey(key: string, policy: KeyPolicy): KeyClass;
15
+ /**
16
+ * Structural key-policy stage: deletes `drop` keys outright (recording a
17
+ * redaction) and passes `safe` + `content` keys through unchanged. Value-level
18
+ * scrubbing of `content` keys is handled by later stages.
19
+ */
20
+ export declare function keyPolicyStage(policy: KeyPolicy): ScrubStage;
@@ -0,0 +1,43 @@
1
+ const VERSION = '0.1.0';
2
+ /** Exact match, or prefix match when the pattern ends with `*`. */
3
+ function matches(key, pattern) {
4
+ if (pattern.endsWith('*'))
5
+ return key.startsWith(pattern.slice(0, -1));
6
+ return key === pattern;
7
+ }
8
+ /**
9
+ * Classify an attribute key against the policy. `drop` wins over `safe` (a key
10
+ * matching both is dropped — fail safe). Unmatched keys are `content` and flow
11
+ * to the value-scrubbing stages.
12
+ */
13
+ export function classifyKey(key, policy) {
14
+ if (policy.drop.some((p) => matches(key, p)))
15
+ return 'drop';
16
+ if (policy.safe.some((p) => matches(key, p)))
17
+ return 'safe';
18
+ return 'content';
19
+ }
20
+ /**
21
+ * Structural key-policy stage: deletes `drop` keys outright (recording a
22
+ * redaction) and passes `safe` + `content` keys through unchanged. Value-level
23
+ * scrubbing of `content` keys is handled by later stages.
24
+ */
25
+ export function keyPolicyStage(policy) {
26
+ return {
27
+ name: 'key-policy',
28
+ version: VERSION,
29
+ scrub(attributes) {
30
+ const out = {};
31
+ const redactions = [];
32
+ for (const [key, value] of Object.entries(attributes)) {
33
+ if (classifyKey(key, policy) === 'drop') {
34
+ redactions.push({ key, stage: 'key-policy', kind: 'dropped-key' });
35
+ continue;
36
+ }
37
+ out[key] = value;
38
+ }
39
+ return { attributes: out, redactions };
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=key-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-policy.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/key-policy.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,mEAAmE;AACnE,SAAS,OAAO,CAAC,GAAW,EAAE,OAAe;IAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,KAAK,OAAO,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAiB;IACxD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,UAAsB;YAC1B,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;oBACxC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;oBACnE,SAAS;gBACX,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type KeyPolicy } from './key-policy.js';
2
+ import type { ScrubStage } from './types.js';
3
+ /** A PII entity detected in text: a label (PER/ORG/LOC/…) and the matched span text. */
4
+ export interface PiiEntity {
5
+ label: string;
6
+ text: string;
7
+ }
8
+ /**
9
+ * ML PII detector seam. The production implementation wraps a Transformers.js
10
+ * token-classification (NER) model; tests inject a deterministic fake. Kept
11
+ * behind an interface so the stage logic is unit-tested without loading a model.
12
+ */
13
+ export interface PiiDetector {
14
+ detect(text: string): Promise<PiiEntity[]>;
15
+ }
16
+ /**
17
+ * ML PII stage. Runs the injected NER detector over each `content`-classified
18
+ * string value and replaces whole-word occurrences of each detected entity with
19
+ * `[PII:<label>]` (word-boundary matching so substrings aren't corrupted — e.g.
20
+ * detecting "London" leaves "Londoner" intact). `safe` and non-string values
21
+ * pass through untouched. The detector returns matched text rather than offsets
22
+ * because the Transformers.js NER pipeline does not surface character offsets.
23
+ */
24
+ export declare function mlPiiStage(policy: KeyPolicy, detector: PiiDetector): ScrubStage;
@@ -0,0 +1,43 @@
1
+ import { classifyKey } from './key-policy.js';
2
+ const VERSION = '0.1.0';
3
+ function escapeRegExp(s) {
4
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
5
+ }
6
+ /**
7
+ * ML PII stage. Runs the injected NER detector over each `content`-classified
8
+ * string value and replaces whole-word occurrences of each detected entity with
9
+ * `[PII:<label>]` (word-boundary matching so substrings aren't corrupted — e.g.
10
+ * detecting "London" leaves "Londoner" intact). `safe` and non-string values
11
+ * pass through untouched. The detector returns matched text rather than offsets
12
+ * because the Transformers.js NER pipeline does not surface character offsets.
13
+ */
14
+ export function mlPiiStage(policy, detector) {
15
+ return {
16
+ name: 'ml-pii',
17
+ version: VERSION,
18
+ async scrub(attributes) {
19
+ const out = {};
20
+ const redactions = [];
21
+ for (const [key, value] of Object.entries(attributes)) {
22
+ if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
23
+ out[key] = value;
24
+ continue;
25
+ }
26
+ let text = value;
27
+ for (const ent of await detector.detect(value)) {
28
+ if (!ent.text)
29
+ continue;
30
+ const re = new RegExp(`\\b${escapeRegExp(ent.text)}\\b`, 'g');
31
+ const replaced = text.replace(re, `[PII:${ent.label}]`);
32
+ if (replaced !== text) {
33
+ redactions.push({ key, stage: 'ml-pii', kind: 'pii', detail: ent.label });
34
+ text = replaced;
35
+ }
36
+ }
37
+ out[key] = text;
38
+ }
39
+ return { attributes: out, redactions };
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=ml-pii-stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-pii-stage.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/ml-pii-stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAkB9D,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB,EAAE,QAAqB;IACjE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,KAAK,CAAC,UAAsB;YAChC,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;YAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;oBACxE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACjB,SAAS;gBACX,CAAC;gBAED,IAAI,IAAI,GAAG,KAAK,CAAC;gBACjB,KAAK,MAAM,GAAG,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,GAAG,CAAC,IAAI;wBAAE,SAAS;oBACxB,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;oBACxD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBACtB,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;wBAC1E,IAAI,GAAG,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAClB,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { OpenRedaction } from 'openredaction';
2
+ import { type KeyPolicy } from './key-policy.js';
3
+ import type { ScrubStage } from './types.js';
4
+ /**
5
+ * Structured-PII stage backed by `openredaction` (570+ curated regex patterns +
6
+ * checksum validation, e.g. Luhn for cards). Runs only on `content`-classified
7
+ * string attributes; `safe` and non-string values pass through untouched. Each
8
+ * detection is replaced inline (openredaction's placeholder substitution) and
9
+ * recorded as a `pii` redaction for the provenance manifest.
10
+ *
11
+ * The detector is constructed once at factory time and reused across spans
12
+ * (pattern compilation is not free).
13
+ */
14
+ export declare function openredactionStage(policy: KeyPolicy, detector?: OpenRedaction): ScrubStage;
@@ -0,0 +1,36 @@
1
+ import { OpenRedaction } from 'openredaction';
2
+ import { classifyKey } from './key-policy.js';
3
+ const VERSION = '0.1.0';
4
+ /**
5
+ * Structured-PII stage backed by `openredaction` (570+ curated regex patterns +
6
+ * checksum validation, e.g. Luhn for cards). Runs only on `content`-classified
7
+ * string attributes; `safe` and non-string values pass through untouched. Each
8
+ * detection is replaced inline (openredaction's placeholder substitution) and
9
+ * recorded as a `pii` redaction for the provenance manifest.
10
+ *
11
+ * The detector is constructed once at factory time and reused across spans
12
+ * (pattern compilation is not free).
13
+ */
14
+ export function openredactionStage(policy, detector = new OpenRedaction()) {
15
+ return {
16
+ name: 'openredaction',
17
+ version: VERSION,
18
+ async scrub(attributes) {
19
+ const out = {};
20
+ const redactions = [];
21
+ for (const [key, value] of Object.entries(attributes)) {
22
+ if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
23
+ out[key] = value;
24
+ continue;
25
+ }
26
+ const result = await detector.detect(value);
27
+ out[key] = result.redacted;
28
+ for (const det of result.detections) {
29
+ redactions.push({ key, stage: 'openredaction', kind: 'pii', detail: det.type });
30
+ }
31
+ }
32
+ return { attributes: out, redactions };
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=openredaction-stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openredaction-stage.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/openredaction-stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAG9D,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,WAA0B,IAAI,aAAa,EAAE;IAE7C,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,KAAK,CAAC,UAAsB;YAChC,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;oBACxE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACjB,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5C,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACpC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { PiiDetector } from './ml-pii-stage.js';
2
+ export interface PiiDetectionConfig {
3
+ enabled: boolean;
4
+ /** Optional Transformers.js NER model id (defaults to Xenova/bert-base-NER). */
5
+ model?: string;
6
+ }
7
+ /** Thrown by the fail-closed detector on every scrub call when ML PII was enabled but the model never loaded. */
8
+ export declare class MlPiiUnavailableError extends Error {
9
+ constructor(cause: string);
10
+ }
11
+ /**
12
+ * Builds the ML PII detector (Transformers.js NER, in-process) when enabled,
13
+ * warming up the model.
14
+ *
15
+ * Failure altitude is **publish-time, not boot-time** (per
16
+ * `spec/2026-06-15-ts-trajectory-scrub-stack.md`, §"Failure posture": "if any
17
+ * stage errors or the model fails to load, the trajectory is **not**
18
+ * published"). Three cases:
19
+ *
20
+ * - Disabled (the default): returns `undefined` — the scrub pipeline runs the
21
+ * structural key policy + openredaction + secretlint/entropy stages only, with
22
+ * no ML PII tier and no error. Exactly the legacy behaviour.
23
+ * - Enabled and the model loads: returns the real detector.
24
+ * - Enabled but the model fails to load: does NOT throw at construction. Returns
25
+ * a fail-closed detector that hard-throws on every scrub call, so each affected
26
+ * publish aborts (fails closed — never publishes under-redacted/raw) while the
27
+ * rest of the daemon keeps running. A loud one-time boot warning is emitted so
28
+ * the degraded posture is visible in logs; the per-publish throw carries its own
29
+ * clear error so aborted publishes are never silent.
30
+ */
31
+ export declare function maybeBuildPiiDetector(cfg: PiiDetectionConfig, log?: (msg: string) => void): Promise<PiiDetector | undefined>;
@@ -0,0 +1,64 @@
1
+ import { TransformersPiiDetector } from './transformers-detector.js';
2
+ /** Thrown by the fail-closed detector on every scrub call when ML PII was enabled but the model never loaded. */
3
+ export class MlPiiUnavailableError extends Error {
4
+ constructor(cause) {
5
+ super('ML PII detection was enabled but the model failed to load; failing closed — ' +
6
+ `this trajectory is NOT published (disable captures.piiDetection or fix the model to publish): ${cause}`);
7
+ this.name = 'MlPiiUnavailableError';
8
+ }
9
+ }
10
+ /**
11
+ * A detector that hard-throws on every `detect()` call. Used when ML PII is
12
+ * enabled but the model failed to load: the failure is narrowed to **publish
13
+ * altitude** — the throw propagates through the ML scrub stage and aborts the
14
+ * one publish in flight (capture publish aborts; task-trajectory ref drops to
15
+ * null), so no raw trajectory is ever published. The daemon's other loops
16
+ * (earning, claim, engine, balance-topup) are unaffected because the failure
17
+ * is no longer raised at construction/boot.
18
+ */
19
+ function failClosedDetector(cause) {
20
+ return {
21
+ detect() {
22
+ return Promise.reject(new MlPiiUnavailableError(cause));
23
+ },
24
+ };
25
+ }
26
+ /**
27
+ * Builds the ML PII detector (Transformers.js NER, in-process) when enabled,
28
+ * warming up the model.
29
+ *
30
+ * Failure altitude is **publish-time, not boot-time** (per
31
+ * `spec/2026-06-15-ts-trajectory-scrub-stack.md`, §"Failure posture": "if any
32
+ * stage errors or the model fails to load, the trajectory is **not**
33
+ * published"). Three cases:
34
+ *
35
+ * - Disabled (the default): returns `undefined` — the scrub pipeline runs the
36
+ * structural key policy + openredaction + secretlint/entropy stages only, with
37
+ * no ML PII tier and no error. Exactly the legacy behaviour.
38
+ * - Enabled and the model loads: returns the real detector.
39
+ * - Enabled but the model fails to load: does NOT throw at construction. Returns
40
+ * a fail-closed detector that hard-throws on every scrub call, so each affected
41
+ * publish aborts (fails closed — never publishes under-redacted/raw) while the
42
+ * rest of the daemon keeps running. A loud one-time boot warning is emitted so
43
+ * the degraded posture is visible in logs; the per-publish throw carries its own
44
+ * clear error so aborted publishes are never silent.
45
+ */
46
+ export async function maybeBuildPiiDetector(cfg, log = (m) => console.warn(m)) {
47
+ if (!cfg.enabled)
48
+ return undefined;
49
+ try {
50
+ const detector = new TransformersPiiDetector(cfg.model ? { model: cfg.model } : {});
51
+ await detector.init();
52
+ log('[scrub] ML PII detection (Transformers.js NER) enabled.');
53
+ return detector;
54
+ }
55
+ catch (err) {
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ log('[scrub] WARNING: ML PII detection is enabled but the model failed to load. ' +
58
+ 'Failing closed at publish altitude: trajectory/capture publishing will ABORT ' +
59
+ '(no raw trajectories are published) until this is resolved or captures.piiDetection ' +
60
+ `is disabled. The daemon's other loops continue running. Cause: ${message}`);
61
+ return failClosedDetector(message);
62
+ }
63
+ }
64
+ //# sourceMappingURL=pii-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-build.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/pii-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AASrE,iHAAiH;AACjH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,KAAa;QACvB,KAAK,CACH,8EAA8E;YAC5E,iGAAiG,KAAK,EAAE,CAC3G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO;QACL,MAAM;YACJ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAuB,EACvB,MAA6B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,yDAAyD,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,GAAG,CACD,6EAA6E;YAC3E,+EAA+E;YAC/E,sFAAsF;YACtF,kEAAkE,OAAO,EAAE,CAC9E,CAAC;QACF,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Attributes, ScrubResult, ScrubStage } from './types.js';
2
+ /**
3
+ * Runs scrub stages in order over a span's attributes: each stage's output
4
+ * attributes feed the next, and redaction records accumulate across the whole
5
+ * chain. Stages may be async (e.g. the ML PII stage). The `components` list
6
+ * (stage name + pinned version) is what the signed provenance manifest records.
7
+ */
8
+ export declare class ScrubPipeline {
9
+ private readonly stages;
10
+ constructor(stages: ScrubStage[]);
11
+ get components(): Array<{
12
+ name: string;
13
+ version: string;
14
+ }>;
15
+ run(attributes: Attributes): Promise<ScrubResult>;
16
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Runs scrub stages in order over a span's attributes: each stage's output
3
+ * attributes feed the next, and redaction records accumulate across the whole
4
+ * chain. Stages may be async (e.g. the ML PII stage). The `components` list
5
+ * (stage name + pinned version) is what the signed provenance manifest records.
6
+ */
7
+ export class ScrubPipeline {
8
+ stages;
9
+ constructor(stages) {
10
+ this.stages = stages;
11
+ }
12
+ get components() {
13
+ return this.stages.map((s) => ({ name: s.name, version: s.version }));
14
+ }
15
+ async run(attributes) {
16
+ let current = attributes;
17
+ const redactions = [];
18
+ for (const stage of this.stages) {
19
+ const result = await stage.scrub(current);
20
+ current = result.attributes;
21
+ redactions.push(...result.redactions);
22
+ }
23
+ return { attributes: current, redactions };
24
+ }
25
+ }
26
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/pipeline.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAsB;QAC9B,IAAI,OAAO,GAAG,UAAU,CAAC;QACzB,MAAM,UAAU,GAAsB,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { type KeyPolicy } from './key-policy.js';
2
+ import type { ScrubStage } from './types.js';
3
+ /**
4
+ * Secrets stage. Two passes over each `content`-classified string value:
5
+ * 1. secretlint preset-recommend rules (AWS, GitHub, Slack, GCP, npm, …) —
6
+ * each match replaced inline with `[SECRET:<rule>]`.
7
+ * 2. a conservative Shannon-entropy + secret-shape fallback that catches
8
+ * near-random tokens no specific rule matched (≥ 20 chars by entropy alone,
9
+ * or 16–19 chars when the token is a single high-density secret-charset run
10
+ * mixing multiple character classes), replaced with `[SECRET:high-entropy]`.
11
+ * `safe` and non-string values pass through untouched.
12
+ */
13
+ export declare function secretlintStage(policy: KeyPolicy): ScrubStage;