@openrig/cli 0.4.8 → 0.5.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 (344) hide show
  1. package/daemon/assets/claude-statusline-context.cjs +40 -8
  2. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +0 -0
  3. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +7 -4
  4. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +68 -17
  5. package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +2 -0
  6. package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +2 -1
  7. package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +1 -0
  8. package/daemon/dist/adapters/claude-code-adapter.d.ts +36 -0
  9. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  10. package/daemon/dist/adapters/claude-code-adapter.js +203 -3
  11. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  12. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +12 -0
  13. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  14. package/daemon/dist/adapters/codex-runtime-adapter.js +24 -2
  15. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  16. package/daemon/dist/build-info.js +3 -3
  17. package/daemon/dist/domain/agent-activity-store.d.ts +1 -0
  18. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
  19. package/daemon/dist/domain/agent-activity-store.js +2 -2
  20. package/daemon/dist/domain/agent-activity-store.js.map +1 -1
  21. package/daemon/dist/domain/claude-activity-hooks.d.ts +33 -0
  22. package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -0
  23. package/daemon/dist/domain/claude-activity-hooks.js +60 -0
  24. package/daemon/dist/domain/claude-activity-hooks.js.map +1 -0
  25. package/daemon/dist/domain/context-packs/bundle-assembler.d.ts +30 -0
  26. package/daemon/dist/domain/context-packs/bundle-assembler.d.ts.map +1 -1
  27. package/daemon/dist/domain/context-packs/bundle-assembler.js +31 -1
  28. package/daemon/dist/domain/context-packs/bundle-assembler.js.map +1 -1
  29. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts +69 -14
  30. package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
  31. package/daemon/dist/domain/context-packs/context-pack-library-service.js +263 -48
  32. package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
  33. package/daemon/dist/domain/context-packs/context-pack-types.d.ts +2 -2
  34. package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
  35. package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
  36. package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
  37. package/daemon/dist/domain/context-packs/manifest-parser.js +11 -0
  38. package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
  39. package/daemon/dist/domain/context-packs/ref-safety.d.ts +11 -0
  40. package/daemon/dist/domain/context-packs/ref-safety.d.ts.map +1 -0
  41. package/daemon/dist/domain/context-packs/ref-safety.js +46 -0
  42. package/daemon/dist/domain/context-packs/ref-safety.js.map +1 -0
  43. package/daemon/dist/domain/context-packs/token-estimate.d.ts +3 -0
  44. package/daemon/dist/domain/context-packs/token-estimate.d.ts.map +1 -0
  45. package/daemon/dist/domain/context-packs/token-estimate.js +5 -0
  46. package/daemon/dist/domain/context-packs/token-estimate.js.map +1 -0
  47. package/daemon/dist/domain/plugin-vendor-service.d.ts +14 -0
  48. package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
  49. package/daemon/dist/domain/plugin-vendor-service.js +26 -2
  50. package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
  51. package/daemon/dist/domain/provider/claude-usage-reader.d.ts +44 -0
  52. package/daemon/dist/domain/provider/claude-usage-reader.d.ts.map +1 -0
  53. package/daemon/dist/domain/provider/claude-usage-reader.js +112 -0
  54. package/daemon/dist/domain/provider/claude-usage-reader.js.map +1 -0
  55. package/daemon/dist/domain/provider/codex-auth-reader.d.ts +18 -0
  56. package/daemon/dist/domain/provider/codex-auth-reader.d.ts.map +1 -0
  57. package/daemon/dist/domain/provider/codex-auth-reader.js +64 -0
  58. package/daemon/dist/domain/provider/codex-auth-reader.js.map +1 -0
  59. package/daemon/dist/domain/provider/host-usage-rollup.d.ts +51 -0
  60. package/daemon/dist/domain/provider/host-usage-rollup.d.ts.map +1 -0
  61. package/daemon/dist/domain/provider/host-usage-rollup.js +162 -0
  62. package/daemon/dist/domain/provider/host-usage-rollup.js.map +1 -0
  63. package/daemon/dist/domain/provider/provider-collect.d.ts +22 -0
  64. package/daemon/dist/domain/provider/provider-collect.d.ts.map +1 -0
  65. package/daemon/dist/domain/provider/provider-collect.js +74 -0
  66. package/daemon/dist/domain/provider/provider-collect.js.map +1 -0
  67. package/daemon/dist/domain/provider/provider-policy.d.ts +38 -0
  68. package/daemon/dist/domain/provider/provider-policy.d.ts.map +1 -0
  69. package/daemon/dist/domain/provider/provider-policy.js +76 -0
  70. package/daemon/dist/domain/provider/provider-policy.js.map +1 -0
  71. package/daemon/dist/domain/provider/provider-read-model.d.ts +28 -0
  72. package/daemon/dist/domain/provider/provider-read-model.d.ts.map +1 -0
  73. package/daemon/dist/domain/provider/provider-read-model.js +68 -0
  74. package/daemon/dist/domain/provider/provider-read-model.js.map +1 -0
  75. package/daemon/dist/domain/provider/provider-service-impl.d.ts +26 -0
  76. package/daemon/dist/domain/provider/provider-service-impl.d.ts.map +1 -0
  77. package/daemon/dist/domain/provider/provider-service-impl.js +83 -0
  78. package/daemon/dist/domain/provider/provider-service-impl.js.map +1 -0
  79. package/daemon/dist/domain/provider/provider-service.d.ts +33 -0
  80. package/daemon/dist/domain/provider/provider-service.d.ts.map +1 -0
  81. package/daemon/dist/domain/provider/provider-service.js +6 -0
  82. package/daemon/dist/domain/provider/provider-service.js.map +1 -0
  83. package/daemon/dist/domain/provider/provider-signals.d.ts +76 -0
  84. package/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -0
  85. package/daemon/dist/domain/provider/provider-signals.js +144 -0
  86. package/daemon/dist/domain/provider/provider-signals.js.map +1 -0
  87. package/daemon/dist/domain/provider/provider-types.d.ts +101 -0
  88. package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -0
  89. package/daemon/dist/domain/provider/provider-types.js +7 -0
  90. package/daemon/dist/domain/provider/provider-types.js.map +1 -0
  91. package/daemon/dist/domain/provider/reactive-tap.d.ts +29 -0
  92. package/daemon/dist/domain/provider/reactive-tap.d.ts.map +1 -0
  93. package/daemon/dist/domain/provider/reactive-tap.js +80 -0
  94. package/daemon/dist/domain/provider/reactive-tap.js.map +1 -0
  95. package/daemon/dist/domain/rigspec-instantiator.d.ts +7 -23
  96. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  97. package/daemon/dist/domain/rigspec-instantiator.js +3 -61
  98. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  99. package/daemon/dist/domain/rigspec-preflight.d.ts +11 -0
  100. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  101. package/daemon/dist/domain/rigspec-preflight.js +43 -1
  102. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  103. package/daemon/dist/domain/runtime-adapter.d.ts +2 -11
  104. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  105. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  106. package/daemon/dist/domain/scope/attestation-lineage.generated.d.ts +14 -0
  107. package/daemon/dist/domain/scope/attestation-lineage.generated.d.ts.map +1 -0
  108. package/daemon/dist/domain/scope/attestation-lineage.generated.js +26 -0
  109. package/daemon/dist/domain/scope/attestation-lineage.generated.js.map +1 -0
  110. package/daemon/dist/domain/scope/scope-approve.d.ts +13 -0
  111. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  112. package/daemon/dist/domain/scope/scope-approve.js +50 -10
  113. package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  114. package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
  115. package/daemon/dist/domain/startup-validation.js +18 -54
  116. package/daemon/dist/domain/startup-validation.js.map +1 -1
  117. package/daemon/dist/domain/stream-store.d.ts +4 -0
  118. package/daemon/dist/domain/stream-store.d.ts.map +1 -1
  119. package/daemon/dist/domain/stream-store.js +15 -2
  120. package/daemon/dist/domain/stream-store.js.map +1 -1
  121. package/daemon/dist/domain/types.d.ts +2 -9
  122. package/daemon/dist/domain/types.d.ts.map +1 -1
  123. package/daemon/dist/domain/types.js.map +1 -1
  124. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +1 -1
  125. package/daemon/dist/routes/context-packs.d.ts.map +1 -1
  126. package/daemon/dist/routes/context-packs.js +157 -75
  127. package/daemon/dist/routes/context-packs.js.map +1 -1
  128. package/daemon/dist/routes/provider.d.ts +3 -0
  129. package/daemon/dist/routes/provider.d.ts.map +1 -0
  130. package/daemon/dist/routes/provider.js +124 -0
  131. package/daemon/dist/routes/provider.js.map +1 -0
  132. package/daemon/dist/routes/scope-approve.d.ts.map +1 -1
  133. package/daemon/dist/routes/scope-approve.js +6 -3
  134. package/daemon/dist/routes/scope-approve.js.map +1 -1
  135. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  136. package/daemon/dist/routes/scope-audit.js +4 -1
  137. package/daemon/dist/routes/scope-audit.js.map +1 -1
  138. package/daemon/dist/routes/stream.d.ts.map +1 -1
  139. package/daemon/dist/routes/stream.js +71 -1
  140. package/daemon/dist/routes/stream.js.map +1 -1
  141. package/daemon/dist/server.d.ts +3 -0
  142. package/daemon/dist/server.d.ts.map +1 -1
  143. package/daemon/dist/server.js +5 -0
  144. package/daemon/dist/server.js.map +1 -1
  145. package/daemon/dist/startup.d.ts.map +1 -1
  146. package/daemon/dist/startup.js +21 -11
  147. package/daemon/dist/startup.js.map +1 -1
  148. package/daemon/docs/reference/developing.md +39 -0
  149. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
  150. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
  151. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
  152. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
  153. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
  154. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  155. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  156. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  157. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -1
  158. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -1
  159. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  160. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  161. package/daemon/specs/agents/research/analyst/agent.yaml +1 -1
  162. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -1
  163. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  164. package/daemon/specs/agents/shared/agent.yaml +6 -0
  165. package/daemon/specs/agents/shared/runtime/claude-activity-hooks.json +4 -0
  166. package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +1 -0
  167. package/dist/bin-wrapper.d.ts.map +1 -1
  168. package/dist/bin-wrapper.js +7 -0
  169. package/dist/bin-wrapper.js.map +1 -1
  170. package/dist/build-info.js +3 -3
  171. package/dist/commands/agent-image.d.ts.map +1 -1
  172. package/dist/commands/agent-image.js +2 -1
  173. package/dist/commands/agent-image.js.map +1 -1
  174. package/dist/commands/broadcast.d.ts.map +1 -1
  175. package/dist/commands/broadcast.js +37 -2
  176. package/dist/commands/broadcast.js.map +1 -1
  177. package/dist/commands/context.d.ts +2 -7
  178. package/dist/commands/context.d.ts.map +1 -1
  179. package/dist/commands/context.js +391 -213
  180. package/dist/commands/context.js.map +1 -1
  181. package/dist/commands/provider.d.ts +4 -0
  182. package/dist/commands/provider.d.ts.map +1 -0
  183. package/dist/commands/provider.js +218 -0
  184. package/dist/commands/provider.js.map +1 -0
  185. package/dist/commands/ps.d.ts +7 -0
  186. package/dist/commands/ps.d.ts.map +1 -1
  187. package/dist/commands/ps.js +34 -4
  188. package/dist/commands/ps.js.map +1 -1
  189. package/dist/commands/queue.d.ts.map +1 -1
  190. package/dist/commands/queue.js +38 -8
  191. package/dist/commands/queue.js.map +1 -1
  192. package/dist/commands/scope.d.ts.map +1 -1
  193. package/dist/commands/scope.js +48 -4
  194. package/dist/commands/scope.js.map +1 -1
  195. package/dist/commands/send.d.ts.map +1 -1
  196. package/dist/commands/send.js +70 -11
  197. package/dist/commands/send.js.map +1 -1
  198. package/dist/commands/stream.d.ts +1 -0
  199. package/dist/commands/stream.d.ts.map +1 -1
  200. package/dist/commands/stream.js +93 -0
  201. package/dist/commands/stream.js.map +1 -1
  202. package/dist/commands/tui.d.ts +4 -0
  203. package/dist/commands/tui.d.ts.map +1 -0
  204. package/dist/commands/tui.js +29 -0
  205. package/dist/commands/tui.js.map +1 -0
  206. package/dist/commands/walk.d.ts +19 -0
  207. package/dist/commands/walk.d.ts.map +1 -0
  208. package/dist/commands/walk.js +139 -0
  209. package/dist/commands/walk.js.map +1 -0
  210. package/dist/context-resolve.d.ts +14 -0
  211. package/dist/context-resolve.d.ts.map +1 -0
  212. package/dist/context-resolve.js +40 -0
  213. package/dist/context-resolve.js.map +1 -0
  214. package/dist/front-door.d.ts +31 -0
  215. package/dist/front-door.d.ts.map +1 -0
  216. package/dist/front-door.js +114 -0
  217. package/dist/front-door.js.map +1 -0
  218. package/dist/index.d.ts +3 -1
  219. package/dist/index.d.ts.map +1 -1
  220. package/dist/index.js +19 -6
  221. package/dist/index.js.map +1 -1
  222. package/dist/lib/scope/attestation-lineage.d.ts +14 -0
  223. package/dist/lib/scope/attestation-lineage.d.ts.map +1 -0
  224. package/dist/lib/scope/attestation-lineage.js +34 -0
  225. package/dist/lib/scope/attestation-lineage.js.map +1 -0
  226. package/package.json +4 -2
  227. package/tui/dist/daemon-client.d.ts +56 -0
  228. package/tui/dist/daemon-client.d.ts.map +1 -0
  229. package/tui/dist/daemon-client.js +99 -0
  230. package/tui/dist/daemon-client.js.map +1 -0
  231. package/tui/dist/demo-data.d.ts +3 -0
  232. package/tui/dist/demo-data.d.ts.map +1 -0
  233. package/tui/dist/demo-data.js +52 -0
  234. package/tui/dist/demo-data.js.map +1 -0
  235. package/tui/dist/detail.d.ts +34 -0
  236. package/tui/dist/detail.d.ts.map +1 -0
  237. package/tui/dist/detail.js +47 -0
  238. package/tui/dist/detail.js.map +1 -0
  239. package/tui/dist/grammar.d.ts +3 -0
  240. package/tui/dist/grammar.d.ts.map +1 -0
  241. package/tui/dist/grammar.js +66 -0
  242. package/tui/dist/grammar.js.map +1 -0
  243. package/tui/dist/hydrate.d.ts +78 -0
  244. package/tui/dist/hydrate.d.ts.map +1 -0
  245. package/tui/dist/hydrate.js +294 -0
  246. package/tui/dist/hydrate.js.map +1 -0
  247. package/tui/dist/index.d.ts +12 -0
  248. package/tui/dist/index.d.ts.map +1 -0
  249. package/tui/dist/index.js +12 -0
  250. package/tui/dist/index.js.map +1 -0
  251. package/tui/dist/input.d.ts +21 -0
  252. package/tui/dist/input.d.ts.map +1 -0
  253. package/tui/dist/input.js +128 -0
  254. package/tui/dist/input.js.map +1 -0
  255. package/tui/dist/live.d.ts +20 -0
  256. package/tui/dist/live.d.ts.map +1 -0
  257. package/tui/dist/live.js +67 -0
  258. package/tui/dist/live.js.map +1 -0
  259. package/tui/dist/main.d.ts +3 -0
  260. package/tui/dist/main.d.ts.map +1 -0
  261. package/tui/dist/main.js +184 -0
  262. package/tui/dist/main.js.map +1 -0
  263. package/tui/dist/motion.d.ts +13 -0
  264. package/tui/dist/motion.d.ts.map +1 -0
  265. package/tui/dist/motion.js +31 -0
  266. package/tui/dist/motion.js.map +1 -0
  267. package/tui/dist/navigator.d.ts +21 -0
  268. package/tui/dist/navigator.d.ts.map +1 -0
  269. package/tui/dist/navigator.js +168 -0
  270. package/tui/dist/navigator.js.map +1 -0
  271. package/tui/dist/refresh.d.ts +3 -0
  272. package/tui/dist/refresh.d.ts.map +1 -0
  273. package/tui/dist/refresh.js +9 -0
  274. package/tui/dist/refresh.js.map +1 -0
  275. package/tui/dist/render.d.ts +21 -0
  276. package/tui/dist/render.d.ts.map +1 -0
  277. package/tui/dist/render.js +807 -0
  278. package/tui/dist/render.js.map +1 -0
  279. package/tui/dist/sections.d.ts +4 -0
  280. package/tui/dist/sections.d.ts.map +1 -0
  281. package/tui/dist/sections.js +19 -0
  282. package/tui/dist/sections.js.map +1 -0
  283. package/tui/dist/socket-server.d.ts +24 -0
  284. package/tui/dist/socket-server.d.ts.map +1 -0
  285. package/tui/dist/socket-server.js +85 -0
  286. package/tui/dist/socket-server.js.map +1 -0
  287. package/tui/dist/state.d.ts +51 -0
  288. package/tui/dist/state.d.ts.map +1 -0
  289. package/tui/dist/state.js +480 -0
  290. package/tui/dist/state.js.map +1 -0
  291. package/tui/dist/stylize.d.ts +4 -0
  292. package/tui/dist/stylize.d.ts.map +1 -0
  293. package/tui/dist/stylize.js +248 -0
  294. package/tui/dist/stylize.js.map +1 -0
  295. package/tui/dist/theme.d.ts +19 -0
  296. package/tui/dist/theme.d.ts.map +1 -0
  297. package/tui/dist/theme.js +86 -0
  298. package/tui/dist/theme.js.map +1 -0
  299. package/tui/dist/topology/canvas.d.ts +43 -0
  300. package/tui/dist/topology/canvas.d.ts.map +1 -0
  301. package/tui/dist/topology/canvas.js +131 -0
  302. package/tui/dist/topology/canvas.js.map +1 -0
  303. package/tui/dist/topology/fixture.d.ts +4 -0
  304. package/tui/dist/topology/fixture.d.ts.map +1 -0
  305. package/tui/dist/topology/fixture.js +71 -0
  306. package/tui/dist/topology/fixture.js.map +1 -0
  307. package/tui/dist/topology/glyphs.d.ts +21 -0
  308. package/tui/dist/topology/glyphs.d.ts.map +1 -0
  309. package/tui/dist/topology/glyphs.js +49 -0
  310. package/tui/dist/topology/glyphs.js.map +1 -0
  311. package/tui/dist/topology/graph-types.d.ts +39 -0
  312. package/tui/dist/topology/graph-types.d.ts.map +1 -0
  313. package/tui/dist/topology/graph-types.js +2 -0
  314. package/tui/dist/topology/graph-types.js.map +1 -0
  315. package/tui/dist/topology/layout.d.ts +52 -0
  316. package/tui/dist/topology/layout.d.ts.map +1 -0
  317. package/tui/dist/topology/layout.js +118 -0
  318. package/tui/dist/topology/layout.js.map +1 -0
  319. package/tui/dist/topology/render-graph.d.ts +8 -0
  320. package/tui/dist/topology/render-graph.d.ts.map +1 -0
  321. package/tui/dist/topology/render-graph.js +20 -0
  322. package/tui/dist/topology/render-graph.js.map +1 -0
  323. package/tui/dist/topology/runtime-marks.d.ts +53 -0
  324. package/tui/dist/topology/runtime-marks.d.ts.map +1 -0
  325. package/tui/dist/topology/runtime-marks.js +185 -0
  326. package/tui/dist/topology/runtime-marks.js.map +1 -0
  327. package/tui/dist/topology/styles/braille.d.ts +5 -0
  328. package/tui/dist/topology/styles/braille.d.ts.map +1 -0
  329. package/tui/dist/topology/styles/braille.js +84 -0
  330. package/tui/dist/topology/styles/braille.js.map +1 -0
  331. package/tui/dist/topology/styles/hatchet.d.ts +41 -0
  332. package/tui/dist/topology/styles/hatchet.d.ts.map +1 -0
  333. package/tui/dist/topology/styles/hatchet.js +146 -0
  334. package/tui/dist/topology/styles/hatchet.js.map +1 -0
  335. package/tui/dist/types.d.ts +362 -0
  336. package/tui/dist/types.d.ts.map +1 -0
  337. package/tui/dist/types.js +6 -0
  338. package/tui/dist/types.js.map +1 -0
  339. package/ui/dist/assets/{index-DkNi0RT8.js → index-Dv5VaLCN.js} +135 -135
  340. package/ui/dist/index.html +1 -1
  341. package/dist/commands/context-pack.d.ts +0 -4
  342. package/dist/commands/context-pack.d.ts.map +0 -1
  343. package/dist/commands/context-pack.js +0 -357
  344. package/dist/commands/context-pack.js.map +0 -1
