@zaip-ai/cli 1.0.7 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) 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 +39 -4
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +13 -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 +7 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/architecture/software-architecture.md +131 -0
  48. package/templates/.agents/branding/brandbook.docx +0 -0
  49. package/templates/.agents/branding/brandbook.md +60 -0
  50. package/templates/.agents/config/agents/catalog.yaml +310 -10
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  57. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  60. package/templates/.agents/config/project.yaml +1 -1
  61. package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
  62. package/templates/.agents/dashboard/.zaip-managed.json +775 -163
  63. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  64. package/templates/.agents/dashboard/README.md +48 -97
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-DxR_pgSV.js +1 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CKcsqb-r.js +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.js +1 -0
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-N5Csr0RP.js +68 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-C0fj2uU9.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.js +2 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-BEsJ-FYH.js +9 -0
  79. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  80. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-B6y6Gw12.js +1 -0
  81. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  82. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  83. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  84. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +1129 -600
  85. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  91. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  93. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +266 -315
  95. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +151 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +37 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +114 -12
  98. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +85 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +133 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +453 -13
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  106. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  111. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  114. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  115. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +26 -0
  116. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  118. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +482 -3
  119. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  120. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +78 -0
  121. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +234 -39
  122. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  125. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +253 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +380 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +175 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +395 -0
  130. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  131. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  132. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  133. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +36 -0
  134. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +58 -5
  135. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +134 -0
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +290 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +133 -19
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +134 -43
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +328 -0
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +302 -6
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +627 -400
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +370 -72
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +467 -326
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +55 -14
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +33 -5
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +119 -0
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +146 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +118 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -161
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +757 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +784 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +100 -0
  177. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  178. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  179. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
  180. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
  181. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  182. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  183. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  184. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +185 -0
  185. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  186. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  187. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  188. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  189. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +345 -18
  190. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  195. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +367 -14
  196. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +562 -131
  197. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +353 -355
  198. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +65 -0
  199. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  200. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +73 -8
  201. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  202. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  203. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  204. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  205. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +105 -42
  206. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  207. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +265 -36
  208. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +171 -8
  209. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +98 -68
  210. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  211. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -17
  212. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  213. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +431 -1
  214. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +574 -20
  215. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +42 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
  217. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  219. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  220. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  221. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  222. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  223. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +67 -5
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +22 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +176 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  232. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  233. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  234. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +21 -7
  235. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  238. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +241 -6
  239. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  240. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  241. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  242. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  243. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  244. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  245. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +7 -4
  246. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +5 -84
  247. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  248. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  249. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  250. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  251. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  252. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  253. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +39 -2
  255. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +25 -13
  256. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  257. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  258. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  259. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  260. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  261. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  262. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +330 -0
  263. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  264. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  265. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  266. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  267. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  268. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  269. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  270. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  271. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  272. package/templates/.agents/dashboard/packages/contracts/src/index.ts +2 -0
  273. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  274. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1759 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1611 -0
  277. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  278. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +20 -0
  279. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +114 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +31 -0
  281. package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
  282. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +589 -0
  283. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +53 -0
  284. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +203 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1646 -107
  286. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  288. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  290. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +339 -4
  291. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  292. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +110 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +189 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  302. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  307. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +178 -84
  308. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +149 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +675 -267
  310. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1212 -309
  311. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  312. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +722 -0
  313. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +3743 -0
  314. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +7017 -0
  315. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  316. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  317. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  318. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +514 -190
  319. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +324 -24
  320. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  321. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  322. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  323. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  324. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  325. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  326. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  327. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  328. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +216 -41
  329. package/templates/.agents/dashboard/work-priority.json +34 -0
  330. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  331. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  332. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  333. package/templates/.agents/design/.zaip-managed.json +3 -3
  334. package/templates/.agents/design/apps/catalog/package.json +1 -1
  335. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  336. package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
  337. package/templates/.agents/growth/strategy.md +27 -0
  338. package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
  339. package/templates/.agents/marketing/strategy.md +29 -0
  340. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  341. package/templates/.agents/requirements/comparative-audit.md +1 -1
  342. package/templates/.agents/requirements/context-engine.md +1 -1
  343. package/templates/.agents/requirements/cost-observability.md +1 -1
  344. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  345. package/templates/.agents/requirements/data-export.md +1 -1
  346. package/templates/.agents/requirements/design-system.md +1 -1
  347. package/templates/.agents/requirements/execution-engine.md +1 -1
  348. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  349. package/templates/.agents/requirements/model-orchestration.md +1 -1
  350. package/templates/.agents/requirements/public-distribution.md +9 -6
  351. package/templates/.agents/requirements/software-architecture.md +1 -1
  352. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  353. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  354. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  355. package/templates/.agents/rules/autonomy-decision.md +15 -0
  356. package/templates/.agents/rules/core.md +1 -1
  357. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  358. package/templates/.agents/rules/specialist-routing.md +19 -0
  359. package/templates/.agents/rules/workflow.md +1 -1
  360. package/templates/.agents/runtime/VERSION +1 -1
  361. package/templates/.agents/runtime/bin/zaip.mjs +118 -67
  362. package/templates/.agents/runtime/checksums.sha256 +6 -4
  363. package/templates/.agents/runtime/manifest.json +3 -1
  364. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  365. package/templates/.agents/runtime/provenance.json +11 -0
  366. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  367. package/templates/.agents/sales/playbook.md +32 -0
  368. package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
  369. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  370. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +22 -0
  371. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  372. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
  373. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  374. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  375. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
  377. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  378. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  380. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  381. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  382. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  383. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  384. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  385. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  386. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  387. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  388. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  389. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  390. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +21 -0
  392. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  393. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  394. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  395. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  396. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +9 -3
  397. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +99 -93
  398. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +132 -23
  399. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +149 -1
  400. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +76 -19
  401. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +217 -7
  402. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
  403. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +20 -0
  404. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  405. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  406. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  407. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  408. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  409. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +41 -0
  410. package/templates/.agents/zaip-aios/INDEX.md +11 -0
  411. package/templates/.agents/zaip-aios/README.md +38 -8
  412. package/templates/.agents/zaip-aios/VERSION +1 -1
  413. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  414. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  415. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  416. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
  417. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
  418. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
  419. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
  420. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -0
  421. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
  422. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
  423. package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +18 -0
  424. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
  425. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
  426. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -0
  427. package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
  428. package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
  429. package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
  430. package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
  431. package/templates/template-manifest.json +1082 -215
  432. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  433. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  434. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cv-JcoxP.js +0 -1320
  435. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  436. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  437. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  438. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  439. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  440. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  441. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  442. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  443. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  444. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -1,3 +1,4 @@
