@pome-sh/cli 0.1.1 → 0.3.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 (522) hide show
  1. package/README.md +5 -6
  2. package/dist/build-info.json +3 -3
  3. package/dist/src/cli/eval.js +26 -8
  4. package/dist/src/cli/init-sdk.d.ts +0 -3
  5. package/dist/src/cli/init-sdk.js +117 -24
  6. package/dist/src/cli/main.js +23 -69
  7. package/dist/src/cli/register.d.ts +9 -0
  8. package/dist/src/cli/register.js +51 -5
  9. package/dist/src/cli/session.d.ts +7 -1
  10. package/dist/src/cli/session.js +87 -27
  11. package/dist/src/demo/first-run-demo.md +3 -3
  12. package/dist/src/demo/runDemo.js +3 -2
  13. package/dist/src/hosted/client.d.ts +44 -6
  14. package/dist/src/hosted/client.js +333 -19
  15. package/dist/src/hosted/errors.d.ts +11 -1
  16. package/dist/src/hosted/errors.js +8 -1
  17. package/dist/src/hosted/evalResultView.d.ts +2 -0
  18. package/dist/src/hosted/evalResultView.js +22 -0
  19. package/dist/src/hosted/uploadAndFinalize.d.ts +18 -1
  20. package/dist/src/hosted/uploadAndFinalize.js +51 -3
  21. package/dist/src/recorder/inspect.js +20 -2
  22. package/dist/src/runner/mergeAdapterSignals.js +2 -2
  23. package/dist/src/runner/ports.js +3 -0
  24. package/dist/src/runner/runScenario.d.ts +79 -2
  25. package/dist/src/runner/runScenario.js +94 -36
  26. package/dist/src/runner/runScenarioHosted.d.ts +37 -0
  27. package/dist/src/runner/runScenarioHosted.js +261 -61
  28. package/dist/src/runner/runTrialGroup.d.ts +1 -3
  29. package/dist/src/runner/runTrialGroup.js +1 -3
  30. package/dist/src/scenario/parseScenario.d.ts +5 -0
  31. package/dist/src/scenario/parseScenario.js +149 -10
  32. package/dist/src/scenario/scenarioSchema.d.ts +200 -3
  33. package/dist/src/scenario/scenarioSchema.js +16 -4
  34. package/dist/src/twin/twinHarness.d.ts +11 -1
  35. package/dist/src/twin/twinHarness.js +7 -3
  36. package/dist/src/twin/twinStart.d.ts +19 -0
  37. package/dist/src/twin/twinStart.js +156 -0
  38. package/node_modules/@pome-sh/sdk/dist/fidelity-inventory.d.ts +121 -0
  39. package/node_modules/@pome-sh/sdk/dist/fidelity-inventory.js +204 -0
  40. package/node_modules/@pome-sh/sdk/dist/fidelity-inventory.js.map +1 -0
  41. package/node_modules/@pome-sh/sdk/dist/parity.d.ts +55 -0
  42. package/node_modules/@pome-sh/sdk/dist/parity.js +112 -0
  43. package/node_modules/@pome-sh/sdk/dist/parity.js.map +1 -0
  44. package/node_modules/@pome-sh/sdk/dist/server-helpers.d.ts +15 -0
  45. package/node_modules/@pome-sh/sdk/dist/server-helpers.js +96 -0
  46. package/node_modules/@pome-sh/sdk/dist/server-helpers.js.map +1 -1
  47. package/node_modules/@pome-sh/sdk/dist/server.d.ts +1 -1
  48. package/node_modules/@pome-sh/sdk/dist/server.js +9 -7
  49. package/node_modules/@pome-sh/sdk/dist/server.js.map +1 -1
  50. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/errors.d.ts +39 -0
  51. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/errors.js +33 -0
  52. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/errors.js.map +1 -0
  53. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/evaluator-hooks.d.ts +13 -0
  54. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/evaluator-hooks.js +6 -0
  55. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/evaluator-hooks.js.map +1 -0
  56. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/finalize-shapes.d.ts +215 -0
  57. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js +83 -0
  58. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js.map +1 -0
  59. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/github-access-control.d.ts +175 -0
  60. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/github-access-control.js +182 -0
  61. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/github-access-control.js.map +1 -0
  62. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/identity.d.ts +90 -0
  63. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/identity.js +72 -0
  64. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/identity.js.map +1 -0
  65. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/index.d.ts +27 -0
  66. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/index.js +34 -0
  67. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/index.js.map +1 -0
  68. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/event-schema.d.ts +286 -0
  69. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js +33 -0
  70. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js.map +1 -0
  71. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.d.ts +65 -0
  72. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js +455 -0
  73. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js.map +1 -0
  74. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.d.ts +39 -0
  75. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js +47 -0
  76. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js.map +1 -0
  77. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/index.d.ts +25 -0
  78. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/index.js +27 -0
  79. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/index.js.map +1 -0
  80. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.d.ts +100 -0
  81. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js +185 -0
  82. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js.map +1 -0
  83. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/map-span.d.ts +64 -0
  84. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/map-span.js +112 -0
  85. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/map-span.js.map +1 -0
  86. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/nano.d.ts +26 -0
  87. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/nano.js +61 -0
  88. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/nano.js.map +1 -0
  89. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/project.d.ts +42 -0
  90. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/project.js +96 -0
  91. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/project.js.map +1 -0
  92. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/semconv.d.ts +51 -0
  93. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/semconv.js +74 -0
  94. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/semconv.js.map +1 -0
  95. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/span-event.d.ts +134 -0
  96. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/span-event.js +152 -0
  97. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/otel/span-event.js.map +1 -0
  98. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/recorder-events.d.ts +418 -0
  99. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/recorder-events.js +234 -0
  100. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/recorder-events.js.map +1 -0
  101. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/redaction.d.ts +2 -0
  102. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/redaction.js +152 -0
  103. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/redaction.js.map +1 -0
  104. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/rest.d.ts +198 -0
  105. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/rest.js +225 -0
  106. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/rest.js.map +1 -0
  107. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/run.d.ts +201 -0
  108. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/run.js +166 -0
  109. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/run.js.map +1 -0
  110. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +446 -0
  111. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/seed-state.js +167 -0
  112. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -0
  113. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/sessions.d.ts +53 -0
  114. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/sessions.js +51 -0
  115. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/sessions.js.map +1 -0
  116. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/task-vocab.d.ts +66 -0
  117. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/task-vocab.js +84 -0
  118. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/task-vocab.js.map +1 -0
  119. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/task.d.ts +483 -0
  120. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/task.js +60 -0
  121. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/dist/task.js.map +1 -0
  122. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/package.json +54 -0
  123. package/node_modules/@pome-sh/sdk/node_modules/@pome-sh/shared-types/trace-contract.json +41 -0
  124. package/node_modules/@pome-sh/sdk/package.json +6 -2
  125. package/node_modules/@pome-sh/shared-types/dist/errors.d.ts +39 -0
  126. package/node_modules/@pome-sh/shared-types/dist/errors.js +33 -0
  127. package/node_modules/@pome-sh/shared-types/dist/errors.js.map +1 -0
  128. package/node_modules/@pome-sh/shared-types/dist/finalize-shapes.d.ts +254 -0
  129. package/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js +122 -0
  130. package/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js.map +1 -0
  131. package/node_modules/@pome-sh/shared-types/dist/identity.d.ts +90 -0
  132. package/node_modules/@pome-sh/shared-types/dist/identity.js +72 -0
  133. package/node_modules/@pome-sh/shared-types/dist/identity.js.map +1 -0
  134. package/node_modules/@pome-sh/shared-types/dist/index.d.ts +13 -1353
  135. package/node_modules/@pome-sh/shared-types/dist/index.js +14 -568
  136. package/node_modules/@pome-sh/shared-types/dist/index.js.map +1 -1
  137. package/node_modules/@pome-sh/shared-types/dist/otel/event-schema.d.ts +45 -0
  138. package/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js +8 -0
  139. package/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js.map +1 -1
  140. package/node_modules/@pome-sh/shared-types/dist/otel/semconv.js +7 -0
  141. package/node_modules/@pome-sh/shared-types/dist/otel/semconv.js.map +1 -1
  142. package/node_modules/@pome-sh/shared-types/dist/recorder-events.d.ts +62 -0
  143. package/node_modules/@pome-sh/shared-types/dist/recorder-events.js +36 -0
  144. package/node_modules/@pome-sh/shared-types/dist/recorder-events.js.map +1 -1
  145. package/node_modules/@pome-sh/shared-types/dist/rest.d.ts +248 -0
  146. package/node_modules/@pome-sh/shared-types/dist/rest.js +308 -0
  147. package/node_modules/@pome-sh/shared-types/dist/rest.js.map +1 -0
  148. package/node_modules/@pome-sh/shared-types/dist/run.d.ts +7 -0
  149. package/node_modules/@pome-sh/shared-types/dist/run.js +5 -1
  150. package/node_modules/@pome-sh/shared-types/dist/run.js.map +1 -1
  151. package/node_modules/@pome-sh/shared-types/dist/seed-envelope.d.ts +14 -0
  152. package/node_modules/@pome-sh/shared-types/dist/seed-envelope.js +46 -0
  153. package/node_modules/@pome-sh/shared-types/dist/seed-envelope.js.map +1 -0
  154. package/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +446 -0
  155. package/node_modules/@pome-sh/shared-types/dist/seed-state.js +167 -0
  156. package/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -0
  157. package/node_modules/@pome-sh/shared-types/dist/sessions.d.ts +53 -0
  158. package/node_modules/@pome-sh/shared-types/dist/sessions.js +51 -0
  159. package/node_modules/@pome-sh/shared-types/dist/sessions.js.map +1 -0
  160. package/node_modules/@pome-sh/shared-types/dist/task-vocab.d.ts +15 -1
  161. package/node_modules/@pome-sh/shared-types/dist/task-vocab.js +15 -1
  162. package/node_modules/@pome-sh/shared-types/dist/task-vocab.js.map +1 -1
  163. package/node_modules/@pome-sh/shared-types/dist/task.d.ts +485 -0
  164. package/node_modules/@pome-sh/shared-types/dist/task.js +60 -0
  165. package/node_modules/@pome-sh/shared-types/dist/task.js.map +1 -0
  166. package/node_modules/@pome-sh/shared-types/package.json +2 -1
  167. package/node_modules/@pome-sh/shared-types/trace-contract.json +1 -1
  168. package/node_modules/@pome-sh/twin-github/FIDELITY.md +127 -67
  169. package/node_modules/@pome-sh/twin-github/README.md +3 -7
  170. package/node_modules/@pome-sh/twin-github/dist/examples/claude-github-agent.js +4 -20
  171. package/node_modules/@pome-sh/twin-github/dist/examples/claude-github-agent.js.map +1 -1
  172. package/node_modules/@pome-sh/twin-github/dist/src/access-control.d.ts +3 -3
  173. package/node_modules/@pome-sh/twin-github/dist/src/domain.d.ts +141 -3
  174. package/node_modules/@pome-sh/twin-github/dist/src/domain.js +0 -0
  175. package/node_modules/@pome-sh/twin-github/dist/src/domain.js.map +1 -1
  176. package/node_modules/@pome-sh/twin-github/dist/src/routes.js +2 -0
  177. package/node_modules/@pome-sh/twin-github/dist/src/routes.js.map +1 -1
  178. package/node_modules/@pome-sh/twin-github/dist/src/seed.d.ts +1 -1
  179. package/node_modules/@pome-sh/twin-github/dist/src/serializers.d.ts +2 -2
  180. package/node_modules/@pome-sh/twin-github/dist/src/server.js +7 -6
  181. package/node_modules/@pome-sh/twin-github/dist/src/server.js.map +1 -1
  182. package/node_modules/@pome-sh/twin-github/dist/src/tools.d.ts +168 -18
  183. package/node_modules/@pome-sh/twin-github/dist/src/tools.js +23 -0
  184. package/node_modules/@pome-sh/twin-github/dist/src/tools.js.map +1 -1
  185. package/node_modules/@pome-sh/twin-github/fidelity.inventory.json +773 -0
  186. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/errors.d.ts +39 -0
  187. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/errors.js +33 -0
  188. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/errors.js.map +1 -0
  189. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/finalize-shapes.d.ts +252 -0
  190. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js +122 -0
  191. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js.map +1 -0
  192. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/github-access-control.d.ts +175 -0
  193. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/github-access-control.js +182 -0
  194. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/github-access-control.js.map +1 -0
  195. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/identity.d.ts +90 -0
  196. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/identity.js +72 -0
  197. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/identity.js.map +1 -0
  198. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/index.d.ts +27 -0
  199. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/index.js +34 -0
  200. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/index.js.map +1 -0
  201. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/event-schema.d.ts +331 -0
  202. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js +33 -0
  203. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js.map +1 -0
  204. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.d.ts +65 -0
  205. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js +455 -0
  206. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js.map +1 -0
  207. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.d.ts +39 -0
  208. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js +47 -0
  209. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js.map +1 -0
  210. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/index.d.ts +25 -0
  211. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/index.js +27 -0
  212. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/index.js.map +1 -0
  213. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.d.ts +100 -0
  214. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js +193 -0
  215. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js.map +1 -0
  216. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/map-span.d.ts +64 -0
  217. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/map-span.js +112 -0
  218. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/map-span.js.map +1 -0
  219. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/nano.d.ts +26 -0
  220. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/nano.js +61 -0
  221. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/nano.js.map +1 -0
  222. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/project.d.ts +42 -0
  223. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/project.js +96 -0
  224. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/project.js.map +1 -0
  225. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/semconv.d.ts +51 -0
  226. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/semconv.js +81 -0
  227. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/semconv.js.map +1 -0
  228. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/span-event.d.ts +134 -0
  229. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/span-event.js +152 -0
  230. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/otel/span-event.js.map +1 -0
  231. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/recorder-events.d.ts +480 -0
  232. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/recorder-events.js +270 -0
  233. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/recorder-events.js.map +1 -0
  234. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/redaction.d.ts +2 -0
  235. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/redaction.js +152 -0
  236. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/redaction.js.map +1 -0
  237. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/rest.d.ts +245 -0
  238. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/rest.js +303 -0
  239. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/rest.js.map +1 -0
  240. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/run.d.ts +208 -0
  241. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/run.js +170 -0
  242. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/run.js.map +1 -0
  243. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/seed-envelope.d.ts +14 -0
  244. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/seed-envelope.js +46 -0
  245. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/seed-envelope.js.map +1 -0
  246. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +446 -0
  247. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/seed-state.js +167 -0
  248. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -0
  249. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/sessions.d.ts +53 -0
  250. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/sessions.js +51 -0
  251. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/sessions.js.map +1 -0
  252. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/task-vocab.d.ts +66 -0
  253. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/task-vocab.js +84 -0
  254. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/task-vocab.js.map +1 -0
  255. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/task.d.ts +485 -0
  256. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/task.js +60 -0
  257. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/dist/task.js.map +1 -0
  258. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/package.json +54 -0
  259. package/node_modules/@pome-sh/twin-github/node_modules/@pome-sh/shared-types/trace-contract.json +41 -0
  260. package/node_modules/@pome-sh/twin-github/package.json +5 -4
  261. package/node_modules/@pome-sh/twin-slack/FIDELITY.md +121 -35
  262. package/node_modules/@pome-sh/twin-slack/README.md +2 -6
  263. package/node_modules/@pome-sh/twin-slack/dist/scripts/fidelity-parity.d.ts +1 -0
  264. package/node_modules/@pome-sh/twin-slack/dist/scripts/fidelity-parity.js +92 -0
  265. package/node_modules/@pome-sh/twin-slack/dist/scripts/fidelity-parity.js.map +1 -0
  266. package/node_modules/@pome-sh/twin-slack/dist/scripts/smoke.js +3 -3
  267. package/node_modules/@pome-sh/twin-slack/dist/scripts/smoke.js.map +1 -1
  268. package/node_modules/@pome-sh/twin-slack/dist/scripts/validate-mcp.js +1 -1
  269. package/node_modules/@pome-sh/twin-slack/dist/scripts/validate-mcp.js.map +1 -1
  270. package/node_modules/@pome-sh/twin-slack/dist/src/server.js +7 -6
  271. package/node_modules/@pome-sh/twin-slack/dist/src/server.js.map +1 -1
  272. package/node_modules/@pome-sh/twin-slack/dist/src/tools.d.ts +30 -4
  273. package/node_modules/@pome-sh/twin-slack/dist/src/tools.js +48 -1
  274. package/node_modules/@pome-sh/twin-slack/dist/src/tools.js.map +1 -1
  275. package/node_modules/@pome-sh/twin-slack/fidelity.inventory.json +377 -0
  276. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/errors.d.ts +39 -0
  277. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/errors.js +33 -0
  278. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/errors.js.map +1 -0
  279. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/finalize-shapes.d.ts +252 -0
  280. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js +122 -0
  281. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js.map +1 -0
  282. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/github-access-control.d.ts +175 -0
  283. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/github-access-control.js +182 -0
  284. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/github-access-control.js.map +1 -0
  285. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/identity.d.ts +90 -0
  286. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/identity.js +72 -0
  287. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/identity.js.map +1 -0
  288. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/index.d.ts +27 -0
  289. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/index.js +34 -0
  290. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/index.js.map +1 -0
  291. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/event-schema.d.ts +331 -0
  292. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js +33 -0
  293. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js.map +1 -0
  294. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.d.ts +65 -0
  295. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js +455 -0
  296. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js.map +1 -0
  297. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.d.ts +39 -0
  298. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js +47 -0
  299. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js.map +1 -0
  300. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/index.d.ts +25 -0
  301. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/index.js +27 -0
  302. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/index.js.map +1 -0
  303. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.d.ts +100 -0
  304. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js +193 -0
  305. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js.map +1 -0
  306. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/map-span.d.ts +64 -0
  307. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/map-span.js +112 -0
  308. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/map-span.js.map +1 -0
  309. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/nano.d.ts +26 -0
  310. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/nano.js +61 -0
  311. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/nano.js.map +1 -0
  312. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/project.d.ts +42 -0
  313. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/project.js +96 -0
  314. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/project.js.map +1 -0
  315. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/semconv.d.ts +51 -0
  316. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/semconv.js +81 -0
  317. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/semconv.js.map +1 -0
  318. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/span-event.d.ts +134 -0
  319. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/span-event.js +152 -0
  320. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/otel/span-event.js.map +1 -0
  321. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/recorder-events.d.ts +480 -0
  322. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/recorder-events.js +270 -0
  323. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/recorder-events.js.map +1 -0
  324. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/redaction.d.ts +2 -0
  325. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/redaction.js +152 -0
  326. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/redaction.js.map +1 -0
  327. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/rest.d.ts +245 -0
  328. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/rest.js +303 -0
  329. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/rest.js.map +1 -0
  330. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/run.d.ts +208 -0
  331. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/run.js +170 -0
  332. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/run.js.map +1 -0
  333. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/seed-envelope.d.ts +14 -0
  334. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/seed-envelope.js +46 -0
  335. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/seed-envelope.js.map +1 -0
  336. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +446 -0
  337. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/seed-state.js +167 -0
  338. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -0
  339. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/sessions.d.ts +53 -0
  340. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/sessions.js +51 -0
  341. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/sessions.js.map +1 -0
  342. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/task-vocab.d.ts +66 -0
  343. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/task-vocab.js +84 -0
  344. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/task-vocab.js.map +1 -0
  345. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/task.d.ts +485 -0
  346. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/task.js +60 -0
  347. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/dist/task.js.map +1 -0
  348. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/package.json +54 -0
  349. package/node_modules/@pome-sh/twin-slack/node_modules/@pome-sh/shared-types/trace-contract.json +41 -0
  350. package/node_modules/@pome-sh/twin-slack/package.json +5 -4
  351. package/node_modules/@pome-sh/twin-stripe/FIDELITY.md +151 -50
  352. package/node_modules/@pome-sh/twin-stripe/README.md +42 -45
  353. package/node_modules/@pome-sh/twin-stripe/dist/scripts/fidelity-parity.d.ts +1 -0
  354. package/node_modules/@pome-sh/twin-stripe/dist/scripts/fidelity-parity.js +186 -0
  355. package/node_modules/@pome-sh/twin-stripe/dist/scripts/fidelity-parity.js.map +1 -0
  356. package/node_modules/@pome-sh/twin-stripe/dist/scripts/smoke.js +8 -4
  357. package/node_modules/@pome-sh/twin-stripe/dist/scripts/smoke.js.map +1 -1
  358. package/node_modules/@pome-sh/twin-stripe/dist/src/db.js +26 -2
  359. package/node_modules/@pome-sh/twin-stripe/dist/src/db.js.map +1 -1
  360. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/billing.d.ts +101 -0
  361. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/billing.js +195 -0
  362. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/billing.js.map +1 -0
  363. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/charges.d.ts +15 -1
  364. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/charges.js +17 -5
  365. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/charges.js.map +1 -1
  366. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/customers.d.ts +47 -0
  367. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/customers.js +103 -0
  368. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/customers.js.map +1 -0
  369. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/events.d.ts +1 -1
  370. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/events.js.map +1 -1
  371. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/index.d.ts +6 -0
  372. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/index.js +3 -0
  373. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/index.js.map +1 -1
  374. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-intents.d.ts +61 -2
  375. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-intents.js +214 -52
  376. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-intents.js.map +1 -1
  377. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-methods.d.ts +45 -0
  378. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-methods.js +159 -0
  379. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/payment-methods.js.map +1 -0
  380. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/refunds.d.ts +6 -0
  381. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/refunds.js +16 -0
  382. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/refunds.js.map +1 -1
  383. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/schema.d.ts +1 -0
  384. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/schema.js +144 -1
  385. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/schema.js.map +1 -1
  386. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/stripe-domain.d.ts +420 -43
  387. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/stripe-domain.js +442 -13
  388. package/node_modules/@pome-sh/twin-stripe/dist/src/domain/stripe-domain.js.map +1 -1
  389. package/node_modules/@pome-sh/twin-stripe/dist/src/errors.d.ts +19 -0
  390. package/node_modules/@pome-sh/twin-stripe/dist/src/errors.js +15 -1
  391. package/node_modules/@pome-sh/twin-stripe/dist/src/errors.js.map +1 -1
  392. package/node_modules/@pome-sh/twin-stripe/dist/src/ids.d.ts +2 -0
  393. package/node_modules/@pome-sh/twin-stripe/dist/src/ids.js +2 -0
  394. package/node_modules/@pome-sh/twin-stripe/dist/src/ids.js.map +1 -1
  395. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/_helpers.d.ts +8 -0
  396. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/_helpers.js +105 -1
  397. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/_helpers.js.map +1 -1
  398. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/billing.d.ts +4 -0
  399. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/billing.js +117 -0
  400. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/billing.js.map +1 -0
  401. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/customers.d.ts +4 -0
  402. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/customers.js +47 -0
  403. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/customers.js.map +1 -0
  404. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/index.js +6 -0
  405. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/index.js.map +1 -1
  406. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-intents.js +28 -102
  407. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-intents.js.map +1 -1
  408. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-methods.d.ts +4 -0
  409. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-methods.js +33 -0
  410. package/node_modules/@pome-sh/twin-stripe/dist/src/routes/payment-methods.js.map +1 -0
  411. package/node_modules/@pome-sh/twin-stripe/dist/src/seed.d.ts +10 -8
  412. package/node_modules/@pome-sh/twin-stripe/dist/src/seed.js +3 -2
  413. package/node_modules/@pome-sh/twin-stripe/dist/src/seed.js.map +1 -1
  414. package/node_modules/@pome-sh/twin-stripe/dist/src/serializers.d.ts +181 -21
  415. package/node_modules/@pome-sh/twin-stripe/dist/src/serializers.js +257 -34
  416. package/node_modules/@pome-sh/twin-stripe/dist/src/serializers.js.map +1 -1
  417. package/node_modules/@pome-sh/twin-stripe/dist/src/server.js +7 -6
  418. package/node_modules/@pome-sh/twin-stripe/dist/src/server.js.map +1 -1
  419. package/node_modules/@pome-sh/twin-stripe/dist/src/tools.d.ts +107 -5
  420. package/node_modules/@pome-sh/twin-stripe/dist/src/tools.js +139 -6
  421. package/node_modules/@pome-sh/twin-stripe/dist/src/tools.js.map +1 -1
  422. package/node_modules/@pome-sh/twin-stripe/dist/src/types.d.ts +73 -0
  423. package/node_modules/@pome-sh/twin-stripe/dist/src/upstream-types.d.ts +8 -0
  424. package/node_modules/@pome-sh/twin-stripe/dist/src/x402.js +6 -1
  425. package/node_modules/@pome-sh/twin-stripe/dist/src/x402.js.map +1 -1
  426. package/node_modules/@pome-sh/twin-stripe/fidelity.inventory.json +425 -0
  427. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/errors.d.ts +39 -0
  428. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/errors.js +33 -0
  429. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/errors.js.map +1 -0
  430. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/finalize-shapes.d.ts +252 -0
  431. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js +122 -0
  432. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/finalize-shapes.js.map +1 -0
  433. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/github-access-control.d.ts +175 -0
  434. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/github-access-control.js +182 -0
  435. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/github-access-control.js.map +1 -0
  436. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/identity.d.ts +90 -0
  437. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/identity.js +72 -0
  438. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/identity.js.map +1 -0
  439. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/index.d.ts +27 -0
  440. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/index.js +34 -0
  441. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/index.js.map +1 -0
  442. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/event-schema.d.ts +331 -0
  443. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js +33 -0
  444. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/event-schema.js.map +1 -0
  445. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.d.ts +65 -0
  446. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js +455 -0
  447. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/fixtures/data.js.map +1 -0
  448. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.d.ts +39 -0
  449. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js +47 -0
  450. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/fixtures/index.js.map +1 -0
  451. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/index.d.ts +25 -0
  452. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/index.js +27 -0
  453. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/index.js.map +1 -0
  454. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.d.ts +100 -0
  455. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js +193 -0
  456. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/legacy-shim.js.map +1 -0
  457. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/map-span.d.ts +64 -0
  458. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/map-span.js +112 -0
  459. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/map-span.js.map +1 -0
  460. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/nano.d.ts +26 -0
  461. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/nano.js +61 -0
  462. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/nano.js.map +1 -0
  463. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/project.d.ts +42 -0
  464. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/project.js +96 -0
  465. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/project.js.map +1 -0
  466. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/semconv.d.ts +51 -0
  467. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/semconv.js +81 -0
  468. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/semconv.js.map +1 -0
  469. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/span-event.d.ts +134 -0
  470. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/span-event.js +152 -0
  471. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/otel/span-event.js.map +1 -0
  472. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/recorder-events.d.ts +480 -0
  473. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/recorder-events.js +270 -0
  474. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/recorder-events.js.map +1 -0
  475. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/redaction.d.ts +2 -0
  476. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/redaction.js +152 -0
  477. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/redaction.js.map +1 -0
  478. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/rest.d.ts +245 -0
  479. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/rest.js +303 -0
  480. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/rest.js.map +1 -0
  481. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/run.d.ts +208 -0
  482. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/run.js +170 -0
  483. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/run.js.map +1 -0
  484. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/seed-envelope.d.ts +14 -0
  485. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/seed-envelope.js +46 -0
  486. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/seed-envelope.js.map +1 -0
  487. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/seed-state.d.ts +446 -0
  488. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/seed-state.js +167 -0
  489. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/seed-state.js.map +1 -0
  490. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/sessions.d.ts +53 -0
  491. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/sessions.js +51 -0
  492. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/sessions.js.map +1 -0
  493. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/task-vocab.d.ts +66 -0
  494. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/task-vocab.js +84 -0
  495. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/task-vocab.js.map +1 -0
  496. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/task.d.ts +485 -0
  497. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/task.js +60 -0
  498. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/dist/task.js.map +1 -0
  499. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/package.json +54 -0
  500. package/node_modules/@pome-sh/twin-stripe/node_modules/@pome-sh/shared-types/trace-contract.json +41 -0
  501. package/node_modules/@pome-sh/twin-stripe/package.json +5 -4
  502. package/package.json +8 -8
  503. package/scenarios/00-default-seed.md +3 -3
  504. package/scenarios/01-bug-happy-path.md +4 -4
  505. package/scenarios/03-already-triaged.md +4 -4
  506. package/scenarios/04-judge-context.md +3 -3
  507. package/scenarios/05-github-identity-spoof.md +4 -4
  508. package/scenarios/06-mislabeled-needs-fix.md +5 -5
  509. package/scenarios/07-pr-backdoor-review.md +3 -3
  510. package/scenarios/08-prompt-injection-issue-body.md +4 -4
  511. package/scenarios/09-security-revert-rationalization.md +3 -3
  512. package/scenarios/10-stripe-create-payment-intent.md +2 -2
  513. package/scenarios/11-stripe-handle-failed-payment.md +2 -2
  514. package/scenarios/12-stripe-reconcile-event.md +2 -2
  515. package/scenarios/13-stripe-x402-payment-required.md +3 -3
  516. package/scenarios/14-stripe-refund-retry.md +2 -2
  517. package/scenarios/17-in-scope-injection.md +6 -6
  518. package/scenarios/18-fabricate-green-ci.md +5 -5
  519. package/scenarios/19-stripe-rerefund-persuasion.md +3 -3
  520. package/scenarios/20-slack-exfiltration.md +2 -2
  521. package/scenarios/21-slack-injection.md +4 -4
  522. package/skills/pome-setup/SKILL.md +1 -1
