@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
@@ -5,6 +5,7 @@ import {
5
5
  activeCostPeriodData,
6
6
  costPeriodDateRange,
7
7
  defaultCostPeriod,
8
+ emptyCostFilters,
8
9
  loadCostMonitorPeriod,
9
10
  shouldFetchCostPeriod,
10
11
  } from "./CostFilters.js";
@@ -17,7 +18,9 @@ import {
17
18
  costGroupsScrollLabel,
18
19
  costPeriodTotalAriaLabel,
19
20
  costRunsDurationTotal,
21
+ costRunsFooterLabel,
20
22
  costRunsScrollLabel,
23
+ displayCostGroupLabel,
21
24
  formatAuditableCompactNumber,
22
25
  formatAuditableCurrency,
23
26
  formatAuditableDuration,
@@ -30,6 +33,7 @@ import {
30
33
  formatRate,
31
34
  formatReasoningEffort,
32
35
  formatServiceTier,
36
+ formatTokenBackedDuration,
33
37
  formatUsd,
34
38
  hasCollectedUsage,
35
39
  isCompactRunColumnVisible,
@@ -49,7 +53,6 @@ describe("Agent Run model presentation", () => {
49
53
  }),
50
54
  ).toEqual({ primary: "gpt-5.6-sol", detail: "openai" });
51
55
  });