1
+ import type { UsageProjection } from "@zaip-ai/dashboard-operations/contracts";
1
2
  import { formatCompactNumber, formatCurrency, formatDurationMs } from "@zaip-ai/dashboard-ui";
2
3
  import type { CostGroupRow, CostRunRow } from "../contracts.js";
3
4
  import type { CostCurrency, CostLocale } from "./cost-monitor-copy.js";
@@ -8,30 +9,32 @@ export function CostCharts({
8
9
  rows,
9
10
  daily,
10
11
  models,
12
+ summaryUsage,
11
13
  currency,
12
14
  locale,
13
15
  }: {
14
16
  rows: readonly CostRunRow[];
15
17
  daily: readonly CostGroupRow[];
16
18
  models: readonly CostGroupRow[];
19
+ /**
20
+ * The summary route intentionally omits historical Run rows, but retains
21
+ * complete usage totals by phase. Prefer those aggregates when supplied so
22
+ * an aggregate-only overview never presents them as empty data.
23
+ */
24
+ summaryUsage?: Pick<UsageProjection, "conversation" | "planning" | "execution" | "total">;
17
25
  currency: CostCurrency;
18
26
  locale: CostLocale;
19
27
  }) {
20
28
  const copy = costChartsCopy(locale);
21
- const tokenMix = [
22
- [copy.input, observed(rows.map((row) => row.input_tokens))],
23
- [copy.cache, observed(rows.map((row) => row.cached_input_tokens))],
24
- [copy.output, observed(rows.map((row) => row.output_tokens))],
25
- [copy.reasoning, observed(rows.map((row) => row.reasoning_tokens))],
26
- ] as const;
29
+ const tokenMix = chartTokenMix(rows, summaryUsage, copy);
27
30
  const availableModels = modelsWithObservedCost(models, currency);
28
31
  const maxModel = Math.max(1, ...availableModels.map((row) => cost(row, currency) ?? 0));
29
32
  const sevenDays = lastSevenDays(daily, currency);
30
- const maxDaily = Math.max(1, ...sevenDays.map((day) => day.value));
33
+ const maxDaily = Math.max(1, ...sevenDays.map((day) => day.value ?? 0));
31
34
  const trendPoints = sevenDays.map((day, index) => ({
32
35
  ...day,
33
36
  x: (index / (sevenDays.length - 1)) * 100,
34
- y: 82 - (day.value / maxDaily) * 58,
37
+ y: 82 - ((day.value ?? 0) / maxDaily) * 58,
35
38
  }));
36
39
  const points = trendPoints.map((point) => `${point.x},${point.y}`).join(" ");
37
40
  return (
@@ -73,7 +76,7 @@ export function CostCharts({
73
76
  key={point.key}
74
77
  style={{ left: `${point.x}%`, top: `${point.y}%` }}
75
78
  >
76
- {formatCurrency(point.value, currency, locale)}
79
+ {formatNullableCurrency(point.value, currency, locale)}
77
80
  </span>
78
81
  ))}
79
82
  </div>
@@ -102,7 +105,7 @@ export function CostCharts({
102
105
  }}
103
106
  />
104
107
  </i>
105
- <strong>{formatCurrency(cost(row, currency), currency, locale)}</strong>
108
+ <strong>{formatNullableCurrency(cost(row, currency), currency, locale)}</strong>
106
109
  </div>
107
110
  ))}