@@ -58,14 +58,33 @@ export class PluginVendorService {
58
58
  const srcPath = nodePath.join(sourceDir, relPath);
59
59
  const destPath = nodePath.join(targetDir, relPath);
60
60
  const content = this.fs.readFile(srcPath);
61
- // Hash-skip: only write if content differs (idempotent re-runs)
61
+ // Hash-skip: only write if content differs (idempotent re-runs). Reconcile mode even on
62
+ // skip — a byte-identical copy staged earlier may still carry the wrong (default) mode.
62
63
  if (this.fs.exists(destPath) && hashContent(this.fs.readFile(destPath)) === hashContent(content)) {
64
+ this.preserveMode(srcPath, destPath);
63
65
  continue;
64
66
  }
65
67
  this.fs.mkdirp(nodePath.dirname(destPath));
66
68
  this.fs.writeFile(destPath, content);
69
+ this.preserveMode(srcPath, destPath);
67
70
  }
68
71
  }
72
+ /**
73
+ * Reapply the source file's permission bits to the staged/projected dest. Plain
74
+ * readFile+writeFile (writeFileSync) creates the dest with the process default mode,
75
+ * dropping executable bits on nested plugin helpers (e.g. claude-compaction-restore/
76
+ * scripts/*.mjs, 0755). This vendor-staging hop (assets -> ~/.openrig/plugins) runs
77
+ * UPSTREAM of the adapter CWD projection, so an unfixed mode here strands 0644 in the
78
+ * staged copy that the adapters then faithfully preserve. No-op when the fs adapter does
79
+ * not expose mode primitives (keeps existing mock-fs callers unaffected).
80
+ */
81
+ preserveMode(src, dest) {
82
+ if (!this.fs.statMode || !this.fs.chmod)
83
+ return;
84
+ const srcMode = this.fs.statMode(src) & 0o777;
85
+ if ((this.fs.statMode(dest) & 0o777) !== srcMode)
86
+ this.fs.chmod(dest, srcMode);
87
+ }
69
88
  /** Project one plugin skill into the harness-global skill roots. */
