open-multi-agent-kit 0.90.0 → 0.90.4

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 (307) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +22 -31
  3. package/dist/cli/args.d.ts +0 -2
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +1 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/config.d.ts +3 -6
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +27 -19
  10. package/dist/config.js.map +1 -1
  11. package/dist/core/adaptorch-bridge.d.ts +257 -0
  12. package/dist/core/adaptorch-bridge.d.ts.map +1 -0
  13. package/dist/core/adaptorch-bridge.js +473 -0
  14. package/dist/core/adaptorch-bridge.js.map +1 -0
  15. package/dist/core/agent-session.d.ts +132 -0
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +327 -5
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/bang-skill-invocation.d.ts +26 -0
  20. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  21. package/dist/core/bang-skill-invocation.js +208 -0
  22. package/dist/core/bang-skill-invocation.js.map +1 -0
  23. package/dist/core/compaction/utils.d.ts.map +1 -1
  24. package/dist/core/compaction/utils.js +15 -2
  25. package/dist/core/compaction/utils.js.map +1 -1
  26. package/dist/core/compactor.d.ts.map +1 -1
  27. package/dist/core/compactor.js +0 -3
  28. package/dist/core/compactor.js.map +1 -1
  29. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  30. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  31. package/dist/core/context-budget-governor-v2.js +1 -0
  32. package/dist/core/context-budget-governor-v2.js.map +1 -1
  33. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  34. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  35. package/dist/core/context-budget-headroom-types.js.map +1 -1
  36. package/dist/core/context-budget-headroom.d.ts +1 -1
  37. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  38. package/dist/core/context-budget-headroom.js +17 -4
  39. package/dist/core/context-budget-headroom.js.map +1 -1
  40. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  41. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  42. package/dist/core/context-budget-system-prompt.js +6 -1
  43. package/dist/core/context-budget-system-prompt.js.map +1 -1
  44. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  45. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  46. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  47. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  48. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  49. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  50. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  51. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  52. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  53. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  54. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  55. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  56. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  57. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  58. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  59. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  60. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  61. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  62. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  63. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  64. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  65. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  66. package/dist/core/context-budget-v2-cache.js +50 -0
  67. package/dist/core/context-budget-v2-cache.js.map +1 -0
  68. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  69. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  70. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  71. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  72. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  73. package/dist/core/context-budget-v2-planner.js +55 -2
  74. package/dist/core/context-budget-v2-planner.js.map +1 -1
  75. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  76. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  77. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  78. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  79. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  80. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  81. package/dist/core/context-budget-v2-selection.js +12 -2
  82. package/dist/core/context-budget-v2-selection.js.map +1 -1
  83. package/dist/core/context-budget-v2-types.d.ts +107 -1
  84. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  85. package/dist/core/context-budget-v2-types.js.map +1 -1
  86. package/dist/core/domain-loadouts.d.ts.map +1 -1
  87. package/dist/core/domain-loadouts.js +1 -1
  88. package/dist/core/domain-loadouts.js.map +1 -1
  89. package/dist/core/headroom.d.ts.map +1 -1
  90. package/dist/core/headroom.js +0 -4
  91. package/dist/core/headroom.js.map +1 -1
  92. package/dist/core/hook-inventory.d.ts.map +1 -1
  93. package/dist/core/hook-inventory.js +6 -0
  94. package/dist/core/hook-inventory.js.map +1 -1
  95. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  96. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  97. package/dist/core/mcp-computer-use-presets.js +158 -0
  98. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  99. package/dist/core/mcp-public-presets.d.ts +578 -0
  100. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  101. package/dist/core/mcp-public-presets.js +647 -0
  102. package/dist/core/mcp-public-presets.js.map +1 -0
  103. package/dist/core/model-registry.d.ts.map +1 -1
  104. package/dist/core/model-registry.js +1 -0
  105. package/dist/core/model-registry.js.map +1 -1
  106. package/dist/core/pi-package-intake-candidates.d.ts +14 -1
  107. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -1
  108. package/dist/core/pi-package-intake-candidates.js +182 -0
  109. package/dist/core/pi-package-intake-candidates.js.map +1 -1
  110. package/dist/core/pi-package-intake.d.ts +8 -1
  111. package/dist/core/pi-package-intake.d.ts.map +1 -1
  112. package/dist/core/pi-package-intake.js +14 -4
  113. package/dist/core/pi-package-intake.js.map +1 -1
  114. package/dist/core/reasoning-router-bias.d.ts +119 -0
  115. package/dist/core/reasoning-router-bias.d.ts.map +1 -0
  116. package/dist/core/reasoning-router-bias.js +287 -0
  117. package/dist/core/reasoning-router-bias.js.map +1 -0
  118. package/dist/core/reasoning-router-v2.d.ts +94 -0
  119. package/dist/core/reasoning-router-v2.d.ts.map +1 -0
  120. package/dist/core/reasoning-router-v2.js +288 -0
  121. package/dist/core/reasoning-router-v2.js.map +1 -0
  122. package/dist/core/reasoning-router-v3.d.ts +15 -0
  123. package/dist/core/reasoning-router-v3.d.ts.map +1 -0
  124. package/dist/core/reasoning-router-v3.js +193 -0
  125. package/dist/core/reasoning-router-v3.js.map +1 -0
  126. package/dist/core/reasoning-router-v4-weights.d.ts +124 -0
  127. package/dist/core/reasoning-router-v4-weights.d.ts.map +1 -0
  128. package/dist/core/reasoning-router-v4-weights.js +112 -0
  129. package/dist/core/reasoning-router-v4-weights.js.map +1 -0
  130. package/dist/core/reasoning-router-v4.d.ts +163 -0
  131. package/dist/core/reasoning-router-v4.d.ts.map +1 -0
  132. package/dist/core/reasoning-router-v4.js +683 -0
  133. package/dist/core/reasoning-router-v4.js.map +1 -0
  134. package/dist/core/reasoning-router-weights.d.ts +155 -0
  135. package/dist/core/reasoning-router-weights.d.ts.map +1 -0
  136. package/dist/core/reasoning-router-weights.js +204 -0
  137. package/dist/core/reasoning-router-weights.js.map +1 -0
  138. package/dist/core/reasoning-router.d.ts +44 -0
  139. package/dist/core/reasoning-router.d.ts.map +1 -0
  140. package/dist/core/reasoning-router.js +138 -0
  141. package/dist/core/reasoning-router.js.map +1 -0
  142. package/dist/core/reverse-skill.d.ts +2 -0
  143. package/dist/core/reverse-skill.d.ts.map +1 -0
  144. package/dist/core/reverse-skill.js +7 -0
  145. package/dist/core/reverse-skill.js.map +1 -0
  146. package/dist/core/router-feedback-collector.d.ts +101 -0
  147. package/dist/core/router-feedback-collector.d.ts.map +1 -0
  148. package/dist/core/router-feedback-collector.js +239 -0
  149. package/dist/core/router-feedback-collector.js.map +1 -0
  150. package/dist/core/settings-manager.d.ts +31 -3
  151. package/dist/core/settings-manager.d.ts.map +1 -1
  152. package/dist/core/settings-manager.js +16 -0
  153. package/dist/core/settings-manager.js.map +1 -1
  154. package/dist/core/slash-commands.d.ts.map +1 -1
  155. package/dist/core/slash-commands.js +4 -1
  156. package/dist/core/slash-commands.js.map +1 -1
  157. package/dist/core/system-prompt.d.ts +2 -0
  158. package/dist/core/system-prompt.d.ts.map +1 -1
  159. package/dist/core/system-prompt.js +58 -5
  160. package/dist/core/system-prompt.js.map +1 -1
  161. package/dist/index.d.ts +1 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +1 -0
  164. package/dist/index.js.map +1 -1
  165. package/dist/migrations.d.ts +19 -0
  166. package/dist/migrations.d.ts.map +1 -1
  167. package/dist/migrations.js +39 -15
  168. package/dist/migrations.js.map +1 -1
  169. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  170. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  171. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  172. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  173. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  174. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  175. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  176. package/dist/modes/interactive/components/control-panel-layout.d.ts +15 -1
  177. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/control-panel-layout.js +212 -68
  179. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  180. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +15 -0
  181. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  182. package/dist/modes/interactive/components/control-panel-runtime-status.js +105 -5
  183. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  184. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  185. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  186. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  187. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  188. package/dist/modes/interactive/components/control-panel.d.ts +8 -0
  189. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/control-panel.js +40 -8
  191. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  192. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  193. package/dist/modes/interactive/components/settings-selector.js +2 -1
  194. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  195. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  196. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  197. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  198. package/dist/modes/interactive/interactive-mode.d.ts +6 -0
  199. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  200. package/dist/modes/interactive/interactive-mode.js +206 -32
  201. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  202. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  203. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  204. package/dist/modes/interactive/theme/theme.js +2 -0
  205. package/dist/modes/interactive/theme/theme.js.map +1 -1
  206. package/docs/loadout-domains/README.md +8 -6
  207. package/docs/loadout-domains/ai-agent-ops.md +3 -2
  208. package/docs/loadout-domains/backend-api.md +3 -2
  209. package/docs/loadout-domains/data-science.md +3 -2
  210. package/docs/loadout-domains/devops-infra.md +2 -1
  211. package/docs/loadout-domains/docs-writing.md +7 -2
  212. package/docs/loadout-domains/frontend-ui.md +42 -11
  213. package/docs/loadout-domains/korean-document.md +83 -0
  214. package/docs/loadout-domains/mobile.md +1 -1
  215. package/docs/loadout-domains/qa-testing.md +4 -2
  216. package/docs/loadout-domains/security-audit.md +2 -1
  217. package/docs/loadout-domains/visual-qa.md +94 -0
  218. package/docs/skills.md +11 -4
  219. package/docs/usage.md +39 -4
  220. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  221. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  222. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  223. package/examples/extensions/gondolin/package-lock.json +2 -2
  224. package/examples/extensions/gondolin/package.json +1 -1
  225. package/examples/extensions/preset.ts +2 -2
  226. package/examples/extensions/sandbox/package-lock.json +2 -2
  227. package/examples/extensions/sandbox/package.json +1 -1
  228. package/examples/extensions/with-deps/package-lock.json +2 -2
  229. package/examples/extensions/with-deps/package.json +1 -1
  230. package/npm-shrinkwrap.json +27 -34
  231. package/package.json +5 -5
  232. package/dist/agents/jailbreak/index.d.ts +0 -7
  233. package/dist/agents/jailbreak/index.d.ts.map +0 -1
  234. package/dist/agents/jailbreak/index.js +0 -7
  235. package/dist/agents/jailbreak/index.js.map +0 -1
  236. package/dist/agents/jailbreak/subagent-f.d.ts +0 -44
  237. package/dist/agents/jailbreak/subagent-f.d.ts.map +0 -1
  238. package/dist/agents/jailbreak/subagent-f.js +0 -60
  239. package/dist/agents/jailbreak/subagent-f.js.map +0 -1
  240. package/dist/cli/jailbreak-args.d.ts +0 -26
  241. package/dist/cli/jailbreak-args.d.ts.map +0 -1
  242. package/dist/cli/jailbreak-args.js +0 -86
  243. package/dist/cli/jailbreak-args.js.map +0 -1
  244. package/dist/commands/jailbreak.d.ts +0 -49
  245. package/dist/commands/jailbreak.d.ts.map +0 -1
  246. package/dist/commands/jailbreak.js +0 -201
  247. package/dist/commands/jailbreak.js.map +0 -1
  248. package/dist/encoding/index.d.ts +0 -6
  249. package/dist/encoding/index.d.ts.map +0 -1
  250. package/dist/encoding/index.js +0 -6
  251. package/dist/encoding/index.js.map +0 -1
  252. package/dist/encoding/l4-encoder.d.ts +0 -96
  253. package/dist/encoding/l4-encoder.d.ts.map +0 -1
  254. package/dist/encoding/l4-encoder.js +0 -474
  255. package/dist/encoding/l4-encoder.js.map +0 -1
  256. package/dist/fuzzing/index.d.ts +0 -6
  257. package/dist/fuzzing/index.d.ts.map +0 -1
  258. package/dist/fuzzing/index.js +0 -6
  259. package/dist/fuzzing/index.js.map +0 -1
  260. package/dist/fuzzing/mutation-engine.d.ts +0 -93
  261. package/dist/fuzzing/mutation-engine.d.ts.map +0 -1
  262. package/dist/fuzzing/mutation-engine.js +0 -244
  263. package/dist/fuzzing/mutation-engine.js.map +0 -1
  264. package/dist/jailbreak-extension.d.ts +0 -48
  265. package/dist/jailbreak-extension.d.ts.map +0 -1
  266. package/dist/jailbreak-extension.js +0 -47
  267. package/dist/jailbreak-extension.js.map +0 -1
  268. package/dist/modules/index.d.ts +0 -8
  269. package/dist/modules/index.d.ts.map +0 -1
  270. package/dist/modules/index.js +0 -7
  271. package/dist/modules/index.js.map +0 -1
  272. package/dist/modules/lrl-bypass.d.ts +0 -40
  273. package/dist/modules/lrl-bypass.d.ts.map +0 -1
  274. package/dist/modules/lrl-bypass.js +0 -84
  275. package/dist/modules/lrl-bypass.js.map +0 -1
  276. package/dist/modules/lrl-deps.d.ts +0 -38
  277. package/dist/modules/lrl-deps.d.ts.map +0 -1
  278. package/dist/modules/lrl-deps.js +0 -128
  279. package/dist/modules/lrl-deps.js.map +0 -1
  280. package/dist/multiturn/easl-chain.d.ts +0 -113
  281. package/dist/multiturn/easl-chain.d.ts.map +0 -1
  282. package/dist/multiturn/easl-chain.js +0 -351
  283. package/dist/multiturn/easl-chain.js.map +0 -1
  284. package/dist/multiturn/index.d.ts +0 -6
  285. package/dist/multiturn/index.d.ts.map +0 -1
  286. package/dist/multiturn/index.js +0 -6
  287. package/dist/multiturn/index.js.map +0 -1
  288. package/dist/routing/fallback-router.d.ts +0 -123
  289. package/dist/routing/fallback-router.d.ts.map +0 -1
  290. package/dist/routing/fallback-router.js +0 -355
  291. package/dist/routing/fallback-router.js.map +0 -1
  292. package/dist/routing/index.d.ts +0 -6
  293. package/dist/routing/index.d.ts.map +0 -1
  294. package/dist/routing/index.js +0 -6
  295. package/dist/routing/index.js.map +0 -1
  296. package/dist/types/jailbreak.d.ts +0 -246
  297. package/dist/types/jailbreak.d.ts.map +0 -1
  298. package/dist/types/jailbreak.js +0 -8
  299. package/dist/types/jailbreak.js.map +0 -1
  300. package/dist/utils/jailbreak/common.d.ts +0 -63
  301. package/dist/utils/jailbreak/common.d.ts.map +0 -1
  302. package/dist/utils/jailbreak/common.js +0 -130
  303. package/dist/utils/jailbreak/common.js.map +0 -1
  304. package/dist/utils/jailbreak/index.d.ts +0 -7
  305. package/dist/utils/jailbreak/index.d.ts.map +0 -1
  306. package/dist/utils/jailbreak/index.js +0 -7
  307. package/dist/utils/jailbreak/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pi-package-intake-candidates.js","sourceRoot":"","sources":["../../src/core/pi-package-intake-candidates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CandidatePackageInput, SourceText } from \"./package-procurement.ts\";\n\nexport type PiPackageLane = \"mcp\" | \"lens\" | \"browser\" | \"subagent\" | \"footer\" | \"todo\";\n\nexport type PiPackagePortMode = \"omk-native\" | \"reference\" | \"measurement-gated\";\n\nexport interface PiPackagePortCandidate {\n\treadonly id: string;\n\treadonly lane: PiPackageLane;\n\treadonly laneLabel: string;\n\treadonly portMode: PiPackagePortMode;\n\treadonly piOrigins: readonly string[];\n\treadonly candidate: CandidatePackageInput;\n}\n\nexport interface PiPackageCandidateReviewInput {\n\treadonly candidateId: string;\n\treadonly declaredLicense?: string;\n\treadonly packageJsonScripts?: Record<string, string>;\n\treadonly reviewedScriptAllowlist?: string[];\n\treadonly sources?: SourceText[];\n\treadonly transitiveLicenses?: string[];\n}\n\nconst P0_SYNTHETIC_PIN = \"0.0.0-p0.0\";\n\nexport const P0_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t{\n\t\tid: \"pi-mcp-adapter\",\n\t\tlane: \"mcp\",\n\t\tlaneLabel: \"MCP\",\n\t\tportMode: \"omk-native\",\n\t\tpiOrigins: [\"pi-mcp-adapter\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-mcp-adapter\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"native\",\n\t\t\tdeclaredUse: \"loadout\",\n\t\t\texpectedResources: [\"extension\", \"tool\"],\n\t\t\tnativeSpec: {\n\t\t\t\texists: true,\n\t\t\t\ttrackId: \"mcp-adapter\",\n\t\t\t\tspecPath: \"packages/coding-agent/src/core/mcp-presets.ts\",\n\t\t\t},\n\t\t\tmetrics: [\"mcp-server-discovery\", \"tool-registration-parity\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-lens\",\n\t\tlane: \"lens\",\n\t\tlaneLabel: \"lens\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-lens\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-lens\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"observability\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\tmetrics: [\"lens-render-latency\", \"context-signal-coverage\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-agent-browser-native\",\n\t\tlane: \"browser\",\n\t\tlaneLabel: \"browser\",\n\t\tportMode: \"omk-native\",\n\t\tpiOrigins: [\"pi-agent-browser-native\", \"pi-browse\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-agent-browser-native\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"native\",\n\t\t\tdeclaredUse: \"loadout\",\n\t\t\texpectedResources: [\"tool\"],\n\t\t\tnativeSpec: {\n\t\t\t\texists: true,\n\t\t\t\ttrackId: \"agent-browser-native\",\n\t\t\t\tspecPath: \"packages/coding-agent/src/core/browser-use.ts\",\n\t\t\t},\n\t\t\tmetrics: [\"browser-action-success-rate\", \"browser-session-isolation\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-subagents\",\n\t\tlane: \"subagent\",\n\t\tlaneLabel: \"subagent\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"pi-subagents\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-subagents\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"reference\",\n\t\t\tdeclaredUse: \"workflow-reference\",\n\t\t\texpectedResources: [\"extension\", \"skill\"],\n\t\t\tpolicyOverlay: { declaredUse: \"workflow-reference\", activateAlongsideScheduler: false },\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-powerline-footer\",\n\t\tlane: \"footer\",\n\t\tlaneLabel: \"footer\",\n\t\tportMode: \"omk-native\",\n\t\tpiOrigins: [\"pi-footer\", \"pi-powerline-footer\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-powerline-footer\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"native\",\n\t\t\tdeclaredUse: \"observability\",\n\t\t\texpectedResources: [\"theme\", \"extension\"],\n\t\t\tnativeSpec: {\n\t\t\t\texists: true,\n\t\t\t\ttrackId: \"powerline-footer\",\n\t\t\t\tspecPath: \"packages/coding-agent/src/core/footer-data-provider.ts\",\n\t\t\t},\n\t\t\tmetrics: [\"footer-width-stability\", \"footer-render-latency\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-long-task\",\n\t\tlane: \"todo\",\n\t\tlaneLabel: \"todo\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-long-task\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-long-task\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"checkpoint\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\tmetrics: [\"long-task-resume-rate\", \"todo-state-parity\"],\n\t\t},\n\t},\n];\n"]}