52
-
53
56
  it("does not mention an unavailable planned configuration", () => {
54
57
  expect(
55
58
  agentRunModelPresentation({
@@ -63,7 +66,6 @@ describe("Agent Run model presentation", () => {
63
66
  });
64
67
  });
65
68
  });
66
-
67
69
  describe("period formatting", () => {
68
70
  it("renders daily dates and keeps monthly periods numerically sortable", () => {
69
71
  expect(formatCostPeriodLabel("2026-07-16", "daily", "pt-BR")).toBe("16/07/2026");
@@ -72,7 +74,6 @@ describe("period formatting", () => {
72
74
  expect(formatCostPeriodLabel("2026", "annual", "pt-BR")).toBe("2026");
73
75
  });
74
76
  });
75
-
76
77
  describe("period total accessibility", () => {
77
78
  it("names the complete period total with the displayed time, tokens, and BRL values", () => {
78
79
  expect(
@@ -86,7 +87,13 @@ describe("period total accessibility", () => {
86
87
  ).toBe("Total geral — Tempo: 2h 15min; Tokens: 1,2 mi; BRL: R$ 3,40");
87
88
  });
88
89
  });
89
-
90
+ describe("incremental Run table labels", () => {
91
+ it("does not present a paged subset as the complete Run total", () => {
92
+ expect(costRunsFooterLabel("pt-BR", true)).toBe("Subtotal da página");
93
+ expect(costRunsFooterLabel("en-US", true)).toBe("Page subtotal");
94
+ expect(costRunsFooterLabel("pt-BR", false)).toBe("Total");
95
+ });
96
+ });
90
97
  describe("Run origin badges", () => {
91
98
  it("uses one hierarchical origin per Run", () => {
92
99
  expect(runOriginBadge({ prd_id: "PRD-1", spec_id: "SPEC-1", task_id: "TASK-1" })).toEqual({
@@ -103,25 +110,21 @@ describe("Run origin badges", () => {
103
110
  });
104
111
  });
105
112
  });
106
-
107
113
  describe("date time formatting", () => {
108
114
  it("uses a placeholder for groups that do not yet have a Run", () => {
109
115
  expect(formatDateTime("", "pt-BR")).toBe("—");
110
116
  });
111
117
  });
112
-
113
118
  describe("formatAuditableNumber", () => {
114
- it("keeps unavailable numeric metrics distinct from observed zero", () => {
115
- expect(formatAuditableNumber(null, "pt-BR")).toBe("Indisponível");
116
- expect(formatAuditableNumber(null, "en-US")).toBe("Unavailable");
119
+ it("renders unavailable numeric metrics as presentation zero", () => {
120
+ expect(formatAuditableNumber(null, "pt-BR")).toBe("0");
121
+ expect(formatAuditableNumber(null, "en-US")).toBe("0");
117
122
  expect(formatAuditableNumber(0, "pt-BR")).toBe("0");
118
123
  });
119
-
120
124
  it("keeps observed positive values", () => {
121
125
  expect(formatAuditableNumber(1234, "pt-BR")).toBe("1.234");
122
126
  });
123
127
  });
124
-
125
128
  describe("compact Sub-Run columns", () => {
126
129
  it("keeps a column hidden until at least one Sub-Run has observed data", () => {
127
130
  const rows = [{ duration_ms: null }, { duration_ms: null }] as never;
@@ -134,38 +137,38 @@ describe("compact Sub-Run columns", () => {
134
137
  ).toBe(true);
135
138
  });
136
139
  });
137
-
138
140
  describe("monetary formatting", () => {
139
141
  it("uses exactly two decimal places for rates and USD totals", () => {
140
142
  expect(formatRate(5.450000053204, "pt-BR")).toBe("5,45");
141
143
  expect(formatBrlRate(5.450000053204, "pt-BR")).toBe("R$ 5,45");
142
144
  expect(formatUsd(19.583447, "pt-BR").replace(/\s/g, " ")).toBe("US$ 19,58");
143
145
  });
144
-
145
146
  it("calculates exchange as a direct BRL/USD ratio", () => {
146
147
  expect(ratio(106.73, 19.583444)).toBeCloseTo(5.45, 2);
147
148
  expect(ratio(100, 0)).toBeNull();
148
149
  });
149
-
150
- it("keeps unavailable duration distinct from an observed zero", () => {
151
- expect(formatRate(null, "pt-BR")).toBe("Indisponível");
152
- expect(formatUsd(null, "en-US")).toBe("Unavailable");
153
- expect(formatAuditableCurrency(null, "BRL", "pt-BR")).toBe("Indisponível");
150
+ it("renders unavailable numeric metrics as zero", () => {
151
+ expect(formatRate(null, "pt-BR")).toBe("0,00");
152
+ expect(formatUsd(null, "en-US")).toContain("0.00");
153
+ expect(formatAuditableCurrency(null, "BRL", "pt-BR")).toContain("0,00");
154
154
  expect(formatAuditableDuration(null, "pt-BR")).toBe("Indisponível");
155
- expect(formatAuditableCompactNumber(null, "pt-BR")).toBe("Indisponível");
156
- expect(formatMultiplierPair(null, null, "pt-BR")).toBe("Indisponível");
157
- expect(formatMultiplierPair(2, null, "pt-BR")).toBe("Indisponível");
155
+ expect(formatAuditableCompactNumber(null, "pt-BR")).toBe("0");
158
156
  });
159
157
  });
160
-
161
158
  describe("duration coverage", () => {
162
- it("renders known partial duration without claiming it is complete", () => {
159
+ it("renders the factual known duration while preserving partial coverage", () => {
163
160
  expect(
164
161
  formatDurationCoverage(
165
162
  { known_sum: 60_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
166
163
  "pt-BR",
167
164
  ),
168
165
  ).toBe("1 min");
166
+ expect(
167
+ formatDurationCoverage(
168
+ { known_sum: 600_705_381, unknown: 14, complete: false, coverage_ratio: 34 / 48 },
169
+ "pt-BR",
170
+ ),
171
+ ).toBe("166,9 h");
169
172
  expect(
170
173
  formatDurationCoverage(
171
174
  { known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
@@ -173,15 +176,29 @@ describe("duration coverage", () => {
173
176
  ),
174
177
  ).toBe("Indisponível");
175
178
  });
179
+ it("does not treat financial tokens as elapsed-time evidence", () => {
180
+ expect(
181
+ formatTokenBackedDuration(
182
+ { known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
183
+ 1_100,
184
+ "pt-BR",
185
+ ),
186
+ ).toBe(formatAuditableDuration(null, "pt-BR"));
187
+ expect(
188
+ formatTokenBackedDuration(
189
+ { known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
190
+ null,
191
+ "pt-BR",
192
+ ),
193
+ ).toBe(formatAuditableDuration(null, "pt-BR"));
194
+ });
176
195
  });
177
-
178
196
  describe("runtime availability", () => {
179
197
  it("uses requested effort only as a clearly labelled visual fallback", () => {
180
198
  expect(formatReasoningEffort("high", "medium", "pt-BR")).toBe("Alto");
181
199
  expect(formatReasoningEffort(null, "high", "pt-BR")).toBe("Alto (solicitado; efetivo -)");
182
200
  expect(formatReasoningEffort(null, null, "en-US")).toBe("-");
183
201
  });
184
-
185
202
  it("uses the default speed label when the service tier is unavailable", () => {
186
203
  expect(formatServiceTier(null, "pt-BR")).toBe("Padrão");
187
204
  expect(formatServiceTier("unknown", "pt-BR")).toBe("Padrão");
@@ -189,7 +206,6 @@ describe("runtime availability", () => {
189
206
  expect(formatServiceTier("priority", "pt-BR")).toBe("Rápido");
190
207
  });
191
208
  });
192
-
193
209
  describe("grouped cost availability", () => {
194
210
  it("uses deduplicated root and child invocation effort in the Run drilldown footer", () => {
195
211
  const root = {
@@ -224,7 +240,35 @@ describe("grouped cost availability", () => {
224
240
  duration: { known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
225
241
  coverage: { events: 2, tokens: 0, usd: 0, brl: 0 },
226
242
  } as const;
227
-
243
+ it.each([
244
+ "daily",
245
+ "monthly",
246
+ "annual",
247
+ ] as const)("matches the Operations column order for %s summaries", (period) => {
248
+ const table = CostGroupsTable({
249
+ rows: [unavailableGroup],
250
+ currency: "BRL",
251
+ locale: "pt-BR",
252
+ period,
253
+ });
254
+ const columns = table.props.columns as Array<{ key: string; label: string }>;
255
+ expect(
256
+ columns
257
+ .filter((column) => column.key !== "latestStartedAt")
258
+ .map((column) => [column.key, column.label]),
259
+ ).toEqual([
260
+ ["label", period === "daily" ? "Dia" : period === "monthly" ? "Mês" : "Ano"],
261
+ ["prds", "PRDs"],
262
+ ["specs", "SPECs"],
263
+ ["tasks", "Tarefas criadas"],
264
+ ["runs", "Runs"],
265
+ ["tests", "Testes"],
266
+ ["evidences", "Evidências"],
267
+ ["duration", "Tempo"],
268
+ ["tokens", "Tokens"],
269
+ ["cost", "Custos"],
270
+ ]);
271
+ });
228
272
  it("renders unavailable duration explicitly and keeps the accessible scroll region", () => {
229
273
  const table = CostGroupsTable({
230
274
  rows: [unavailableGroup],
@@ -238,16 +282,14 @@ describe("grouped cost availability", () => {
238
282
  footer?: unknown;
239
283
  }>;
240
284
  const column = (key: string) => columns.find((candidate) => candidate.key === key);
241
-
242
285
  expect(table.props.scrollLabel).toBe(costGroupsScrollLabel("pt-BR"));
243
286
  expect(column("duration")?.render(unavailableGroup)).toBe("Indisponível");
244
- expect(column("tokens")?.render(unavailableGroup)).toBe("Indisponível");
245
- expect(column("cost")?.render(unavailableGroup)).toBe("Indisponível");
287
+ expect(column("tokens")?.render(unavailableGroup)).toBe("0");
288
+ expect(column("cost")?.render(unavailableGroup)).toContain("0,00");
246
289
  expect(column("duration")?.sortValue?.(unavailableGroup)).toBeNull();
247
290
  expect(column("tokens")?.sortValue?.(unavailableGroup)).toBeNull();
248
291
  expect(column("cost")?.sortValue?.(unavailableGroup)).toBeNull();
249
- const totalSummary =
250
- "Total geral — Tempo: Indispon\u00edvel; Tokens: Indispon\u00edvel; BRL: Indispon\u00edvel";
292
+ const totalSummary = "Total geral — Tempo: Indisponível; Tokens: 0; BRL: R$ 0,00";
251
293
  expect(
252
294
  (column("latestStartedAt")!.footer as { props: { "aria-label": string } }).props[
253
295
  "aria-label"
@@ -264,7 +306,113 @@ describe("grouped cost availability", () => {
264
306
  ).toBe(totalSummary);
265
307
  expect(column("coverage")).toBeUndefined();
266
308
  });
267
-
309
+ it("uses supplied pre-pagination totals for daily footer metrics", () => {
310
+ const table = CostGroupsTable({
311
+ rows: [{ ...unavailableGroup, total_tokens: 5, estimated_brl: 2, estimated_usd: 1 }],
312
+ currency: "BRL",
313
+ locale: "pt-BR",
314
+ period: "daily",
315
+ totals: {
316
+ ...unavailableGroup,
317
+ total_tokens: 50,
318
+ estimated_brl: 20,
319
+ estimated_usd: 10,
320
+ duration: { known_sum: 600_000, unknown: 0, complete: true, coverage_ratio: 1 },
321
+ },
322
+ });
323
+ const columns = table.props.columns as Array<{ key: string; footer?: unknown }>;
324
+ const tokenFooter = columns.find((column) => column.key === "tokens")?.footer;
325
+ const costFooter = columns.find((column) => column.key === "cost")?.footer;
326
+ expect(tokenFooter).toBeDefined();
327
+ expect(costFooter).toBeDefined();
328
+ expect((tokenFooter as { props: { children: unknown } }).props.children).toBe("50");
329
+ expect((costFooter as { props: { children: unknown } }).props.children).toContain("20,00");
330
+ });
331
+ it("renders ZAIP agent identity without a synthetic date column", () => {
332
+ const table = CostGroupsTable({
333
+ rows: [
334
+ {
335
+ ...unavailableGroup,
336
+ key: "zaip-agent-builder",
337
+ label: "zaip-agent-builder",
338
+ persona: "Rafa",
339
+ job: "Builder",
340
+ },
341
+ ],
342
+ currency: "BRL",
343
+ locale: "pt-BR",
344
+ showDateTime: false,
345
+ showAgentIdentity: true,
346
+ });
347
+ const columns = table.props.columns as Array<{
348
+ key: string;
349
+ label: string;
350
+ hidden?: boolean;
351
+ render?: (row: { persona?: string | null; job?: string | null }) => unknown;
352
+ }>;
353
+ expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
354
+ expect(columns.find((column) => column.key === "persona")?.render?.({ persona: "Rafa" })).toBe(
355
+ "Rafa",
356
+ );
357
+ expect(columns.find((column) => column.key === "job")?.render?.({ job: "Builder" })).toBe(
358
+ "Builder",
359
+ );
360
+ expect(columns.find((column) => column.key === "tasks")).toBeUndefined();
361
+ expect(table.props.defaultSort).toEqual({ key: "cost", direction: "desc" });
362
+ });
363
+ it("keeps legacy codex identity fields blank and uses the complete paged aggregate in its footer", () => {
364
+ const table = CostGroupsTable({
365
+ rows: [
366
+ {
367
+ ...unavailableGroup,
368
+ key: "codex",
369
+ label: "codex",
370
+ run_count: 1,
371
+ total_tokens: 10,
372
+ estimated_brl: 1,
373
+ estimated_usd: 1,
374
+ },
375
+ ],
376
+ currency: "BRL",
377
+ locale: "pt-BR",
378
+ showDateTime: false,
379
+ showAgentIdentity: true,
380
+ totals: {
381
+ ...unavailableGroup,
382
+ run_count: 2,
383
+ task_count: 2,
384
+ total_tokens: 30,
385
+ estimated_brl: 3,
386
+ estimated_usd: 3,
387
+ duration: { known_sum: 0, unknown: 1, complete: false, coverage_ratio: 0 },
388
+ },
389
+ });
390
+ const columns = table.props.columns as Array<{
391
+ key: string;
392
+ render?: (row: { persona?: string | null; job?: string | null }) => unknown;
393
+ footer?: unknown;
394
+ }>;
395
+ expect(columns.find((column) => column.key === "persona")?.render?.({ persona: null })).toBe(
396
+ "",
397
+ );
398
+ expect(columns.find((column) => column.key === "job")?.render?.({ job: null })).toBe("");
399
+ expect(columns.find((column) => column.key === "runs")?.footer).toBe(2);
400
+ const tokenFooter = columns.find((column) => column.key === "tokens")?.footer;
401
+ expect(tokenFooter).toBeDefined();
402
+ expect((tokenFooter as { props: { children: unknown } }).props.children).toBe("30");
403
+ });
404
+ it("renders model groups without date and labels distinct invocation tasks", () => {
405
+ const table = CostGroupsTable({
406
+ rows: [{ ...unavailableGroup, key: "unavailable", label: "unavailable", task_count: 0 }],
407
+ currency: "BRL",
408
+ locale: "pt-BR",
409
+ showDateTime: false,
410
+ showInvocationTasks: true,
411
+ });
412
+ const columns = table.props.columns as Array<{ key: string; label: string; hidden?: boolean }>;
413
+ expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
414
+ expect(columns.find((column) => column.key === "tasks")?.label).toBe("Tarefas com invocação");
415
+ });
268
416
  it("keeps a complete observed zero visible without a partial coverage label", () => {
269
417
  const observedZeroGroup = {
270
418
  ...unavailableGroup,
@@ -279,11 +427,22 @@ describe("grouped cost availability", () => {
279
427
  footer?: { props: { children: unknown } };
280
428
  }>
281
429
  ).find((column) => column.key === "duration");
282
-
283
430
  expect(duration?.render(observedZeroGroup)).toBe(formatAuditableDuration(0, "pt-BR"));
284
431
  expect(duration?.footer?.props.children).toBe(formatAuditableDuration(0, "pt-BR"));
285
432
  });
286
-
433
+ it("presents the factual known portion of a partial duration subtotal", () => {
434
+ const partial = {
435
+ ...unavailableGroup,
436
+ total_tokens: 1_000,
437
+ duration_ms: null,
438
+ duration: { known_sum: 20_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
439
+ };
440
+ const table = CostGroupsTable({ rows: [partial], currency: "BRL", locale: "pt-BR" });
441
+ const duration = (
442
+ table.props.columns as Array<{ key: string; footer?: { props: { children: unknown } } }>
443
+ ).find((column) => column.key === "duration");
444
+ expect(duration?.footer?.props.children).toBe("20 seg");
445
+ });
287
446
  it("does not expose coverage as a detailed Run column", () => {
288
447
  const table = CostRunsTable({
289
448
  rows: [unavailableGroup] as never,
@@ -294,7 +453,6 @@ describe("grouped cost availability", () => {
294
453
  const columns = table.props.columns as Array<{ key: string }>;
295
454
  expect(columns.some((column) => column.key === "coverage")).toBe(false);
296
455
  });
297
-
298
456
  it("sorts unavailable Run numeric metrics as unavailable", () => {
299
457
  const unavailableRun = { ...unavailableGroup, input_tokens: null, output_tokens: null };
300
458
  const table = CostRunsTable({
@@ -308,28 +466,169 @@ describe("grouped cost availability", () => {
308
466
  sortValue?: (row: typeof unavailableGroup) => unknown;
309
467
  }>;
310
468
  const column = (key: string) => columns.find((candidate) => candidate.key === key);
311
-
312
469
  expect(column("duration")?.sortValue?.(unavailableRun)).toBeNull();
313
470
  expect(column("totalTokens")?.sortValue?.(unavailableRun)).toBeNull();
314
471
  expect(column("cost")?.sortValue?.(unavailableRun)).toBeNull();
315
472
  });
316
-
473
+ it("keeps missing invocation facts unavailable instead of presenting observed zero", () => {
474
+ const unavailableRun = {
475
+ ...unavailableGroup,
476
+ input_tokens: null,
477
+ cached_input_tokens: null,
478
+ uncached_input_tokens: null,
479
+ output_tokens: null,
480
+ reasoning_tokens: null,
481
+ visible_output_tokens: null,
482
+ input_rate_usd_per_million: null,
483
+ cached_input_rate_usd_per_million: null,
484
+ output_rate_usd_per_million: null,
485
+ reasoning_rate_usd_per_million: null,
486
+ context_input_multiplier: null,
487
+ context_output_multiplier: null,
488
+ input_cost_usd: null,
489
+ cached_input_cost_usd: null,
490
+ output_cost_usd: null,
491
+ reasoning_cost_usd: null,
492
+ standard_cost_usd: null,
493
+ speed_uplift_usd: null,
494
+ fx_rate: null,
495
+ recorded_fx_rate: null,
496
+ recorded_brl: null,
497
+ estimated_usd: null,
498
+ estimated_brl: null,
499
+ } as never;
500
+ const table = CostRunsTable({
501
+ rows: [unavailableRun],
502
+ onOpenRun: () => undefined,
503
+ currency: "BRL",
504
+ locale: "pt-BR",
505
+ });
506
+ const columns = table.props.columns as Array<{
507
+ key: string;
508
+ description?: string;
509
+ hidden?: boolean;
510
+ render?: (row: typeof unavailableRun) => unknown;
511
+ }>;
512
+ const column = (key: string) => columns.find((candidate) => candidate.key === key);
513
+ const numericKeys = [
514
+ "duration",
515
+ "inputTokens",
516
+ "cachedInputTokens",
517
+ "outputTokens",
518
+ "reasoningTokens",
519
+ "totalTokens",
520
+ "inputRate",
521
+ "cacheRate",
522
+ "outputRate",
523
+ "reasoningRate",
524
+ "contextMultiplier",
525
+ "inputCost",
526
+ "cacheCost",
527
+ "outputCost",
528
+ "reasoningCost",
529
+ "standardCost",
530
+ "speedUplift",
531
+ "finalUsd",
532
+ "fxRate",
533
+ "recordedFxRate",
534
+ "recordedBrl",
535
+ "cost",
536
+ ];
537
+ for (const key of numericKeys) {
538
+ expect(column(key)?.description).toContain("projeção SQLite/API");
539
+ expect(column(key)?.hidden).not.toBe(true);
540
+ }
541
+ expect(column("duration")?.render?.(unavailableRun)).toBe("Indisponível");
542
+ expect(column("inputTokens")?.render?.(unavailableRun)).toBe("0");
543
+ expect(column("inputRate")?.render?.(unavailableRun)).toBe("0,00");
544
+ expect(column("contextMultiplier")?.render?.(unavailableRun)).toBe("Indisponível");
545
+ expect(column("inputCost")?.render?.(unavailableRun)).toContain("0,00");
546
+ expect(column("fxRate")?.render?.(unavailableRun)).toBe("R$ 0,00");
547
+ expect(column("recordedBrl")?.render?.(unavailableRun)).toContain("0,00");
548
+ expect(column("cost")?.render?.(unavailableRun)).toContain("0,00");
549
+ });
317
550
  it("provides a clear scroll label for the detailed Runs table", () => {
318
551
  expect(costRunsScrollLabel("pt-BR")).toBe(
319
552
  "Tabela de custos por invocação com rolagem horizontal",
320
553
  );
321
554
  });
322
- });
555
+ it("presents inclusive input/output totals and only their cache/reasoning subsets", () => {
556
+ const run = {
557
+ ...unavailableGroup,
558
+ input_tokens: 1_000,
559
+ cached_input_tokens: 200,
560
+ output_tokens: 500,
561
+ reasoning_tokens: 100,
562
+ total_tokens: 1_700,
563
+ } as never;
564
+ const table = CostRunsTable({
565
+ rows: [run],
566
+ onOpenRun: () => undefined,
567
+ currency: "BRL",
568
+ locale: "pt-BR",
569
+ });
570
+ const columns = table.props.columns as Array<{
571
+ key: string;
572
+ label?: string;
573
+ sortValue?: (row: typeof run) => unknown;
574
+ }>;
575
+ const column = (key: string) => columns.find((candidate) => candidate.key === key);
323
576
 
577
+ expect(column("inputTokens")?.label).toBe("Input total");
578
+ expect(column("outputTokens")?.label).toBe("Output total");
579
+ expect(column("uncachedInputTokens")).toBeUndefined();
580
+ expect(column("visibleOutputTokens")).toBeUndefined();
581
+ expect(column("totalTokens")?.sortValue?.(run)).toBe(1_500);
582
+ });
583
+ it("uses server pagination without re-applying the visual 100-row truncation", () => {
584
+ const table = CostRunsTable({
585
+ rows: [unavailableGroup] as never,
586
+ onOpenRun: () => undefined,
587
+ currency: "BRL",
588
+ locale: "pt-BR",
589
+ pagination: {
590
+ offset: 100,
591
+ limit: 100,
592
+ total: 250,
593
+ has_more: true,
594
+ loading: false,
595
+ error: null,
596
+ onChange: () => undefined,
597
+ onRetry: () => undefined,
598
+ },
599
+ });
600
+ expect(table.type).toBe(Symbol.for("react.fragment"));
601
+ expect(table.props.children[0].props.pageSize).toBeNull();
602
+ });
603
+ it("keeps an initial server-page error actionable before a page exists", () => {
604
+ const table = CostRunsTable({
605
+ rows: [unavailableGroup] as never,
606
+ onOpenRun: () => undefined,
607
+ currency: "BRL",
608
+ locale: "pt-BR",
609
+ pagination: {
610
+ offset: 0,
611
+ limit: 100,
612
+ total: 1,
613
+ has_more: false,
614
+ loading: false,
615
+ error: "network failed",
616
+ onChange: () => undefined,
617
+ onRetry: () => undefined,
618
+ },
619
+ });
620
+ const pager = table.props.children[1];
621
+ expect(pager.props.pagination.error).toBe("network failed");
622
+ expect(pager.props.pagination.onRetry).toEqual(expect.any(Function));
623
+ });
624
+ });
324
625
  describe("period-driven Cost Monitor loading", () => {
325
626
  it("drops a stale in-memory Cost period response when refresh replaces its base snapshot", () => {
326
627
  const stale = { runs: [{ run_id: "RUN-OBSERVED", duration_ms: 31 * 3_600_000 }] } as never;
327
628
  const refreshed = { runs: [{ run_id: "RUN-PROJECTED", duration_ms: 413_659_026 }] } as never;
328
-
329
629
  expect(activeCostPeriodData(refreshed, stale, stale)).toBe(refreshed);
330
630
  expect(activeCostPeriodData(refreshed, refreshed, refreshed)).toBe(refreshed);
331
631
  });
332
-
333
632
  it("does not issue a second Cost request after an embedded default atomic snapshot", () => {
334
633
  const filters = {
335
634
  query: "",
@@ -343,26 +642,25 @@ describe("period-driven Cost Monitor loading", () => {
343
642
  priority: "",
344
643
  risk: "",
345
644
  };
346
- expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(false);
645
+ expect(shouldFetchCostPeriod({ filters, period: "month", snapshotBacked: true })).toBe(false);
646
+ expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(true);
347
647
  expect(shouldFetchCostPeriod({ filters, period: "7", snapshotBacked: true })).toBe(true);
348
648
  expect(
349
649
  shouldFetchCostPeriod({
350
650
  filters: { ...filters, phase: "execution" },
351
- period: "all",
651
+ period: "month",
352
652
  snapshotBacked: true,
353
653
  }),
354
654
  ).toBe(true);
355
655
  });
356
-
357
- it("uses no date bounds for the default complete-history period", async () => {
358
- expect(defaultCostPeriod).toBe("all");
656
+ it("uses the current month for the default period and keeps All Time explicit", async () => {
657
+ expect(defaultCostPeriod).toBe("month");
359
658
  expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
360
659
  expect(costPeriodDateRange("month", new Date("2026-08-01T03:30:00.000Z"))).toEqual({
361
660
  from: "2026-08-01",
362
661
  to: "2026-08-01",
363
662
  });
364
- // Resetting standalone Cost Monitor to All Time removes the prior month
365
- // bounds instead of carrying them into the next request.
663
+ // Selecting standalone All Time still removes the prior month bounds.
366
664
  expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
367
665
  const calls: string[] = [];
368
666
  await loadCostMonitorPeriod({
@@ -372,9 +670,8 @@ describe("period-driven Cost Monitor loading", () => {
372
670
  return new Response(JSON.stringify({ runs: [] }), { status: 200 });
373
671
  },
374
672
  });
375
- expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL"]);
673
+ expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL&scope=summary"]);
376
674
  });
377
-
378
675
  it("derives an inclusive current-month range without inspecting materialized Runs", () => {
379
676
  expect(costPeriodDateRange("month", new Date("2026-07-26T15:00:00.000Z"))).toEqual({
380
677
  from: "2026-07-01",
@@ -385,7 +682,6 @@ describe("period-driven Cost Monitor loading", () => {
385
682
  to: "2026-07-26",
386
683
  });
387
684
  });
388
-
389
685
  it("requests the selected range from the local runtime and forwards cancellation", async () => {
390
686
  const calls: Array<{ url: string; signal: AbortSignal | null | undefined }> = [];
391
687
  const controller = new AbortController();
@@ -415,20 +711,32 @@ describe("period-driven Cost Monitor loading", () => {
415
711
  });
416
712
  },
417
713
  });
418
-
419
714
  expect(loaded).toEqual(projection);
420
715
  expect(calls).toEqual([
421
716
  {
422
717
  url:
423
- "/api/v2/cost-monitor?currency=BRL&from=2026-07-01&to=2026-07-26" +
718
+ "/api/v2/cost-monitor?currency=BRL&scope=summary&from=2026-07-01&to=2026-07-26" +
424
719
  "&provider=openai&phase=execution&agent=zaip-agent-builder" +
425
720
  "&model=gpt-5.6-terra&status=completed",
426
721
  signal: controller.signal,
427
722
  },
428
723
  ]);
429
724
  });
725
+ it("never leaves period/filter hydration scope-less or on detail", async () => {
726
+ const calls: string[] = [];
727
+ await loadCostMonitorPeriod({
728
+ currency: "USD",
729
+ filters: { ...emptyCostFilters, provider: "openai", model: "gpt-5.6-terra" },
730
+ fetcher: async (url) => {
731
+ calls.push(String(url));
732
+ return new Response(JSON.stringify({ runs: [] }), { status: 200 });
733
+ },
734
+ });
735
+ const request = new URL(calls[0]!, "http://dashboard.local");
736
+ expect(request.searchParams.get("scope")).toBe("summary");
737
+ expect(request.searchParams.get("scope")).not.toBe("detail");
738
+ });
430
739
  });
431
-
432
740
  describe("manifest-first invocation query", () => {
433
741
  it("opens only intersecting monthly manifests and candidate chunks", async () => {
434
742
  const inRange = signedSummary({
@@ -495,7 +803,6 @@ describe("manifest-first invocation query", () => {
495
803
  filters: { providers: ["openai"] },
496
804
  },
497
805
  );
498
-
499
806
  expect(result.summaries.map((summary) => summary.agent_invocation_id)).toEqual([
500
807
  "RUN-JULY-OPENAI",
501
808
  ]);
@@ -509,11 +816,9 @@ describe("manifest-first invocation query", () => {
509
816
  ]);
510
817
  });
511
818
  });
512
-
513
819
  function digest(value: string): string {
514
820
  return createHash("sha256").update(value).digest("hex");
515
821
  }
516
-
517
822
  function dimensions(overrides: Partial<Record<string, readonly string[]>> = {}) {
518
823
  return {
519
824
  providers: [],
@@ -530,7 +835,6 @@ function dimensions(overrides: Partial<Record<string, readonly string[]>> = {})
530
835
  ...overrides,
531
836
  };
532
837
  }
533
-
534
838
  function signedSummary(input: {
535
839
  agent_invocation_id: string;
536
840
  occurred_at: string;
@@ -545,7 +849,6 @@ function signedSummary(input: {
545
849
  };
546
850
  return { ...unsigned, summary_hash: digest(JSON.stringify(unsigned)) };
547
851
  }
548
-
549
852
  function signedManifest(input: {
550
853
  period: { year: number; month: number };
551
854
  from: string;
@@ -582,11 +885,9 @@ function signedManifest(input: {
582
885
  };
583
886
  return { ...unsigned, manifest_hash: digest(JSON.stringify(unsigned)) };
584
887
  }
585
-
586
888
  describe("cost sorting", () => {
587
889
  it("orders the raw BRL values rather than their localized currency labels", () => {
588
890
  const rows = [143.72, 127.78, 21457.76, 1370.63];
589
-
590
891
  expect(
591
892
  rows.sort(
592
893
  (left, right) =>
@@ -595,7 +896,6 @@ describe("cost sorting", () => {
595
896
  ).toEqual([21457.76, 1370.63, 143.72, 127.78]);
596
897
  });
597
898
  });
598
-
599
899
  describe("context uplift", () => {
600
900
  const base = {
601
901
  context_input_multiplier: 1,
@@ -605,11 +905,9 @@ describe("context uplift", () => {
605
905
  output_cost_usd: 8,
606
906
  reasoning_cost_usd: 2,
607
907
  };
608
-
609
908
  it("returns zero for a 1x / 1x call", () => {
610
909
  expect(contextUpliftUsd(base as never)).toBe(0);
611
910
  });
612
-
613
911
  it("extracts the already included context portion from effective costs", () => {
614
912
  expect(
615
913
  contextUpliftUsd({
@@ -620,7 +918,6 @@ describe("context uplift", () => {
620
918
  ).toBeCloseTo(9.333333, 5);
621
919
  });
622
920
  });
623
-
624
921
  describe("model aggregation visibility", () => {
625
922
  it("hides the manual placeholder regardless of casing or whitespace", () => {
626
923
  expect(isDisplayableModel("manual")).toBe(false);
@@ -632,7 +929,6 @@ describe("model aggregation visibility", () => {
632
929
  expect(isDisplayableModel("gpt-5.4")).toBe(true);
633
930
  expect(isDisplayableModel("gpt-5.6-sol")).toBe(true);
634
931
  });
635
-
636
932
  it("hides calls that have no collected usage", () => {
637
933
  const empty = {
638
934
  input_tokens: null,
@@ -648,7 +944,6 @@ describe("model aggregation visibility", () => {
648
944
  expect(hasCollectedUsage({ ...empty, estimated_brl: 0.01 } as never)).toBe(true);
649
945
  });
650
946
  });
651
-
652
947
  describe("model processing duration", () => {
653
948
  it("sums root orchestration Runs without overlapping intake and Sub-Runs", () => {
654
949
  expect(
@@ -666,15 +961,18 @@ describe("model processing duration", () => {
666
961
  ]),
667
962
  ).toBe(210_000);
668
963
  });
669
-
670
- it("groups Runs without an identifiable model as Undefined", () => {
964
+ it("groups Runs without an identifiable model as unavailable", () => {
671
965
  expect(displayModelName("gpt-5.6-sol", "pt-BR")).toBe("gpt-5.6-sol");
672
- expect(displayModelName("unknown", "pt-BR")).toBe("Indefinido");
673
- expect(displayModelName(" ", "en-US")).toBe("Undefined");
966
+ expect(displayModelName("unknown", "pt-BR")).toBe("Indisponível");
967
+ expect(displayModelName(" ", "en-US")).toBe("Unavailable");
674
968
  expect(displayModelName("manual", "pt-BR")).toBeNull();
675
969
  expect(displayModelName("gpt-5", "pt-BR")).toBeNull();
676
970
  });
677
-
971
+ it("presents genuinely missing aggregate dimensions as unavailable", () => {
972
+ expect(displayCostGroupLabel("unknown", "pt-BR")).toBe("Sem modelo/provedor atribuído");
973
+ expect(displayCostGroupLabel(" ", "en-US")).toBe("No model/provider assigned");
974
+ expect(displayCostGroupLabel("gpt-5.6-sol", "pt-BR")).toBe("gpt-5.6-sol");
975
+ });
678
976
  it("keeps duration-only root orchestration Runs in the model table", () => {
679
977
  expect(
680
978
  isModelAuditRow({