heyspex 0.1.0 → 0.2.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 (322) hide show
  1. package/README.md +21 -0
  2. package/bin/hs.mjs +931 -98
  3. package/bin/spexcode.mjs +262 -0
  4. package/dev-factory/engine/worktree.mjs +740 -0
  5. package/dev-factory/lib/code-repo-root.mjs +67 -0
  6. package/dev-factory/lib/context-budget.mjs +84 -0
  7. package/dev-factory/lib/epic-detect.mjs +190 -0
  8. package/dev-factory/lib/fleet-queue-file.mjs +846 -0
  9. package/dev-factory/lib/fleet-queue.mjs +426 -0
  10. package/dev-factory/lib/fleet-state.mjs +14 -18
  11. package/dev-factory/lib/model-catalog.mjs +338 -0
  12. package/dev-factory/lib/seat-context.mjs +199 -0
  13. package/dev-factory/lib/spec-io.mjs +93 -0
  14. package/dev-factory/lib/sufficiency-score.mjs +8 -2
  15. package/dev-factory/lib/worktree-allocator.mjs +744 -0
  16. package/dev-factory/model-catalog.json +222 -0
  17. package/dist/cli/hs-check.mjs +1085 -103
  18. package/dist/cli/hs-claim.mjs +936 -63
  19. package/dist/cli/hs-connect.mjs +9786 -1910
  20. package/dist/cli/hs-defer.mjs +5267 -3053
  21. package/dist/cli/hs-dev.mjs +564 -0
  22. package/dist/cli/hs-env.mjs +385 -299
  23. package/dist/cli/hs-index-rebuild.mjs +7129 -0
  24. package/dist/cli/hs-index-reconcile.mjs +7852 -0
  25. package/dist/cli/hs-init.mjs +777 -138
  26. package/dist/cli/hs-install.mjs +6583 -485
  27. package/dist/cli/hs-join.mjs +10137 -2368
  28. package/dist/cli/hs-vault-pull.mjs +4659 -5882
  29. package/dist/cli/hs-vault.mjs +3793 -1537
  30. package/dist/cli/hs-workspace.mjs +2550 -524
  31. package/dist/cli-templates/customer-vault/specs/entity-model.md +594 -601
  32. package/dist/cli-templates/customer-vault/specs/protocols/canonical-frontmatter-templates.md +110 -177
  33. package/dist/cli-templates/customer-vault/specs/protocols/destructive-action-checklist.md +122 -0
  34. package/dist/cli-templates/customer-vault/specs/protocols/memory-protocol.md +13 -15
  35. package/dist/cli-templates/customer-vault/specs/protocols/session-close-protocol.md +91 -0
  36. package/dist/cli-templates/customer-vault/specs/protocols/spec-hierarchy.md +150 -168
  37. package/dist/cli-templates/customer-vault/specs/protocols/spec-summary-authoring.md +83 -0
  38. package/dist/cli-templates/harness-commands/claude/hs-auto.md +36 -0
  39. package/dist/cli-templates/harness-commands/claude/hs-backfill.md +28 -0
  40. package/dist/cli-templates/harness-commands/claude/hs-capture.md +62 -0
  41. package/dist/cli-templates/harness-commands/claude/hs-defer.md +29 -0
  42. package/dist/cli-templates/harness-commands/claude/hs-dev.md +20 -0
  43. package/dist/cli-templates/harness-commands/claude/hs-doctor.md +32 -0
  44. package/dist/cli-templates/harness-commands/claude/hs-ground.md +28 -0
  45. package/dist/cli-templates/harness-commands/claude/hs-handoff.md +33 -0
  46. package/dist/cli-templates/harness-commands/claude/hs-log.md +27 -0
  47. package/dist/cli-templates/harness-commands/claude/hs-next.md +29 -0
  48. package/dist/cli-templates/harness-commands/claude/hs-promote.md +70 -0
  49. package/dist/cli-templates/harness-commands/claude/hs-push.md +35 -0
  50. package/dist/cli-templates/harness-commands/claude/hs-qc.md +27 -0
  51. package/dist/cli-templates/harness-commands/claude/hs-res.md +63 -0
  52. package/dist/cli-templates/harness-commands/claude/hs-resolve.md +23 -0
  53. package/dist/cli-templates/harness-commands/claude/hs-review.md +23 -0
  54. package/dist/cli-templates/harness-commands/claude/hs-view.md +26 -0
  55. package/dist/cli-templates/harness-commands/claude/kill-ports.md +32 -0
  56. package/dist/cli-templates/harness-commands/claude/prototype.md +91 -0
  57. package/dist/cli-templates/harness-commands/cursor/hs-auto.md +40 -0
  58. package/dist/cli-templates/harness-commands/cursor/hs-backfill.md +31 -0
  59. package/dist/cli-templates/harness-commands/cursor/hs-capture.md +65 -0
  60. package/dist/cli-templates/harness-commands/cursor/hs-defer.md +32 -0
  61. package/dist/cli-templates/harness-commands/cursor/hs-dev.md +24 -0
  62. package/dist/cli-templates/harness-commands/cursor/hs-doctor.md +36 -0
  63. package/dist/cli-templates/harness-commands/cursor/hs-ground.md +31 -0
  64. package/dist/cli-templates/harness-commands/cursor/hs-handoff.md +37 -0
  65. package/dist/cli-templates/harness-commands/cursor/hs-log.md +31 -0
  66. package/dist/cli-templates/harness-commands/cursor/hs-next.md +32 -0
  67. package/dist/cli-templates/harness-commands/cursor/hs-promote.md +73 -0
  68. package/dist/cli-templates/harness-commands/cursor/hs-push.md +38 -0
  69. package/dist/cli-templates/harness-commands/cursor/hs-qc.md +30 -0
  70. package/dist/cli-templates/harness-commands/cursor/hs-res.md +67 -0
  71. package/dist/cli-templates/harness-commands/cursor/hs-resolve.md +26 -0
  72. package/dist/cli-templates/harness-commands/cursor/hs-review.md +26 -0
  73. package/dist/cli-templates/harness-commands/cursor/hs-view.md +30 -0
  74. package/dist/cli-templates/harness-commands/cursor/kill-ports.md +35 -0
  75. package/dist/cli-templates/harness-commands/cursor/prototype.md +95 -0
  76. package/docs/mcp-client-config.md +259 -6
  77. package/package.json +231 -124
  78. package/plugins/heyspex/.claude-plugin/plugin.json +12 -0
  79. package/plugins/heyspex/.cursor-plugin/plugin.json +15 -0
  80. package/plugins/heyspex/.mcp.json +12 -0
  81. package/plugins/heyspex/bin/launch-mcp.mjs +95 -0
  82. package/plugins/heyspex/bin/run-hook.mjs +62 -0
  83. package/plugins/heyspex/hooks/cursor-hooks.json +227 -0
  84. package/plugins/heyspex/hooks/hooks.json +361 -0
  85. package/plugins/heyspex/mcp.json +13 -0
  86. package/scripts/check-mcp-freshness.mjs +17 -9
  87. package/scripts/claude-hooks/_env-vault-events.mjs +68 -0
  88. package/scripts/claude-hooks/_guardrail-events.mjs +96 -0
  89. package/scripts/claude-hooks/_guardrail-loader.mjs +494 -0
  90. package/scripts/claude-hooks/_intent-classifier-router.mjs +410 -0
  91. package/scripts/claude-hooks/_intent-classifier-semantic.mjs +351 -0
  92. package/scripts/claude-hooks/_run.mjs +120 -0
  93. package/scripts/claude-hooks/_transcript-text.mjs +60 -0
  94. package/scripts/claude-hooks/_vault-retrieval.mjs +322 -0
  95. package/scripts/claude-hooks/agent-spawn-delegation-gate.mjs +133 -0
  96. package/scripts/claude-hooks/capture-workflow-gate.mjs +11 -0
  97. package/scripts/claude-hooks/check-auto-memory-budget.mjs +396 -0
  98. package/scripts/claude-hooks/check-claude-md-budget.mjs +327 -0
  99. package/scripts/claude-hooks/check-mcp-freshness-hook.mjs +14 -0
  100. package/scripts/claude-hooks/claim-before-code-gate.mjs +11 -0
  101. package/scripts/claude-hooks/claim-liveness-shared.mjs +575 -0
  102. package/scripts/claude-hooks/close-terminal-on-ship.mjs +64 -0
  103. package/scripts/claude-hooks/coo-denylist-gate.mjs +11 -0
  104. package/scripts/claude-hooks/coo-guard-check.mjs +11 -0
  105. package/scripts/claude-hooks/deep-research-cost-gate.mjs +11 -0
  106. package/scripts/claude-hooks/dev-server-task-reminder.mjs +15 -0
  107. package/scripts/claude-hooks/emit-claim-status.mjs +41 -0
  108. package/scripts/claude-hooks/enforce-session-sequence.mjs +11 -0
  109. package/scripts/claude-hooks/enforce-vault-naming.mjs +11 -0
  110. package/scripts/claude-hooks/env-vault-guard.mjs +11 -0
  111. package/scripts/claude-hooks/epic-milestone-phrasing-gate.mjs +11 -0
  112. package/scripts/claude-hooks/git-identity-guard.mjs +11 -0
  113. package/scripts/claude-hooks/git-reflog-audit.mjs +15 -0
  114. package/scripts/claude-hooks/git-stash-gate.mjs +11 -0
  115. package/scripts/claude-hooks/guard-auto-memory-writes.mjs +137 -0
  116. package/scripts/claude-hooks/id-display-format-gate.mjs +11 -0
  117. package/scripts/claude-hooks/inject-communication-style.mjs +66 -0
  118. package/scripts/claude-hooks/inject-coo-seat.mjs +78 -0
  119. package/scripts/claude-hooks/inject-dev-server-awareness.mjs +11 -0
  120. package/scripts/claude-hooks/inject-doctrine.mjs +13 -0
  121. package/scripts/claude-hooks/inject-vault-context.mjs +14 -0
  122. package/scripts/claude-hooks/intent-classifier-trigger.mjs +247 -0
  123. package/scripts/claude-hooks/log-session-activity.mjs +341 -0
  124. package/scripts/claude-hooks/naughty-list-gate.mjs +11 -0
  125. package/scripts/claude-hooks/notify-status-flip.mjs +72 -0
  126. package/scripts/claude-hooks/plan-exit-ingest-gate.mjs +170 -0
  127. package/scripts/claude-hooks/plan-ingest-close-reminder.mjs +66 -0
  128. package/scripts/claude-hooks/plan-review-gate.mjs +11 -0
  129. package/scripts/claude-hooks/preflight-reminder.mjs +262 -0
  130. package/scripts/claude-hooks/protected-action-intent.mjs +221 -0
  131. package/scripts/claude-hooks/research-method-guard.mjs +398 -0
  132. package/scripts/claude-hooks/research-protocol-gate.mjs +11 -0
  133. package/scripts/claude-hooks/session-end.mjs +449 -0
  134. package/scripts/claude-hooks/settings-write-gate.mjs +11 -0
  135. package/scripts/claude-hooks/settlement-check-gate.mjs +39 -0
  136. package/scripts/claude-hooks/status-flip-detect.mjs +17 -0
  137. package/scripts/claude-hooks/terminal-close-shared.mjs +426 -0
  138. package/scripts/claude-hooks/terminal-close-watcher.mjs +122 -0
  139. package/scripts/claude-hooks/wip-checkpoint.mjs +298 -0
  140. package/scripts/cursor-hooks/manifest.mjs +235 -0
  141. package/scripts/dev-server-status.mjs +34 -13
  142. package/scripts/dev-server-stop.mjs +313 -0
  143. package/scripts/heyspex-mode.mjs +268 -0
  144. package/scripts/hs-auto-resolve.mjs +240 -0
  145. package/scripts/hs-auto-source.mjs +398 -0
  146. package/scripts/hs-auto.mjs +134 -0
  147. package/scripts/hs-capture-cli.mjs +326 -0
  148. package/scripts/hs-classifier.mjs +136 -0
  149. package/scripts/hs-companion.mjs +88 -0
  150. package/scripts/hs-gateway.mjs +115 -0
  151. package/scripts/hs-mode.mjs +125 -0
  152. package/scripts/hs-next.mjs +441 -0
  153. package/scripts/hs-settings.mjs +338 -0
  154. package/scripts/hs-view.mjs +333 -0
  155. package/scripts/hs-worktree.mjs +201 -0
  156. package/scripts/install-claude-code-hooks.mjs +270 -0
  157. package/scripts/install-cursor-hooks.mjs +471 -0
  158. package/scripts/lib/agent-env-markers.mjs +38 -0
  159. package/scripts/lib/console-url-resolver.mjs +197 -60
  160. package/scripts/lib/customer-kit.mjs +886 -0
  161. package/scripts/lib/dev-mode.mjs +244 -28
  162. package/scripts/lib/heyspex-home.mjs +72 -0
  163. package/scripts/lib/hs-command.mjs +277 -0
  164. package/scripts/lib/hs-companion-settings.mjs +472 -0
  165. package/scripts/lib/hs-source-commit.mjs +59 -5
  166. package/scripts/lib/hs-source-identity.mjs +526 -0
  167. package/scripts/lib/hs-source-log.mjs +11 -21
  168. package/scripts/lib/hs-source-push.mjs +107 -58
  169. package/scripts/lib/hs-worktree-args.mjs +115 -0
  170. package/scripts/lib/shared-path-helpers.mjs +134 -0
  171. package/scripts/lib/standalone-doctor.mjs +540 -3
  172. package/scripts/lib/subagent-git-lock.mjs +109 -0
  173. package/scripts/lib/template-pin.mjs +34 -0
  174. package/scripts/provenance-lib.mjs +91 -0
  175. package/scripts/stamp-provenance-on-edit.mjs +222 -0
  176. package/scripts/wip-ledger-health.mjs +653 -0
  177. package/spexharness/doctrine/baseline/SPEXCODE-DOCTRINE.baseline.json +29 -0
  178. package/spexharness/src/adapters/audit.mjs +197 -0
  179. package/spexharness/src/adapters/claude-code.mjs +441 -0
  180. package/spexharness/src/chat/tui/ansi.mjs +448 -0
  181. package/spexharness/src/chat/tui/palette.mjs +22 -0
  182. package/spexharness/src/chat/tui/select.mjs +208 -0
  183. package/spexharness/src/config-root.mjs +54 -0
  184. package/spexharness/src/context-budget.mjs +141 -0
  185. package/spexharness/src/dev-server-control.mjs +389 -0
  186. package/spexharness/src/doctrine/behaviour.mjs +371 -0
  187. package/spexharness/src/doctrine/corpus.mjs +733 -0
  188. package/spexharness/src/doctrine/inject.mjs +338 -0
  189. package/spexharness/src/doctrine/merge.mjs +184 -0
  190. package/spexharness/src/doctrine/sources.mjs +252 -0
  191. package/spexharness/src/doctrine/synthesize.mjs +401 -0
  192. package/spexharness/src/doctrine/vault-source.mjs +574 -0
  193. package/spexharness/src/doctrine/writer.mjs +176 -0
  194. package/spexharness/src/events.mjs +84 -0
  195. package/spexharness/src/gates/capture-workflow-gate.mjs +202 -0
  196. package/spexharness/src/gates/claim-before-code-gate.decide.mjs +33 -0
  197. package/spexharness/src/gates/claim-before-code-gate.mjs +129 -0
  198. package/spexharness/src/gates/deep-research-cost-gate.mjs +274 -0
  199. package/spexharness/src/gates/enforce-session-sequence.mjs +895 -0
  200. package/spexharness/src/gates/enforce-vault-naming.mjs +215 -0
  201. package/spexharness/src/gates/epic-milestone-phrasing-gate.mjs +233 -0
  202. package/spexharness/src/gates/git-identity-guard.decide.mjs +436 -0
  203. package/spexharness/src/gates/git-identity-guard.mjs +61 -0
  204. package/spexharness/src/gates/git-reflog-audit.mjs +151 -0
  205. package/spexharness/src/gates/git-stash-gate.decide.mjs +361 -0
  206. package/spexharness/src/gates/git-stash-gate.mjs +159 -0
  207. package/spexharness/src/gates/id-display-format-gate.mjs +190 -0
  208. package/spexharness/src/gates/inject-doctrine-gate.mjs +89 -0
  209. package/spexharness/src/gates/inject-vault-context.mjs +239 -0
  210. package/spexharness/src/gates/naughty-list-gate.mjs +213 -0
  211. package/spexharness/src/gates/plan-review-gate.mjs +233 -0
  212. package/spexharness/src/gates/preflight-reminder-gate.mjs +265 -0
  213. package/spexharness/src/gates/research-protocol-gate.mjs +175 -0
  214. package/spexharness/src/gates/settings-write-gate.decide.mjs +96 -0
  215. package/spexharness/src/gates/settings-write-gate.mjs +104 -0
  216. package/spexharness/src/git-reflog-audit.mjs +294 -0
  217. package/spexharness/src/intent-classifier.mjs +194 -0
  218. package/spexharness/src/intent-directive.mjs +541 -0
  219. package/spexharness/src/profile/learn.mjs +551 -0
  220. package/spexharness/src/profile/proposals.mjs +357 -0
  221. package/spexharness/src/profile/vault-inclusion.mjs +386 -0
  222. package/spexharness/src/redact.mjs +151 -0
  223. package/spexharness/src/rule-table.mjs +819 -0
  224. package/spexharness/src/seat-context.mjs +122 -0
  225. package/spexharness/src/session-bootstrap.mjs +512 -0
  226. package/spexharness/src/session-record.mjs +815 -0
  227. package/spexharness/src/token-inventory.mjs +207 -0
  228. package/vendor/heyspex-mcp/account-switch.mjs +95 -0
  229. package/vendor/heyspex-mcp/alignment-gate.mjs +315 -1
  230. package/vendor/heyspex-mcp/blocker-resolver.mjs +37 -2
  231. package/vendor/heyspex-mcp/breakdown-ladder.mjs +119 -4
  232. package/vendor/heyspex-mcp/breakdown-source.mjs +271 -0
  233. package/vendor/heyspex-mcp/breakdown-writer.mjs +23 -3
  234. package/vendor/heyspex-mcp/capture-buffer-patches.mjs +46 -5
  235. package/vendor/heyspex-mcp/capture-channel.mjs +55 -5
  236. package/vendor/heyspex-mcp/capture-console-client.mjs +80 -1
  237. package/vendor/heyspex-mcp/capture-focus.mjs +1035 -29
  238. package/vendor/heyspex-mcp/capture-outbox.mjs +5 -1
  239. package/vendor/heyspex-mcp/capture-tools.mjs +1219 -0
  240. package/vendor/heyspex-mcp/claim-tools.mjs +1124 -0
  241. package/vendor/heyspex-mcp/cli-verbs.mjs +2076 -0
  242. package/vendor/heyspex-mcp/cli.mjs +201 -15524
  243. package/vendor/heyspex-mcp/cloud-tool-surface.mjs +128 -0
  244. package/vendor/heyspex-mcp/cloud-vault-writes.mjs +412 -0
  245. package/vendor/heyspex-mcp/config-seed.yaml +15 -0
  246. package/vendor/heyspex-mcp/config-settings.mjs +290 -7
  247. package/vendor/heyspex-mcp/console-fetch.mjs +657 -16
  248. package/vendor/heyspex-mcp/console-transport.mjs +166 -0
  249. package/vendor/heyspex-mcp/credentials.mjs +584 -0
  250. package/vendor/heyspex-mcp/defer-spec.mjs +44 -4
  251. package/vendor/heyspex-mcp/deferred-reclaim.mjs +29 -3
  252. package/vendor/heyspex-mcp/design-handlers.mjs +31 -0
  253. package/vendor/heyspex-mcp/design-tools.mjs +4 -1
  254. package/vendor/heyspex-mcp/dev-factory-bridge.mjs +4 -4
  255. package/vendor/heyspex-mcp/dev-mode-core.mjs +45 -0
  256. package/vendor/heyspex-mcp/dev-tools.mjs +124 -0
  257. package/vendor/heyspex-mcp/diagnose-handlers.mjs +54 -0
  258. package/vendor/heyspex-mcp/events-tools.mjs +207 -0
  259. package/vendor/heyspex-mcp/filing-tools.mjs +688 -0
  260. package/vendor/heyspex-mcp/fleet-handlers.mjs +37 -0
  261. package/vendor/heyspex-mcp/fleet-queue-tools.mjs +69 -14
  262. package/vendor/heyspex-mcp/focus-tools.mjs +190 -0
  263. package/vendor/heyspex-mcp/folder-trust-store.mjs +59 -0
  264. package/vendor/heyspex-mcp/http-transport.mjs +300 -0
  265. package/vendor/heyspex-mcp/list-tools.mjs +257 -0
  266. package/vendor/heyspex-mcp/login-handoff.mjs +15 -1
  267. package/vendor/heyspex-mcp/mcp-config.mjs +94 -0
  268. package/vendor/heyspex-mcp/memory-tools.mjs +523 -0
  269. package/vendor/heyspex-mcp/mvp-mode.mjs +53 -6
  270. package/vendor/heyspex-mcp/occupied-keys.mjs +141 -0
  271. package/vendor/heyspex-mcp/on-deck-brief.mjs +3360 -0
  272. package/vendor/heyspex-mcp/on-deck-scheduler.mjs +1708 -0
  273. package/vendor/heyspex-mcp/package-root.mjs +32 -0
  274. package/vendor/heyspex-mcp/peer-presence.mjs +8 -1
  275. package/vendor/heyspex-mcp/plan-ground.mjs +621 -652
  276. package/vendor/heyspex-mcp/plan-push.mjs +906 -21
  277. package/vendor/heyspex-mcp/plan-review.mjs +124 -30
  278. package/vendor/heyspex-mcp/preflight-gate.mjs +0 -0
  279. package/vendor/heyspex-mcp/procedure-handlers.mjs +325 -0
  280. package/vendor/heyspex-mcp/procedure-tools.mjs +540 -351
  281. package/vendor/heyspex-mcp/promote-capture.mjs +386 -69
  282. package/vendor/heyspex-mcp/promote-diagnose.mjs +74 -0
  283. package/vendor/heyspex-mcp/promote-research-to-diagnose.mjs +9 -2
  284. package/vendor/heyspex-mcp/promote-research.mjs +660 -53
  285. package/vendor/heyspex-mcp/promotion-helpers.mjs +251 -0
  286. package/vendor/heyspex-mcp/prompts.mjs +1460 -0
  287. package/vendor/heyspex-mcp/read-path.mjs +29 -9
  288. package/vendor/heyspex-mcp/receipt-shape.mjs +146 -0
  289. package/vendor/heyspex-mcp/recipe-handlers.mjs +117 -0
  290. package/vendor/heyspex-mcp/regen-tasks.mjs +210 -3
  291. package/vendor/heyspex-mcp/register-spec.mjs +266 -54
  292. package/vendor/heyspex-mcp/request-context.mjs +59 -0
  293. package/vendor/heyspex-mcp/research-focus.mjs +207 -4
  294. package/vendor/heyspex-mcp/research-handlers.mjs +623 -0
  295. package/vendor/heyspex-mcp/research-tools.mjs +4 -4
  296. package/vendor/heyspex-mcp/response-budget.mjs +348 -0
  297. package/vendor/heyspex-mcp/review-focus.mjs +25 -1
  298. package/vendor/heyspex-mcp/search-specs.mjs +280 -0
  299. package/vendor/heyspex-mcp/seat-block-ledger.mjs +113 -0
  300. package/vendor/heyspex-mcp/seat-identity.mjs +2 -6
  301. package/vendor/heyspex-mcp/session-owner.mjs +108 -0
  302. package/vendor/heyspex-mcp/session-tools.mjs +152 -0
  303. package/vendor/heyspex-mcp/settings-registry.mjs +232 -0
  304. package/vendor/heyspex-mcp/settings-tools.mjs +85 -12
  305. package/vendor/heyspex-mcp/spec-edit-tools.mjs +446 -0
  306. package/vendor/heyspex-mcp/spec-id-lib.mjs +93 -17
  307. package/vendor/heyspex-mcp/split-research.mjs +301 -56
  308. package/vendor/heyspex-mcp/stdio-rpc.mjs +22 -0
  309. package/vendor/heyspex-mcp/submit-for-review.mjs +132 -6
  310. package/vendor/heyspex-mcp/summary-contract.mjs +105 -0
  311. package/vendor/heyspex-mcp/summary-write-tools.mjs +224 -0
  312. package/vendor/heyspex-mcp/symptom-query.mjs +146 -0
  313. package/vendor/heyspex-mcp/test-helpers.mjs +108 -1
  314. package/vendor/heyspex-mcp/tool-catalog.mjs +2813 -0
  315. package/vendor/heyspex-mcp/tool-dispatch.mjs +639 -0
  316. package/vendor/heyspex-mcp/tool-helpers.mjs +325 -0
  317. package/vendor/heyspex-mcp/validate-linkage.mjs +414 -27
  318. package/vendor/heyspex-mcp/vault-io.mjs +724 -0
  319. package/vendor/heyspex-mcp/vault-less-endpoints.mjs +52 -0
  320. package/vendor/heyspex-mcp/vault-resolve.mjs +366 -68
  321. package/vendor/heyspex-mcp/verify-reproduction.mjs +270 -30
  322. package/vendor/heyspex-mcp/whoami.mjs +91 -0