70
89
  ensureSkillGlobally(pluginName, skillName, globalSkillRoots) {
71
90
  const sourceDir = nodePath.join(this.userPluginsDir, pluginName, "skills", skillName);
@@ -82,10 +101,12 @@ export class PluginVendorService {
82
101
  const content = this.fs.readFile(srcPath);
83
102
  if (this.fs.exists(destPath) &&
84
103
  hashContent(this.fs.readFile(destPath)) === hashContent(content)) {
104
+ this.preserveMode(srcPath, destPath);
85
105
  continue;
86
106
  }
87
107
  this.fs.mkdirp(nodePath.dirname(destPath));
88
108
  this.fs.writeFile(destPath, content);
109
+ this.preserveMode(srcPath, destPath);
89
110
  }
90
111
  }
91
112
  }
@@ -110,7 +131,10 @@ export class PluginVendorService {
110
131
  }
111
132
  // v0: tarball extraction NOT implemented — when slice 3.6 lands marketplace-
112
133
  // consumption, this is where fetch-then-extract logic lives. For now,
113
- // success path just logs.
134
+ // success path just logs. EXPLICIT MODE DECISION: v0 writes no files here, so there is
135
+ // no mode to preserve; the future extract path MUST route its writes through
136
+ // preserveMode() (or a tar extractor that preserves mode) so fetched executable helpers
137
+ // keep 0755 — same invariant as ensureVendored/ensureSkillGlobally.
114
138
  this.logger(`[plugin-vendor] fetch ${pluginName} succeeded (${response.status}); v0 vendored copy still authoritative`);
