pi-smart-router 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/.pi/extensions/smart-router/command-formatters.ts +167 -0
  2. package/.pi/extensions/smart-router/commands.ts +242 -0
  3. package/.pi/extensions/smart-router/dataset-export.ts +142 -0
  4. package/.pi/extensions/smart-router/delegate-stream.ts +105 -0
  5. package/.pi/extensions/smart-router/delegation-runtime.ts +355 -0
  6. package/.pi/extensions/smart-router/extension-setup.ts +115 -0
  7. package/.pi/extensions/smart-router/fleet-bootstrap.ts +244 -0
  8. package/.pi/extensions/smart-router/index.ts +115 -0
  9. package/.pi/extensions/smart-router/package.json +3 -0
  10. package/.pi/extensions/smart-router/pi-model-scope.ts +55 -0
  11. package/.pi/extensions/smart-router/pricing-lifecycle.ts +43 -0
  12. package/.pi/extensions/smart-router/route-and-delegate.ts +562 -0
  13. package/.pi/extensions/smart-router/routing-context.ts +171 -0
  14. package/.pi/extensions/smart-router/routing-outcomes.ts +44 -0
  15. package/.pi/extensions/smart-router/session-lifecycle.ts +140 -0
  16. package/.pi/extensions/smart-router/stream-delegation.ts +75 -0
  17. package/.pi/extensions/smart-router/types.ts +90 -0
  18. package/.pi/extensions/smart-router/utils.ts +58 -0
  19. package/README.md +593 -0
  20. package/bin/pi-smart-router.mjs +79 -0
  21. package/config/.gitkeep +0 -0
  22. package/config/hydra-projection-weights.json.example +1169 -0
  23. package/config/models.yaml.example +58 -0
  24. package/config/p-success-weights.json.example +19 -0
  25. package/config/routing-calibration.json.example +1605 -0
  26. package/config/routing-centroids.json.example +1570 -0
  27. package/config/routing-clusters.yaml.example +41 -0
  28. package/data/contrib/example.json +25 -0
  29. package/dist/api/explain/router-explain.d.ts +47 -0
  30. package/dist/api/explain/router-explain.d.ts.map +1 -0
  31. package/dist/api/explain/router-explain.js +101 -0
  32. package/dist/api/explain/router-explain.js.map +1 -0
  33. package/dist/api/middleware/pi-router-middleware.d.ts +86 -0
  34. package/dist/api/middleware/pi-router-middleware.d.ts.map +1 -0
  35. package/dist/api/middleware/pi-router-middleware.js +83 -0
  36. package/dist/api/middleware/pi-router-middleware.js.map +1 -0
  37. package/dist/cli/smart-router-cli.d.ts +85 -0
  38. package/dist/cli/smart-router-cli.d.ts.map +1 -0
  39. package/dist/cli/smart-router-cli.js +293 -0
  40. package/dist/cli/smart-router-cli.js.map +1 -0
  41. package/dist/config/defaults.d.ts +7 -0
  42. package/dist/config/defaults.d.ts.map +1 -0
  43. package/dist/config/defaults.js +33 -0
  44. package/dist/config/defaults.js.map +1 -0
  45. package/dist/config/models-loader.d.ts +22 -0
  46. package/dist/config/models-loader.d.ts.map +1 -0
  47. package/dist/config/models-loader.js +51 -0
  48. package/dist/config/models-loader.js.map +1 -0
  49. package/dist/config/pi-model-mapper.d.ts +40 -0
  50. package/dist/config/pi-model-mapper.d.ts.map +1 -0
  51. package/dist/config/pi-model-mapper.js +216 -0
  52. package/dist/config/pi-model-mapper.js.map +1 -0
  53. package/dist/config/routing-clusters-loader.d.ts +35 -0
  54. package/dist/config/routing-clusters-loader.d.ts.map +1 -0
  55. package/dist/config/routing-clusters-loader.js +100 -0
  56. package/dist/config/routing-clusters-loader.js.map +1 -0
  57. package/dist/domain/delegation/delegation-context.d.ts +23 -0
  58. package/dist/domain/delegation/delegation-context.d.ts.map +1 -0
  59. package/dist/domain/delegation/delegation-context.js +73 -0
  60. package/dist/domain/delegation/delegation-context.js.map +1 -0
  61. package/dist/domain/delegation/execution-ledger.d.ts +19 -0
  62. package/dist/domain/delegation/execution-ledger.d.ts.map +1 -0
  63. package/dist/domain/delegation/execution-ledger.js +23 -0
  64. package/dist/domain/delegation/execution-ledger.js.map +1 -0
  65. package/dist/domain/delegation/output-headroom.d.ts +39 -0
  66. package/dist/domain/delegation/output-headroom.d.ts.map +1 -0
  67. package/dist/domain/delegation/output-headroom.js +78 -0
  68. package/dist/domain/delegation/output-headroom.js.map +1 -0
  69. package/dist/domain/matching/cluster-matcher.d.ts +69 -0
  70. package/dist/domain/matching/cluster-matcher.d.ts.map +1 -0
  71. package/dist/domain/matching/cluster-matcher.js +294 -0
  72. package/dist/domain/matching/cluster-matcher.js.map +1 -0
  73. package/dist/domain/matching/embedding-provider.d.ts +21 -0
  74. package/dist/domain/matching/embedding-provider.d.ts.map +1 -0
  75. package/dist/domain/matching/embedding-provider.js +42 -0
  76. package/dist/domain/matching/embedding-provider.js.map +1 -0
  77. package/dist/domain/matching/hydra-input.d.ts +18 -0
  78. package/dist/domain/matching/hydra-input.d.ts.map +1 -0
  79. package/dist/domain/matching/hydra-input.js +40 -0
  80. package/dist/domain/matching/hydra-input.js.map +1 -0
  81. package/dist/domain/matching/hydra-matcher.d.ts +103 -0
  82. package/dist/domain/matching/hydra-matcher.d.ts.map +1 -0
  83. package/dist/domain/matching/hydra-matcher.js +275 -0
  84. package/dist/domain/matching/hydra-matcher.js.map +1 -0
  85. package/dist/domain/pinning/cache-economics.d.ts +53 -0
  86. package/dist/domain/pinning/cache-economics.d.ts.map +1 -0
  87. package/dist/domain/pinning/cache-economics.js +72 -0
  88. package/dist/domain/pinning/cache-economics.js.map +1 -0
  89. package/dist/domain/pinning/loop-escalation.d.ts +41 -0
  90. package/dist/domain/pinning/loop-escalation.d.ts.map +1 -0
  91. package/dist/domain/pinning/loop-escalation.js +137 -0
  92. package/dist/domain/pinning/loop-escalation.js.map +1 -0
  93. package/dist/domain/pinning/session-pinner.d.ts +81 -0
  94. package/dist/domain/pinning/session-pinner.d.ts.map +1 -0
  95. package/dist/domain/pinning/session-pinner.js +237 -0
  96. package/dist/domain/pinning/session-pinner.js.map +1 -0
  97. package/dist/domain/pinning/sub-route-policy.d.ts +41 -0
  98. package/dist/domain/pinning/sub-route-policy.d.ts.map +1 -0
  99. package/dist/domain/pinning/sub-route-policy.js +72 -0
  100. package/dist/domain/pinning/sub-route-policy.js.map +1 -0
  101. package/dist/domain/pipeline/router-pipeline.d.ts +180 -0
  102. package/dist/domain/pipeline/router-pipeline.d.ts.map +1 -0
  103. package/dist/domain/pipeline/router-pipeline.js +807 -0
  104. package/dist/domain/pipeline/router-pipeline.js.map +1 -0
  105. package/dist/domain/pipeline/safe-default.d.ts +25 -0
  106. package/dist/domain/pipeline/safe-default.d.ts.map +1 -0
  107. package/dist/domain/pipeline/safe-default.js +41 -0
  108. package/dist/domain/pipeline/safe-default.js.map +1 -0
  109. package/dist/domain/refactor-guardrails.d.ts +48 -0
  110. package/dist/domain/refactor-guardrails.d.ts.map +1 -0
  111. package/dist/domain/refactor-guardrails.js +129 -0
  112. package/dist/domain/refactor-guardrails.js.map +1 -0
  113. package/dist/domain/routing/context-fit.d.ts +53 -0
  114. package/dist/domain/routing/context-fit.d.ts.map +1 -0
  115. package/dist/domain/routing/context-fit.js +142 -0
  116. package/dist/domain/routing/context-fit.js.map +1 -0
  117. package/dist/domain/routing/expected-cost.d.ts +63 -0
  118. package/dist/domain/routing/expected-cost.d.ts.map +1 -0
  119. package/dist/domain/routing/expected-cost.js +177 -0
  120. package/dist/domain/routing/expected-cost.js.map +1 -0
  121. package/dist/domain/routing/p-success-classifier.d.ts +130 -0
  122. package/dist/domain/routing/p-success-classifier.d.ts.map +1 -0
  123. package/dist/domain/routing/p-success-classifier.js +350 -0
  124. package/dist/domain/routing/p-success-classifier.js.map +1 -0
  125. package/dist/domain/routing/tier-features.d.ts +70 -0
  126. package/dist/domain/routing/tier-features.d.ts.map +1 -0
  127. package/dist/domain/routing/tier-features.js +174 -0
  128. package/dist/domain/routing/tier-features.js.map +1 -0
  129. package/dist/domain/routing/tool-history-guard.d.ts +32 -0
  130. package/dist/domain/routing/tool-history-guard.d.ts.map +1 -0
  131. package/dist/domain/routing/tool-history-guard.js +110 -0
  132. package/dist/domain/routing/tool-history-guard.js.map +1 -0
  133. package/dist/domain/scoring/multi-objective.d.ts +48 -0
  134. package/dist/domain/scoring/multi-objective.d.ts.map +1 -0
  135. package/dist/domain/scoring/multi-objective.js +116 -0
  136. package/dist/domain/scoring/multi-objective.js.map +1 -0
  137. package/dist/domain/triage/triage-engine.d.ts +43 -0
  138. package/dist/domain/triage/triage-engine.d.ts.map +1 -0
  139. package/dist/domain/triage/triage-engine.js +317 -0
  140. package/dist/domain/triage/triage-engine.js.map +1 -0
  141. package/dist/domain/triage/turn-envelope.d.ts +17 -0
  142. package/dist/domain/triage/turn-envelope.d.ts.map +1 -0
  143. package/dist/domain/triage/turn-envelope.js +81 -0
  144. package/dist/domain/triage/turn-envelope.js.map +1 -0
  145. package/dist/domain/types/entities.d.ts +303 -0
  146. package/dist/domain/types/entities.d.ts.map +1 -0
  147. package/dist/domain/types/entities.js +6 -0
  148. package/dist/domain/types/entities.js.map +1 -0
  149. package/dist/domain/types/index.d.ts +4 -0
  150. package/dist/domain/types/index.d.ts.map +1 -0
  151. package/dist/domain/types/index.js +2 -0
  152. package/dist/domain/types/index.js.map +1 -0
  153. package/dist/domain/types/schemas.d.ts +346 -0
  154. package/dist/domain/types/schemas.d.ts.map +1 -0
  155. package/dist/domain/types/schemas.js +241 -0
  156. package/dist/domain/types/schemas.js.map +1 -0
  157. package/dist/domain/types/store-port.d.ts +44 -0
  158. package/dist/domain/types/store-port.d.ts.map +1 -0
  159. package/dist/domain/types/store-port.js +6 -0
  160. package/dist/domain/types/store-port.js.map +1 -0
  161. package/dist/index.d.ts +39 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +36 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/infra/gemini-provider.d.ts +28 -0
  166. package/dist/infra/gemini-provider.d.ts.map +1 -0
  167. package/dist/infra/gemini-provider.js +112 -0
  168. package/dist/infra/gemini-provider.js.map +1 -0
  169. package/dist/infra/telemetry.d.ts +51 -0
  170. package/dist/infra/telemetry.d.ts.map +1 -0
  171. package/dist/infra/telemetry.js +100 -0
  172. package/dist/infra/telemetry.js.map +1 -0
  173. package/dist/infrastructure/delegation/provider-error.d.ts +44 -0
  174. package/dist/infrastructure/delegation/provider-error.d.ts.map +1 -0
  175. package/dist/infrastructure/delegation/provider-error.js +179 -0
  176. package/dist/infrastructure/delegation/provider-error.js.map +1 -0
  177. package/dist/infrastructure/gateway/circuit-breaker.d.ts +68 -0
  178. package/dist/infrastructure/gateway/circuit-breaker.d.ts.map +1 -0
  179. package/dist/infrastructure/gateway/circuit-breaker.js +150 -0
  180. package/dist/infrastructure/gateway/circuit-breaker.js.map +1 -0
  181. package/dist/infrastructure/gateway/gateway-dispatch.d.ts +138 -0
  182. package/dist/infrastructure/gateway/gateway-dispatch.d.ts.map +1 -0
  183. package/dist/infrastructure/gateway/gateway-dispatch.js +308 -0
  184. package/dist/infrastructure/gateway/gateway-dispatch.js.map +1 -0
  185. package/dist/infrastructure/hardware/hardware-probe.d.ts +32 -0
  186. package/dist/infrastructure/hardware/hardware-probe.d.ts.map +1 -0
  187. package/dist/infrastructure/hardware/hardware-probe.js +199 -0
  188. package/dist/infrastructure/hardware/hardware-probe.js.map +1 -0
  189. package/dist/infrastructure/local/local-zero-tier.d.ts +47 -0
  190. package/dist/infrastructure/local/local-zero-tier.d.ts.map +1 -0
  191. package/dist/infrastructure/local/local-zero-tier.js +92 -0
  192. package/dist/infrastructure/local/local-zero-tier.js.map +1 -0
  193. package/dist/infrastructure/persistence/memory-store.d.ts +31 -0
  194. package/dist/infrastructure/persistence/memory-store.d.ts.map +1 -0
  195. package/dist/infrastructure/persistence/memory-store.js +87 -0
  196. package/dist/infrastructure/persistence/memory-store.js.map +1 -0
  197. package/dist/infrastructure/persistence/sqlite-store.d.ts +81 -0
  198. package/dist/infrastructure/persistence/sqlite-store.d.ts.map +1 -0
  199. package/dist/infrastructure/persistence/sqlite-store.js +658 -0
  200. package/dist/infrastructure/persistence/sqlite-store.js.map +1 -0
  201. package/dist/infrastructure/pricing/litellm-fetch.d.ts +46 -0
  202. package/dist/infrastructure/pricing/litellm-fetch.d.ts.map +1 -0
  203. package/dist/infrastructure/pricing/litellm-fetch.js +145 -0
  204. package/dist/infrastructure/pricing/litellm-fetch.js.map +1 -0
  205. package/dist/infrastructure/pricing/price-broker.d.ts +56 -0
  206. package/dist/infrastructure/pricing/price-broker.d.ts.map +1 -0
  207. package/dist/infrastructure/pricing/price-broker.js +133 -0
  208. package/dist/infrastructure/pricing/price-broker.js.map +1 -0
  209. package/dist/infrastructure/pricing/pricing-monitor.d.ts +27 -0
  210. package/dist/infrastructure/pricing/pricing-monitor.d.ts.map +1 -0
  211. package/dist/infrastructure/pricing/pricing-monitor.js +46 -0
  212. package/dist/infrastructure/pricing/pricing-monitor.js.map +1 -0
  213. package/dist/infrastructure/telemetry/dataset-limits.d.ts +13 -0
  214. package/dist/infrastructure/telemetry/dataset-limits.d.ts.map +1 -0
  215. package/dist/infrastructure/telemetry/dataset-limits.js +28 -0
  216. package/dist/infrastructure/telemetry/dataset-limits.js.map +1 -0
  217. package/dist/infrastructure/telemetry/dataset-recorder.d.ts +48 -0
  218. package/dist/infrastructure/telemetry/dataset-recorder.d.ts.map +1 -0
  219. package/dist/infrastructure/telemetry/dataset-recorder.js +154 -0
  220. package/dist/infrastructure/telemetry/dataset-recorder.js.map +1 -0
  221. package/dist/infrastructure/telemetry/outcome-limits.d.ts +12 -0
  222. package/dist/infrastructure/telemetry/outcome-limits.d.ts.map +1 -0
  223. package/dist/infrastructure/telemetry/outcome-limits.js +28 -0
  224. package/dist/infrastructure/telemetry/outcome-limits.js.map +1 -0
  225. package/dist/infrastructure/telemetry/outcome-recorder.d.ts +29 -0
  226. package/dist/infrastructure/telemetry/outcome-recorder.d.ts.map +1 -0
  227. package/dist/infrastructure/telemetry/outcome-recorder.js +49 -0
  228. package/dist/infrastructure/telemetry/outcome-recorder.js.map +1 -0
  229. package/dist/infrastructure/telemetry/routing-telemetry.d.ts +115 -0
  230. package/dist/infrastructure/telemetry/routing-telemetry.d.ts.map +1 -0
  231. package/dist/infrastructure/telemetry/routing-telemetry.js +529 -0
  232. package/dist/infrastructure/telemetry/routing-telemetry.js.map +1 -0
  233. package/dist/infrastructure/telemetry/telemetry-limits.d.ts +16 -0
  234. package/dist/infrastructure/telemetry/telemetry-limits.d.ts.map +1 -0
  235. package/dist/infrastructure/telemetry/telemetry-limits.js +35 -0
  236. package/dist/infrastructure/telemetry/telemetry-limits.js.map +1 -0
  237. package/package.json +110 -0
  238. package/skills/router-backlog-orchestrator/SKILL.md +183 -0
  239. package/skills/router-backlog-orchestrator/references/github-router-issue-template.md +78 -0
  240. package/skills/router-backlog-orchestrator/references/packet-from-issue.md +99 -0
  241. package/skills/router-backlog-orchestrator/references/prioritization-rubric.md +65 -0
  242. package/skills/router-backlog-orchestrator/scripts/collect-backlog.sh +44 -0
  243. package/specs/001-build-smart-router/contracts/telemetry-contrib.schema.json +151 -0
  244. package/src/api/explain/.gitkeep +0 -0
  245. package/src/api/explain/router-explain.ts +146 -0
  246. package/src/api/middleware/.gitkeep +0 -0
  247. package/src/api/middleware/pi-router-middleware.ts +169 -0
  248. package/src/cli/smart-router-cli.ts +436 -0
  249. package/src/config/.gitkeep +0 -0
  250. package/src/config/defaults.ts +35 -0
  251. package/src/config/models-loader.ts +68 -0
  252. package/src/config/pi-model-mapper.ts +285 -0
  253. package/src/config/routing-clusters-loader.ts +148 -0
  254. package/src/domain/delegation/delegation-context.ts +111 -0
  255. package/src/domain/delegation/execution-ledger.ts +34 -0
  256. package/src/domain/delegation/output-headroom.ts +131 -0
  257. package/src/domain/matching/.gitkeep +0 -0
  258. package/src/domain/matching/cluster-matcher.ts +474 -0
  259. package/src/domain/matching/embedding-provider.ts +79 -0
  260. package/src/domain/matching/hydra-input.ts +53 -0
  261. package/src/domain/matching/hydra-matcher.ts +454 -0
  262. package/src/domain/pinning/.gitkeep +0 -0
  263. package/src/domain/pinning/cache-economics.ts +128 -0
  264. package/src/domain/pinning/loop-escalation.ts +181 -0
  265. package/src/domain/pinning/session-pinner.ts +388 -0
  266. package/src/domain/pinning/sub-route-policy.ts +119 -0
  267. package/src/domain/pipeline/.gitkeep +0 -0
  268. package/src/domain/pipeline/router-pipeline.ts +1139 -0
  269. package/src/domain/pipeline/safe-default.ts +70 -0
  270. package/src/domain/refactor-guardrails.ts +202 -0
  271. package/src/domain/routing/context-fit.ts +221 -0
  272. package/src/domain/routing/expected-cost.ts +320 -0
  273. package/src/domain/routing/p-success-classifier.ts +511 -0
  274. package/src/domain/routing/tier-features.ts +290 -0
  275. package/src/domain/routing/tool-history-guard.ts +159 -0
  276. package/src/domain/scoring/.gitkeep +0 -0
  277. package/src/domain/scoring/multi-objective.ts +175 -0
  278. package/src/domain/triage/.gitkeep +0 -0
  279. package/src/domain/triage/triage-engine.ts +373 -0
  280. package/src/domain/triage/turn-envelope.ts +104 -0
  281. package/src/domain/types/.gitkeep +0 -0
  282. package/src/domain/types/entities.ts +384 -0
  283. package/src/domain/types/index.ts +41 -0
  284. package/src/domain/types/schemas.ts +289 -0
  285. package/src/domain/types/store-port.ts +59 -0
  286. package/src/index.ts +103 -0
  287. package/src/infra/gemini-provider.ts +142 -0
  288. package/src/infra/telemetry.ts +169 -0
  289. package/src/infrastructure/delegation/provider-error.ts +251 -0
  290. package/src/infrastructure/gateway/.gitkeep +0 -0
  291. package/src/infrastructure/gateway/circuit-breaker.ts +196 -0
  292. package/src/infrastructure/gateway/gateway-dispatch.ts +444 -0
  293. package/src/infrastructure/hardware/.gitkeep +0 -0
  294. package/src/infrastructure/hardware/hardware-probe.ts +276 -0
  295. package/src/infrastructure/local/.gitkeep +0 -0
  296. package/src/infrastructure/local/local-zero-tier.ts +151 -0
  297. package/src/infrastructure/persistence/.gitkeep +0 -0
  298. package/src/infrastructure/persistence/memory-store.ts +122 -0
  299. package/src/infrastructure/persistence/sqlite-store.ts +900 -0
  300. package/src/infrastructure/pricing/.gitkeep +0 -0
  301. package/src/infrastructure/pricing/litellm-fetch.ts +215 -0
  302. package/src/infrastructure/pricing/price-broker.ts +183 -0
  303. package/src/infrastructure/pricing/pricing-monitor.ts +65 -0
  304. package/src/infrastructure/telemetry/.gitkeep +0 -0
  305. package/src/infrastructure/telemetry/dataset-limits.ts +39 -0
  306. package/src/infrastructure/telemetry/dataset-recorder.ts +215 -0
  307. package/src/infrastructure/telemetry/outcome-limits.ts +42 -0
  308. package/src/infrastructure/telemetry/outcome-recorder.ts +118 -0
  309. package/src/infrastructure/telemetry/routing-telemetry.ts +824 -0
  310. package/src/infrastructure/telemetry/telemetry-limits.ts +50 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Smart Router CLI subcommands — library-facing command handlers.