108
111
  </div>
@@ -119,7 +122,7 @@ export function CostCharts({
119
122
  <div key={label}>
120
123
  <i style={{ background: colors[index] }} />
121
124
  <span>{label}</span>
122
- <strong>{formatCompactNumber(value, locale)}</strong>
125
+ <strong>{formatNullableNumber(value, locale)}</strong>
123
126
  </div>
124
127
  ))}
125
128
  </div>
@@ -133,12 +136,7 @@ export function CostCharts({
133
136
  </header>
134
137
  <div className="phase-strip">
135
138
  {(["conversation", "planning", "execution"] as const).map((phase, index) => {
136
- const phaseRows = rows.filter((row) => row.phase === phase);
137
- const duration = observed(phaseRows.map((row) => row.duration_ms));
138
- const tokens = observed(phaseRows.map((row) => row.total_tokens));
139
- const phaseCost = observed(
140
- phaseRows.map((row) => (currency === "BRL" ? row.estimated_brl : row.estimated_usd)),
141
- );
139
+ const metrics = chartPhaseMetrics(phase, rows, summaryUsage, currency);
142
140
  return (
143
141
  <div key={phase}>
144
142
  <div className="phase-name">
@@ -148,15 +146,15 @@ export function CostCharts({
148
146
  <dl className="phase-metrics">
149
147
  <div>
150
148
  <dt>{locale === "pt-BR" ? "Tempo" : "Time"}</dt>
151
- <dd>{formatDurationMs(duration, locale)}</dd>
149
+ <dd>{formatNullableDuration(metrics.duration, locale)}</dd>
152
150
  </div>
153
151
  <div>
154
152
  <dt>Tokens</dt>
155
- <dd>{formatCompactNumber(tokens, locale)}</dd>
153
+ <dd>{formatNullableNumber(metrics.tokens, locale)}</dd>
156
154
  </div>
157
155
  <div>
158
156
  <dt>{locale === "pt-BR" ? "Custo" : "Cost"}</dt>
159
- <dd>{formatCurrency(phaseCost, currency, locale)}</dd>
157
+ <dd>{formatNullableCurrency(metrics.cost, currency, locale)}</dd>
160
158
  </div>
161
159
  </dl>
162
160
  </div>
@@ -168,6 +166,84 @@ export function CostCharts({
168
166
  );
169
167
  }
170
168
 
169
+ export function chartTokenMix(
170
+ rows: readonly CostRunRow[],
171
+ summaryUsage: Pick<UsageProjection, "total"> | undefined,
172
+ copy: Pick<
173
+ ReturnType<typeof costChartsCopy>,
174
+ "inputWithoutCache" | "cachedInput" | "visibleOutput" | "reasoning" | "total"
175
+ >,
176
+ ) {
177
+ const tokens = summaryUsage?.total.tokens;
178
+ const input = tokens?.input ?? observed(rows.map((row) => row.input_tokens));
179
+ const cachedInput = subsetTokenTotal(
180
+ tokens?.cached_input ?? observed(rows.map((row) => row.cached_input_tokens)),
181
+ input,
182
+ );
183
+ const output = tokens?.output ?? observed(rows.map((row) => row.output_tokens));
184
+ const reasoning = subsetTokenTotal(
185
+ tokens?.reasoning ?? observed(rows.map((row) => row.reasoning_tokens)),
186
+ output,
187
+ );
188
+ const total = inclusiveTokenTotal(
189
+ input,
190
+ output,
191
+ tokens?.total ?? observed(rows.map((row) => row.total_tokens)),
192
+ );
193
+ return [
194
+ // Cache is inside Input and reasoning is inside Output. The chart must
195
+ // show mutually exclusive remainders rather than overlapping totals.
196
+ [copy.inputWithoutCache, exclusiveTokenRemainder(input, cachedInput)],
197
+ [copy.cachedInput, cachedInput],
198
+ [copy.visibleOutput, exclusiveTokenRemainder(output, reasoning)],
199
+ [copy.reasoning, reasoning],
200
+ [copy.total, total],
201
+ ] as const;
202
+ }
203
+
204
+ export function chartPhaseMetrics(
205
+ phase: "conversation" | "planning" | "execution",
206
+ rows: readonly CostRunRow[],
207
+ summaryUsage: Pick<UsageProjection, "conversation" | "planning" | "execution"> | undefined,
208
+ currency: CostCurrency,
209
+ ) {
210
+ const phaseRows = rows.filter((row) => row.phase === phase);
211
+ const usage = summaryUsage?.[phase];
212
+ return {
213
+ // Aggregate-only data carries observed invocation duration by phase. It
214
+ // remains distinct from the canonical root-Run wall-clock duration.
215
+ duration:
216
+ usage?.duration_ms ??
217
+ observed(
218
+ phaseRows.map((row) =>
219
+ row.duration_provenance === "observed" ||
220
+ row.duration_provenance === "reconciled" ||
221
+ row.duration_provenance === "legacy_inferred"
222
+ ? row.duration_ms
223
+ : null,
224
+ ),
225
+ ),
226
+ tokens: usage?.tokens.total ?? observed(phaseRows.map((row) => row.total_tokens)),
227
+ cost:
228
+ (currency === "BRL" ? usage?.cost.brl : usage?.cost.usd) ??
229
+ observed(
230
+ phaseRows.map((row) => (currency === "BRL" ? row.estimated_brl : row.estimated_usd)),
231
+ ),
232
+ };
233
+ }
234
+
235
+ function formatNullableDuration(value: number | null, locale: CostLocale) {
236
+ return value === null || value === 0 ? "0" : formatDurationMs(value, locale);
237
+ }
238
+
239
+ function formatNullableNumber(value: number | null, locale: CostLocale) {
240
+ return formatCompactNumber(value ?? 0, locale);
241
+ }
242
+
243
+ function formatNullableCurrency(value: number | null, currency: CostCurrency, locale: CostLocale) {
244
+ return formatCurrency(value ?? 0, currency, locale);
245
+ }
246
+
171
247
  export function costChartsCopy(locale: CostLocale) {
172
248
  return locale === "pt-BR"
173
249
  ? {
@@ -182,10 +258,11 @@ export function costChartsCopy(locale: CostLocale) {
182
258
  tokenMix: "Mix de tokens",
183
259
  phases: "FASES",
184
260
  totalsByPhase: "Totais por fase",
185
- input: "Entrada",
186
- cache: "Cache",
187
- output: "Saída",
261
+ inputWithoutCache: "Input sem cache",
262
+ cachedInput: "Cache",
263
+ visibleOutput: "Output visível",
188
264
  reasoning: "Raciocínio",
265
+ total: "Total (input + output)",
189
266
  }
190
267
  : {
191
268
  analyticsView: "Analytics overview",
@@ -199,10 +276,11 @@ export function costChartsCopy(locale: CostLocale) {
199
276
  tokenMix: "Token mix",
200
277
  phases: "PHASES",
201
278
  totalsByPhase: "Totals by phase",
202
- input: "Input",
203
- cache: "Cache",
204
- output: "Output",
279
+ inputWithoutCache: "Uncached input",
280
+ cachedInput: "Cached input",
281
+ visibleOutput: "Visible output",
205
282
  reasoning: "Reasoning",
283
+ total: "Total (input + output)",
206
284
  };
207
285
  }
208
286
 
@@ -221,27 +299,40 @@ function cost(row: CostGroupRow, currency: CostCurrency) {
221
299
  }
222
300
 
223
301
  export function modelsWithObservedCost(models: readonly CostGroupRow[], currency: CostCurrency) {
224
- return models.filter((row) => cost(row, currency) !== null);
302
+ return models
303
+ .filter((row) => cost(row, currency) !== null)
304
+ .sort((left, right) => {
305
+ const difference = (cost(right, currency) ?? 0) - (cost(left, currency) ?? 0);
306
+ return difference !== 0 ? difference : left.key.localeCompare(right.key);
307
+ });
225
308
  }
226
309
 
227
- export function lastSevenDays(
228
- daily: readonly CostGroupRow[],
229
- currency: CostCurrency,
230
- now = new Date(),
231
- ) {
232
- const values = new Map(daily.map((row) => [row.key, cost(row, currency) ?? 0]));
233
- return Array.from({ length: 7 }, (_, index) => {
234
- const date = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (6 - index));
235
- const key = localDateKey(date);
236
- return { date, key, value: values.get(key) ?? 0 };
237
- });
310
+ function subsetTokenTotal(subset: number | null, total: number | null): number | null {
311
+ if (subset === null || total === null || subset > total) return null;
312
+ return subset;
313
+ }
314
+
315
+ function exclusiveTokenRemainder(total: number | null, subset: number | null): number | null {
316
+ return total === null || subset === null ? null : total - subset;
238
317
  }
239
318
 
240
- function localDateKey(date: Date) {
241
- const year = date.getFullYear();
242
- const month = String(date.getMonth() + 1).padStart(2, "0");
243
- const day = String(date.getDate()).padStart(2, "0");
244
- return `${year}-${month}-${day}`;
319
+ function inclusiveTokenTotal(
320
+ input: number | null,
321
+ output: number | null,
322
+ reportedTotal: number | null,
323
+ ): number | null {
324
+ return input !== null && output !== null ? input + output : reportedTotal;
325
+ }
326
+
327
+ export function lastSevenDays(daily: readonly CostGroupRow[], currency: CostCurrency) {
328
+ const values = new Map(daily.map((row) => [row.key, cost(row, currency)]));
329
+ const buckets = [...values.keys()].sort().slice(-7);
330
+ return buckets.map((key) => {
331
+ const date = new Date(`${key}T12:00:00`);
332
+ // A missing calendar bucket is a real zero; a present bucket with missing
333
+ // financial telemetry remains unavailable rather than being coerced to zero.
334
+ return { date, key, value: values.get(key)! };
335
+ });
245
336
  }
246
337
 
247
338
  function formatTrendDay(date: Date, locale: CostLocale) {
@@ -4,7 +4,8 @@ import type { CostMonitorProjection } from "../contracts.js";
4
4
  import type { CostCurrency, CostLocale } from "./cost-monitor-copy.js";
5
5
 
6
6
  export type CostPeriod = "all" | "7" | "30" | "90" | "month";
7
- export const defaultCostPeriod: CostPeriod = "all";
7
+ /** Cost Monitor opens on the current Sao Paulo month, matching Operations. */
8
+ export const defaultCostPeriod: CostPeriod = "month";
8
9
 
9
10
  export function costPeriodDateRange(
10
11
  period: CostPeriod,
@@ -38,6 +39,9 @@ export async function loadCostMonitorPeriod({
38
39
  fetcher?: typeof fetch;
39
40
  }): Promise<CostMonitorProjection> {
40
41
  const query = new URLSearchParams({ currency });
42
+ // Period and filter changes hydrate aggregate read models only. Entity
43
+ // detail is loaded through its dedicated bounded page route.
44
+ query.set("scope", "summary");
41
45
  if (from !== undefined) query.set("from", from);
42
46
  if (to !== undefined) query.set("to", to);
43
47
  if (filters) {
@@ -63,6 +67,123 @@ export async function loadCostMonitorPeriod({
63
67
  return (await response.json()) as CostMonitorProjection;
64
68
  }
65
69
 
70
+ /** Exact dimensional projection, requested only after a dimensional tab opens. */
71
+ export async function loadCostMonitorDetail({
72
+ currency,
73
+ filters,
74
+ from,
75
+ refresh,
76
+ to,
77
+ signal,
78
+ fetcher = fetch,
79
+ }: {
80
+ currency: CostCurrency;
81
+ filters?: CostFilterState;
82
+ from?: string;
83
+ refresh?: string | null;
84
+ to?: string;
85
+ signal?: AbortSignal;
86
+ fetcher?: typeof fetch;
87
+ }): Promise<CostMonitorProjection> {
88
+ const query = costMonitorQuery({
89
+ currency,
90
+ ...(filters === undefined ? {} : { filters }),
91
+ ...(from === undefined ? {} : { from }),
92
+ ...(refresh === undefined ? {} : { refresh }),
93
+ ...(to === undefined ? {} : { to }),
94
+ });
95
+ query.set("scope", "detail");
96
+ const response = await fetcher(`/api/v2/cost-monitor?${query.toString()}`, {
97
+ ...(signal === undefined ? {} : { signal }),
98
+ });
99
+ if (!response.ok)
100
+ throw new Error(
101
+ (await response.text()).trim() || `Cost Monitor detail request failed (${response.status})`,
102
+ );
103
+ return (await response.json()) as CostMonitorProjection;
104
+ }
105
+
106
+ export async function loadCostMonitorRunPage({
107
+ currency,
108
+ filters,
109
+ from,
110
+ offset,
111
+ refresh,
112
+ to,
113
+ signal,
114
+ fetcher = fetch,
115
+ }: {
116
+ currency: CostCurrency;
117
+ filters?: CostFilterState;
118
+ from?: string;
119
+ offset: number;
120
+ refresh?: string | null;
121
+ to?: string;
122
+ signal?: AbortSignal;
123
+ fetcher?: typeof fetch;
124
+ }): Promise<CostRunPage> {
125
+ const query = costMonitorQuery({
126
+ currency,
127
+ ...(filters === undefined ? {} : { filters }),
128
+ ...(from === undefined ? {} : { from }),
129
+ ...(refresh === undefined ? {} : { refresh }),
130
+ ...(to === undefined ? {} : { to }),
131
+ });
132
+ query.set("scope", "runs");
133
+ query.set("offset", String(Math.max(0, offset)));
134
+ query.set("limit", "100");
135
+ const response = await fetcher(`/api/v2/cost-monitor?${query.toString()}`, {
136
+ ...(signal === undefined ? {} : { signal }),
137
+ });
138
+ if (!response.ok) {
139
+ const detail = (await response.text()).trim();
140
+ throw new Error(detail || `Cost Monitor run page request failed (${response.status})`);
141
+ }
142
+ const payload = (await response.json()) as Pick<CostMonitorProjection, "runs" | "run_page">;
143
+ return {
144
+ page_only: true,
145
+ runs: payload.runs,
146
+ run_page: payload.run_page ?? { offset, limit: 100, total: null, has_more: false },
147
+ };
148
+ }
149
+
150
+ /** Complete contract for the incremental Run endpoint; it is not a summary projection. */
151
+ export interface CostRunPage {
152
+ page_only: true;
153
+ runs: CostMonitorProjection["runs"];
154
+ run_page: { offset: number; limit: number; total: number | null; has_more: boolean };
155
+ }
156
+
157
+ function costMonitorQuery({
158
+ currency,
159
+ filters,
160
+ from,
161
+ refresh,
162
+ to,
163
+ }: {
164
+ currency: CostCurrency;
165
+ filters?: CostFilterState;
166
+ from?: string;
167
+ refresh?: string | null;
168
+ to?: string;
169
+ }): URLSearchParams {
170
+ const query = new URLSearchParams({ currency });
171
+ if (from !== undefined) query.set("from", from);
172
+ if (to !== undefined) query.set("to", to);
173
+ if (filters) {
174
+ const manifestFilters = [
175
+ ["provider", filters.provider],
176
+ ["phase", filters.phase],
177
+ ["agent", filters.agent],
178
+ ["model", filters.model],
179
+ ["status", filters.status],
180
+ ] as const;
181
+ for (const [key, value] of manifestFilters) if (value) query.set(key, value);
182
+ }
183
+ if (refresh) query.set("refresh", refresh);
184
+ return query;
185
+ }
186
+
66
187
  export function useCostMonitorPeriod({
67
188
  currency,
68
189
  data,
@@ -91,10 +212,14 @@ export function useCostMonitorPeriod({
91
212
  const [periodLoading, setPeriodLoading] = useState(false);
92
213
  const [periodError, setPeriodError] = useState<string | null>(null);
93
214
  const initialDataRef = useRef(true);
215
+ const loadPeriodRef = useRef(loadPeriod);
216
+ loadPeriodRef.current = loadPeriod;
94
217
  const requestedRange =
95
218
  dateRange === undefined
96
219
  ? costPeriodDateRange(period)
97
220
  : { from: dateRange.start, to: dateRange.end };
221
+ const requestedFrom = requestedRange?.from;
222
+ const requestedTo = requestedRange?.to;
98
223
  const shouldFetch = shouldFetchCostPeriod({ filters, period, snapshotBacked });
99
224
  useEffect(() => {
100
225
  if (!shouldFetch) {
@@ -109,13 +234,16 @@ export function useCostMonitorPeriod({
109
234
  const controller = new AbortController();
110
235
  setPeriodLoading(true);
111
236
  setPeriodError(null);
112
- void loadPeriod({
113
- currency,
114
- filters,
115
- ...(requestedRange === undefined ? {} : { from: requestedRange.from, to: requestedRange.to }),
116
- refresh: lastUpdatedAt,
117
- signal: controller.signal,
118
- })
237
+ void loadPeriodRef
238
+ .current({
239
+ currency,
240
+ filters,
241
+ ...(requestedFrom === undefined || requestedTo === undefined
242
+ ? {}
243
+ : { from: requestedFrom, to: requestedTo }),
244
+ refresh: lastUpdatedAt,
245
+ signal: controller.signal,
246
+ })
119
247
  .then((nextPeriodData) => {
120
248
  if (controller.signal.aborted) return;
121
249
  setPeriodDataBase(data);
@@ -130,17 +258,7 @@ export function useCostMonitorPeriod({
130
258
  if (!controller.signal.aborted) setPeriodLoading(false);
131
259
  });
132
260
  return () => controller.abort();
133
- }, [
134
- currency,
135
- data,
136
- filters,
137
- lastUpdatedAt,
138
- loadPeriod,
139
- requestedRange?.from,
140
- requestedRange?.to,
141
- shouldFetch,
142
- requestedRange,
143
- ]);
261
+ }, [currency, data, filters, lastUpdatedAt, requestedFrom, requestedTo, shouldFetch]);
144
262
  return {
145
263
  activeData: activeCostPeriodData(data, periodData, periodDataBase),
146
264
  periodError,
@@ -46,6 +46,8 @@ describe("CostModelsAuditTable coverage", () => {
46
46
  expect(tables).not.toContain("Partial ·");
47
47
  expect(tables).not.toContain("durationCoverageDetail");
48
48
  expect(models).not.toContain("durationCoverageDetail");
49
+ expect(models).not.toContain("tempo observado");
50
+ expect(models).not.toContain("observed time");
49
51
  expect(models).toContain("aggregateDurationCoverage");
50
52
  });
51
53
  });
@@ -4,8 +4,10 @@ import {
4
4
  contextUpliftUsd,
5
5
  formatAuditableNumber,
6
6
  formatDurationCoverage,
7
+ formatTokenBackedDuration,
7
8
  formatUsd,
8
9
  hasCollectedUsage,
10
+ hasKnownDuration,
9
11
  isDisplayableModel,
10
12
  localizedDescription,
11
13
  scenario,
@@ -45,6 +47,7 @@ export function CostModelsAuditTable({
45
47
  const estimatedUsd = sum("estimated_usd");
46
48
  const estimatedBrl = sum("estimated_brl");
47
49
  const contextUplift = sumNumbers(items.map(contextUpliftUsd));
50
+ const total = sum("total_tokens");
48
51
  const duration = aggregateDurationCoverage(
49
52
  items.filter((row) => durationRows.has(row)),
50
53
  "all_invocations",
@@ -53,12 +56,12 @@ export function CostModelsAuditTable({
53
56
  model,
54
57
  runs: items.length,
55
58
  duration,
56
- durationMs: duration.complete ? duration.known_sum : null,
59
+ durationMs: hasKnownDuration(duration) ? duration.known_sum : null,
57
60
  input,
58
61
  cached,
59
62
  output,
60
63
  reasoning: sum("reasoning_tokens"),
61
- total: sum("total_tokens"),
64
+ total,
62
65
  inputUsd,
63
66
  cacheUsd,
64
67
  outputUsd,
@@ -82,8 +85,8 @@ export function CostModelsAuditTable({
82
85
  footer: locale === "pt-BR" ? "Total" : "Total",
83
86
  description: localizedDescription(
84
87
  locale,
85
- "Modelo efetivamente identificado nas invocações de agentes agregadas nesta linha. Invocações sem modelo identificável são agrupadas como Indefinido.",
86
- "Model identified in the agent invocations aggregated in this row. Invocations without an identifiable model are grouped as Undefined.",
88
+ "Modelo efetivamente identificado nas invocações de agentes agregadas nesta linha. Invocações sem modelo identificável são agrupadas como Indisponível.",
89
+ "Model identified in the agent invocations aggregated in this row. Invocations without an identifiable model are grouped as Unavailable.",
87
90
  ),
88
91
  },
89
92
  {
@@ -108,13 +111,13 @@ export function CostModelsAuditTable({
108
111
  },
109
112
  {
110
113
  key: "durationMs",
111
- label: locale === "pt-BR" ? "Tempo de processamento" : "Processing time",
112
- render: (row) => formatDurationCoverage(row.duration, locale),
113
- sortValue: (row) => (row.duration.coverage_ratio > 0 ? row.duration.known_sum : null),
114
+ label: locale === "pt-BR" ? "Tempo" : "Time",
115
+ render: (row) => formatTokenBackedDuration(row.duration, row.total, locale),
116
+ sortValue: (row) => row.durationMs,
114
117
  description: localizedDescription(
115
118
  locale,
116
- "Soma do tempo observado de todas as Invocações de Agente financeiras elegíveis deste modelo. Cada ID de invocação entra uma vez; dados ausentes permanecem parciais e não são estimados.",
117
- "Sum of observed time for all eligible financial Agent Invocations of this model. Each invocation ID is included once; missing data remains partial and is not estimated.",
119
+ "Soma do tempo de todas as Invocações de Agente financeiras elegíveis deste modelo. Cada ID de invocação entra uma vez; dados ausentes permanecem indisponíveis.",
120
+ "Sum of time for all eligible financial Agent Invocations of this model. Each invocation ID is included once; missing data remains unavailable.",
118
121
  ),
119
122
  align: "right",
120
123
  footer: formatDurationCoverage(
@@ -288,7 +291,7 @@ export function displayModelName(model: string, locale: CostLocale): string | nu
288
291
  if (isDisplayableModel(model)) return model;
289
292
  const normalized = model.trim().toLowerCase();
290
293
  if (normalized.length === 0 || normalized === "unknown") {
291
- return locale === "pt-BR" ? "Indefinido" : "Undefined";
294
+ return locale === "pt-BR" ? "Indisponível" : "Unavailable";
292
295
  }
293
296
  return null;
294
297
  }