1
+ {"version":3,"file":"pi-package-intake-candidates.js","sourceRoot":"","sources":["../../src/core/pi-package-intake-candidates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CandidatePackageInput, SourceText } from \"./package-procurement.ts\";\n\nexport type PiPackageLane =\n\t| \"mcp\"\n\t| \"lens\"\n\t| \"browser\"\n\t| \"subagent\"\n\t| \"footer\"\n\t| \"todo\"\n\t| \"memory\"\n\t| \"safety\"\n\t| \"context-opt\"\n\t| \"goal\"\n\t| \"code-search\"\n\t| \"observability\"\n\t| \"actor\"\n\t| \"interactive-ui\"\n\t| \"side-channel\"\n\t| \"review\";\n\nexport type PiPackagePortMode = \"omk-native\" | \"reference\" | \"measurement-gated\";\n\nexport interface PiPackagePortCandidate {\n\treadonly id: string;\n\treadonly lane: PiPackageLane;\n\treadonly laneLabel: string;\n\treadonly portMode: PiPackagePortMode;\n\treadonly piOrigins: readonly string[];\n\treadonly candidate: CandidatePackageInput;\n}\n\nexport interface PiPackageCandidateReviewInput {\n\treadonly candidateId: string;\n\treadonly declaredLicense?: string;\n\treadonly packageJsonScripts?: Record<string, string>;\n\treadonly reviewedScriptAllowlist?: string[];\n\treadonly sources?: SourceText[];\n\treadonly transitiveLicenses?: string[];\n}\n\nconst P0_SYNTHETIC_PIN = \"0.0.0-p0.0\";\nconst P1_SYNTHETIC_PIN = \"0.0.0-p1.0\";\n\n/**\n * P1 batch: sourced from a full crawl of pi.dev/packages (94 pages, 4653 unique\n * packages, crawled 2026-07-01), cross-referenced against the P0 lanes above to avoid\n * duplicates, then filtered to the highest-download, most clearly-scoped package per\n * new capability lane. None of these have had a source-level compatibility/capability\n * scan run yet (no `sources` supplied here) - that is why every one of them uses a\n * conservative `intendedUse` (`reference`, `measurement-gated`, or `report-only`, never\n * `native` or `permanent-adopt`) until a real review supplies `sources`/`declaredLicense`\n * for the actual npm package content. See\n * `.omk/runs/pi-package-catalog-20260701/` for the full crawled catalog and per-lane\n * shortlist this batch was drawn from.\n */\nexport const P1_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t{\n\t\tid: \"pi-hermes-memory\",\n\t\tlane: \"memory\",\n\t\tlaneLabel: \"memory\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"pi-hermes-memory\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-hermes-memory\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"reference\",\n\t\t\tdeclaredUse: \"memory\",\n\t\t\texpectedResources: [\"extension\", \"skill\"],\n\t\t\tpolicyOverlay: { declaredUse: \"memory\", activateAlongsideScheduler: false },\n\t\t},\n\t},\n\t{\n\t\tid: \"cc-safety-net\",\n\t\tlane: \"safety\",\n\t\tlaneLabel: \"safety\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"cc-safety-net\"],\n\t\tcandidate: {\n\t\t\tname: \"cc-safety-net\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"reference\",\n\t\t\tdeclaredUse: \"workflow-reference\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\tpolicyOverlay: { declaredUse: \"workflow-reference\", activateAlongsideScheduler: false },\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-lean-ctx\",\n\t\tlane: \"context-opt\",\n\t\tlaneLabel: \"context-opt\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-lean-ctx\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-lean-ctx\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"cache-perf\",\n\t\t\texpectedResources: [\"extension\", \"tool\"],\n\t\t\t// Same underlying lean-ctx engine as the currently-disabled `lean-ctx` OMK MCP\n\t\t\t// server (unstable stdio connection, see prior session diagnosis). Measurement\n\t\t\t// must directly compare this extension path's stability against that known\n\t\t\t// failure mode before any native/permanent adoption is considered.\n\t\t\tmetrics: [\"session-cache-hit-rate\", \"stdio-connection-stability\", \"token-cost-per-reread\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-codex-goal\",\n\t\tlane: \"goal\",\n\t\tlaneLabel: \"goal\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"pi-codex-goal\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-codex-goal\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"reference\",\n\t\t\tdeclaredUse: \"workflow-reference\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\t// OMK already has native goal tracking (omk_orchestrate_goal / Ouroboros);\n\t\t\t// reference-only to compare UX patterns, not a functional gap.\n\t\t\tpolicyOverlay: { declaredUse: \"workflow-reference\", activateAlongsideScheduler: false },\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-readseek\",\n\t\tlane: \"code-search\",\n\t\tlaneLabel: \"code-search\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-readseek\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-readseek\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"quality\",\n\t\t\texpectedResources: [\"extension\", \"tool\"],\n\t\t\tmetrics: [\"hash-anchor-edit-success-rate\", \"structural-search-latency\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"braintrust-pi-extension\",\n\t\tlane: \"observability\",\n\t\tlaneLabel: \"observability\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"@braintrust/pi-extension\"],\n\t\tcandidate: {\n\t\t\tname: \"@braintrust/pi-extension\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"advisory\",\n\t\t\tdeclaredUse: \"observability\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\t// Third-party telemetry (matches package-procurement.ts's `telemetry` capability\n\t\t\t// rule verbatim - the pattern literally includes `@braintrust`). Must land as\n\t\t\t// report-only/advisory with a strict export policy, never a default-on data path.\n\t\t\tpolicyOverlay: {\n\t\t\t\tdeclaredUse: \"observability\",\n\t\t\t\texportPolicy: { defaultOff: true, offlineDisables: true, denyRawPrompt: true, denyRawToolOutput: true },\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tid: \"llblab-pi-actors\",\n\t\tlane: \"actor\",\n\t\tlaneLabel: \"actor\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"@llblab/pi-actors\"],\n\t\tcandidate: {\n\t\t\tname: \"@llblab/pi-actors\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"reference\",\n\t\t\tdeclaredUse: \"workflow-reference\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\t// OMK already has the subagent tool + AdaptOrch WPL for orchestration;\n\t\t\t// reference-only pattern comparison for a local actor-kernel model.\n\t\t\tpolicyOverlay: { declaredUse: \"workflow-reference\", activateAlongsideScheduler: false },\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-ask-user\",\n\t\tlane: \"interactive-ui\",\n\t\tlaneLabel: \"interactive-ui\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-ask-user\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-ask-user\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"quality\",\n\t\t\texpectedResources: [\"extension\", \"tool\"],\n\t\t\tmetrics: [\"clarification-round-trip-count\", \"selection-ui-render-latency\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"rpiv-btw\",\n\t\tlane: \"side-channel\",\n\t\tlaneLabel: \"side-channel\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"@juicesharp/rpiv-btw\"],\n\t\tcandidate: {\n\t\t\tname: \"@juicesharp/rpiv-btw\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"workflow-reference\" as const,\n\t\t\texpectedResources: [\"extension\"],\n\t\t\tmetrics: [\"main-transcript-pollution-delta\", \"side-question-latency\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-simplify\",\n\t\tlane: \"review\",\n\t\tlaneLabel: \"review\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"pi-simplify\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-simplify\",\n\t\t\texactVersion: P1_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"report-only\",\n\t\t\tdeclaredUse: \"quality\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\t// Review/advisory tool - decision matrix routes declaredUse \"quality\" to\n\t\t\t// report-only and denies it if it also claims filesystem-write/child-process\n\t\t\t// capabilities, which is exactly the right default for an unreviewed\n\t\t\t// code-review extension.\n\t\t},\n\t},\n];\n\nexport const P0_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t{\n\t\tid: \"pi-mcp-adapter\",\n\t\tlane: \"mcp\",\n\t\tlaneLabel: \"MCP\",\n\t\tportMode: \"omk-native\",\n\t\tpiOrigins: [\"pi-mcp-adapter\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-mcp-adapter\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"native\",\n\t\t\tdeclaredUse: \"loadout\",\n\t\t\texpectedResources: [\"extension\", \"tool\"],\n\t\t\tnativeSpec: {\n\t\t\t\texists: true,\n\t\t\t\ttrackId: \"mcp-adapter\",\n\t\t\t\tspecPath: \"packages/coding-agent/src/core/mcp-presets.ts\",\n\t\t\t},\n\t\t\tmetrics: [\"mcp-server-discovery\", \"tool-registration-parity\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-lens\",\n\t\tlane: \"lens\",\n\t\tlaneLabel: \"lens\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-lens\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-lens\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"observability\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\tmetrics: [\"lens-render-latency\", \"context-signal-coverage\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-agent-browser-native\",\n\t\tlane: \"browser\",\n\t\tlaneLabel: \"browser\",\n\t\tportMode: \"omk-native\",\n\t\tpiOrigins: [\"pi-agent-browser-native\", \"pi-browse\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-agent-browser-native\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"native\",\n\t\t\tdeclaredUse: \"loadout\",\n\t\t\texpectedResources: [\"tool\"],\n\t\t\tnativeSpec: {\n\t\t\t\texists: true,\n\t\t\t\ttrackId: \"agent-browser-native\",\n\t\t\t\tspecPath: \"packages/coding-agent/src/core/browser-use.ts\",\n\t\t\t},\n\t\t\tmetrics: [\"browser-action-success-rate\", \"browser-session-isolation\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-subagents\",\n\t\tlane: \"subagent\",\n\t\tlaneLabel: \"subagent\",\n\t\tportMode: \"reference\",\n\t\tpiOrigins: [\"pi-subagents\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-subagents\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"reference\",\n\t\t\tdeclaredUse: \"workflow-reference\",\n\t\t\texpectedResources: [\"extension\", \"skill\"],\n\t\t\tpolicyOverlay: { declaredUse: \"workflow-reference\", activateAlongsideScheduler: false },\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-powerline-footer\",\n\t\tlane: \"footer\",\n\t\tlaneLabel: \"footer\",\n\t\tportMode: \"omk-native\",\n\t\tpiOrigins: [\"pi-footer\", \"pi-powerline-footer\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-powerline-footer\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"native\",\n\t\t\tdeclaredUse: \"observability\",\n\t\t\texpectedResources: [\"theme\", \"extension\"],\n\t\t\tnativeSpec: {\n\t\t\t\texists: true,\n\t\t\t\ttrackId: \"powerline-footer\",\n\t\t\t\tspecPath: \"packages/coding-agent/src/core/footer-data-provider.ts\",\n\t\t\t},\n\t\t\tmetrics: [\"footer-width-stability\", \"footer-render-latency\"],\n\t\t},\n\t},\n\t{\n\t\tid: \"pi-long-task\",\n\t\tlane: \"todo\",\n\t\tlaneLabel: \"todo\",\n\t\tportMode: \"measurement-gated\",\n\t\tpiOrigins: [\"pi-long-task\"],\n\t\tcandidate: {\n\t\t\tname: \"pi-long-task\",\n\t\t\texactVersion: P0_SYNTHETIC_PIN,\n\t\t\tintendedUse: \"measurement-gated\",\n\t\t\tdeclaredUse: \"checkpoint\",\n\t\t\texpectedResources: [\"extension\"],\n\t\t\tmetrics: [\"long-task-resume-rate\", \"todo-state-parity\"],\n\t\t},\n\t},\n];\n"]}
@@ -1,7 +1,14 @@
1
1
  import { type ProcurementReview } from "./package-procurement.ts";
2
2
  import { type PiPackageCandidateReviewInput, type PiPackageLane, type PiPackagePortCandidate } from "./pi-package-intake-candidates.ts";
3
3
  export type { PiPackageCandidateReviewInput, PiPackageLane, PiPackagePortCandidate, PiPackagePortMode, } from "./pi-package-intake-candidates.ts";
4
- export { P0_PI_PACKAGE_PORT_CANDIDATES } from "./pi-package-intake-candidates.ts";
4
+ export { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from "./pi-package-intake-candidates.ts";
5
+ /**
6
+ * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of
7
+ * pi.dev/packages (4653 unique packages) and is intentionally more conservative
8
+ * (reference/measurement-gated/report-only only, never native) since no source-level
9
+ * review has been run on any P1 candidate yet.
10
+ */
11
+ export declare const ALL_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[];
5
12
  export interface PiPackageIntakeInput {
6
13
  readonly candidates?: readonly PiPackagePortCandidate[];
7
14
  readonly reviews?: readonly PiPackageCandidateReviewInput[];
@@ -1 +1 @@
1
- {"version":3,"file":"pi-package-intake.d.ts","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAoB,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAEN,KAAK,6BAA6B,EAClC,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EACX,6BAA6B,EAC7B,aAAa,EACb,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;CACzC;AAuBD,wBAAgB,uBAAuB,CAAC,KAAK,GAAE,oBAAyB,GAAG,qBAAqB,CAO/F;AAED,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,sBAAsB,EAClC,WAAW,CAAC,EAAE,6BAA6B,EAC3C,GAAG,CAAC,EAAE,IAAI,GACR,qBAAqB,CAkBvB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,sBAAsB,CAgD1G","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? P0_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn P0_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
1
+ {"version":3,"file":"pi-package-intake.d.ts","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAoB,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAGN,KAAK,6BAA6B,EAClC,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EACX,6BAA6B,EAC7B,aAAa,EACb,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAEjH;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,SAAS,sBAAsB,EAG3E,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;CACzC;AAuBD,wBAAgB,uBAAuB,CAAC,KAAK,GAAE,oBAAyB,GAAG,qBAAqB,CAO/F;AAED,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,sBAAsB,EAClC,WAAW,CAAC,EAAE,6BAA6B,EAC3C,GAAG,CAAC,EAAE,IAAI,GACR,qBAAqB,CAkBvB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,sBAAsB,CAgD1G","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\tP1_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\n/**\n * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of\n * pi.dev/packages (4653 unique packages) and is intentionally more conservative\n * (reference/measurement-gated/report-only only, never native) since no source-level\n * review has been run on any P1 candidate yet.\n */\nexport const ALL_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t...P0_PI_PACKAGE_PORT_CANDIDATES,\n\t...P1_PI_PACKAGE_PORT_CANDIDATES,\n];\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? ALL_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn ALL_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
@@ -1,6 +1,16 @@
1
1
  import { procureCandidate } from "./package-procurement.js";
2
- import { P0_PI_PACKAGE_PORT_CANDIDATES, } from "./pi-package-intake-candidates.js";
3
- export { P0_PI_PACKAGE_PORT_CANDIDATES } from "./pi-package-intake-candidates.js";
2
+ import { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES, } from "./pi-package-intake-candidates.js";
3
+ export { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from "./pi-package-intake-candidates.js";
4
+ /**
5
+ * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of
6
+ * pi.dev/packages (4653 unique packages) and is intentionally more conservative
7
+ * (reference/measurement-gated/report-only only, never native) since no source-level
8
+ * review has been run on any P1 candidate yet.
9
+ */
10
+ export const ALL_PI_PACKAGE_PORT_CANDIDATES = [
11
+ ...P0_PI_PACKAGE_PORT_CANDIDATES,
12
+ ...P1_PI_PACKAGE_PORT_CANDIDATES,
13
+ ];
4
14
  const HARD_FORK_FINDING_KINDS = new Set([
5
15
  "legacy-home-path",
6
16
  "legacy-state-dir",
@@ -11,7 +21,7 @@ const HARD_FORK_FINDING_KINDS = new Set([
11
21
  ]);
12
22
  const DIRECT_PI_ADOPTION_BLOCKED = new Set(["permanent-package"]);
13
23
  export function evaluatePiPackageIntake(input = {}) {
14
- const candidates = input.candidates ?? P0_PI_PACKAGE_PORT_CANDIDATES;
24
+ const candidates = input.candidates ?? ALL_PI_PACKAGE_PORT_CANDIDATES;
15
25
  const reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));
16
26
  const results = candidates.map((definition) => evaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now));
17
27
  return { results, summary: summarizePiPackageIntake(results) };
@@ -117,6 +127,6 @@ function compareLaneSummaries(a, b) {
117
127
  return laneRank(a.lane) - laneRank(b.lane);
118
128
  }
119
129
  function laneRank(lane) {
120
- return P0_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);
130
+ return ALL_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);
121
131
  }
122
132
  //# sourceMappingURL=pi-package-intake.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi-package-intake.js","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACnG,OAAO,EACN,6BAA6B,GAI7B,MAAM,mCAAmC,CAAC;AAQ3C,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AA0ClF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACvC,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,uBAAuB;IACvB,eAAe;CACf,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAY5E,MAAM,UAAU,uBAAuB,CAAC,KAAK,GAAyB,EAAE,EAAyB;IAChG,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,6BAA6B,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAC7C,0BAA0B,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAClF,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;AAAA,CAC/D;AAED,MAAM,UAAU,0BAA0B,CACzC,UAAkC,EAClC,WAA2C,EAC3C,GAAU,EACc;IACxB,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC/B,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,eAAe,EAAE,WAAW,EAAE,eAAe,IAAI,KAAK;QACtD,kBAAkB,EAAE,WAAW,EAAE,kBAAkB;QACnD,uBAAuB,EAAE,WAAW,EAAE,uBAAuB;QAC7D,OAAO,EAAE,WAAW,EAAE,OAAO;QAC7B,kBAAkB,EAAE,WAAW,EAAE,kBAAkB;QACnD,GAAG;KACH,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO;QACN,UAAU;QACV,MAAM;QACN,eAAe,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;QAC3C,eAAe;QACf,yBAAyB,EAAE,2BAA2B,CAAC,UAAU,EAAE,MAAM,CAAC;KAC1E,CAAC;AAAA,CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAyC,EAA0B;IAC3G,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC5E,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACjF,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,eAAe,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;YAC1B,SAAS;QACV,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACzC,cAAc,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YACxD,iBAAiB,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YAC3D,mBAAmB,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAClD,QAAQ,IAAI,CAAC,CAAC;YACd,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAED,OAAO;QACN,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,cAAc;QACd,iBAAiB;QACjB,mBAAmB;QACnB,QAAQ;QACR,MAAM;QACN,eAAe;QACf,QAAQ,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KAC7F,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,MAAyB,EAAY;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB;SAC1C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC9F,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAAA,CAC7B;AAED,SAAS,2BAA2B,CAAC,UAAkC,EAAE,MAAyB,EAAW;IAC5G,OAAO,UAAU,CAAC,SAAS,CAAC,WAAW,KAAK,iBAAiB,IAAI,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAAA,CACjH;AAED,SAAS,cAAc,CAAC,MAA6B,EAA+B;IACnF,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;QAC5B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS;QAClC,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC;QACT,eAAe,EAAE,CAAC;KAClB,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,CAAuB,EAAE,CAAuB,EAAU;IACvF,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC9C,IAAI,aAAa,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IACxC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAAA,CAC3C;AAED,SAAS,QAAQ,CAAC,IAAmB,EAAU;IAC9C,OAAO,6BAA6B,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAAA,CACvF","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? P0_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn P0_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
1
+ {"version":3,"file":"pi-package-intake.js","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACnG,OAAO,EACN,6BAA6B,EAC7B,6BAA6B,GAI7B,MAAM,mCAAmC,CAAC;AAQ3C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAEjH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAsC;IAChF,GAAG,6BAA6B;IAChC,GAAG,6BAA6B;CAChC,CAAC;AA0CF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACvC,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,uBAAuB;IACvB,eAAe;CACf,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAY5E,MAAM,UAAU,uBAAuB,CAAC,KAAK,GAAyB,EAAE,EAAyB;IAChG,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,8BAA8B,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAC7C,0BAA0B,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAClF,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;AAAA,CAC/D;AAED,MAAM,UAAU,0BAA0B,CACzC,UAAkC,EAClC,WAA2C,EAC3C,GAAU,EACc;IACxB,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC/B,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,eAAe,EAAE,WAAW,EAAE,eAAe,IAAI,KAAK;QACtD,kBAAkB,EAAE,WAAW,EAAE,kBAAkB;QACnD,uBAAuB,EAAE,WAAW,EAAE,uBAAuB;QAC7D,OAAO,EAAE,WAAW,EAAE,OAAO;QAC7B,kBAAkB,EAAE,WAAW,EAAE,kBAAkB;QACnD,GAAG;KACH,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO;QACN,UAAU;QACV,MAAM;QACN,eAAe,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;QAC3C,eAAe;QACf,yBAAyB,EAAE,2BAA2B,CAAC,UAAU,EAAE,MAAM,CAAC;KAC1E,CAAC;AAAA,CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAyC,EAA0B;IAC3G,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC5E,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACjF,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,eAAe,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;YAC1B,SAAS;QACV,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACzC,cAAc,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YACxD,iBAAiB,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YAC3D,mBAAmB,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAClD,QAAQ,IAAI,CAAC,CAAC;YACd,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAED,OAAO;QACN,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,cAAc;QACd,iBAAiB;QACjB,mBAAmB;QACnB,QAAQ;QACR,MAAM;QACN,eAAe;QACf,QAAQ,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KAC7F,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,MAAyB,EAAY;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB;SAC1C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC9F,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAAA,CAC7B;AAED,SAAS,2BAA2B,CAAC,UAAkC,EAAE,MAAyB,EAAW;IAC5G,OAAO,UAAU,CAAC,SAAS,CAAC,WAAW,KAAK,iBAAiB,IAAI,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAAA,CACjH;AAED,SAAS,cAAc,CAAC,MAA6B,EAA+B;IACnF,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;QAC5B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS;QAClC,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC;QACT,eAAe,EAAE,CAAC;KAClB,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,CAAuB,EAAE,CAAuB,EAAU;IACvF,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC9C,IAAI,aAAa,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IACxC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAAA,CAC3C;AAED,SAAS,QAAQ,CAAC,IAAmB,EAAU;IAC9C,OAAO,8BAA8B,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAAA,CACxF","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\tP1_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\n/**\n * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of\n * pi.dev/packages (4653 unique packages) and is intentionally more conservative\n * (reference/measurement-gated/report-only only, never native) since no source-level\n * review has been run on any P1 candidate yet.\n */\nexport const ALL_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t...P0_PI_PACKAGE_PORT_CANDIDATES,\n\t...P1_PI_PACKAGE_PORT_CANDIDATES,\n];\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? ALL_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn ALL_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Reasoning-router bias compiler — Goal 009 Wave 1 Lane L (privacy-safe learning ledger).
3
+ *
4
+ * Pure, deterministic compiler from a set of privacy-safe feedback records
5
+ * (see router-feedback-collector.ts) to a bounded, per-cell reasoning-level
6
+ * bias snapshot. No clock, randomness, network, or model calls: the same
7
+ * input array always produces the same output (`JSON.stringify` byte-
8
+ * identical), regardless of input record order. This module is a standalone,
9
+ * pure utility — nothing here is wired into a router resolver or
10
+ * agent-session.ts by this lane.
11
+ *
12
+ * Goal 010 Lane I addition: `isRouterBiasCell` / `isRouterBiasSnapshot` /
13
+ * `parseRouterBiasSnapshot` / `getDefaultRouterBiasSnapshotPath` below let a
14
+ * (now opt-in) caller safely load a snapshot this module previously only
15
+ * wrote. `parseRouterBiasSnapshot` performs no filesystem access itself — it
16
+ * only validates already-read text — so this module's zero-I/O determinism
17
+ * guarantee for `compileBiasSnapshot`/`getBiasStepsForCell` is unchanged; the
18
+ * actual disk read lives in agent-session.ts.
19
+ */
20
+ import { type RouterFeedbackLaneType, type RouterFeedbackLenBucket, type RouterFeedbackTaskClass, type RouterFeedbackVersion } from "./router-feedback-collector.ts";
21
+ /** Minimum non-neutral ("strong") record count per cell before any bias applies. */
22
+ export declare const BIAS_STRONG_THRESHOLD = 5;
23
+ /** Bias magnitude bound, matching the resolver's existing bias clamp (reasoning-router-v2.ts BIAS_MAX). */
24
+ export declare const BIAS_MAX_STEPS = 2;
25
+ /** Bounded per-cell bias, in ladder steps. Never outside [-2, 2]. */
26
+ export type RouterBiasSteps = -2 | -1 | 0 | 1 | 2;
27
+ /** The feature tuple a bias cell is keyed on — identical dimensions the router already computes locally. */
28
+ export interface RouterBiasCellKey {
29
+ readonly predictedClass: RouterFeedbackTaskClass;
30
+ readonly laneType: RouterFeedbackLaneType;
31
+ readonly lenBucket: RouterFeedbackLenBucket;
32
+ readonly hadFence: boolean;
33
+ readonly hadDiff: boolean;
34
+ }
35
+ export interface RouterBiasCell extends RouterBiasCellKey {
36
+ readonly biasSteps: RouterBiasSteps;
37
+ /** Non-neutral (up/down-signaling) record count for this cell. */
38
+ readonly nStrong: number;
39
+ /** Total record count for this cell, including neutral (accepted/same/pass) records. */
40
+ readonly nTotal: number;
41
+ }
42
+ export interface RouterBiasSnapshot {
43
+ readonly schemaVersion: "router-bias-snapshot/v1";
44
+ /** sha256 hex digest of the canonicalized valid-record set actually compiled; not a prompt hash. */
45
+ readonly sourceRecordDigest: string;
46
+ /** Count of records that were validated and included in this snapshot. */
47
+ readonly consideredCount: number;
48
+ /** Count of records excluded from this snapshot (schema-invalid, or router-version mismatch). */
49
+ readonly droppedCount: number;
50
+ /** Bias cells, sorted deterministically. Empty when there is no ledger data or no cell reaches the threshold. */
51
+ readonly biasCells: readonly RouterBiasCell[];
52
+ }
53
+ export interface CompileBiasSnapshotOptions {
54
+ /**
55
+ * Restrict compilation to one router version — `compileBiasSnapshot` never
56
+ * mixes records from different router versions into one snapshot. Records
57
+ * tagged with any other `routerVersion` are excluded from this snapshot and
58
+ * counted in `droppedCount`. Defaults to "v3" for API compatibility; the
59
+ * offline CLI now defaults to "v4", matching the only auto-router wired to
60
+ * consume a learning-bias snapshot at runtime.
61
+ */
62
+ readonly routerVersion?: RouterFeedbackVersion;
63
+ }
64
+ /**
65
+ * Deterministically compile a bounded bias snapshot from raw (possibly
66
+ * malformed) ledger entries. Unknown-shaped entries — including ones with
67
+ * extra keys, missing keys, or out-of-range enum values — are dropped and
68
+ * counted, never thrown. Records tagged with a `routerVersion` other than the
69
+ * target version are also dropped and counted (never merged across router
70
+ * versions into one snapshot). An empty or all-dropped input compiles to an
71
+ * empty-bias snapshot (`biasCells: []`), which is exactly the shipped
72
+ * no-learning behavior — this makes "empty ledger -> zero bias" true by
73
+ * construction, not by a special case.
74
+ *
75
+ * Pure: same `records` (any order) -> same `RouterBiasSnapshot` (byte-
76
+ * identical `JSON.stringify` output), because cells are grouped by an
77
+ * order-independent key and the emitted cell/record ordering is always
78
+ * sorted before serialization.
79
+ */
80
+ export declare function compileBiasSnapshot(records: readonly unknown[], options?: CompileBiasSnapshotOptions): RouterBiasSnapshot;
81
+ /** Look up the compiled bias for one feature cell; 0 (no bias) when the cell is absent from the snapshot. */
82
+ export declare function getBiasStepsForCell(snapshot: RouterBiasSnapshot, key: RouterBiasCellKey): RouterBiasSteps;
83
+ /**
84
+ * Strict runtime validator for one compiled bias cell. Exact eight-key
85
+ * allowlist plus bounded per-field checks, reusing the same closed enums as
86
+ * `isRouterFeedbackRecord` (`ROUTER_FEEDBACK_TASK_CLASSES`,
87
+ * `ROUTER_FEEDBACK_LANE_TYPES`, `ROUTER_FEEDBACK_LEN_BUCKETS`) so this
88
+ * validator cannot silently drift from the ledger's own schema. `nStrong` is
89
+ * additionally required to never exceed `nTotal` (true by construction for
90
+ * every cell `compileBiasSnapshot` can produce; a cheap sanity bound against
91
+ * a hand-tampered file).
92
+ */
93
+ export declare function isRouterBiasCell(value: unknown): value is RouterBiasCell;
94
+ /**
95
+ * Strict runtime validator for a compiled bias snapshot. Exact five-key
96
+ * allowlist; `biasCells` must be an array whose every element passes
97
+ * `isRouterBiasCell`. Never trusts on-disk content: any unexpected shape,
98
+ * extra key, or out-of-range value returns `false` rather than throwing.
99
+ */
100
+ export declare function isRouterBiasSnapshot(value: unknown): value is RouterBiasSnapshot;
101
+ /**
102
+ * Safe parse of raw (untrusted, e.g. on-disk) JSON text into a validated
103
+ * `RouterBiasSnapshot`. Never throws: malformed JSON or any schema violation
104
+ * returns `null`. Performs no filesystem access itself — callers own the
105
+ * actual read — so this module's zero-I/O determinism guarantee for
106
+ * `compileBiasSnapshot`/`getBiasStepsForCell` is unaffected.
107
+ */
108
+ export declare function parseRouterBiasSnapshot(raw: string): RouterBiasSnapshot | null;
109
+ /**
110
+ * Default compiled-bias-snapshot path:
111
+ * `<agentDir>/router-feedback/weights/router-bias-snapshot.<version>.json` —
112
+ * matches `compile-bias-snapshot.ts`'s own default `--out` naming exactly, so
113
+ * a snapshot compiled offline for `version` is found here with no extra
114
+ * configuration. Owner-only agent dir, never repo-local (mirrors
115
+ * `getDefaultRouterFeedbackLedgerPath`). Defaults to "v4", the router version
116
+ * this lane wires bias *consumption* for.
117
+ */
118
+ export declare function getDefaultRouterBiasSnapshotPath(version?: RouterFeedbackVersion): string;
119
+ //# sourceMappingURL=reasoning-router-bias.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-router-bias.d.ts","sourceRoot":"","sources":["../../src/core/reasoning-router-bias.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAKN,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAE5B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,MAAM,gCAAgC,CAAC;AAExC,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,2GAA2G;AAC3G,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAElD,8GAA4G;AAC5G,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,cAAc,EAAE,uBAAuB,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,aAAa,EAAE,yBAAyB,CAAC;IAClD,oGAAoG;IACpG,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,iGAAiG;IACjG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iHAAiH;IACjH,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IAC1C;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;CAC/C;AAgDD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,GAAE,0BAA+B,GACtC,kBAAkB,CA0DpB;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAMzG;AAwDD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAaxE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAYhF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAQ9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,qBAA4B,GAAG,MAAM,CAE9F","sourcesContent":["/**\n * Reasoning-router bias compiler — Goal 009 Wave 1 Lane L (privacy-safe learning ledger).\n *\n * Pure, deterministic compiler from a set of privacy-safe feedback records\n * (see router-feedback-collector.ts) to a bounded, per-cell reasoning-level\n * bias snapshot. No clock, randomness, network, or model calls: the same\n * input array always produces the same output (`JSON.stringify` byte-\n * identical), regardless of input record order. This module is a standalone,\n * pure utility — nothing here is wired into a router resolver or\n * agent-session.ts by this lane.\n *\n * Goal 010 Lane I addition: `isRouterBiasCell` / `isRouterBiasSnapshot` /\n * `parseRouterBiasSnapshot` / `getDefaultRouterBiasSnapshotPath` below let a\n * (now opt-in) caller safely load a snapshot this module previously only\n * wrote. `parseRouterBiasSnapshot` performs no filesystem access itself — it\n * only validates already-read text — so this module's zero-I/O determinism\n * guarantee for `compileBiasSnapshot`/`getBiasStepsForCell` is unchanged; the\n * actual disk read lives in agent-session.ts.\n */\n\nimport { createHash } from \"crypto\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.ts\";\nimport {\n\tisRouterFeedbackRecord,\n\tROUTER_FEEDBACK_LANE_TYPES,\n\tROUTER_FEEDBACK_LEN_BUCKETS,\n\tROUTER_FEEDBACK_TASK_CLASSES,\n\ttype RouterFeedbackLaneType,\n\ttype RouterFeedbackLenBucket,\n\ttype RouterFeedbackRecord,\n\ttype RouterFeedbackTaskClass,\n\ttype RouterFeedbackVersion,\n} from \"./router-feedback-collector.ts\";\n\n/** Minimum non-neutral (\"strong\") record count per cell before any bias applies. */\nexport const BIAS_STRONG_THRESHOLD = 5;\n\n/** Bias magnitude bound, matching the resolver's existing bias clamp (reasoning-router-v2.ts BIAS_MAX). */\nexport const BIAS_MAX_STEPS = 2;\n\n/** Bounded per-cell bias, in ladder steps. Never outside [-2, 2]. */\nexport type RouterBiasSteps = -2 | -1 | 0 | 1 | 2;\n\n/** The feature tuple a bias cell is keyed on — identical dimensions the router already computes locally. */\nexport interface RouterBiasCellKey {\n\treadonly predictedClass: RouterFeedbackTaskClass;\n\treadonly laneType: RouterFeedbackLaneType;\n\treadonly lenBucket: RouterFeedbackLenBucket;\n\treadonly hadFence: boolean;\n\treadonly hadDiff: boolean;\n}\n\nexport interface RouterBiasCell extends RouterBiasCellKey {\n\treadonly biasSteps: RouterBiasSteps;\n\t/** Non-neutral (up/down-signaling) record count for this cell. */\n\treadonly nStrong: number;\n\t/** Total record count for this cell, including neutral (accepted/same/pass) records. */\n\treadonly nTotal: number;\n}\n\nexport interface RouterBiasSnapshot {\n\treadonly schemaVersion: \"router-bias-snapshot/v1\";\n\t/** sha256 hex digest of the canonicalized valid-record set actually compiled; not a prompt hash. */\n\treadonly sourceRecordDigest: string;\n\t/** Count of records that were validated and included in this snapshot. */\n\treadonly consideredCount: number;\n\t/** Count of records excluded from this snapshot (schema-invalid, or router-version mismatch). */\n\treadonly droppedCount: number;\n\t/** Bias cells, sorted deterministically. Empty when there is no ledger data or no cell reaches the threshold. */\n\treadonly biasCells: readonly RouterBiasCell[];\n}\n\nexport interface CompileBiasSnapshotOptions {\n\t/**\n\t * Restrict compilation to one router version — `compileBiasSnapshot` never\n\t * mixes records from different router versions into one snapshot. Records\n\t * tagged with any other `routerVersion` are excluded from this snapshot and\n\t * counted in `droppedCount`. Defaults to \"v3\" for API compatibility; the\n\t * offline CLI now defaults to \"v4\", matching the only auto-router wired to\n\t * consume a learning-bias snapshot at runtime.\n\t */\n\treadonly routerVersion?: RouterFeedbackVersion;\n}\n\nfunction cellKeyString(key: RouterBiasCellKey): string {\n\treturn [key.predictedClass, key.laneType, String(key.lenBucket), String(key.hadFence), String(key.hadDiff)].join(\n\t\t\"|\",\n\t);\n}\n\n/** +1 \"needed more effort\", -1 \"needed less effort\", 0 neutral (no directional bias contribution). */\nfunction outcomeDirection(outcome: RouterFeedbackRecord[\"outcome\"]): -1 | 0 | 1 {\n\tif (outcome === \"up\" || outcome === \"fail\" || outcome === \"debug-follow-up\") return 1;\n\tif (outcome === \"down\") return -1;\n\treturn 0;\n}\n\n/** Fixed-key-order JSON so identical records always canonicalize to identical bytes. */\nfunction canonicalRecordJson(record: RouterFeedbackRecord): string {\n\treturn JSON.stringify({\n\t\trouterVersion: record.routerVersion,\n\t\tlaneType: record.laneType,\n\t\tpredictedClass: record.predictedClass,\n\t\tresolvedLevel: record.resolvedLevel,\n\t\tacceptedLevel: record.acceptedLevel,\n\t\tsignal: record.signal,\n\t\toutcome: record.outcome,\n\t\tlenBucket: record.lenBucket,\n\t\thadFence: record.hadFence,\n\t\thadDiff: record.hadDiff,\n\t});\n}\n\ninterface CellAccumulator extends RouterBiasCellKey {\n\tnTotal: number;\n\tupVotes: number;\n\tdownVotes: number;\n}\n\nfunction computeBiasSteps(upVotes: number, downVotes: number, nStrong: number): RouterBiasSteps {\n\tif (nStrong < BIAS_STRONG_THRESHOLD) return 0;\n\tconst majority = upVotes - downVotes;\n\tif (majority === 0) return 0;\n\n\tconst dominance = Math.abs(majority) / nStrong;\n\tconst magnitude = dominance >= 0.75 ? BIAS_MAX_STEPS : 1;\n\tconst signedMagnitude = majority > 0 ? magnitude : -magnitude;\n\treturn Math.max(-BIAS_MAX_STEPS, Math.min(BIAS_MAX_STEPS, signedMagnitude)) as RouterBiasSteps;\n}\n\n/**\n * Deterministically compile a bounded bias snapshot from raw (possibly\n * malformed) ledger entries. Unknown-shaped entries — including ones with\n * extra keys, missing keys, or out-of-range enum values — are dropped and\n * counted, never thrown. Records tagged with a `routerVersion` other than the\n * target version are also dropped and counted (never merged across router\n * versions into one snapshot). An empty or all-dropped input compiles to an\n * empty-bias snapshot (`biasCells: []`), which is exactly the shipped\n * no-learning behavior — this makes \"empty ledger -> zero bias\" true by\n * construction, not by a special case.\n *\n * Pure: same `records` (any order) -> same `RouterBiasSnapshot` (byte-\n * identical `JSON.stringify` output), because cells are grouped by an\n * order-independent key and the emitted cell/record ordering is always\n * sorted before serialization.\n */\nexport function compileBiasSnapshot(\n\trecords: readonly unknown[],\n\toptions: CompileBiasSnapshotOptions = {},\n): RouterBiasSnapshot {\n\tconst routerVersion = options.routerVersion ?? \"v3\";\n\tconst valid: RouterFeedbackRecord[] = [];\n\tlet droppedCount = 0;\n\n\tfor (const entry of records) {\n\t\tif (isRouterFeedbackRecord(entry) && entry.routerVersion === routerVersion) {\n\t\t\tvalid.push(entry);\n\t\t} else {\n\t\t\tdroppedCount += 1;\n\t\t}\n\t}\n\n\tconst cells = new Map<string, CellAccumulator>();\n\tfor (const record of valid) {\n\t\tconst key: RouterBiasCellKey = {\n\t\t\tpredictedClass: record.predictedClass,\n\t\t\tlaneType: record.laneType,\n\t\t\tlenBucket: record.lenBucket,\n\t\t\thadFence: record.hadFence,\n\t\t\thadDiff: record.hadDiff,\n\t\t};\n\t\tconst mapKey = cellKeyString(key);\n\t\tconst existing = cells.get(mapKey) ?? { ...key, nTotal: 0, upVotes: 0, downVotes: 0 };\n\t\texisting.nTotal += 1;\n\t\tconst direction = outcomeDirection(record.outcome);\n\t\tif (direction === 1) existing.upVotes += 1;\n\t\telse if (direction === -1) existing.downVotes += 1;\n\t\tcells.set(mapKey, existing);\n\t}\n\n\tconst biasCells: RouterBiasCell[] = [];\n\tfor (const mapKey of [...cells.keys()].sort()) {\n\t\tconst acc = cells.get(mapKey);\n\t\tif (!acc) continue;\n\t\tconst nStrong = acc.upVotes + acc.downVotes;\n\t\tbiasCells.push({\n\t\t\tpredictedClass: acc.predictedClass,\n\t\t\tlaneType: acc.laneType,\n\t\t\tlenBucket: acc.lenBucket,\n\t\t\thadFence: acc.hadFence,\n\t\t\thadDiff: acc.hadDiff,\n\t\t\tbiasSteps: computeBiasSteps(acc.upVotes, acc.downVotes, nStrong),\n\t\t\tnStrong,\n\t\t\tnTotal: acc.nTotal,\n\t\t});\n\t}\n\n\tconst canonicalValid = valid.map(canonicalRecordJson).sort();\n\tconst sourceRecordDigest = createHash(\"sha256\").update(canonicalValid.join(\"\\n\")).digest(\"hex\");\n\n\treturn {\n\t\tschemaVersion: \"router-bias-snapshot/v1\",\n\t\tsourceRecordDigest,\n\t\tconsideredCount: valid.length,\n\t\tdroppedCount,\n\t\tbiasCells,\n\t};\n}\n\n/** Look up the compiled bias for one feature cell; 0 (no bias) when the cell is absent from the snapshot. */\nexport function getBiasStepsForCell(snapshot: RouterBiasSnapshot, key: RouterBiasCellKey): RouterBiasSteps {\n\tconst wantKey = cellKeyString(key);\n\tfor (const cell of snapshot.biasCells) {\n\t\tif (cellKeyString(cell) === wantKey) return cell.biasSteps;\n\t}\n\treturn 0;\n}\n\n// ============================================================================\n// Snapshot parser / loader (Goal 010 Lane I)\n// ============================================================================\n//\n// Everything below lets a caller safely turn untrusted on-disk JSON text into\n// a validated RouterBiasSnapshot. Same posture as isRouterFeedbackRecord in\n// router-feedback-collector.ts: an exact positive key-set allowlist (not a\n// denylist), bounded per-field checks reusing the ledger's own closed enums,\n// and \"never throw, return null/false instead\" on any malformed input.\n\n/** Bounded bias-step values a compiled cell may carry; mirrors RouterBiasSteps. */\nconst ROUTER_BIAS_STEPS_VALUES: readonly RouterBiasSteps[] = [-2, -1, 0, 1, 2];\n\n/** Exact allowed key set for one compiled `RouterBiasCell`, sorted for canonical set-equality comparison. */\nconst ROUTER_BIAS_CELL_KEYS: readonly string[] = [\n\t\"predictedClass\",\n\t\"laneType\",\n\t\"lenBucket\",\n\t\"hadFence\",\n\t\"hadDiff\",\n\t\"biasSteps\",\n\t\"nStrong\",\n\t\"nTotal\",\n].sort();\n\n/** Exact allowed key set for a `RouterBiasSnapshot`, sorted for canonical set-equality comparison. */\nconst ROUTER_BIAS_SNAPSHOT_KEYS: readonly string[] = [\n\t\"schemaVersion\",\n\t\"sourceRecordDigest\",\n\t\"consideredCount\",\n\t\"droppedCount\",\n\t\"biasCells\",\n].sort();\n\n/** sha256 hex digest shape check for `sourceRecordDigest` (never trusts the value is actually a real digest of anything, only that it has the right shape). */\nconst SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeySet(value: Record<string, unknown>, allowedSortedKeys: readonly string[]): boolean {\n\tconst keys = Object.keys(value).sort();\n\tif (keys.length !== allowedSortedKeys.length) return false;\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tif (keys[i] !== allowedSortedKeys[i]) return false;\n\t}\n\treturn true;\n}\n\nfunction isBoundedNonNegativeInteger(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n}\n\n/**\n * Strict runtime validator for one compiled bias cell. Exact eight-key\n * allowlist plus bounded per-field checks, reusing the same closed enums as\n * `isRouterFeedbackRecord` (`ROUTER_FEEDBACK_TASK_CLASSES`,\n * `ROUTER_FEEDBACK_LANE_TYPES`, `ROUTER_FEEDBACK_LEN_BUCKETS`) so this\n * validator cannot silently drift from the ledger's own schema. `nStrong` is\n * additionally required to never exceed `nTotal` (true by construction for\n * every cell `compileBiasSnapshot` can produce; a cheap sanity bound against\n * a hand-tampered file).\n */\nexport function isRouterBiasCell(value: unknown): value is RouterBiasCell {\n\tif (!isPlainObject(value)) return false;\n\tif (!hasExactKeySet(value, ROUTER_BIAS_CELL_KEYS)) return false;\n\tif (!ROUTER_FEEDBACK_TASK_CLASSES.includes(value.predictedClass as RouterFeedbackTaskClass)) return false;\n\tif (!ROUTER_FEEDBACK_LANE_TYPES.includes(value.laneType as RouterFeedbackLaneType)) return false;\n\tif (!ROUTER_FEEDBACK_LEN_BUCKETS.includes(value.lenBucket as RouterFeedbackLenBucket)) return false;\n\tif (typeof value.hadFence !== \"boolean\") return false;\n\tif (typeof value.hadDiff !== \"boolean\") return false;\n\tif (!ROUTER_BIAS_STEPS_VALUES.includes(value.biasSteps as RouterBiasSteps)) return false;\n\tif (!isBoundedNonNegativeInteger(value.nStrong)) return false;\n\tif (!isBoundedNonNegativeInteger(value.nTotal)) return false;\n\tif ((value.nStrong as number) > (value.nTotal as number)) return false;\n\treturn true;\n}\n\n/**\n * Strict runtime validator for a compiled bias snapshot. Exact five-key\n * allowlist; `biasCells` must be an array whose every element passes\n * `isRouterBiasCell`. Never trusts on-disk content: any unexpected shape,\n * extra key, or out-of-range value returns `false` rather than throwing.\n */\nexport function isRouterBiasSnapshot(value: unknown): value is RouterBiasSnapshot {\n\tif (!isPlainObject(value)) return false;\n\tif (!hasExactKeySet(value, ROUTER_BIAS_SNAPSHOT_KEYS)) return false;\n\tif (value.schemaVersion !== \"router-bias-snapshot/v1\") return false;\n\tif (typeof value.sourceRecordDigest !== \"string\" || !SHA256_HEX_PATTERN.test(value.sourceRecordDigest)) return false;\n\tif (!isBoundedNonNegativeInteger(value.consideredCount)) return false;\n\tif (!isBoundedNonNegativeInteger(value.droppedCount)) return false;\n\tif (!Array.isArray(value.biasCells)) return false;\n\tfor (const cell of value.biasCells) {\n\t\tif (!isRouterBiasCell(cell)) return false;\n\t}\n\treturn true;\n}\n\n/**\n * Safe parse of raw (untrusted, e.g. on-disk) JSON text into a validated\n * `RouterBiasSnapshot`. Never throws: malformed JSON or any schema violation\n * returns `null`. Performs no filesystem access itself — callers own the\n * actual read — so this module's zero-I/O determinism guarantee for\n * `compileBiasSnapshot`/`getBiasStepsForCell` is unaffected.\n */\nexport function parseRouterBiasSnapshot(raw: string): RouterBiasSnapshot | null {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\treturn null;\n\t}\n\treturn isRouterBiasSnapshot(parsed) ? parsed : null;\n}\n\n/**\n * Default compiled-bias-snapshot path:\n * `<agentDir>/router-feedback/weights/router-bias-snapshot.<version>.json` —\n * matches `compile-bias-snapshot.ts`'s own default `--out` naming exactly, so\n * a snapshot compiled offline for `version` is found here with no extra\n * configuration. Owner-only agent dir, never repo-local (mirrors\n * `getDefaultRouterFeedbackLedgerPath`). Defaults to \"v4\", the router version\n * this lane wires bias *consumption* for.\n */\nexport function getDefaultRouterBiasSnapshotPath(version: RouterFeedbackVersion = \"v4\"): string {\n\treturn join(getAgentDir(), \"router-feedback\", \"weights\", `router-bias-snapshot.${version}.json`);\n}\n"]}