@@ -0,0 +1,222 @@
1
+ {
2
+ "_comment": "SINGLE SOURCE OF TRUTH for model ids, aliases, retirements, context windows, capabilities and list prices — every cloud provider the fleet can call (DeepSeek, Anthropic, OpenAI, Gemini, OpenRouter, GitHub Models) AND every local runtime (Ollama, vLLM). Hand-edit THIS file when a vendor ships or retires a model; never scatter a new literal id through the code. Readers: dev-factory/lib/model-catalog.mjs (typed accessors + self-test), dev-factory/cloud-clients.mjs (the whole PROVIDERS table is derived from `providerKeys` below), dev-factory/lib/fleet-manifest.mjs (context/VRAM/cost tables), spexharness/src/chat/compact.mjs (window sizes), spex-console/src/lib/model-catalog.ts (the console's ONLY import path — keep it so when dev-factory merges into SpexFleet one line moves), dev-factory/judge.mjs, dev-factory/router.mjs --self-test (refuses retired ids in routing-table.json), scripts/check-model-ids.mjs (refuses retired ids in live code). ROUTING (which seat runs which model, which machine hosts which local model) stays in routing-table.json — this file says what a model IS and how it is reached, not who uses it. UPGRADE RECIPE: (1) add the new id under `models` with its window/price; (2) move the old id into `aliases` (old → new) and `retired`; (3) repoint the `roles` / `providerKeys` you want moved; (4) run `node dev-factory/lib/model-catalog.mjs --self-test && node dev-factory/router.mjs --self-test && npm run check:model-ids`. `verifiedOn` per provider records when the prices were last checked against the vendor's sheet.",
3
+ "verified": "2026-09-18",
4
+ "cloud": {
5
+ "deepseek": {
6
+ "kind": "openai",
7
+ "company": "deepseek",
8
+ "baseUrl": "https://api.deepseek.com/v1",
9
+ "betaBaseUrl": "https://api.deepseek.com/beta",
10
+ "anthropicBaseUrl": "https://api.deepseek.com/anthropic",
11
+ "userIdField": "user_id",
12
+ "_userIdFieldNote": "Wire field for per-seat cache/scheduling isolation (DeepSeek rate-limit doc: user_id isolates KVCache and scheduling). cloud-clients.mjs sends opts.userId (defaulting to opts.seat) under this name only for providers that declare it; betaBaseUrl is used only when a caller opts into strict tool schemas (opts.strictTools) — DeepSeek's strict mode is served from /beta.",
13
+ "keyEnv": "HEYSPEX_DEEPSEEK_API_KEY",
14
+ "keyEnvFallback": "DEEPSEEK_API_KEY",
15
+ "source": "https://api-docs.deepseek.com/quick_start/pricing",
16
+ "verifiedOn": "2026-09-18",
17
+ "peakHoursUtc": { "days": [1, 2, 3, 4, 5], "ranges": [["01:00", "04:00"], ["06:00", "10:00"]], "note": "Off-peak rates are half of peak; all other hours are off-peak (DeepSeek pricing note 3)." },
18
+ "roles": {
19
+ "cheap": "deepseek-flash",
20
+ "strong": "deepseek-v4-pro",
21
+ "chatDefault": "deepseek-flash",
22
+ "judge": "deepseek-flash",
23
+ "legacyJudge": "deepseek-chat"
24
+ },
25
+ "models": {
26
+ "deepseek-flash": {
27
+ "displayName": "DeepSeek-V4.1-Flash",
28
+ "released": "2026-09-10",
29
+ "contextWindow": 1048576,
30
+ "maxOutputTokens": 393216,
31
+ "tier": "cheap",
32
+ "capabilities": ["api", "metered", "tools", "thinking", "json", "vision", "strict-tools", "fim", "prefix"],
33
+ "thinkingDefault": true,
34
+ "effortLevels": ["low", "high", "max"],
35
+ "concurrencyLimit": 2500,
36
+ "pricePer1M": {
37
+ "peak": { "cacheHit": 0.006, "cacheMiss": 0.30, "output": 1.20 },
38
+ "offPeak": { "cacheHit": 0.003, "cacheMiss": 0.15, "output": 0.60 }
39
+ }
40
+ },
41
+ "deepseek-v4-pro": {
42
+ "displayName": "DeepSeek-V4-Pro-0813",
43
+ "released": "2026-08-13",
44
+ "contextWindow": 1048576,
45
+ "maxOutputTokens": 393216,
46
+ "tier": "strong",
47
+ "capabilities": ["api", "metered", "tools", "thinking", "json", "strict-tools", "fim", "prefix", "max_reasoning"],
48
+ "thinkingDefault": true,
49
+ "effortLevels": ["low", "high", "max"],
50
+ "concurrencyLimit": 500,
51
+ "note": "Retirement announced 2026-09-10 was reversed; service continues past 2026-09-14 at unchanged billing (pricing note 2).",
52
+ "pricePer1M": {
53
+ "peak": { "cacheHit": 0.044, "cacheMiss": 1.32, "output": 3.96 },
54
+ "offPeak": { "cacheHit": 0.022, "cacheMiss": 0.66, "output": 1.98 }
55
+ }
56
+ }
57
+ },
58
+ "aliases": {
59
+ "deepseek-v4-flash": "deepseek-flash",
60
+ "deepseek-v4-flash-vision-exp": "deepseek-flash",
61
+ "deepseek-chat": "deepseek-flash"
62
+ },
63
+ "retired": [
64
+ { "id": "deepseek-v4-flash", "on": "2026-09-10", "servedBy": "deepseek-flash", "note": "Legacy name still accepted by the API and routed to V4.1 Flash at the Flash price 'temporarily'." },
65
+ { "id": "deepseek-v4-flash-vision-exp", "on": "2026-09-10", "servedBy": "deepseek-flash" }
66
+ ],
67
+ "unlisted": {
68
+ "deepseek-chat": "Not on the 2026-09-10 model sheet. Kept only as the held-constant LLM-judge alias (PROVIDERS key `deepseek`); priced as deepseek-flash. Verify with --liveness before relying on it."
69
+ },
70
+ "emitAliasesAsProviderKeys": true,
71
+ "providerKeys": {
72
+ "deepseek-flash": { "model": "deepseek-flash" },
73
+ "deepseek-v4-pro": { "model": "deepseek-v4-pro" },
74
+ "deepseek": { "model": "deepseek-chat", "legacyAliasOf": "deepseek-flash", "note": "Legacy alias, held-constant LLM judge. Sends `deepseek-chat` on the wire, priced as deepseek-flash." }
75
+ }
76
+ },
77
+ "anthropic": {
78
+ "kind": "anthropic",
79
+ "company": "anthropic",
80
+ "baseUrl": "https://api.anthropic.com/v1",
81
+ "keyEnv": "HEYSPEX_ANTHROPIC_API_KEY",
82
+ "source": "claude-api skill model table (cached 2026-06-24) — first-party API rates",
83
+ "verifiedOn": "2026-06-24",
84
+ "_note": "Anthropic models are excluded from the dev-factory council by construction and are the ceiling/reference arm in benches; the PROVIDERS keys `claude` / `claude-opus` still point at the 4.x generation on purpose (flip `providerKeys` to the 5-family when the owner rules on it — the ids and prices are already here). Claude Code CLI launches use the bare alias words in `cliAliases` (resolved by spex-console/src/lib/model-registry/launch-resolve.ts), not these ids.",
85
+ "roles": {
86
+ "default": "claude-opus-5",
87
+ "strong": "claude-opus-5",
88
+ "mid": "claude-sonnet-5",
89
+ "cheap": "claude-haiku-4-5",
90
+ "max": "claude-fable-5-1",
91
+ "previousStrong": "claude-opus-4-8",
92
+ "previousMid": "claude-sonnet-4-6"
93
+ },
94
+ "cliAliases": { "opus": "claude-opus-5", "sonnet": "claude-sonnet-5", "haiku": "claude-haiku-4-5", "fable": "claude-fable-5-1" },
95
+ "models": {
96
+ "claude-fable-5-1": { "displayName": "Claude Fable 5.1", "contextWindow": 1048576, "maxOutputTokens": 131072, "tier": "max", "capabilities": ["api", "metered", "tools", "thinking", "vision", "json"], "noTemp": true, "thinkingAlwaysOn": true, "pricePer1M": { "input": 10.00, "output": 50.00 } },
97
+ "claude-opus-5": { "displayName": "Claude Opus 5", "contextWindow": 1048576, "maxOutputTokens": 131072, "tier": "strong", "capabilities": ["api", "metered", "tools", "thinking", "vision", "json"], "noTemp": true, "pricePer1M": { "input": 5.00, "output": 25.00 } },
98
+ "claude-sonnet-5": { "displayName": "Claude Sonnet 5", "contextWindow": 1048576, "maxOutputTokens": 131072, "tier": "strong", "capabilities": ["api", "metered", "tools", "thinking", "vision", "json"], "noTemp": true, "pricePer1M": { "input": 2.00, "output": 10.00 } },
99
+ "claude-haiku-4-5": { "displayName": "Claude Haiku 4.5", "contextWindow": 200000, "maxOutputTokens": 65536, "tier": "cheap", "capabilities": ["api", "metered", "tools", "thinking", "vision"], "pricePer1M": { "input": 1.00, "output": 5.00 } },
100
+ "claude-opus-4-8": { "displayName": "Claude Opus 4.8", "contextWindow": 1048576, "maxOutputTokens": 131072, "tier": "strong", "capabilities": ["api", "metered", "tools", "thinking", "vision", "json"], "noTemp": true, "generation": "previous", "pricePer1M": { "input": 5.00, "output": 25.00 } },
101
+ "claude-sonnet-4-6":{ "displayName": "Claude Sonnet 4.6","contextWindow": 1048576, "maxOutputTokens": 131072, "tier": "strong", "capabilities": ["api", "metered", "tools", "thinking", "vision", "json"], "generation": "previous", "pricePer1M": { "input": 3.00, "output": 15.00 } }
102
+ },
103
+ "aliases": {},
104
+ "retired": [],
105
+ "providerKeys": {
106
+ "claude": { "model": "claude-sonnet-4-6", "note": "Generic Claude key — previous generation kept on purpose; see _note." },
107
+ "claude-opus": { "model": "claude-opus-4-8", "noTemp": true, "note": "Opus key — previous generation kept on purpose. Old table priced this at $15/$75; the sheet says $5/$25." }
108
+ }
109
+ },
110
+ "openai": {
111
+ "kind": "openai",
112
+ "company": "openai",
113
+ "baseUrl": "https://api.openai.com/v1",
114
+ "keyEnv": "HEYSPEX_OPENAI_API_KEY",
115
+ "source": "carried over from cloud-clients.mjs PROVIDERS (no vendor re-verification in this pass)",
116
+ "verifiedOn": "2026-06-28",
117
+ "roles": { "default": "gpt-4o" },
118
+ "models": {
119
+ "gpt-4o": { "contextWindow": 128000, "tier": "strong", "capabilities": ["api", "metered", "tools", "vision", "json"], "pricePer1M": { "input": 2.50, "output": 10.00 } }
120
+ },
121
+ "aliases": {},
122
+ "retired": [],
123
+ "providerKeys": { "openai": { "model": "gpt-4o" } }
124
+ },
125
+ "gemini": {
126
+ "kind": "openai",
127
+ "company": "google",
128
+ "baseUrl": "https://generativelanguage.googleapis.com/v1beta/openai",
129
+ "keyEnv": "HEYSPEX_GEMINI_API_KEY",
130
+ "source": "carried over from cloud-clients.mjs PROVIDERS (no vendor re-verification in this pass)",
131
+ "verifiedOn": "2026-06-28",
132
+ "roles": { "default": "gemini-2.5-pro", "strong": "gemini-2.5-pro" },
133
+ "models": {
134
+ "gemini-2.5-pro": { "contextWindow": 1048576, "tier": "strong", "capabilities": ["api", "metered", "tools", "vision", "json", "thinking"], "pricePer1M": { "input": 1.25, "output": 10.00 } }
135
+ },
136
+ "aliases": {},
137
+ "retired": [],
138
+ "providerKeys": { "gemini": { "model": "gemini-2.5-pro" } }
139
+ },
140
+ "openrouter": {
141
+ "kind": "openai",
142
+ "company": "openrouter",
143
+ "baseUrl": "https://openrouter.ai/api/v1",
144
+ "keyEnv": "OPENROUTER_API_KEY",
145
+ "source": "carried over from cloud-clients.mjs PROVIDERS (OpenRouter list prices as dated per model)",
146
+ "verifiedOn": "2026-07-10",
147
+ "_note": "Same-family fallbacks hosted via OpenRouter (council key resilience, 2026-07-08 dogfood audit): a customer fleet with ONE OpenRouter key can still seat all three decorrelated council families — the MODEL family is what decorrelates blind spots, not the API host. grok-4.3 is the decorrelated director-seat primary (owner directive 2026-07-10, HS-E1O0); glm-5.2 is the 'beat Opus cheaper' candidate (HS-XNJI), not yet wired into any tier.",
148
+ "roles": { "cheap": "openai/gpt-4o-mini", "director": "x-ai/grok-4.3", "directorFallback": "z-ai/glm-5.2", "geminiFallback": "google/gemini-2.5-pro", "gpt4oFallback": "openai/gpt-4o" },
149
+ "models": {
150
+ "openai/gpt-4o-mini": { "contextWindow": 128000, "tier": "cheap", "capabilities": ["api", "metered", "tools", "json"], "pricePer1M": { "input": 0.15, "output": 0.60 } },
151
+ "openai/gpt-4o": { "contextWindow": 128000, "tier": "strong", "capabilities": ["api", "metered", "tools", "vision", "json"], "pricePer1M": { "input": 2.50, "output": 10.00 } },
152
+ "google/gemini-2.5-pro": { "contextWindow": 1048576, "tier": "strong", "capabilities": ["api", "metered", "tools", "vision", "json"], "pricePer1M": { "input": 1.25, "output": 10.00 } },
153
+ "z-ai/glm-5.2": { "displayName": "GLM-5.2 (Z.ai, open-weight 744B)", "contextWindow": 200000, "tier": "strong", "capabilities": ["api", "metered", "tools", "json"], "verifiedOn": "2026-06-30", "pricePer1M": { "input": 0.95, "output": 3.00 } },
154
+ "x-ai/grok-4.3": { "displayName": "Grok 4.3 (xAI)", "contextWindow": 256000, "tier": "strong", "capabilities": ["api", "metered", "tools", "json", "thinking", "structured-outputs"], "verifiedOn": "2026-07-10", "pricePer1M": { "input": 1.25, "output": 2.50 } }
155
+ },
156
+ "aliases": {},
157
+ "retired": [],
158
+ "providerKeys": {
159
+ "openrouter": { "model": "openai/gpt-4o-mini" },
160
+ "gemini-openrouter": { "model": "google/gemini-2.5-pro" },
161
+ "gpt4o-openrouter": { "model": "openai/gpt-4o" },
162
+ "glm-5.2": { "model": "z-ai/glm-5.2" },
163
+ "grok-4.3": { "model": "x-ai/grok-4.3" }
164
+ }
165
+ },
166
+ "github-models": {
167
+ "kind": "openai",
168
+ "company": "github",
169
+ "baseUrl": "https://models.github.ai/inference",
170
+ "keyEnv": "HEYSPEX_GITHUB_TOKEN",
171
+ "keyEnvFallback": "GITHUB_TOKEN",
172
+ "source": "GitHub Models bills via Copilot credits; gpt-4o list price mirrored for the ledger (estimate)",
173
+ "verifiedOn": "2026-06-28",
174
+ "_note": "Copilot-ecosystem credits as a cloud tier (HS-32OM fleet onboarding). Model ids are publisher-namespaced.",
175
+ "roles": { "default": "openai/gpt-4o" },
176
+ "models": {
177
+ "openai/gpt-4o": { "contextWindow": 128000, "tier": "strong", "capabilities": ["api", "metered", "tools", "vision", "json"], "pricePer1M": { "input": 2.50, "output": 10.00 } }
178
+ },
179
+ "aliases": {},
180
+ "retired": [],
181
+ "providerKeys": { "github-models": { "model": "openai/gpt-4o" } }
182
+ }
183
+ },
184
+ "local": {
185
+ "ollama": {
186
+ "kind": "ollama",
187
+ "_comment": "Local fleet models. WHERE each fits (canHost) and WHO uses it (purposes) live in routing-table.json; per-machine speeds live in fleet-manifest.mjs STATIC_SPEEDS. Ids are Ollama tags exactly as `ollama list` prints them. Local models have no PROVIDERS entry — callModel treats an unknown id as an Ollama id.",
188
+ "roles": {
189
+ "builder": "gpt-oss:20b",
190
+ "coder": "qwen3-coder:30b",
191
+ "judgeFallback": "qwen3-coder:30b",
192
+ "vision": "qwen3.6:27b",
193
+ "small": "qwen3:8b"
194
+ },
195
+ "models": {
196
+ "gpt-oss:20b": { "contextWindow": 131072, "vramRequiredMb": 13800, "architecture": "gptoss", "capabilities": ["tools", "thinking"] },
197
+ "qwen3-coder:30b": { "contextWindow": 262144, "vramRequiredMb": 18600, "architecture": "qwen3moe", "capabilities": ["tools"] },
198
+ "qwen3.6:27b": { "contextWindow": 262144, "vramRequiredMb": 17400, "architecture": "qwen35", "capabilities": ["tools", "thinking", "vision"] },
199
+ "qwen2.5-coder:32b": { "contextWindow": 131072, "vramRequiredMb": 19900, "architecture": "qwen2", "capabilities": ["tools", "insert"] },
200
+ "qwen3:8b": { "contextWindow": 32768, "vramRequiredMb": 5200, "architecture": "qwen3", "capabilities": ["tools", "thinking"] },
201
+ "deepseek-r1:70b": { "contextWindow": 131072, "vramRequiredMb": 42500, "architecture": "deepseek", "capabilities": ["tools", "thinking"], "note": "Q2_K quant — lower quality than Q4_K_M." },
202
+ "llama3.3:70b": { "contextWindow": 131072, "vramRequiredMb": 42500, "architecture": "llama3", "capabilities": ["tools"] },
203
+ "VibeThinker-3B": { "contextWindow": 8192, "vramRequiredMb": 3300, "architecture": "qwen2", "capabilities": [], "note": "Fits anywhere ≤12GB." }
204
+ },
205
+ "aliases": {},
206
+ "retired": []
207
+ },
208
+ "vllm": {
209
+ "kind": "openai",
210
+ "_comment": "Night Action vLLM + DSpark pilot (RTX 3060, matched draft `deepseek-ai/dspark_qwen3_8b_block7`). AWQ quant target (bf16 ~16GB does not fit 12GB VRAM alongside the draft; AWQ ~5.6GB does). Reference: HS-XNJI Experiment 1/2. Local, free, no key — vLLM OpenAI-compat endpoint on port 8000.",
211
+ "baseUrl": "http://192.168.1.252:8000/v1",
212
+ "keyEnv": null,
213
+ "roles": { "default": "Qwen/Qwen3-8B-AWQ" },
214
+ "models": {
215
+ "Qwen/Qwen3-8B-AWQ": { "contextWindow": 32768, "vramRequiredMb": 5600, "architecture": "qwen3", "tier": "local", "capabilities": ["api", "tools", "thinking"] }
216
+ },
217
+ "aliases": {},
218
+ "retired": [],
219
+ "providerKeys": { "qwen3-8b-dspark": { "model": "Qwen/Qwen3-8B-AWQ", "local": true } }
220
+ }
221
+ }
222
+ }