3
+ *
4
+ * Extension wiring lives in `.pi/extensions/smart-router/commands.ts`;
5
+ * this module holds reusable subcommand logic for dogfooding and tests.
6
+ */
7
+ import { createHash } from 'node:crypto';
8
+ import { mkdirSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { attachOutcomeLabelsToExport, deriveSuccessLabel, indexOutcomesByRequestId, } from '../domain/routing/p-success-classifier.js';
11
+ import { DATASET_MAX_ENTRIES } from '../infrastructure/telemetry/dataset-limits.js';
12
+ export const UNPIN_SUBCOMMAND = 'unpin';
13
+ export const EXPORT_TELEMETRY_CONTRIB_COMMAND = 'export telemetry-contrib';
14
+ export const TELEMETRY_CONTRIB_VERSION = 1;
15
+ export const TELEMETRY_CONTRIB_SCHEMA_PATH = 'specs/001-build-smart-router/contracts/telemetry-contrib.schema.json';
16
+ export const DEFAULT_TELEMETRY_CONTRIB_EXPORT_DIR = '.pi-smart-router/exports';
17
+ export const DEFAULT_TELEMETRY_CONTRIB_EXPORT_LIMIT = DATASET_MAX_ENTRIES;
18
+ /** Keys stripped from contrib export (install-local identifiers and prompt-adjacent fields). */
19
+ export const TELEMETRY_CONTRIB_STRIP_KEYS = [
20
+ 'request_id',
21
+ 'session_id',
22
+ 'prompt_text',
23
+ 'messages',
24
+ 'prompt',
25
+ 'prompt_fingerprint',
26
+ 'pepper',
27
+ 'install_pepper',
28
+ 'dataset_pepper',
29
+ 'dataset_key',
30
+ 'pepper_key',
31
+ 'install_key',
32
+ 'candidates_json',
33
+ 'context_fit_rejected_json',
34
+ ];
35
+ /** Mirrors SP-116 `CALIBRATION_CONTRIB_REJECT_KEYS` for ingest-safe export. */
36
+ export const TELEMETRY_CONTRIB_REJECT_KEYS = [
37
+ 'session_id',
38
+ 'prompt_text',
39
+ 'messages',
40
+ 'prompt',
41
+ 'prompt_fingerprint',
42
+ ];
43
+ /** Mirrors SP-116 tainted key pattern for ingest-safe export. */
44
+ export const TELEMETRY_CONTRIB_TAINTED_KEY_PATTERN = /(?:^|_)(prompt|message|messages|content|tool_calls?|secret|password|token|api_key)(?:_|$)/i;
45
+ export class TelemetryContribValidationError extends Error {
46
+ name = 'TelemetryContribValidationError';
47
+ constructor(message, options) {
48
+ super(message, options);
49
+ }
50
+ }
51
+ function isPlainObject(value) {
52
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
53
+ }
54
+ function collectForbiddenContribKeys(value, path = '', found = []) {
55
+ if (Array.isArray(value)) {
56
+ for (let i = 0; i < value.length; i++) {
57
+ collectForbiddenContribKeys(value[i], `${path}[${i}]`, found);
58
+ }
59
+ return found;
60
+ }
61
+ if (!isPlainObject(value)) {
62
+ return found;
63
+ }
64
+ for (const [key, nested] of Object.entries(value)) {
65
+ const keyPath = path ? `${path}.${key}` : key;
66
+ if (TELEMETRY_CONTRIB_REJECT_KEYS.includes(key) ||
67
+ TELEMETRY_CONTRIB_TAINTED_KEY_PATTERN.test(key)) {
68
+ found.push(keyPath);
69
+ }
70
+ collectForbiddenContribKeys(nested, keyPath, found);
71
+ }
72
+ return found;
73
+ }
74
+ /** Fail closed when a contrib row contains forbidden or tainted keys (SP-116 parity). */
75
+ export function assertTelemetryContribRecordSafe(record, context) {
76
+ if (!isPlainObject(record)) {
77
+ const suffix = context ? ` (${context})` : '';
78
+ throw new TelemetryContribValidationError(`Contrib record must be a JSON object${suffix}`);
79
+ }
80
+ const forbidden = collectForbiddenContribKeys(record);
81
+ if (forbidden.length > 0) {
82
+ const suffix = context ? ` (${context})` : '';
83
+ throw new TelemetryContribValidationError(`Tainted contrib record rejected${suffix}: forbidden keys ${forbidden.join(', ')}`);
84
+ }
85
+ }
86
+ /** Strip install-local pepper fields from a validated contrib row (SP-116 parity). */
87
+ export function sanitizeTelemetryContribRecord(record) {
88
+ const sanitized = { ...record };
89
+ for (const key of TELEMETRY_CONTRIB_STRIP_KEYS) {
90
+ delete sanitized[key];
91
+ }
92
+ return sanitized;
93
+ }
94
+ /** Returns true when args invoke `/smart-router unpin`. */
95
+ export function isUnpinInvocation(args) {
96
+ const tokens = args.trim().split(/\s+/).filter(Boolean);
97
+ return tokens.length === 1 && tokens[0] === UNPIN_SUBCOMMAND;
98
+ }
99
+ /** Returns true when args invoke `export telemetry-contrib`. */
100
+ export function isExportTelemetryContribInvocation(args) {
101
+ const tokens = args.trim().split(/\s+/).filter(Boolean);
102
+ return (tokens.length >= 2 &&
103
+ tokens[0] === 'export' &&
104
+ tokens[1] === 'telemetry-contrib');
105
+ }
106
+ export function parseExportTelemetryContribArgs(args) {
107
+ if (!isExportTelemetryContribInvocation(args)) {
108
+ throw new Error('Usage: export telemetry-contrib [--limit N]');
109
+ }
110
+ const tokens = args.trim().split(/\s+/).filter(Boolean);
111
+ let limit = DEFAULT_TELEMETRY_CONTRIB_EXPORT_LIMIT;
112
+ for (let i = 2; i < tokens.length; i++) {
113
+ const token = tokens[i];
114
+ if (token === '--limit') {
115
+ const next = tokens[i + 1];
116
+ if (!next) {
117
+ throw new Error('Usage: export telemetry-contrib [--limit N]');
118
+ }
119
+ limit = parsePositiveLimit(next);
120
+ i++;
121
+ continue;
122
+ }
123
+ if (token.startsWith('--limit=')) {
124
+ limit = parsePositiveLimit(token.slice('--limit='.length));
125
+ continue;
126
+ }
127
+ throw new Error(`Unknown argument: ${token}`);
128
+ }
129
+ return { limit };
130
+ }
131
+ function parsePositiveLimit(raw) {
132
+ const parsed = Number.parseInt(raw, 10);
133
+ if (!Number.isFinite(parsed) || parsed <= 0) {
134
+ throw new Error('Usage: export telemetry-contrib [--limit N]');
135
+ }
136
+ return Math.min(parsed, DEFAULT_TELEMETRY_CONTRIB_EXPORT_LIMIT);
137
+ }
138
+ /**
139
+ * Clear the current session pin via SessionPinner.breakPin().
140
+ * Does not modify SessionPinner break rules — operator-initiated unpin only.
141
+ */
142
+ export function executeUnpinCommand(ctx) {
143
+ const { sessionId, sessionPinner } = ctx;
144
+ if (!sessionPinner) {
145
+ return {
146
+ outcome: 'unavailable',
147
+ message: 'Session pinner unavailable.',
148
+ level: 'error',
149
+ };
150
+ }
151
+ const pin = sessionPinner.getPin(sessionId);
152
+ if (!pin) {
153
+ return {
154
+ outcome: 'noop',
155
+ message: 'No session pin to clear.',
156
+ level: 'info',
157
+ };
158
+ }
159
+ sessionPinner.breakPin(sessionId);
160
+ return {
161
+ outcome: 'cleared',
162
+ previousModelId: pin.pinned_model_id,
163
+ message: `Cleared session pin (was ${pin.pinned_model_id}). Next request will run full routing.`,
164
+ level: 'info',
165
+ };
166
+ }
167
+ export function hashSessionIdForContribExport(sessionId) {
168
+ return createHash('sha256').update(sessionId).digest('hex');
169
+ }
170
+ function resolveSessionIdHash(record, outcomes) {
171
+ const sessionId = outcomes[0]?.session_id;
172
+ if (typeof sessionId === 'string' && sessionId.length > 0) {
173
+ return hashSessionIdForContribExport(sessionId);
174
+ }
175
+ const raw = record;
176
+ if (typeof raw.session_id === 'string' && raw.session_id.length > 0) {
177
+ return hashSessionIdForContribExport(raw.session_id);
178
+ }
179
+ return hashSessionIdForContribExport('');
180
+ }
181
+ /** Map a dataset row plus linked outcomes to a privacy-safe telemetry contrib record. */
182
+ export function toTelemetryContribRecord(record, outcomes = []) {
183
+ const { success, outcome_signals } = deriveSuccessLabel(outcomes);
184
+ const contrib = {
185
+ version: TELEMETRY_CONTRIB_VERSION,
186
+ timestamp: record.timestamp,
187
+ session_id_hash: resolveSessionIdHash(record, outcomes),
188
+ turn_type: record.turn_type,
189
+ stage: record.stage,
190
+ reason_code: record.reason_code,
191
+ selected_model_id: record.selected_model_id,
192
+ tier: record.tier,
193
+ routing_latency_ms: record.routing_latency_ms,
194
+ estimated_cost_usd: record.estimated_cost_usd,
195
+ estimated_input_tokens: record.estimated_input_tokens,
196
+ has_tool_context: record.has_tool_context,
197
+ compaction_flag: record.compaction_flag,
198
+ triage_verdict: record.triage_verdict,
199
+ triage_reason_code: record.triage_reason_code,
200
+ triage_cyclomatic_score: record.triage_cyclomatic_score,
201
+ triage_trivial_hits: record.triage_trivial_hits,
202
+ triage_complex_hits: record.triage_complex_hits,
203
+ triage_sanitized_length_delta: record.triage_sanitized_length_delta,
204
+ requirement_reasoning: record.requirement_reasoning,
205
+ requirement_code_gen: record.requirement_code_gen,
206
+ requirement_tool_use: record.requirement_tool_use,
207
+ cluster_id: record.cluster_id,
208
+ cluster_similarity: record.cluster_similarity,
209
+ cluster_margin: record.cluster_margin,
210
+ low_intensity_score: record.low_intensity_score,
211
+ tier_hint: record.tier_hint,
212
+ p_success_cheap: record.p_success_cheap,
213
+ local_eligible_reason: record.local_eligible_reason,
214
+ tier_selection_reason_code: record.tier_selection_reason_code,
215
+ success_label: success,
216
+ outcome_signals,
217
+ };
218
+ for (const key of TELEMETRY_CONTRIB_STRIP_KEYS) {
219
+ delete contrib[key];
220
+ }
221
+ return sanitizeTelemetryContribRecord(contrib);
222
+ }
223
+ export function formatTelemetryContribJson(records) {
224
+ if (records.length === 0) {
225
+ return '[]';
226
+ }
227
+ return JSON.stringify(records, null, 2);
228
+ }
229
+ export function formatTelemetryContribJsonl(records) {
230
+ if (records.length === 0) {
231
+ return '';
232
+ }
233
+ return records.map((record) => JSON.stringify(record)).join('\n') + '\n';
234
+ }
235
+ export function formatTelemetryContribExportTimestamp(date = new Date()) {
236
+ return date.toISOString().replace(/[:.]/g, '-');
237
+ }
238
+ export function getTelemetryContribExportPath(cwd, timestamp) {
239
+ return join(cwd, DEFAULT_TELEMETRY_CONTRIB_EXPORT_DIR, `telemetry-contrib-${timestamp}.json`);
240
+ }
241
+ /** Defense-in-depth validation using SP-116 contrib safety checks. */
242
+ export function validateTelemetryContribRecord(record, context) {
243
+ assertTelemetryContribRecordSafe(record, context);
244
+ return sanitizeTelemetryContribRecord(record);
245
+ }
246
+ export function buildTelemetryContribRecords(datasetRecords, outcomeRecords = []) {
247
+ const outcomesByRequest = indexOutcomesByRequestId(outcomeRecords);
248
+ return datasetRecords.map((record) => {
249
+ const linkedOutcomes = outcomesByRequest.get(record.request_id) ?? [];
250
+ const contrib = toTelemetryContribRecord(record, linkedOutcomes);
251
+ validateTelemetryContribRecord(contrib, record.request_id);
252
+ return contrib;
253
+ });
254
+ }
255
+ export async function exportTelemetryContrib(ctx, options) {
256
+ const datasetRecords = await ctx.store.listDatasetRecords({ limit: ctx.limit });
257
+ const outcomeRecords = await ctx.store.listOutcomeRecords({ limit: ctx.limit });
258
+ const records = buildTelemetryContribRecords(datasetRecords, outcomeRecords);
259
+ const json = formatTelemetryContribJson(records);
260
+ if (records.length === 0 || options?.writeFile === false) {
261
+ return { path: null, recordCount: records.length, json };
262
+ }
263
+ const timestamp = formatTelemetryContribExportTimestamp();
264
+ const exportDir = join(ctx.cwd, DEFAULT_TELEMETRY_CONTRIB_EXPORT_DIR);
265
+ mkdirSync(exportDir, { recursive: true });
266
+ const exportPath = getTelemetryContribExportPath(ctx.cwd, timestamp);
267
+ writeFileSync(exportPath, `${json}\n`, 'utf8');
268
+ return { path: exportPath, recordCount: records.length, json };
269
+ }
270
+ /** Join dataset export shape with outcome labels, then strip to contrib-safe fields. */
271
+ export function datasetExportRowToTelemetryContrib(exportRecord, outcomes) {
272
+ const joined = attachOutcomeLabelsToExport(exportRecord, outcomes);
273
+ const contrib = {
274
+ version: TELEMETRY_CONTRIB_VERSION,
275
+ ...joined,
276
+ };
277
+ for (const key of TELEMETRY_CONTRIB_STRIP_KEYS) {
278
+ delete contrib[key];
279
+ }
280
+ if (typeof exportRecord.session_id_hash === 'string') {
281
+ contrib.session_id_hash = exportRecord.session_id_hash;
282
+ }
283
+ else if (typeof exportRecord.session_id === 'string') {
284
+ contrib.session_id_hash = hashSessionIdForContribExport(exportRecord.session_id);
285
+ }
286
+ delete contrib.session_id;
287
+ return validateTelemetryContribRecord(contrib);
288
+ }
289
+ export const smartRouterCliSubcommands = {
290
+ unpin: executeUnpinCommand,
291
+ exportTelemetryContrib,
292
+ };
293
+ //# sourceMappingURL=smart-router-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-router-cli.js","sourceRoot":"","sources":["../../src/cli/smart-router-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Operator configuration defaults (FR-021).
3
+ * Values sourced from specs/001-build-smart-router/data-model.md § Configuration (Operator).
4
+ */
5
+ import type { OperatorConfig } from '../domain/types/schemas.js';
6
+ export declare const DEFAULT_OPERATOR_CONFIG: Readonly<OperatorConfig>;
7
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CA0BnD,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Operator configuration defaults (FR-021).
3
+ * Values sourced from specs/001-build-smart-router/data-model.md § Configuration (Operator).
4
+ */
5
+ import { DEFAULT_LOW_INTENSITY_WEIGHTS } from '../domain/routing/tier-features.js';
6
+ export const DEFAULT_OPERATOR_CONFIG = {
7
+ frugality: {
8
+ lambda_cost: 0.5,
9
+ lambda_latency: 0.1,
10
+ lambda_verbosity: 0.15,
11
+ },
12
+ loop_escalation: {
13
+ threshold: 3,
14
+ },
15
+ pricing: {
16
+ staleness_days: 14,
17
+ },
18
+ local: {
19
+ min_memory_gb_full: 16,
20
+ min_memory_gb_classification: 8,
21
+ battery_threshold_pct: 20,
22
+ },
23
+ hydra: {
24
+ artifact_cache_path: '.pi-smart-router/models/',
25
+ },
26
+ low_intensity: {
27
+ weights: DEFAULT_LOW_INTENSITY_WEIGHTS,
28
+ high_threshold: 0.65,
29
+ low_threshold: 0.35,
30
+ p_success_alpha: 0.5,
31
+ },
32
+ };
33
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;KAChD;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;CACO,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Fleet catalog loader — reads models.yaml and validates against ModelProfileSchema.
3
+ * Maps to T011 in the routing pipeline spec.
4
+ */
5
+ import type { ModelProfile } from '../domain/types/index.js';
6
+ export interface FleetCatalog {
7
+ readonly models: readonly ModelProfile[];
8
+ }
9
+ export interface LoadModelsOptions {
10
+ readonly filePath?: string;
11
+ }
12
+ /**
13
+ * Load and validate the fleet model catalog from a YAML file.
14
+ *
15
+ * @throws {ModelsLoaderError} when the file cannot be read or validation fails.
16
+ */
17
+ export declare function loadModels(options?: LoadModelsOptions): FleetCatalog;
18
+ export declare class ModelsLoaderError extends Error {
19
+ readonly name = "ModelsLoaderError";
20
+ constructor(message: string, options?: ErrorOptions);
21
+ }
22
+ //# sourceMappingURL=models-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-loader.d.ts","sourceRoot":"","sources":["../../src/config/models-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAM7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,YAAY,CA4BpE;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAkB,IAAI,uBAAuB;gBAEjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGpD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Fleet catalog loader — reads models.yaml and validates against ModelProfileSchema.
3
+ * Maps to T011 in the routing pipeline spec.
4
+ */
5
+ import { readFileSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { parse as parseYaml } from 'yaml';
8
+ import { z } from 'zod';
9
+ import { ModelProfileSchema } from '../domain/types/schemas.js';
10
+ const FleetCatalogSchema = z.object({
11
+ models: z.array(ModelProfileSchema).min(1, 'Fleet catalog must contain at least one model'),
12
+ });
13
+ /**
14
+ * Load and validate the fleet model catalog from a YAML file.
15
+ *
16
+ * @throws {ModelsLoaderError} when the file cannot be read or validation fails.
17
+ */
18
+ export function loadModels(options) {
19
+ const filePath = options?.filePath ?? resolve('config', 'models.yaml');
20
+ let raw;
21
+ try {
22
+ raw = readFileSync(filePath, 'utf8');
23
+ }
24
+ catch (err) {
25
+ const message = err instanceof Error ? err.message : String(err);
26
+ throw new ModelsLoaderError(`Failed to read models file: ${message}`, { cause: err });
27
+ }
28
+ let parsed;
29
+ try {
30
+ parsed = parseYaml(raw);
31
+ }
32
+ catch (err) {
33
+ const message = err instanceof Error ? err.message : String(err);
34
+ throw new ModelsLoaderError(`Failed to parse YAML: ${message}`, { cause: err });
35
+ }
36
+ const result = FleetCatalogSchema.safeParse(parsed);
37
+ if (!result.success) {
38
+ const issues = result.error.issues
39
+ .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)
40
+ .join('\n');
41
+ throw new ModelsLoaderError(`Invalid fleet catalog:\n${issues}`, { cause: result.error });
42
+ }
43
+ return { models: result.data.models };
44
+ }
45
+ export class ModelsLoaderError extends Error {
46
+ name = 'ModelsLoaderError';
47
+ constructor(message, options) {
48
+ super(message, options);
49
+ }
50
+ }
51
+ //# sourceMappingURL=models-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-loader.js","sourceRoot":"","sources":["../../src/config/models-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,+CAA+C,CAAC;CAC5F,CAAC,CAAC;AAUH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAA2B;IACpD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEvE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,iBAAiB,CAAC,+BAA+B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,iBAAiB,CAAC,yBAAyB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;aAC/D,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACxB,IAAI,GAAG,mBAAmB,CAAC;IAE7C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Pi model registry → ModelProfile mapper.
3
+ *
4
+ * Maps pi `Model` objects (provider + id) to router fleet entries using
5
+ * pattern-based lookup for known families. Unknown models receive conservative
6
+ * economical-cloud defaults.
7
+ */
8
+ import type { ModelLimits, ModelProfile, Tier } from '../domain/types/entities.js';
9
+ /** Pi registry `Model.cost` shape — per-token USD rates. */
10
+ export interface PiRegistryCost {
11
+ readonly input: number;
12
+ readonly output: number;
13
+ readonly cacheRead: number;
14
+ readonly cacheWrite: number;
15
+ }
16
+ export interface PiModelInput {
17
+ readonly provider: string;
18
+ readonly id: string;
19
+ readonly name?: string;
20
+ readonly cost?: PiRegistryCost;
21
+ }
22
+ /** Conservative context limits when YAML and LiteLLM registry have no entry (SP-092). */
23
+ export declare const DEFAULT_MODEL_LIMITS: Readonly<Record<Tier, ModelLimits>>;
24
+ export declare function getDefaultLimitsForTier(tier: Tier): ModelLimits;
25
+ /**
26
+ * Default virtual subscription-quota cost for Cursor frontier models (SP-096 / #70).
27
+ * `fallback_cost_per_1m` stays 0 (no per-token API billing); `quota_cost_per_1m`
28
+ * is used only for frugality scoring and telemetry so economical API models are
29
+ * not dominated solely because subscription registry cost is zero.
30
+ */
31
+ export declare const DEFAULT_CURSOR_QUOTA_COST_PER_1M = 3;
32
+ /**
33
+ * Map a pi model registry entry to a router ModelProfile.
34
+ */
35
+ export declare function mapPiModelToProfile(input: PiModelInput): ModelProfile;
36
+ /**
37
+ * Map an array of pi registry models to a router fleet catalog.
38
+ */
39
+ export declare function mapFleetFromRegistry(models: readonly PiModelInput[]): ModelProfile[];
40
+ //# sourceMappingURL=pi-model-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-model-mapper.d.ts","sourceRoot":"","sources":["../../src/config/pi-model-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,WAAW,EAGX,YAAY,EACZ,IAAI,EACL,MAAM,6BAA6B,CAAC;AAErC,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAiBD,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAIpE,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAE/D;AAwDD;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,IAAM,CAAC;AAqIpD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAuBrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAEpF"}