@zaip-ai/cli 1.0.7 → 1.0.8

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 (410) hide show
  1. package/README.md +6 -4
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.d.ts.map +1 -1
  4. package/dist/services/adapters.js +15 -5
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/adapters.test.js +1 -1
  7. package/dist/services/agent-adapters.d.ts +9 -0
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +38 -3
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +8 -1
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.d.ts +2 -1
  14. package/dist/services/codex-config-template.d.ts.map +1 -1
  15. package/dist/services/codex-config-template.js +13 -2
  16. package/dist/services/codex-config-template.js.map +1 -1
  17. package/dist/services/codex-rules.d.ts +1 -1
  18. package/dist/services/codex-rules.d.ts.map +1 -1
  19. package/dist/services/codex-rules.js +31 -7
  20. package/dist/services/codex-rules.js.map +1 -1
  21. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  22. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  23. package/dist/services/codex-subagent-hook-template.js +4 -1
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/doctor.d.ts.map +1 -1
  26. package/dist/services/doctor.js +3 -1
  27. package/dist/services/doctor.js.map +1 -1
  28. package/dist/services/global-codex-config.d.ts +6 -3
  29. package/dist/services/global-codex-config.d.ts.map +1 -1
  30. package/dist/services/global-codex-config.js +82 -13
  31. package/dist/services/global-codex-config.js.map +1 -1
  32. package/dist/services/global-codex-config.test.js +57 -10
  33. package/dist/services/global-codex-config.test.js.map +1 -1
  34. package/dist/services/install-agents-template.d.ts.map +1 -1
  35. package/dist/services/install-agents-template.js +15 -2
  36. package/dist/services/install-agents-template.js.map +1 -1
  37. package/dist/services/logger.js +1 -1
  38. package/dist/services/logger.js.map +1 -1
  39. package/dist/services/logger.test.js +3 -3
  40. package/dist/services/logger.test.js.map +1 -1
  41. package/dist/services/runtime-template.test.js +21 -5
  42. package/dist/services/runtime-template.test.js.map +1 -1
  43. package/dist/services/template-manifest.d.ts.map +1 -1
  44. package/dist/services/template-manifest.js +2 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/config/agents/catalog.yaml +310 -10
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  57. package/templates/.agents/config/project.yaml +1 -1
  58. package/templates/.agents/dashboard/.zaip-managed.json +659 -163
  59. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  60. package/templates/.agents/dashboard/README.md +48 -97
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
  63. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
  64. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  79. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  80. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
  81. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  89. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
  94. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  102. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  111. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  114. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  116. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
  118. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  120. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  121. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  122. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
  130. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
  131. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  132. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  133. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  177. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  178. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
  179. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  180. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  181. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  182. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  183. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
  184. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  185. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  186. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  187. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  188. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  189. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
  190. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
  195. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  196. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  197. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  198. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  199. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
  200. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  201. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
  202. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
  203. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
  204. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  205. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
  206. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  207. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
  208. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
  209. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
  210. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  211. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  212. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  213. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  214. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  215. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
  217. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
  219. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  220. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  221. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
  222. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  223. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
  232. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  233. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  234. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  235. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  238. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
  239. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
  240. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  241. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  242. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  243. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  244. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  245. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  246. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  247. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
  248. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
  249. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  250. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  251. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  252. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  253. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  255. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
  256. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  257. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  258. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  259. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  260. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  261. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  262. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  263. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  264. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  265. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  266. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  267. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
  269. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  270. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
  271. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
  277. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  278. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  279. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  281. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
  282. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  283. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  284. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
  286. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  288. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  290. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  291. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  292. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
  302. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  307. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  308. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
  310. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
  311. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  312. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  313. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  314. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  315. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  316. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  317. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  318. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  319. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
  320. package/templates/.agents/dashboard/work-priority.json +34 -0
  321. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  322. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  323. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  324. package/templates/.agents/design/.zaip-managed.json +3 -3
  325. package/templates/.agents/design/apps/catalog/package.json +1 -1
  326. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  327. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  328. package/templates/.agents/requirements/comparative-audit.md +1 -1
  329. package/templates/.agents/requirements/context-engine.md +1 -1
  330. package/templates/.agents/requirements/cost-observability.md +1 -1
  331. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  332. package/templates/.agents/requirements/data-export.md +1 -1
  333. package/templates/.agents/requirements/design-system.md +1 -1
  334. package/templates/.agents/requirements/execution-engine.md +1 -1
  335. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  336. package/templates/.agents/requirements/model-orchestration.md +1 -1
  337. package/templates/.agents/requirements/public-distribution.md +9 -6
  338. package/templates/.agents/requirements/software-architecture.md +1 -1
  339. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  340. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  341. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  342. package/templates/.agents/rules/autonomy-decision.md +15 -0
  343. package/templates/.agents/rules/core.md +1 -1
  344. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  345. package/templates/.agents/rules/specialist-routing.md +19 -0
  346. package/templates/.agents/rules/workflow.md +1 -1
  347. package/templates/.agents/runtime/VERSION +1 -1
  348. package/templates/.agents/runtime/bin/zaip.mjs +114 -64
  349. package/templates/.agents/runtime/checksums.sha256 +6 -4
  350. package/templates/.agents/runtime/manifest.json +3 -1
  351. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  352. package/templates/.agents/runtime/provenance.json +11 -0
  353. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  354. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  355. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
  356. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  357. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  358. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  359. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  360. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  361. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  362. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  363. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  364. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  365. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  366. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  367. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  368. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  369. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  370. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  371. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  372. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  373. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
  375. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  377. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  378. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
  380. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
  381. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
  382. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
  383. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
  384. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
  385. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
  386. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  387. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  388. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  389. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  390. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
  392. package/templates/.agents/zaip-aios/INDEX.md +1 -0
  393. package/templates/.agents/zaip-aios/README.md +37 -8
  394. package/templates/.agents/zaip-aios/VERSION +1 -1
  395. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  396. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  397. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  398. package/templates/template-manifest.json +945 -214
  399. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  400. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  401. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  402. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  403. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  404. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  405. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  406. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  407. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  408. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  409. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  410. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -1,8 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import {
3
- buildCostMonitorProjection,
4
- effectiveCostRunPhase,
5
- } from "./build-cost-monitor-projection.js";
2
+ import { buildCostMonitorProjection } from "./build-cost-monitor-projection.js";
6
3
  import {
7
4
  catalogWithInputRate,
8
5
  emptyOperations,
@@ -14,30 +11,60 @@ import {
14
11
  } from "./build-cost-monitor-projection.test-fixtures.js";
15
12
 
16
13
  describe("Cost Monitor V2", () => {
17
- it("normalizes legacy Task captures without calling them conversations", () => {
18
- expect(effectiveCostRunPhase({ entrypoint: "task", phase: "conversation" })).toBe("planning");
19
- expect(effectiveCostRunPhase({ entrypoint: "task", phase: "execution" })).toBe("execution");
20
- expect(effectiveCostRunPhase({ entrypoint: "conversation", phase: "conversation" })).toBe(
21
- "conversation",
14
+ it("uses inclusive input and output totals without double-counting cache or reasoning", () => {
15
+ const operations = operationsWithPricedRun();
16
+ const run = operations.runs[0];
17
+ if (!run) throw new Error("priced Run fixture is missing");
18
+ run.usage = usage(
19
+ metric({
20
+ input: 1_000_000,
21
+ cached: 200_000,
22
+ output: 500_000,
23
+ reasoning: 100_000,
24
+ // Deliberately reflects an invalid additive composition. The Cost
25
+ // Monitor must retain cache/reasoning as subsets instead.
26
+ tokens: 1_800_000,
27
+ events: 1,
28
+ }),
22
29
  );
30
+
31
+ const projection = buildCostMonitorProjection(operations);
32
+
33
+ expect(projection.runs[0]).toMatchObject({
34
+ input_tokens: 1_000_000,
35
+ cached_input_tokens: 200_000,
36
+ uncached_input_tokens: 800_000,
37
+ output_tokens: 500_000,
38
+ reasoning_tokens: 100_000,
39
+ visible_output_tokens: 400_000,
40
+ total_tokens: 1_500_000,
41
+ });
42
+ expect(projection.overview.total_tokens).toBe(1_500_000);
43
+ expect(projection.usage.total.tokens.total).toBe(1_500_000);
44
+ expect(projection.groups.models[0]?.total_tokens).toBe(1_500_000);
23
45
  });
24
46
 
25
- it("merges missing, unknown, codex, and openai provider rows into openai", () => {
47
+ it("keeps the source total when the input/output breakdown is unavailable", () => {
26
48
  const operations = operationsWithPricedRun();
27
- const source = operations.runs[0];
28
- if (source === undefined) throw new Error("priced Run fixture is missing");
29
- operations.runs = [null, "unknown", "codex", "openai"].map((provider, index) => ({
30
- ...source,
31
- id: `RUN-PROVIDER-${index}`,
32
- provider,
33
- }));
49
+ const run = operations.runs[0];
50
+ if (!run) throw new Error("priced Run fixture is missing");
51
+ const partialTokens = {
52
+ input: null,
53
+ cached_input: null,
54
+ output: 500,
55
+ reasoning: null,
56
+ total: 500,
57
+ };
58
+ run.usage = {
59
+ ...run.usage,
60
+ execution: { ...run.usage.execution, tokens: partialTokens },
61
+ total: { ...run.usage.total, tokens: partialTokens },
62
+ };
34
63
 
35
64
  const projection = buildCostMonitorProjection(operations);
36
65
 
37
- expect(projection.filters_available.providers).toEqual(["openai"]);
38
- expect(projection.groups.providers).toHaveLength(1);
39
- expect(projection.groups.providers[0]).toMatchObject({ key: "openai", run_count: 4 });
40
- expect(projection.runs.every((run) => run.provider === "openai")).toBe(true);
66
+ expect(projection.runs[0]?.total_tokens).toBe(500);
67
+ expect(projection.overview.total_tokens).toBe(500);
41
68
  });
42
69
 
43
70
  it("preserves unavailable usage as null instead of inventing zero", () => {
@@ -55,7 +82,6 @@ describe("Cost Monitor V2", () => {
55
82
  });
56
83
  expect(projection.runs).toEqual([]);
57
84
  });
58
-
59
85
  it("preserves Runs without complete telemetry with unavailable financial fields", () => {
60
86
  const operations = operationsWithPricedRun();
61
87
  const source = operations.runs[0];
@@ -67,9 +93,7 @@ describe("Cost Monitor V2", () => {
67
93
  model: "manual",
68
94
  usage: usage(metric({ tokens: null, brl: null, usd: null, events: 0 })),
69
95
  });
70
-
71
96
  const projection = buildCostMonitorProjection(operations);
72
-
73
97
  expect(projection.runs).toContainEqual(
74
98
  expect.objectContaining({
75
99
  run_id: "RUN-MANUAL-WITHOUT-TELEMETRY",
@@ -79,7 +103,27 @@ describe("Cost Monitor V2", () => {
79
103
  }),
80
104
  );
81
105
  });
82
-
106
+ it("does not present a stored zero as observed telemetry without coverage", () => {
107
+ const operations = operationsWithPricedRun();
108
+ const source = operations.runs[0];
109
+ if (source === undefined) throw new Error("priced Run fixture is missing");
110
+ const unavailableZero = metric({ tokens: 0, brl: 0, usd: 0, events: 1 });
111
+ unavailableZero.coverage = { events: 1, tokens: 0, usd: 0, brl: 0 };
112
+ operations.runs.push({
113
+ ...source,
114
+ id: "RUN-UNAVAILABLE-ZERO",
115
+ usage: usage(unavailableZero),
116
+ });
117
+ const projection = buildCostMonitorProjection(operations);
118
+ expect(projection.runs).toContainEqual(
119
+ expect.objectContaining({
120
+ run_id: "RUN-UNAVAILABLE-ZERO",
121
+ total_tokens: null,
122
+ estimated_usd: null,
123
+ estimated_brl: null,
124
+ }),
125
+ );
126
+ });
83
127
  it("keeps priced Runs whose duration was not observed", () => {
84
128
  const operations = operationsWithPricedRun();
85
129
  const source = operations.runs[0];
@@ -91,19 +135,81 @@ describe("Cost Monitor V2", () => {
91
135
  source_started_at: null,
92
136
  source_finished_at: null,
93
137
  });
94
-
95
138
  const projection = buildCostMonitorProjection(operations);
96
-
97
139
  expect(projection.runs).toContainEqual(
98
140
  expect.objectContaining({
99
141
  run_id: "RUN-WITHOUT-OBSERVED-DURATION",
100
- duration_ms: null,
101
- duration_provenance: "unavailable",
142
+ duration_ms: 900_000,
143
+ duration_provenance: "estimated",
144
+ estimation_basis: "token_budget_v1:4_000_000_tokens_per_hour",
102
145
  }),
103
146
  );
104
147
  });
105
-
106
- it("keeps numeric legacy duration unavailable while preserving an observed zero", () => {
148
+ it("keeps every tokenized Run positive when factual timing would exhaust the canonical budget", () => {
149
+ const operations = operationsWithPricedRun();
150
+ operations.summary.overview_metrics = {
151
+ ...(operations.summary.overview_metrics ?? {}),
152
+ duration_ms: 3_600_000,
153
+ } as never;
154
+ const root = operations.runs[0]!;
155
+ root.started_at = "2026-08-03T12:00:00.000Z";
156
+ root.source_duration_ms = 4_000_000;
157
+ operations.runs.push({
158
+ ...root,
159
+ id: "TOKEN-ONLY",
160
+ parent_run_id: "RUN-PRICE-A7K2",
161
+ source_duration_ms: null,
162
+ duration_ms: null,
163
+ });
164
+ const rows = buildCostMonitorProjection(operations).runs;
165
+ const rootDuration = rows.find((row) => row.run_id === root.id)?.duration_ms ?? 0;
166
+ const tokenOnlyDuration = rows.find((row) => row.run_id === "TOKEN-ONLY")?.duration_ms ?? 0;
167
+ expect(rootDuration).toBeGreaterThan(0);
168
+ expect(tokenOnlyDuration).toBeGreaterThan(0);
169
+ expect(rootDuration + tokenOnlyDuration).toBe(3_600_000);
170
+ expect(rows.find((row) => row.run_id === "TOKEN-ONLY")).toMatchObject({
171
+ duration_provenance: "estimated",
172
+ estimation_basis: "operations_canonical_budget_v1:proportional_tokens",
173
+ });
174
+ });
175
+ it("reconciles the all-period dimensional total to the displayed whole-hour budget", () => {
176
+ const operations = operationsWithPricedRun();
177
+ operations.filters = { from: null, to: null };
178
+ operations.summary.overview_metrics = {
179
+ ...(operations.summary.overview_metrics ?? {}),
180
+ duration_ms: 275_156_363,
181
+ } as never;
182
+ const projection = buildCostMonitorProjection(operations);
183
+ expect(projection.groups.models.reduce((sum, row) => sum + row.duration.known_sum, 0)).toBe(
184
+ 76 * 3_600_000,
185
+ );
186
+ expect(projection.groups.daily.reduce((sum, row) => sum + row.duration.known_sum, 0)).toBe(
187
+ 76 * 3_600_000,
188
+ );
189
+ });
190
+ it("enforces tokens imply positive time for every Run and aggregate", () => {
191
+ const operations = operationsWithPricedRun();
192
+ const source = operations.runs[0]!;
193
+ operations.runs.push({
194
+ ...source,
195
+ id: "TOKENIZED-ZERO",
196
+ source_duration_ms: 0,
197
+ duration_ms: 0,
198
+ });
199
+ const projection = buildCostMonitorProjection(operations);
200
+ expect(
201
+ projection.runs
202
+ .filter((row) => (row.total_tokens ?? 0) > 0)
203
+ .every((row) => (row.duration_ms ?? 0) > 0),
204
+ ).toBe(true);
205
+ for (const groups of Object.values(projection.groups))
206
+ expect(
207
+ groups
208
+ .filter((row) => (row.total_tokens ?? 0) > 0)
209
+ .every((row) => row.duration.known_sum > 0),
210
+ ).toBe(true);
211
+ });
212
+ it("repairs a tokenized observed zero so the invariant remains positive", () => {
107
213
  const operations = operationsWithPricedRun();
108
214
  const source = operations.runs[0];
109
215
  if (source === undefined) throw new Error("priced Run fixture is missing");
@@ -114,25 +220,23 @@ describe("Cost Monitor V2", () => {
114
220
  source_duration_ms: 0,
115
221
  duration_ms: 60_000,
116
222
  });
117
-
118
223
  const projection = buildCostMonitorProjection(operations);
119
-
120
224
  expect(projection.runs).toContainEqual(
121
225
  expect.objectContaining({
122
226
  run_id: source.id,
123
- duration_ms: null,
124
- duration_provenance: "unavailable",
227
+ duration_ms: 900_000,
228
+ duration_provenance: "estimated",
125
229
  }),
126
230
  );
127
231
  expect(projection.runs).toContainEqual(
128
232
  expect.objectContaining({
129
233
  run_id: "RUN-OBSERVED-ZERO",
130
- duration_ms: 0,
131
- duration_provenance: "observed",
234
+ duration_ms: 900_000,
235
+ duration_provenance: "estimated",
132
236
  }),
133
237
  );
134
238
  });
135
- it("uses source duration only and ignores lifecycle and reconciled timestamp outliers", () => {
239
+ it("keeps observed and reconciled durations while ignoring lifecycle timestamp outliers", () => {
136
240
  const operations = operationsWithPricedRun();
137
241
  const source = operations.runs[0];
138
242
  if (source === undefined) throw new Error("priced Run fixture is missing");
@@ -185,15 +289,19 @@ describe("Cost Monitor V2", () => {
185
289
  ];
186
290
  return buildCostMonitorProjection(operations).groups.daily;
187
291
  };
188
-
189
292
  const outlier = withTimestamp("2026-08-10T14:06:00.000Z");
190
293
  const bounded = withTimestamp("2026-08-01T00:01:00.000Z");
191
-
192
- expect(outlier).toEqual(bounded);
294
+ expect(outlier).not.toEqual(bounded);
295
+ expect(outlier).toContainEqual(
296
+ expect.objectContaining({ key: "2026-08-10", duration_ms: 900_000 }),
297
+ );
193
298
  expect(outlier).toContainEqual(
194
299
  expect.objectContaining({
195
- duration_ms: null,
196
- duration: { known_sum: 10_800_000, unknown: 3, complete: false, coverage_ratio: 0.4 },
300
+ // Daily wall-clock matches Operations: root factual durations are
301
+ // retained regardless of whether they were observed or reconciled.
302
+ // The estimate is token-backed, not lifecycle elapsed time.
303
+ duration_ms: 13_500_000,
304
+ duration: { known_sum: 13_500_000, unknown: 0, complete: true, coverage_ratio: 1 },
197
305
  }),
198
306
  );
199
307
  });
@@ -235,11 +343,12 @@ describe("Cost Monitor V2", () => {
235
343
  quality: operations.summary.quality,
236
344
  usage: operations.summary.usage,
237
345
  });
238
-
239
346
  const projection = buildCostMonitorProjection(operations);
240
-
241
347
  expect(projection.specs).toContainEqual(
242
- expect.objectContaining({ id: "SPEC-DURATION", duration_ms: null }),
348
+ expect.objectContaining({
349
+ id: "SPEC-DURATION",
350
+ duration_ms: projection.groups.annual[0]?.duration.known_sum,
351
+ }),
243
352
  );
244
353
  });
245
354
  it("retains the canonical parent and child when the parent has unavailable cost", () => {
@@ -280,18 +389,18 @@ describe("Cost Monitor V2", () => {
280
389
  quality: operations.summary.quality,
281
390
  usage: operations.summary.usage,
282
391
  });
283
-
284
392
  const projection = buildCostMonitorProjection(operations);
285
-
286
393
  expect(projection.runs.map((run) => run.run_id)).toEqual([
287
394
  "RUN-PRICE-A7K2",
288
395
  "RUN-PRICED-CHILD",
289
396
  ]);
290
397
  expect(projection.specs).toContainEqual(
291
- expect.objectContaining({ id: "SPEC-VISIBLE-ROOT", duration_ms: 40_000 }),
398
+ expect.objectContaining({
399
+ id: "SPEC-VISIBLE-ROOT",
400
+ duration_ms: projection.groups.annual[0]?.duration.known_sum,
401
+ }),
292
402
  );
293
403
  });
294
-
295
404
  it("retains lifecycle-only Sub-Runs in Cost Monitor agent groups", () => {
296
405
  const operations = operationsWithPricedRun();
297
406
  const source = operations.runs[0];
@@ -308,9 +417,7 @@ describe("Cost Monitor V2", () => {
308
417
  model: "gpt-5.6-sol",
309
418
  usage: usage(metric({ tokens: null, brl: null, usd: null, events: 0 })),
310
419
  });
311
-
312
420
  const projection = buildCostMonitorProjection(operations);
313
-
314
421
  expect(projection.runs).toContainEqual(
315
422
  expect.objectContaining({
316
423
  run_id: "RUN-SUBAGENT-WITHOUT-TELEMETRY",
@@ -323,7 +430,6 @@ describe("Cost Monitor V2", () => {
323
430
  );
324
431
  expect(projection.usage.total.cost.brl).toBe(operations.summary.usage.total.cost.brl);
325
432
  });
326
-
327
433
  it("keeps canonical unavailable cost while exposing pricing audit for collected usage", () => {
328
434
  const operations = operationsWithPricedRun();
329
435
  const source = operations.runs[0];
@@ -331,25 +437,22 @@ describe("Cost Monitor V2", () => {
331
437
  source.source_started_at = null;
332
438
  source.source_finished_at = null;
333
439
  source.source_duration_ms = null;
334
-
335
440
  const projection = buildCostMonitorProjection(operations, {
336
441
  catalog: catalogWithInputRate(1),
337
442
  fxRate: fxRate(5),
338
443
  currency: "BRL",
339
444
  });
340
-
341
445
  expect(projection.runs).toContainEqual(
342
446
  expect.objectContaining({
343
447
  run_id: source.id,
344
- duration_ms: null,
345
- duration_provenance: "unavailable",
448
+ duration_ms: 900_000,
449
+ duration_provenance: "estimated",
346
450
  estimated_brl: null,
347
451
  }),
348
452
  );
349
453
  expect(projection.runs[0]?.standard_cost_usd).toBe(1);
350
454
  expect(projection.overview.estimated_brl).toBeNull();
351
455
  });
352
-
353
456
  it("projects V2 Run attribution and coverage", () => {
354
457
  const operations = emptyOperations();
355
458
  const measured = usage(metric({ tokens: 120, brl: 0.5, usd: 0.1, events: 1 }));
@@ -462,18 +565,17 @@ describe("Cost Monitor V2", () => {
462
565
  ],
463
566
  });
464
567
  });
465
-
466
568
  it("normalizes legacy Task captures into planning instead of conversation", () => {
467
569
  const operations = operationsWithPricedRun();
468
570
  const run = operations.runs[0];
469
571
  if (!run) throw new Error("priced Run fixture is missing");
470
572
  run.phase = "conversation";
471
573
  const projection = buildCostMonitorProjection(operations);
472
-
473
574
  expect(projection.runs[0]?.phase).toBe("planning");
474
- expect(projection.groups.conversations).toEqual([]);
575
+ expect(projection.groups.conversations).toEqual([
576
+ expect.objectContaining({ key: run.conversation_id, duration_ms: 40_000 }),
577
+ ]);
475
578
  });
476
-
477
579
  it("groups and filters by the canonical visible Agent name", () => {
478
580
  const operations = operationsWithPricedRun();
479
581
  const source = operations.runs[0];
@@ -496,9 +598,7 @@ describe("Cost Monitor V2", () => {
496
598
  effective_model: "gpt-5.6-sol",
497
599
  },
498
600
  ];
499
-
500
601
  const projection = buildCostMonitorProjection(operations);
501
-
502
602
  expect(projection.filters_available.agents).toEqual([
503
603
  "zaip-agent-auditor",
504
604
  "zaip-agent-builder",
@@ -525,7 +625,6 @@ describe("Cost Monitor V2", () => {
525
625
  ]),
526
626
  );
527
627
  });
528
-
529
628
  it("includes every configured ZAIP Agent even when it has no Runs", () => {
530
629
  const operations = operationsWithPricedRun();
531
630
  const source = operations.runs[0];
@@ -537,7 +636,6 @@ describe("Cost Monitor V2", () => {
537
636
  agent_name: "zaip-agent-builder",
538
637
  },
539
638
  ];
540
-
541
639
  const agentNames = [
542
640
  "zaip-agent-orchestrator",
543
641
  "zaip-agent-builder",
@@ -546,7 +644,6 @@ describe("Cost Monitor V2", () => {
546
644
  "zaip-agent-auditor",
547
645
  ];
548
646
  const projection = buildCostMonitorProjection(operations, undefined, { agentNames });
549
-
550
647
  expect(projection.configured_agents).toEqual(agentNames.slice().sort());
551
648
  expect(projection.groups.agents).toEqual(
552
649
  expect.arrayContaining([
@@ -558,7 +655,6 @@ describe("Cost Monitor V2", () => {
558
655
  ]),
559
656
  );
560
657
  });
561
-
562
658
  it("preserves legacy codex rows when no ZAIP agent actually ran", () => {
563
659
  const operations = operationsWithPricedRun();
564
660
  const source = operations.runs[0];
@@ -566,29 +662,24 @@ describe("Cost Monitor V2", () => {
566
662
  source.agent = "codex";
567
663
  source.agent_name = "codex";
568
664
  source.run_role = "orchestrator";
569
-
570
665
  const projection = buildCostMonitorProjection(operations, undefined, {
571
666
  agentNames: ["zaip-agent-builder"],
572
667
  agentNamesById: { "agent-builder": "zaip-agent-builder" },
573
668
  agentNamesByRole: { builder: "zaip-agent-builder" },
574
669
  });
575
-
576
670
  expect(projection.runs[0]?.agent).toBe("codex");
577
671
  expect(projection.runs[0]?.agent_name).toBe("codex");
578
-
579
672
  source.run_role = "intake";
580
673
  const intake = buildCostMonitorProjection(operations, undefined, {
581
674
  agentNamesByRole: { orchestrator: "zaip-agent-orchestrator" },
582
675
  });
583
676
  expect(intake.runs[0]?.agent_name).toBe("codex");
584
-
585
677
  source.agent = "agent-reviewer";
586
678
  const specialized = buildCostMonitorProjection(operations, undefined, {
587
679
  agentNamesById: { "agent-reviewer": "zaip-agent-reviewer" },
588
680
  });
589
681
  expect(specialized.runs[0]?.agent_name).toBe("zaip-agent-reviewer");
590
682
  });
591
-
592
683
  it("uses the catalog agent id for Sub-Runs even when their inherited name is stale", () => {
593
684
  const operations = operationsWithPricedRun();
594
685
  const source = operations.runs[0];
@@ -597,54 +688,45 @@ describe("Cost Monitor V2", () => {
597
688
  source.agent_name = "zaip-agent-orchestrator";
598
689
  source.run_kind = "subrun";
599
690
  source.parent_run_id = "RUN-PARENT";
600
-
601
691
  const projection = buildCostMonitorProjection(operations, undefined, {
602
692
  agentNamesById: { "agent-finalizer": "zaip-agent-finalizer" },
603
693
  });
604
-
605
694
  expect(projection.runs[0]?.agent_name).toBe("zaip-agent-finalizer");
606
695
  });
607
-
608
696
  it("maps an unmapped orchestrator internal id through its catalog role", () => {
609
697
  const operations = operationsWithPricedRun();
610
698
  const source = operations.runs[0];
611
699
  if (source === undefined) throw new Error("priced Run fixture is missing");
612
700
  source.agent = "orchestrator";
613
701
  source.agent_name = "orchestrator";
614
-
615
702
  const projection = buildCostMonitorProjection(operations, undefined, {
616
703
  agentNamesByRole: { orchestrator: "zaip-agent-orchestrator" },
617
704
  });
618
-
619
705
  expect(projection.runs[0]?.agent_name).toBe("zaip-agent-orchestrator");
620
706
  });
621
-
622
707
  it("maps the canonical orchestrator id when catalog loading is unavailable", () => {
623
708
  const operations = operationsWithPricedRun();
624
709
  const source = operations.runs[0];
625
710
  if (source === undefined) throw new Error("priced Run fixture is missing");
626
711
  source.agent = "agent-orchestrator";
627
712
  source.agent_name = "agent-orchestrator";
628
-
629
713
  expect(buildCostMonitorProjection(operations).runs[0]?.agent_name).toBe(
630
714
  "zaip-agent-orchestrator",
631
715
  );
632
716
  });
633
-
634
- it("does not classify Task-attributed Runs as conversations", () => {
717
+ it("keeps Task-attributed Runs in their conversation cost bucket", () => {
635
718
  const operations = operationsWithPricedRun();
636
719
  const run = operations.runs[0];
637
720
  if (!run) throw new Error("priced Run fixture is missing");
638
721
  run.phase = "conversation";
639
722
  run.entrypoint = "task";
640
723
  run.task_id = "TASK-ATTRIBUTED";
641
-
642
724
  const projection = buildCostMonitorProjection(operations);
643
-
644
725
  expect(projection.runs[0]).toMatchObject({ origin: "task", phase: "planning" });
645
- expect(projection.groups.conversations).toEqual([]);
726
+ expect(projection.groups.conversations).toEqual([
727
+ expect.objectContaining({ key: run.conversation_id, duration_ms: 40_000 }),
728
+ ]);
646
729
  });
647
-
648
730
  it("keeps canonical metrics while recalculating pricing audit from the current catalog", () => {
649
731
  const operations = operationsWithPricedRun();
650
732
  const low = buildCostMonitorProjection(operations, {
@@ -657,7 +739,6 @@ describe("Cost Monitor V2", () => {
657
739
  fxRate: fxRate(5),
658
740
  currency: "BRL",
659
741
  });
660
-
661
742
  expect(low.overview.estimated_usd).toBeNull();
662
743
  expect(low.overview.estimated_brl).toBeNull();
663
744
  expect(high.overview.estimated_usd).toBeNull();
@@ -665,7 +746,6 @@ describe("Cost Monitor V2", () => {
665
746
  expect(low.runs[0]?.standard_cost_usd).toBe(1);
666
747
  expect(high.runs[0]?.standard_cost_usd).toBe(3);
667
748
  });
668
-
669
749
  it("preserves a recorded total when service tier is unavailable", () => {
670
750
  const operations = operationsWithPricedRun();
671
751
  const run = operations.runs[0];
@@ -683,13 +763,11 @@ describe("Cost Monitor V2", () => {
683
763
  events: 1,
684
764
  }),
685
765
  );
686
-
687
766
  const projection = buildCostMonitorProjection(operations, {
688
767
  catalog: catalogWithInputRate(99),
689
768
  fxRate: fxRate(5.5),
690
769
  currency: "BRL",
691
770
  });
692
-
693
771
  expect(projection.runs[0]).toMatchObject({
694
772
  service_tier: null,
695
773
  input_cost_usd: 99,
@@ -700,7 +778,6 @@ describe("Cost Monitor V2", () => {
700
778
  });
701
779
  expect(projection.overview).toMatchObject({ estimated_usd: 1.25, estimated_brl: 6.25 });
702
780
  });
703
-
704
781
  it("retains token-bearing Runs when a cost cannot be established", () => {
705
782
  const operations = operationsWithPricedRun();
706
783
  const source = operations.runs[0];
@@ -723,13 +800,11 @@ describe("Cost Monitor V2", () => {
723
800
  usage: usage(metric({ tokens: 1_000, input: 900, output: 100, events: 1 })),
724
801
  },
725
802
  ];
726
-
727
803
  const projection = buildCostMonitorProjection(operations, {
728
804
  catalog: gpt54Catalog(),
729
805
  fxRate: fxRate(5.5),
730
806
  currency: "BRL",
731
807
  });
732
-
733
808
  expect(projection.runs).toHaveLength(2);
734
809
  expect(projection.runs).toEqual(
735
810
  expect.arrayContaining([
@@ -746,48 +821,4 @@ describe("Cost Monitor V2", () => {
746
821
  ]),
747
822
  );
748
823
  });
749
-
750
- it("preserves recorded cost when the current catalog cannot price a supported tier combination", () => {
751
- const operations = operationsWithPricedRun();
752
- const run = operations.runs[0];
753
- if (!run) throw new Error("priced Run fixture is missing");
754
- run.model = "gpt-5.4";
755
- run.effective_model = "gpt-5.4";
756
- run.service_tier = "priority";
757
- run.usage = usage(
758
- metric({
759
- tokens: 400_000,
760
- input: 300_000,
761
- cached: 200_000,
762
- output: 100_000,
763
- reasoning: 20_000,
764
- usd: 2,
765
- brl: 10,
766
- events: 1,
767
- }),
768
- );
769
-
770
- const projection = buildCostMonitorProjection(operations, {
771
- catalog: gpt54Catalog(),
772
- fxRate: fxRate(5.5),
773
- currency: "BRL",
774
- });
775
-
776
- expect(projection.runs[0]).toMatchObject({
777
- service_tier: "priority",
778
- input_rate_usd_per_million: 2.5,
779
- cached_input_rate_usd_per_million: 0.25,
780
- output_rate_usd_per_million: 15,
781
- input_cost_usd: 0.5,
782
- cached_input_cost_usd: 0.1,
783
- output_cost_usd: 2.25,
784
- reasoning_cost_usd: 0,
785
- standard_cost_usd: 2.85,
786
- speed_cost_multiplier: null,
787
- speed_uplift_usd: null,
788
- estimated_usd: 2,
789
- estimated_brl: 10,
790
- coverage: { events: 1, tokens: 1, usd: 1, brl: 1 },
791
- });
792
- });
793
824
  });