115
139
  }
116
140
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-vendor-service.js","sourceRoot":"","sources":["../../src/domain/plugin-vendor-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-vendor-service.js","sourceRoot":"","sources":["../../src/domain/plugin-vendor-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type ClaudeStatuslineReading } from "./provider-signals.js";
2
+ import type { ProviderSignal } from "./provider-types.js";
3
+ export interface ProviderUsageCacheFs {
4
+ readFile(path: string): string;
5
+ writeFile(path: string, content: string): void;
6
+ rename(from: string, to: string): void;
7
+ exists(path: string): boolean;
8
+ }
9
+ /** The on-disk provider_usage cache shape (authored by the Claude statusline sidecar). */
10
+ export interface ProviderUsageCache {
11
+ seatSession: string;
12
+ /** Present only when the statusline carried valid Pro/Max rate_limits. */
13
+ accountKind?: "subscription";
14
+ asOf: string;
15
+ /** Present only when the statusline carried a rate_limits object. */
16
+ rateLimits?: ClaudeStatuslineReading;
17
+ staleAfter?: string;
18
+ }
19
+ /**
20
+ * Atomic write: serialize to a tmp sibling, then rename over the target. rename(2) is atomic on the
21
+ * same filesystem, so a concurrent reader sees EITHER the old file OR the fully-written new one —
22
+ * never a half-written (torn) read. The sidecar uses this so the daemon never parses a partial cache.
23
+ */
24
+ export declare function writeProviderUsageCacheAtomic(fs: ProviderUsageCacheFs, path: string, cache: ProviderUsageCache): void;
25
+ export interface ClaudeSeatRef {
26
+ seatSession: string;
27
+ }
28
+ export interface ClaudeUsageReaderDeps {
29
+ /** The live Claude seats to read provider_usage for. */
30
+ listClaudeSeats: () => ClaudeSeatRef[];
31
+ /** Raw cache JSON for a seat, or null if the cache file is absent (pre-first-response). Never throws. */
32
+ readCacheRaw: (seatSession: string) => string | null;
33
+ now: () => string;
34
+ }
35
+ /**
36
+ * Read each Claude seat's provider_usage cache → provider_statusline rows via
37
+ * claudeStatuslineSignals. Explicit unknown rows for absent cache (no_statusline_cache_yet) and
38
+ * cache-present-but-no/-malformed windows (empty_reading).
39
+ * Never throws — a malformed cache is treated as present-with-no-windows, not a crash.
40
+ */
41
+ export declare function collectClaudeStatuslineSignals(deps: ClaudeUsageReaderDeps): ProviderSignal[];
42
+ /** Read the seat-keyed cache directory using the same path consumed by daemon startup. */
43
+ export declare function collectClaudeSignalsFromProviderUsageDirectory(directory: string, now?: () => string): ProviderSignal[];
44
+ //# sourceMappingURL=claude-usage-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-usage-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/claude-usage-reader.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,oBAAoB,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,kBAAkB,GACxB,IAAI,CAIN;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,eAAe,EAAE,MAAM,aAAa,EAAE,CAAC;IACvC,yGAAyG;IACzG,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,qBAAqB,GAAG,cAAc,EAAE,CAmC5F;AAED,0FAA0F;AAC1F,wBAAgB,8CAA8C,CAC5D,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,MAAuC,GACjD,cAAc,EAAE,CAsBlB"}
@@ -0,0 +1,112 @@
1
+ // Slice-04 (OPR.0.5.0.4) seam C3 — the Claude statusline provider_usage cache LANE.
2
+ // A statusline sidecar writes a per-seat provider_usage cache with an atomic tmp+rename (so a
3
+ // concurrent daemon read never sees a torn file); the daemon reads it here and normalizes it into
4
+ // provider_statusline signal rows via the existing claudeStatuslineSignals. Absent cache
5
+ // (pre-first-response) and empty/malformed readings each become an EXPLICIT
6
+ // unknown row with an unknownReason — never a missing row and never a fabricated zero. Never throws.
7
+ //
8
+ // SCOPE: this atom is the cache producer/reader + collectSignals wiring ONLY. It does not touch the
9
+ // C4 reactive tap, C2 Codex app-server, activity-accurate precheck, D switch execution, or BR-1.
10
+ import fs from "node:fs";
11
+ import nodePath from "node:path";
12
+ import { claudeStatuslineSignals } from "./provider-signals.js";
13
+ /**
14
+ * Atomic write: serialize to a tmp sibling, then rename over the target. rename(2) is atomic on the
15
+ * same filesystem, so a concurrent reader sees EITHER the old file OR the fully-written new one —
16
+ * never a half-written (torn) read. The sidecar uses this so the daemon never parses a partial cache.
17
+ */
18
+ export function writeProviderUsageCacheAtomic(fs, path, cache) {
19
+ const tmp = `${path}.tmp-${cache.asOf.replace(/[^0-9]/g, "")}`;
20
+ fs.writeFile(tmp, JSON.stringify(cache));
21
+ fs.rename(tmp, path);
22
+ }
23
+ /**
24
+ * Read each Claude seat's provider_usage cache → provider_statusline rows via
25
+ * claudeStatuslineSignals. Explicit unknown rows for absent cache (no_statusline_cache_yet) and
26
+ * cache-present-but-no/-malformed windows (empty_reading).
27
+ * Never throws — a malformed cache is treated as present-with-no-windows, not a crash.
28
+ */
29
+ export function collectClaudeStatuslineSignals(deps) {
30
+ const now = deps.now();
31
+ const out = [];
32
+ for (const seat of deps.listClaudeSeats()) {
33
+ let cachePresent = false;
34
+ let reading;
35
+ let staleAfter;
36
+ let capturedAsOf;
37
+ const raw = deps.readCacheRaw(seat.seatSession);
38
+ if (raw !== null) {
39
+ cachePresent = true;
40
+ try {
41
+ const parsed = JSON.parse(raw);
42
+ if (parsed.seatSession === seat.seatSession && parsed.accountKind === "subscription") {
43
+ reading = validRateLimits(parsed.rateLimits);
44
+ }
45
+ staleAfter = parsed.staleAfter;
46
+ capturedAsOf = typeof parsed.asOf === "string" ? parsed.asOf : undefined;
47
+ }
48
+ catch {
49
+ // Malformed cache → present-with-no-windows (empty_reading unknown), never a throw.
50
+ reading = undefined;
51
+ }
52
+ }
53
+ out.push(...claudeStatuslineSignals({
54
+ seatSession: seat.seatSession,
55
+ cachePresent,
56
+ reading,
57
+ // Signal asOf = when the reading was captured (the cache's asOf) when present+valid; else now.
58
+ asOf: cachePresent && capturedAsOf ? capturedAsOf : now,
59
+ staleAfter,
60
+ }));
61
+ }
62
+ return out;
63
+ }
64
+ /** Read the seat-keyed cache directory using the same path consumed by daemon startup. */
65
+ export function collectClaudeSignalsFromProviderUsageDirectory(directory, now = () => new Date().toISOString()) {
66
+ const seats = new Map();
67
+ try {
68
+ for (const file of fs.readdirSync(directory)) {
69
+ if (!file.endsWith(".json"))
70
+ continue;
71
+ try {
72
+ const parsed = JSON.parse(fs.readFileSync(nodePath.join(directory, file), "utf-8"));
73
+ if (typeof parsed.seatSession === "string") {
74
+ seats.set(parsed.seatSession, { seatSession: parsed.seatSession });
75
+ }
76
+ }
77
+ catch { /* malformed cache cannot create a usable cache signal */ }
78
+ }
79
+ }
80
+ catch { /* absent cache directory */ }
81
+ return collectClaudeStatuslineSignals({
82
+ listClaudeSeats: () => [...seats.values()],
83
+ readCacheRaw: (seatSession) => {
84
+ const safe = seatSession.replace(/[^a-zA-Z0-9@._-]/g, "_");
85
+ try {
86
+ return fs.readFileSync(nodePath.join(directory, `${safe}.json`), "utf-8");
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ },
92
+ now,
93
+ });
94
+ }
95
+ function validRateLimits(value) {
96
+ if (!value || typeof value !== "object" || Array.isArray(value))
97
+ return undefined;
98
+ const source = value;
99
+ const reading = {};
100
+ for (const key of ["five_hour", "seven_day"]) {
101
+ const raw = source[key];
102
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
103
+ continue;
104
+ const window = raw;
105
+ if (typeof window.usedPercent === "number" && Number.isFinite(window.usedPercent)
106
+ && typeof window.resetsAt === "string") {
107
+ reading[key] = { usedPercent: window.usedPercent, resetsAt: window.resetsAt };
108
+ }
109
+ }
110
+ return reading.five_hour || reading.seven_day ? reading : undefined;
111
+ }
112
+ //# sourceMappingURL=claude-usage-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-usage-reader.js","sourceRoot":"","sources":["../../../src/domain/provider/claude-usage-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface CodexSeatRow {
2
+ seat: string;
3
+ rig: string;
4
+ runtime: string;
5
+ cwd: string;
6
+ /** The codex-auth profile name this seat is registered against (opaque, non-secret). */
7
+ authProfile: string;
8
+ updatedTs: string;
9
+ }
10
+ export interface CodexAuthMetadata {
11
+ /** Profile NAMES (opaque, non-secret refs) — never file contents. */
12
+ profiles: string[];
13
+ seats: CodexSeatRow[];
14
+ }
15
+ /** Read the codex-auth on-disk METADATA (profile names + seat registry). Never throws; never
16
+ * surfaces token-class content. Absent home/files yield empty arrays. */
17
+ export declare function readCodexAuthMetadata(env?: NodeJS.ProcessEnv): CodexAuthMetadata;
18
+ //# sourceMappingURL=codex-auth-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-auth-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/codex-auth-reader.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,wFAAwF;IACxF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAgDD;0EAC0E;AAC1E,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAM7F"}
@@ -0,0 +1,64 @@
1
+ // Slice-04 (OPR.0.5.0.4) seam C1 — a DAEMON-LOCAL, secret-safe reader of the codex-auth on-disk
2
+ // contract. The daemon cannot import packages/cli (no @openrig/cli dep); this re-reads the same
3
+ // documented format: $CODEX_HOME||~/.codex with auth-profiles/*.json (profile NAMES) and
4
+ // auth-seat-registry.tsv (6 tab columns: seat/rig/runtime/cwd/auth_profile/updated_ts — NO token
5
+ // column). It reads profile NAMES and the TSV ONLY — never the profile *.json contents, which hold
6
+ // token-class material (BR-6: no secret ever surfaces).
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ const SEAT_COLUMN_COUNT = 6;
10
+ function resolveCodexHome(env) {
11
+ const codexHome = typeof env.CODEX_HOME === "string" && env.CODEX_HOME.length > 0
12
+ ? env.CODEX_HOME
13
+ : path.join(env.HOME ?? "", ".codex");
14
+ return {
15
+ profileDir: path.join(codexHome, "auth-profiles"),
16
+ registryPath: path.join(codexHome, "auth-seat-registry.tsv"),
17
+ };
18
+ }
19
+ // Profile NAMES only — the *.json file contents (token-class) are never opened.
20
+ function listProfiles(profileDir) {
21
+ try {
22
+ return fs
23
+ .readdirSync(profileDir)
24
+ .filter((n) => n.endsWith(".json"))
25
+ .map((n) => n.slice(0, -".json".length))
26
+ .sort();
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ function readSeats(registryPath) {
33
+ let raw;
34
+ try {
35
+ raw = fs.readFileSync(registryPath, "utf8");
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ const rows = [];
41
+ for (const line of raw.split("\n")) {
42
+ if (line.length === 0)
43
+ continue;
44
+ const cols = line.split("\t");
45
+ if (cols.length !== SEAT_COLUMN_COUNT)
46
+ continue; // skip malformed rows — never fabricate fields
47
+ // Length is exactly 6 above, so the tuple destructure is total (satisfies noUncheckedIndexedAccess).
48
+ const [seat, rig, runtime, cwd, authProfile, updatedTs] = cols;
49
+ if (seat === "seat")
50
+ continue; // the header row
51
+ rows.push({ seat, rig, runtime, cwd, authProfile, updatedTs });
52
+ }
53
+ return rows;
54
+ }
55
+ /** Read the codex-auth on-disk METADATA (profile names + seat registry). Never throws; never
56
+ * surfaces token-class content. Absent home/files yield empty arrays. */
57
+ export function readCodexAuthMetadata(env = process.env) {
58
+ const { profileDir, registryPath } = resolveCodexHome(env);
59
+ return {
60
+ profiles: listProfiles(profileDir),
61
+ seats: readSeats(registryPath),
62
+ };
63
+ }
64
+ //# sourceMappingURL=codex-auth-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-auth-reader.js","sourceRoot":"","sources":["../../../src/domain/provider/codex-auth-reader.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,gGAAgG;AAChG,yFAAyF;AACzF,iGAAiG;AACjG,mGAAmG;AACnG,wDAAwD;AAExD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,SAAS,gBAAgB,CAAC,GAAsB;IAC9C,MAAM,SAAS,GACb,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,UAAU;QAChB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;QACjD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,UAAkB;IACtC,IAAI,CAAC;QACH,OAAO,EAAE;aACN,WAAW,CAAC,UAAU,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACvC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,YAAoB;IACrC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,iBAAiB;YAAE,SAAS,CAAC,+CAA+C;QAChG,qGAAqG;QACrG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,IAAwD,CAAC;QACnH,IAAI,IAAI,KAAK,MAAM;YAAE,SAAS,CAAC,iBAAiB;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACxE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO;QACL,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC;QAClC,KAAK,EAAE,SAAS,CAAC,YAAY,CAAC;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { ProviderKind, ProviderSignal, SignalWindow } from "./provider-types.js";
2
+ /** Nearing = the shipped default advisory threshold on the C3-carried percentage. */
3
+ export declare const NEARING_THRESHOLD_PERCENT = 80;
4
+ /** Same-window resets_at spread tolerated as sampling skew before it is a CONFLICT.
5
+ * Two seats on ONE account can read the same window seconds apart; two different
6
+ * accounts' reset schedules differ by far more than this. */
7
+ export declare const CONFLICTING_RESETS_EPSILON_MS = 120000;
8
+ export type HostUsageState = "ok" | "nearing" | "limited" | "explicit_unknown";
9
+ export interface HostUsageWindowFact {
10
+ window: SignalWindow | "unknown";
11
+ usedPercent?: number;
12
+ resetsAt?: string;
13
+ asOf: string;
14
+ /** The contributing seat (topology identity, never an account identity). */
15
+ seatSession?: string;
16
+ }
17
+ export interface HostUsageConflictAnomaly {
18
+ kind: "conflicting_seat_windows";
19
+ window: SignalWindow | "unknown";
20
+ seats: string[];
21
+ evidence: string;
22
+ asOf: string;
23
+ }
24
+ export interface HostUsageRow {
25
+ /** The reserved LOCAL host id — this daemon's own scope (MH aggregation is out of scope). */
26
+ host: "local";
27
+ provider: ProviderKind;
28
+ state: HostUsageState;
29
+ /** For `limited`: when the limit lifts, when the source carried it. Honest absence otherwise. */
30
+ resetsAt?: string;
31
+ /** (iii) exactly the C3-carried granularity — never normalized-away, never invented. */
32
+ windows: HostUsageWindowFact[];
33
+ provenance: {
34
+ basis: "one_account_per_host_deployment_invariant";
35
+ note: string;
36
+ };
37
+ anomalies: HostUsageConflictAnomaly[];
38
+ /** Contributing evidence refs: seat sessions (C3) / labeled reactive events (C4). */
39
+ evidenceSeats: string[];
40
+ unknownReason?: string;
41
+ asOf: string;
42
+ }
43
+ export interface HostUsageRollupInput {
44
+ signals: ProviderSignal[];
45
+ /** Deployment presence for codex (auth profiles on disk) — presence without a meter is an
46
+ * explicit unknown, never an omitted row (the blindside must be visible). */
47
+ codexProfilesPresent: boolean;
48
+ now: string;
49
+ }
50
+ export declare function rollupHostUsage(input: HostUsageRollupInput): HostUsageRow[];
51
+ //# sourceMappingURL=host-usage-rollup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-usage-rollup.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/host-usage-rollup.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEtF,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;8DAE8D;AAC9D,eAAO,MAAM,6BAA6B,SAAU,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,6FAA6F;IAC7F,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,UAAU,EAAE;QACV,KAAK,EAAE,2CAA2C,CAAC;QACnD,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,qFAAqF;IACrF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B;kFAC8E;IAC9E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,EAAE,CAU3E"}
@@ -0,0 +1,162 @@
1
+ // Slice-04 S-A (OPR.0.5.0.4, founder re-center amendment A2) — HOST-LEVEL USAGE ROLLUP.
2
+ //
3
+ // Usage is metered per account and this deployment runs ONE account per host, so a
4
+ // usage-limit park is a HOST-level event. This module aggregates the seat-sourced
5
+ // signal rows (C3 Claude statusline lane, sealed 5b56a2a4 · C4 Codex reactive lane,
6
+ // sealed 6508330d) into ONE honest state row per (host, provider):
7
+ //
8
+ // ok | nearing | limited (until resets_at when known) | explicit_unknown
9
+ //
10
+ // THE THREE BINDING HONESTY CONDITIONS (PM pattern check, verbatim-class):
11
+ // (i) host==account is a DEPLOYMENT INVARIANT and every row SAYS so in its
12
+ // provenance — it is never presented as source-derived account
13
+ // classification (the C3 Option-A bar stands: the statusline carries no
14
+ // account identity and none is fabricated here). Rollup keys are
15
+ // (host, provider) ONLY; no account id/ref ever appears in a row.
16
+ // (ii) CONFLICTING seat windows on one host falsify the invariant for that
17
+ // host: they surface as a first-class `conflicting_seat_windows` anomaly
18
+ // plus an explicit_unknown host state — never a silent merge, never an
19
+ // averaged/fabricated number. The conflicting facts stay visible.
20
+ // (iii) usage-limit granularity rides ONLY what the C3 rows already carry
21
+ // (window / usedPercent / resetsAt / asOf) — nothing coerced, nothing
22
+ // invented. Codex has NO remaining-meter lane yet (C2 is a later seam),
23
+ // so codex state derives from fresh reactive EXHAUSTION evidence only,
24
+ // and its absence is an explicit unknown — never "ok" by silence.
25
+ //
26
+ // The single-daemon scope IS the host scope: rows carry host="local" (the
27
+ // reserved local host id). Multi-host aggregation is explicitly out of scope
28
+ // (the PRD's MH-lane later).
29
+ /** Nearing = the shipped default advisory threshold on the C3-carried percentage. */
30
+ export const NEARING_THRESHOLD_PERCENT = 80;
31
+ /** Same-window resets_at spread tolerated as sampling skew before it is a CONFLICT.
32
+ * Two seats on ONE account can read the same window seconds apart; two different
33
+ * accounts' reset schedules differ by far more than this. */
34
+ export const CONFLICTING_RESETS_EPSILON_MS = 120_000;
35
+ const PROVENANCE_NOTE = "host==account is a deployment invariant of this rig (one account per host), declared by the operator — " +
36
+ "it is not source-derived account classification, and no account identity is read or emitted.";
37
+ export function rollupHostUsage(input) {
38
+ const rows = [];
39
+ const claude = rollupClaude(input);
40
+ if (claude)
41
+ rows.push(claude);
42
+ const codex = rollupCodex(input);
43
+ if (codex)
44
+ rows.push(codex);
45
+ return rows;
46
+ }
47
+ // ——— Claude: the C3 seat-keyed statusline lane (meter rows + explicit-unknown rows) ———
48
+ function rollupClaude(input) {
49
+ const lane = input.signals.filter((s) => s.provider === "claude");
50
+ if (lane.length === 0)
51
+ return null; // no claude deployment presence → no row
52
+ const meterRows = lane.filter((s) => s.sourceClass === "provider_statusline" && typeof s.usedPercent === "number");
53
+ const windows = meterRows.map((s) => ({
54
+ window: s.window ?? "unknown",
55
+ usedPercent: s.usedPercent,
56
+ resetsAt: s.resetsAt,
57
+ asOf: s.asOf,
58
+ seatSession: s.seatSession,
59
+ }));
60
+ const evidenceSeats = [...new Set(lane.map((s) => s.seatSession).filter((x) => typeof x === "string"))];
61
+ const base = {
62
+ host: "local",
63
+ provider: "claude",
64
+ windows,
65
+ provenance: { basis: "one_account_per_host_deployment_invariant", note: PROVENANCE_NOTE },
66
+ anomalies: [],
67
+ evidenceSeats,
68
+ asOf: input.now,
69
+ };
70
+ if (meterRows.length === 0) {
71
+ // Only explicit-unknown seat rows (absent cache / pre-first-response / api-key):
72
+ // the host state is honestly unknown, carrying the lane's own reason.
73
+ const reason = lane.find((s) => s.unknownReason)?.unknownReason ?? "no_usable_claude_usage_rows";
74
+ return { ...base, state: "explicit_unknown", unknownReason: reason };
75
+ }
76
+ // (ii) conflict detection per window: under host==account, every seat reading the SAME
77
+ // window must see the SAME reset schedule (within sampling skew). A wider spread means
78
+ // the seats are watching DIFFERENT accounts — the invariant is falsified for this host.
79
+ const anomalies = [];
80
+ const byWindow = new Map();
81
+ for (const s of meterRows) {
82
+ const key = s.window ?? "unknown";
83
+ byWindow.set(key, [...(byWindow.get(key) ?? []), s]);
84
+ }
85
+ for (const [windowKey, group] of byWindow) {
86
+ const withResets = group.filter((s) => typeof s.resetsAt === "string");
87
+ if (withResets.length < 2)
88
+ continue;
89
+ const times = withResets.map((s) => Date.parse(s.resetsAt)).filter(Number.isFinite);
90
+ if (times.length < 2)
91
+ continue;
92
+ if (Math.max(...times) - Math.min(...times) > CONFLICTING_RESETS_EPSILON_MS) {
93
+ anomalies.push({
94
+ kind: "conflicting_seat_windows",
95
+ window: windowKey,
96
+ seats: [...new Set(withResets.map((s) => s.seatSession).filter((x) => typeof x === "string"))],
97
+ evidence: `seats report divergent ${windowKey} reset schedules on one host: ` +
98
+ withResets.map((s) => `${s.seatSession ?? "?"} resets_at=${s.resetsAt}`).join(" vs "),
99
+ asOf: input.now,
100
+ });
101
+ }
102
+ }
103
+ if (anomalies.length > 0) {
104
+ return {
105
+ ...base,
106
+ state: "explicit_unknown",
107
+ anomalies,
108
+ unknownReason: "conflicting_seat_windows: divergent reset schedules falsify the one-account-per-host invariant for this host",
109
+ };
110
+ }
111
+ const maxUsed = Math.max(...meterRows.map((s) => s.usedPercent));
112
+ if (maxUsed >= 100) {
113
+ const exhausted = meterRows.filter((s) => s.usedPercent >= 100);
114
+ const resets = exhausted
115
+ .map((s) => s.resetsAt)
116
+ .filter((x) => typeof x === "string")
117
+ .sort();
118
+ return { ...base, state: "limited", ...(resets[0] !== undefined ? { resetsAt: resets[0] } : {}) };
119
+ }
120
+ if (maxUsed >= NEARING_THRESHOLD_PERCENT)
121
+ return { ...base, state: "nearing" };
122
+ return { ...base, state: "ok" };
123
+ }
124
+ // ——— Codex: the C4 reactive lane (exhaustion evidence only — no meter until C2) ———
125
+ function rollupCodex(input) {
126
+ const lane = input.signals.filter((s) => s.provider === "codex");
127
+ if (lane.length === 0 && !input.codexProfilesPresent)
128
+ return null; // no deployment presence
129
+ const nowMs = Date.parse(input.now);
130
+ // At-limit exhaustion evidence = a reactive_error event row the C4 tap marked as an
131
+ // actionable switch trigger (at_limit → allow_switch_decision; stream/stop errors are
132
+ // advisory and are NOT usage evidence). Freshness is inclusive-expiry (BR-2 class).
133
+ const freshAtLimit = lane.filter((s) => s.sourceClass === "provider_event" &&
134
+ s.authority === "reactive_error" &&
135
+ s.automationUse === "allow_switch_decision" &&
136
+ typeof s.staleAfter === "string" &&
137
+ Number.isFinite(Date.parse(s.staleAfter)) &&
138
+ Number.isFinite(nowMs) &&
139
+ nowMs < Date.parse(s.staleAfter));
140
+ const base = {
141
+ host: "local",
142
+ provider: "codex",
143
+ windows: [], // (iii): codex carries no remaining-meter granularity yet — nothing is invented
144
+ provenance: { basis: "one_account_per_host_deployment_invariant", note: PROVENANCE_NOTE },
145
+ anomalies: [],
146
+ evidenceSeats: freshAtLimit.map((s) => `reactive_event asOf=${s.asOf}`),
147
+ asOf: input.now,
148
+ };
149
+ if (freshAtLimit.length > 0) {
150
+ const resets = freshAtLimit
151
+ .map((s) => s.resetsAt)
152
+ .filter((x) => typeof x === "string")
153
+ .sort();
154
+ return { ...base, state: "limited", ...(resets[0] !== undefined ? { resetsAt: resets[0] } : {}) };
155
+ }
156
+ return {
157
+ ...base,
158
+ state: "explicit_unknown",
159
+ unknownReason: "no usage meter for codex on this host yet (the app-server read lane is a later seam); no fresh at-limit evidence either way",
160
+ };
161
+ }
162
+ //# sourceMappingURL=host-usage-rollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-usage-rollup.js","sourceRoot":"","sources":["../../../src/domain/provider/host-usage-rollup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CodexAuthMetadata } from "./codex-auth-reader.js";
2
+ import type { FourBlockReadModel, ProviderSignal } from "./provider-types.js";
3
+ import type { NodeLifecycleState } from "../types.js";
4
+ /** One seat in the fleet (the universe to bind), sourced from node-inventory across rigs. */
5
+ export interface ProviderSeat {
6
+ seatSession: string;
7
+ rigName: string;
8
+ runtime: string;
9
+ lifecycleState: NodeLifecycleState;
10
+ }
11
+ export interface ProviderCollectDeps {
12
+ /** Reads codex-auth on-disk METADATA (profile names + seat registry) — never token content. */
13
+ readCodexAuth: () => CodexAuthMetadata;
14
+ /** The current seat universe (node-inventory across all rigs). */
15
+ listSeats: () => ProviderSeat[];
16
+ /** signals[] — empty until the live Codex/Claude/reactive collection lane is wired. */
17
+ collectSignals?: () => ProviderSignal[];
18
+ /** A real caller-provided clock; the read model's asOf (anomalies borrow it, never invented). */
19
+ now: () => string;
20
+ }
21
+ export declare function collectFourBlockReadModel(deps: ProviderCollectDeps): FourBlockReadModel;
22
+ //# sourceMappingURL=provider-collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-collect.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-collect.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,OAAO,KAAK,EAAE,kBAAkB,EAAmB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,+FAA+F;IAC/F,aAAa,EAAE,MAAM,iBAAiB,CAAC;IACvC,kEAAkE;IAClE,SAAS,EAAE,MAAM,YAAY,EAAE,CAAC;IAChC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,cAAc,EAAE,CAAC;IACxC,iGAAiG;IACjG,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CAsEvF"}