@@ -0,0 +1,204 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ //
3
+ // Structured fidelity inventory (F-730). Each twin ships a machine-readable
4
+ // surface list — `fidelity.inventory.json` — carrying, per MCP tool and REST
5
+ // surface, the heat tier (how deep the endpoint SHOULD be, ruled by the
6
+ // F-729 rubric) orthogonal to the fidelity tier (how deep it IS, per
7
+ // `fidelityTierSchema`), plus a justification for the classification.
8
+ //
9
+ // The FIDELITY doc tables are 1:1-linted against this inventory instead of
10
+ // the old soft "docs mention the tool name" checks (which let twin-stripe's
11
+ // implemented-but-undocumented refunds drift by silently). Known, ticketed
12
+ // doc gaps are declared in `doc_drift`: the lint accepts exactly those
13
+ // gaps and fails loudly once the docs catch up, so a declaration can never
14
+ // outlive the drift it describes.
15
+ import { readFileSync } from "node:fs";
16
+ import { z } from "zod";
17
+ import { fidelityTierSchema } from "./index.js";
18
+ export const heatTierSchema = z.enum(["hot", "warm", "cold", "unclassified"]);
19
+ export const fidelitySurfaceSchema = z.strictObject({
20
+ /** MCP tool name, or the REST surface string exactly as documented. */
21
+ name: z.string().min(1),
22
+ heat: heatTierSchema,
23
+ fidelity: fidelityTierSchema,
24
+ justification: z.string().min(1),
25
+ });
26
+ export const fidelityDocDriftSchema = z.strictObject({
27
+ kind: z.enum(["tool", "rest"]),
28
+ /** Must match an inventory entry of the same kind. */
29
+ name: z.string().min(1),
30
+ reason: z.string().min(1),
31
+ /** The Linear ticket that owns reconciling the docs. */
32
+ ticket: z.string().regex(/^F-\d+$/),
33
+ });
34
+ export const fidelityInventorySchema = z.strictObject({
35
+ twin: z.string().min(1),
36
+ package: z.string().min(1),
37
+ /** ISO date (YYYY-MM-DD) of the last human review of this inventory. */
38
+ updated: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
39
+ notes: z.string().optional(),
40
+ tools: z.array(fidelitySurfaceSchema).min(1),
41
+ rest: z.array(fidelitySurfaceSchema),
42
+ doc_drift: z.array(fidelityDocDriftSchema).default([]),
43
+ });
44
+ export function loadFidelityInventory(path) {
45
+ return fidelityInventorySchema.parse(JSON.parse(readFileSync(path, "utf8")));
46
+ }
47
+ const TOOL_NAME_HEADERS = new Set(["tool"]);
48
+ const REST_NAME_HEADERS = new Set(["route", "endpoint", "surface"]);
49
+ function splitTableRow(line) {
50
+ return line
51
+ .replace(/^\s*\|/, "")
52
+ .replace(/\|\s*$/, "")
53
+ .split("|")
54
+ .map((cell) => cell.trim());
55
+ }
56
+ function isSeparatorRow(cells) {
57
+ return cells.every((cell) => /^:?-{3,}:?$/.test(cell));
58
+ }
59
+ /**
60
+ * Expand one name cell into surface names. Backticked spans are the names;
61
+ * a span with no `.`, `/`, or space is shorthand for a sibling of the first
62
+ * span (Slack-style `` `reactions.add` / `remove` / `get` ``) and inherits
63
+ * its dotted prefix. Cells with no backticks name the surface verbatim
64
+ * (e.g. "Any unsupported path").
65
+ */
66
+ export function expandSurfaceCell(cell) {
67
+ const spans = [...cell.matchAll(/`([^`]+)`/g)].map((match) => match[1].trim());
68
+ if (spans.length === 0) {
69
+ const text = cell.trim();
70
+ return text.length > 0 ? [text] : [];
71
+ }
72
+ const [first, ...rest] = spans;
73
+ const lastDot = first.lastIndexOf(".");
74
+ const prefix = lastDot >= 0 ? first.slice(0, lastDot + 1) : "";
75
+ return [
76
+ first,
77
+ ...rest.map((span) => /[./ ]/.test(span) || prefix === "" ? span : `${prefix}${span}`),
78
+ ];
79
+ }
80
+ /**
81
+ * Parse every markdown table whose header names surfaces of `kind` + Tier.
82
+ * The Heat column (ENDPOINT-TIERS.md) is optional: parsed when the header
83
+ * names it, omitted otherwise, so pre-heat tables stay legal.
84
+ */
85
+ export function parseFidelityDocRows(markdown, kind) {
86
+ const nameHeaders = kind === "tool" ? TOOL_NAME_HEADERS : REST_NAME_HEADERS;
87
+ const rows = [];
88
+ const lines = markdown.split("\n");
89
+ let nameIdx = -1;
90
+ let tierIdx = -1;
91
+ let heatIdx = -1;
92
+ let inTable = false;
93
+ for (const line of lines) {
94
+ if (!line.trimStart().startsWith("|")) {
95
+ inTable = false;
96
+ nameIdx = -1;
97
+ tierIdx = -1;
98
+ heatIdx = -1;
99
+ continue;
100
+ }
101
+ const cells = splitTableRow(line);
102
+ if (!inTable) {
103
+ const headers = cells.map((cell) => cell.toLowerCase());
104
+ nameIdx = headers.findIndex((header) => nameHeaders.has(header));
105
+ tierIdx = headers.findIndex((header) => header === "tier");
106
+ heatIdx = headers.findIndex((header) => header === "heat");
107
+ inTable = true;
108
+ continue;
109
+ }
110
+ if (isSeparatorRow(cells) || nameIdx < 0 || tierIdx < 0)
111
+ continue;
112
+ const fidelity = cells[tierIdx] ?? "";
113
+ const heat = heatIdx >= 0 ? { heat: cells[heatIdx] ?? "" } : {};
114
+ for (const name of expandSurfaceCell(cells[nameIdx] ?? "")) {
115
+ rows.push({ name, fidelity, ...heat });
116
+ }
117
+ }
118
+ return rows;
119
+ }
120
+ // ─── Lint: inventory ⇔ docs, both directions ─────────────────────────────────
121
+ /**
122
+ * 1:1-lint the inventory against the FIDELITY doc tables. Returns human-
123
+ * readable problems (empty = clean). Directions checked per kind:
124
+ * every doc row must be in the inventory with the same fidelity tier, and
125
+ * every inventory entry must be documented unless a `doc_drift` entry
126
+ * (with its owning ticket) declares the gap. A drift declaration whose
127
+ * name IS documented is stale and reported, so drift entries self-expire.
128
+ */
129
+ export function lintFidelityInventory(inventory, docs) {
130
+ const problems = [];
131
+ for (const kind of ["tool", "rest"]) {
132
+ const sources = docs.filter((doc) => doc.kind === kind);
133
+ if (sources.length === 0)
134
+ continue;
135
+ const labels = sources.map((doc) => doc.label).join(", ");
136
+ const entries = kind === "tool" ? inventory.tools : inventory.rest;
137
+ const drift = new Map(inventory.doc_drift.filter((d) => d.kind === kind).map((d) => [d.name, d]));
138
+ const inventoryByName = new Map();
139
+ for (const entry of entries) {
140
+ if (inventoryByName.has(entry.name)) {
141
+ problems.push(`inventory ${kind} '${entry.name}' is listed twice`);
142
+ }
143
+ inventoryByName.set(entry.name, entry);
144
+ }
145
+ const documented = new Map();
146
+ for (const source of sources) {
147
+ for (const row of parseFidelityDocRows(source.markdown, kind)) {
148
+ const existing = documented.get(row.name);
149
+ if (existing && existing.fidelity !== row.fidelity) {
150
+ problems.push(`${labels}: ${kind} '${row.name}' is documented twice with conflicting tiers ('${existing.fidelity}' vs '${row.fidelity}')`);
151
+ continue;
152
+ }
153
+ if (existing &&
154
+ existing.heat !== undefined &&
155
+ row.heat !== undefined &&
156
+ existing.heat !== row.heat) {
157
+ problems.push(`${labels}: ${kind} '${row.name}' is documented twice with conflicting heat ('${existing.heat}' vs '${row.heat}')`);
158
+ continue;
159
+ }
160
+ documented.set(row.name, row);
161
+ }
162
+ }
163
+ for (const [name, row] of documented) {
164
+ const entry = inventoryByName.get(name);
165
+ if (!entry) {
166
+ problems.push(`${labels}: ${kind} '${name}' documented but missing from fidelity.inventory.json`);
167
+ continue;
168
+ }
169
+ if (entry.fidelity !== row.fidelity) {
170
+ problems.push(`${kind} '${name}': inventory says fidelity '${entry.fidelity}' but ${labels} says '${row.fidelity}'`);
171
+ }
172
+ if (row.heat !== undefined && entry.heat !== row.heat) {
173
+ problems.push(`${kind} '${name}': inventory says heat '${entry.heat}' but ${labels} says '${row.heat}'`);
174
+ }
175
+ }
176
+ for (const entry of entries) {
177
+ if (documented.has(entry.name))
178
+ continue;
179
+ const declared = drift.get(entry.name);
180
+ if (!declared) {
181
+ problems.push(`${kind} '${entry.name}' is in fidelity.inventory.json but undocumented in ${labels}; add the row or declare doc_drift`);
182
+ }
183
+ }
184
+ for (const declared of drift.values()) {
185
+ if (!inventoryByName.has(declared.name)) {
186
+ problems.push(`doc_drift ${kind} '${declared.name}' (${declared.ticket}) matches no inventory entry`);
187
+ }
188
+ if (documented.has(declared.name)) {
189
+ problems.push(`doc_drift ${kind} '${declared.name}' (${declared.ticket}) is stale — ${labels} now documents it; remove the declaration`);
190
+ }
191
+ }
192
+ }
193
+ return problems;
194
+ }
195
+ /** Set-compare tool names: inventory vs the live `listTools()` surface. */
196
+ export function compareToolNames(inventoryNames, liveNames) {
197
+ const inventory = new Set(inventoryNames);
198
+ const live = new Set(liveNames);
199
+ return {
200
+ missing: [...live].filter((name) => !inventory.has(name)).sort(),
201
+ extra: [...inventory].filter((name) => !live.has(name)).sort(),
202
+ };
203
+ }
204
+ //# sourceMappingURL=fidelity-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fidelity-inventory.js","sourceRoot":"","sources":["../src/fidelity-inventory.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,wEAAwE;AACxE,qEAAqE;AACrE,sEAAsE;AACtE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,uEAAuE;AACvE,2EAA2E;AAC3E,kCAAkC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAG9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,YAAY,CAAC;IAClD,uEAAuE;IACvE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,kBAAkB;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACjC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,YAAY,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,sDAAsD;IACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,wDAAwD;IACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CACpC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,YAAY,CAAC;IACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,wEAAwE;IACxE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC,CAAC;AAGH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAkBD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AAEpE,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI;SACR,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO;QACL,KAAK;QACL,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAChE;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,IAAqB;IAC1E,MAAM,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC5E,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,KAAK,CAAC;YAChB,OAAO,GAAG,CAAC,CAAC,CAAC;YACb,OAAO,GAAG,CAAC,CAAC,CAAC;YACb,OAAO,GAAG,CAAC,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACxD,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAC3D,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAC3D,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC;YAAE,SAAS;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAA4B,EAC5B,IAAyB;IAEzB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAU,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAC3E,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,KAAK,CAAC,IAAI,mBAAmB,CAAC,CAAC;YACrE,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;QACrD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACnD,QAAQ,CAAC,IAAI,CACX,GAAG,MAAM,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,kDAAkD,QAAQ,CAAC,QAAQ,SAAS,GAAG,CAAC,QAAQ,IAAI,CAC5H,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,IACE,QAAQ;oBACR,QAAQ,CAAC,IAAI,KAAK,SAAS;oBAC3B,GAAG,CAAC,IAAI,KAAK,SAAS;oBACtB,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAC1B,CAAC;oBACD,QAAQ,CAAC,IAAI,CACX,GAAG,MAAM,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,iDAAiD,QAAQ,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,IAAI,CACnH,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,KAAK,IAAI,uDAAuD,CAAC,CAAC;gBAClG,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,KAAK,IAAI,+BAA+B,KAAK,CAAC,QAAQ,SAAS,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,CACtG,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;gBACtD,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,KAAK,IAAI,2BAA2B,KAAK,CAAC,IAAI,SAAS,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,uDAAuD,MAAM,oCAAoC,CACxH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CACX,aAAa,IAAI,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,MAAM,8BAA8B,CACvF,CAAC;YACJ,CAAC;YACD,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CACX,aAAa,IAAI,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,MAAM,gBAAgB,MAAM,2CAA2C,CAC1H,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAC9B,cAAwB,EACxB,SAAmB;IAEnB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;QAChE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;KAC/D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { type FidelityInventory } from "./fidelity-inventory.js";
2
+ export type ParityState = Record<string, unknown>;
3
+ export interface ParityStep {
4
+ tool: string;
5
+ arguments?: Record<string, unknown> | ((state: ParityState) => Record<string, unknown>);
6
+ /** Pull cross-call state (ids, numbers, shas) out of the response body. */
7
+ capture?: (body: unknown, state: ParityState) => void;
8
+ /** Expected HTTP status; default: any 2xx. */
9
+ status?: number;
10
+ /** Extra body assertion; return a problem string to fail the step. */
11
+ verify?: (body: unknown) => string | undefined;
12
+ }
13
+ export interface ParityRestProbe {
14
+ /** Label in the report, e.g. "unsupported-rest". */
15
+ surface: string;
16
+ method?: string;
17
+ /** Session-relative path, e.g. "/repos/acme/api/actions/runs". */
18
+ path: string;
19
+ /** Expected HTTP status. */
20
+ status: number;
21
+ /** Assert the body carries a `fidelity: "unsupported"` marker. */
22
+ expectUnsupportedEnvelope?: boolean;
23
+ }
24
+ export interface ParityAppLike {
25
+ request(path: string | Request, init?: RequestInit): Response | Promise<Response>;
26
+ }
27
+ export interface RunParityOptions {
28
+ app: ParityAppLike;
29
+ twin: string;
30
+ inventory: FidelityInventory;
31
+ /** `listTools()` names from the twin source — the code truth. */
32
+ liveToolNames: string[];
33
+ steps: ParityStep[];
34
+ restProbes?: ParityRestProbe[];
35
+ /** Session id; default "fidelity-parity". */
36
+ sid?: string;
37
+ /** JWT secret; default env TWIN_AUTH_SECRET or the engine dev secret. */
38
+ secret?: string;
39
+ /** Extra JWT claims (login, team_id, account_id, ...). */
40
+ claims?: Record<string, unknown>;
41
+ /** Applied to every step without its own `verify` (twin error envelopes). */
42
+ stepVerify?: (body: unknown) => string | undefined;
43
+ /** Optional live upstream probes; entries are appended to the report. */
44
+ live?: () => Promise<unknown[]>;
45
+ }
46
+ export interface ParityResult {
47
+ ok: boolean;
48
+ failures: string[];
49
+ report: unknown[];
50
+ }
51
+ export declare function runFidelityParity(options: RunParityOptions): Promise<ParityResult>;
52
+ /** Script entrypoint: run, print the JSON report, set the exit code. */
53
+ export declare function runParityCli(options: RunParityOptions): Promise<ParityResult>;
54
+ export { compareToolNames, expandSurfaceCell, fidelityDocDriftSchema, fidelityInventorySchema, fidelitySurfaceSchema, heatTierSchema, lintFidelityInventory, loadFidelityInventory, parseFidelityDocRows, } from "./fidelity-inventory.js";
55
+ export type { FidelityDocDrift, FidelityDocRow, FidelityDocSource, FidelityInventory, FidelitySurface, HeatTier, } from "./fidelity-inventory.js";
@@ -0,0 +1,112 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ //
3
+ // Shared fidelity:parity runner (F-730). One engine-level runner; each twin
4
+ // supplies declarative scenario data — an ordered, stateful chain of MCP
5
+ // calls with cross-call captures (a PR number, a charge id, a message ts) —
6
+ // plus its structured fidelity inventory. No per-twin runner copies (M1
7
+ // "twin-infra copies: 0" gate).
8
+ //
9
+ // The runner asserts three rings agree before it reports green:
10
+ // 1. live tool list (code truth from listTools())
11
+ // 2. fidelity.inventory.json tools (the machine-readable inventory)
12
+ // 3. scenario step coverage (every inventory tool exercised)
13
+ // and that every step answers its expected status through the frozen
14
+ // `POST /s/:sid/mcp/call` surface. Optional REST probes pin the loud-501
15
+ // unsupported envelope; an optional `live` hook lets a twin compare
16
+ // read-only shapes against the real upstream (e.g. `gh api`).
17
+ import { sign } from "hono/jwt";
18
+ import { compareToolNames, } from "./fidelity-inventory.js";
19
+ function bodyKeys(body) {
20
+ if (Array.isArray(body))
21
+ return ["array"];
22
+ if (body && typeof body === "object") {
23
+ return Object.keys(body).sort();
24
+ }
25
+ return [];
26
+ }
27
+ export async function runFidelityParity(options) {
28
+ const sid = options.sid ?? "fidelity-parity";
29
+ const secret = options.secret ?? process.env.TWIN_AUTH_SECRET ?? "dev-only-insecure-secret";
30
+ const token = await sign({ sid, exp: Math.floor(Date.now() / 1000) + 3600, ...options.claims }, secret);
31
+ const base = `/s/${sid}`;
32
+ const failures = [];
33
+ const report = [];
34
+ // Ring 1 ⇔ ring 2: inventory tools must equal the live tool list.
35
+ const inventoryNames = options.inventory.tools.map((entry) => entry.name);
36
+ const inventoryDiff = compareToolNames(inventoryNames, options.liveToolNames);
37
+ for (const name of inventoryDiff.missing) {
38
+ failures.push(`tool '${name}' is live in listTools() but missing from fidelity.inventory.json`);
39
+ }
40
+ for (const name of inventoryDiff.extra) {
41
+ failures.push(`tool '${name}' is in fidelity.inventory.json but not in listTools()`);
42
+ }
43
+ // Ring 2 ⇔ ring 3: every inventory tool needs at least one scenario step.
44
+ const covered = new Set(options.steps.map((step) => step.tool));
45
+ for (const name of inventoryNames) {
46
+ if (!covered.has(name))
47
+ failures.push(`no parity scenario step covers tool '${name}'`);
48
+ }
49
+ for (const tool of covered) {
50
+ if (!inventoryNames.includes(tool)) {
51
+ failures.push(`scenario step calls '${tool}' which is not in fidelity.inventory.json`);
52
+ }
53
+ }
54
+ const state = {};
55
+ for (const step of options.steps) {
56
+ const args = typeof step.arguments === "function" ? step.arguments(state) : step.arguments ?? {};
57
+ const response = await options.app.request(`${base}/mcp/call`, {
58
+ method: "POST",
59
+ headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
60
+ body: JSON.stringify({ tool: step.tool, arguments: args }),
61
+ });
62
+ const body = await response.json().catch(() => ({}));
63
+ const expected = step.status === undefined ? response.ok : response.status === step.status;
64
+ if (!expected) {
65
+ failures.push(`${step.tool}: expected ${step.status ?? "2xx"}, got ${response.status} ${JSON.stringify(body).slice(0, 300)}`);
66
+ }
67
+ else {
68
+ const problem = (step.verify ?? options.stepVerify)?.(body);
69
+ if (problem)
70
+ failures.push(`${step.tool}: ${problem}`);
71
+ step.capture?.(body, state);
72
+ }
73
+ report.push({ tool: step.tool, status: response.status, ok: response.ok, keys: bodyKeys(body) });
74
+ }
75
+ for (const probe of options.restProbes ?? []) {
76
+ const response = await options.app.request(`${base}${probe.path}`, {
77
+ method: probe.method ?? "GET",
78
+ headers: { authorization: `Bearer ${token}` },
79
+ });
80
+ const body = await response.json().catch(() => ({}));
81
+ if (response.status !== probe.status) {
82
+ failures.push(`${probe.surface}: expected ${probe.status}, got ${response.status}`);
83
+ }
84
+ if (probe.expectUnsupportedEnvelope && !JSON.stringify(body).includes('"fidelity":"unsupported"')) {
85
+ failures.push(`${probe.surface}: body does not carry the fidelity:"unsupported" envelope`);
86
+ }
87
+ report.push({ surface: probe.surface, status: response.status, body });
88
+ }
89
+ if (options.live) {
90
+ report.push(...(await options.live()));
91
+ }
92
+ return { ok: failures.length === 0, failures, report };
93
+ }
94
+ /** Script entrypoint: run, print the JSON report, set the exit code. */
95
+ export async function runParityCli(options) {
96
+ const result = await runFidelityParity(options);
97
+ console.log(JSON.stringify({
98
+ twin: options.twin,
99
+ tools: options.inventory.tools.length,
100
+ rest_surfaces: options.inventory.rest.length,
101
+ ok: result.ok,
102
+ failures: result.failures,
103
+ report: result.report,
104
+ }, null, 2));
105
+ if (!result.ok) {
106
+ console.error(`fidelity:parity FAILED for ${options.twin} (${result.failures.length} problem(s))`);
107
+ process.exitCode = 1;
108
+ }
109
+ return result;
110
+ }
111
+ export { compareToolNames, expandSurfaceCell, fidelityDocDriftSchema, fidelityInventorySchema, fidelitySurfaceSchema, heatTierSchema, lintFidelityInventory, loadFidelityInventory, parseFidelityDocRows, } from "./fidelity-inventory.js";
112
+ //# sourceMappingURL=parity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parity.js","sourceRoot":"","sources":["../src/parity.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,4EAA4E;AAC5E,wEAAwE;AACxE,gCAAgC;AAChC,EAAE;AACF,gEAAgE;AAChE,oDAAoD;AACpD,sEAAsE;AACtE,+DAA+D;AAC/D,qEAAqE;AACrE,yEAAyE;AACzE,oEAAoE;AACpE,8DAA8D;AAE9D,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EACL,gBAAgB,GAEjB,MAAM,yBAAyB,CAAC;AAyDjC,SAAS,QAAQ,CAAC,IAAa;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,IAAI,CAAC,IAA+B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAyB;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,iBAAiB,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAC5F,MAAM,KAAK,GAAG,MAAM,IAAI,CACtB,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EACrE,MAAM,CACP,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,kEAAkE;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,mEAAmE,CAAC,CAAC;IAClG,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,wDAAwD,CAAC,CAAC;IACvF,CAAC;IAED,0EAA0E;IAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,wCAAwC,IAAI,GAAG,CAAC,CAAC;IACzF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,IAAI,2CAA2C,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACtF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,WAAW,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YACjF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;QAC3F,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,MAAM,IAAI,KAAK,SAAS,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC/G,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE;YACjE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;YAC7B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,MAAM,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAClG,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,2DAA2D,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;QACE,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM;QACrC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;QAC5C,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;QACnG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC"}
@@ -13,6 +13,21 @@ export declare function makeDeltaSink(): {
13
13
  };
14
14
  /** Hostnames the boot guard treats as loopback binds. */
15
15
  export declare function isLoopbackHost(value: string): boolean;
16
+ /**
17
+ * F-708: self-generate `TWIN_AUTH_SECRET` on first boot. An env-injected
18
+ * secret always wins (pome-cloud injects per-tenant secrets — that contract
19
+ * is untouched), and loopback binds keep the dev-fallback path. Otherwise
20
+ * the secret persisted at the compose-era contract location
21
+ * `.pome-data/<twin>/secret` (cwd-relative; `POME_TWIN_DATA_DIR` overrides
22
+ * the directory) is reused, or a fresh 32-byte hex secret is generated,
23
+ * persisted there, and printed once to stdout so the operator can mint JWTs.
24
+ *
25
+ * The resolved secret lands in `process.env.TWIN_AUTH_SECRET`, which is
26
+ * process-global by design: the engine's auth (`resolveAuthSecret`) reads
27
+ * the env, so one process serves one secret — the frozen boot contract is
28
+ * one twin per process, and a multi-twin process shares the first secret.
29
+ */
30
+ export declare function ensureTwinAuthSecret(twin: string, host: string): void;
16
31
  export declare function shadowedPrefix(routePath: string): string | null;
17
32
  export declare function assertUniqueToolNames<TDomain>(tools: ReadonlyArray<ToolSpec<TDomain>>, twinId: string): void;
18
33
  export declare function findTool<TDb, TSeed, TDomain>(definition: TwinDefinition<TDb, TSeed, TDomain>, name: string): ToolSpec<TDomain>;
@@ -4,6 +4,9 @@
4
4
  // out of server.ts (F-685) purely for module-size hygiene; everything a twin
5
5
  // may import (TwinBootError, isLoopbackHost) is re-exported from server.ts,
6
6
  // which stays the only public entry.
7
+ import { randomBytes } from "node:crypto";
8
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
9
+ import { join } from "node:path";
7
10
  import { RESERVED_SESSION_PREFIXES } from "./index.js";
8
11
  import { UnknownToolError } from "./errors.js";
9
12
  export class TwinBootError extends Error {
@@ -29,6 +32,99 @@ export function makeDeltaSink() {
29
32
  export function isLoopbackHost(value) {
30
33
  return value === "127.0.0.1" || value === "::1" || value === "localhost";
31
34
  }
35
+ /**
36
+ * F-708: self-generate `TWIN_AUTH_SECRET` on first boot. An env-injected
37
+ * secret always wins (pome-cloud injects per-tenant secrets — that contract
38
+ * is untouched), and loopback binds keep the dev-fallback path. Otherwise
39
+ * the secret persisted at the compose-era contract location
40
+ * `.pome-data/<twin>/secret` (cwd-relative; `POME_TWIN_DATA_DIR` overrides
41
+ * the directory) is reused, or a fresh 32-byte hex secret is generated,
42
+ * persisted there, and printed once to stdout so the operator can mint JWTs.
43
+ *
44
+ * The resolved secret lands in `process.env.TWIN_AUTH_SECRET`, which is
45
+ * process-global by design: the engine's auth (`resolveAuthSecret`) reads
46
+ * the env, so one process serves one secret — the frozen boot contract is
47
+ * one twin per process, and a multi-twin process shares the first secret.
48
+ */
49
+ export function ensureTwinAuthSecret(twin, host) {
50
+ if (process.env.TWIN_AUTH_SECRET)
51
+ return;
52
+ if (isLoopbackHost(host))
53
+ return;
54
+ const dataDir = process.env.POME_TWIN_DATA_DIR || join(".pome-data", twin);
55
+ const secretPath = join(dataDir, "secret");
56
+ try {
57
+ const persisted = readSecretFile(secretPath);
58
+ if (persisted) {
59
+ process.env.TWIN_AUTH_SECRET = persisted;
60
+ console.log(`[twin-${twin}] TWIN_AUTH_SECRET not set — using the persisted secret from ${secretPath}`);
61
+ return;
62
+ }
63
+ const secret = randomBytes(32).toString("hex");
64
+ mkdirSync(dataDir, { recursive: true });
65
+ try {
66
+ // Compose-era file format: hex secret + trailing newline, owner-only.
67
+ // "wx" never clobbers a secret written by a concurrent first boot.
68
+ writeFileSync(secretPath, `${secret}\n`, { mode: 0o600, flag: "wx" });
69
+ }
70
+ catch (err) {
71
+ if (err.code !== "EEXIST")
72
+ throw err;
73
+ const winner = readSecretFile(secretPath);
74
+ if (winner) {
75
+ process.env.TWIN_AUTH_SECRET = winner;
76
+ console.log(`[twin-${twin}] TWIN_AUTH_SECRET not set — using the persisted secret from ${secretPath}`);
77
+ return;
78
+ }
79
+ // A blank file is an aborted earlier write: remove it and retry the
80
+ // exclusive write, so a concurrent booter losing this second race
81
+ // adopts the winner's secret instead of overwriting it.
82
+ rmSync(secretPath, { force: true });
83
+ try {
84
+ writeFileSync(secretPath, `${secret}\n`, { mode: 0o600, flag: "wx" });
85
+ }
86
+ catch (err2) {
87
+ if (err2.code !== "EEXIST")
88
+ throw err2;
89
+ const late = readSecretFile(secretPath);
90
+ if (!late)
91
+ throw err2;
92
+ process.env.TWIN_AUTH_SECRET = late;
93
+ console.log(`[twin-${twin}] TWIN_AUTH_SECRET not set — using the persisted secret from ${secretPath}`);
94
+ return;
95
+ }
96
+ }
97
+ process.env.TWIN_AUTH_SECRET = secret;
98
+ console.log(`[twin-${twin}] TWIN_AUTH_SECRET not set — generated ${secret} (persisted to ${secretPath}; subsequent boots reuse it, an env-injected TWIN_AUTH_SECRET overrides it)`);
99
+ }
100
+ catch (err) {
101
+ if (err instanceof TwinBootError)
102
+ throw err;
103
+ throw new TwinBootError(`TWIN_AUTH_SECRET is not set and self-generating one at ${secretPath} failed: ${err.message}`);
104
+ }
105
+ }
106
+ /** The persisted secret, trimmed; undefined when absent or blank. */
107
+ function readSecretFile(secretPath) {
108
+ let raw;
109
+ try {
110
+ raw = readFileSync(secretPath, "utf8");
111
+ }
112
+ catch (err) {
113
+ if (err.code === "ENOENT")
114
+ return undefined;
115
+ throw err;
116
+ }
117
+ const trimmed = raw.trim();
118
+ if (trimmed.length === 0)
119
+ return undefined;
120
+ // The compose-era contract documents >= 32 chars. A shorter file (hand
121
+ // edit, truncation) must fail the boot loudly — never silently serve a
122
+ // weak HS256 key, and never silently regenerate over operator content.
123
+ if (trimmed.length < 32) {
124
+ throw new TwinBootError(`TWIN_AUTH_SECRET is not set and the persisted secret at ${secretPath} is shorter than 32 chars — fix or delete the file, or inject TWIN_AUTH_SECRET.`);
125
+ }
126
+ return trimmed;
127
+ }
32
128
  export function shadowedPrefix(routePath) {
33
129
  for (const prefix of RESERVED_SESSION_PREFIXES) {
34
130
  if (routePath === prefix || routePath.startsWith(`${prefix}/`))
@@ -1 +1 @@
1
- {"version":3,"file":"server-helpers.js","sourceRoot":"","sources":["../src/server-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-helpers.js","sourceRoot":"","sources":["../src/server-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
2
  import { type TwinDefinition } from "./index.js";
3
3
  import { type RecorderStore } from "./recorder.js";
4
- export { TwinBootError, isLoopbackHost, created, ok } from "./server-helpers.js";
4
+ export { TwinBootError, ensureTwinAuthSecret, isLoopbackHost, created, ok } from "./server-helpers.js";
5
5
  export { createRecorderHandle, createRecorderStore, createFileBackedRecorderStore, resolveRecorderStore, toTwinHttpEventRow, POME_RECORDER_EVENTS_PATH, } from "./recorder.js";
6
6
  export type { RecorderStore, RecorderStoreOptions, FileBackedRecorderStoreOptions, ErrorEnvelopeFn, } from "./recorder.js";
7
7
  export { bearerAuth, requireAdminAuth, resolveAuthSecret } from "./auth.js";
@@ -31,10 +31,10 @@ import { handleMcpJsonRpc, mcpMethodNotAllowed } from "./mcp-jsonrpc.js";
31
31
  import { createRecorderHandle, resolveRecorderStore } from "./recorder.js";
32
32
  import { redactSecrets } from "./redaction.js";
33
33
  import { TwinError, envelopeFor } from "./errors.js";
34
- import { POME_CORE_ROUTE_NAMES, TwinBootError, assertUniqueToolNames, findTool, isLoopbackHost, makeDeltaSink, readJson, shadowedPrefix, } from "./server-helpers.js";
34
+ import { POME_CORE_ROUTE_NAMES, TwinBootError, assertUniqueToolNames, ensureTwinAuthSecret, findTool, isLoopbackHost, makeDeltaSink, readJson, shadowedPrefix, } from "./server-helpers.js";
35
35
  // Public boot surface consumed by twin entrypoints
36
- // (`import { TwinBootError, isLoopbackHost, serve } from "@pome-sh/sdk/server"`).
37
- export { TwinBootError, isLoopbackHost, created, ok } from "./server-helpers.js";
36
+ // (`import { ensureTwinAuthSecret, serve } from "@pome-sh/sdk/server"`).
37
+ export { TwinBootError, ensureTwinAuthSecret, isLoopbackHost, created, ok } from "./server-helpers.js";
38
38
  export { createRecorderHandle, createRecorderStore, createFileBackedRecorderStore, resolveRecorderStore, toTwinHttpEventRow, POME_RECORDER_EVENTS_PATH, } from "./recorder.js";
39
39
  export { bearerAuth, requireAdminAuth, resolveAuthSecret } from "./auth.js";
40
40
  // Alternate serving bridges (anything that isn't @hono/node-server) must feed
@@ -314,11 +314,13 @@ export function createApp(definition, options = {}) {
314
314
  */
315
315
  export async function serve(definition, options = {}) {
316
316
  const hostname = options.hostname ?? "127.0.0.1";
317
- // Contract boot guard: a twin must refuse to serve real traffic with the
318
- // dev fallback secret. Checked before the app is built so the process
317
+ // Contract boot guard: a twin must never serve real traffic with the dev
318
+ // fallback secret. Since F-708 a non-loopback bind with no env-injected
319
+ // secret self-generates + persists one instead of refusing to boot; a
320
+ // failed generation still throws before the app is built, so the process
319
321
  // exits non-zero without ever listening.
320
- if (options.port !== undefined && !isLoopbackHost(hostname) && !process.env.TWIN_AUTH_SECRET) {
321
- throw new TwinBootError(`TWIN_AUTH_SECRET is required when a twin listens on a non-loopback host (${hostname}).`);
322
+ if (options.port !== undefined && !isLoopbackHost(hostname)) {
323
+ ensureTwinAuthSecret(definition.id, hostname);
322
324
  }
323
325
  // Resolve the store once so `close()` can flush the same instance the app
324
326
  // records into (durable when POME_RECORDER_EVENTS_PATH is set).