@zaip-ai/cli 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/README.md +6 -4
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.d.ts.map +1 -1
  4. package/dist/services/adapters.js +15 -5
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/adapters.test.js +1 -1
  7. package/dist/services/agent-adapters.d.ts +9 -0
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +38 -3
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +8 -1
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.d.ts +2 -1
  14. package/dist/services/codex-config-template.d.ts.map +1 -1
  15. package/dist/services/codex-config-template.js +13 -2
  16. package/dist/services/codex-config-template.js.map +1 -1
  17. package/dist/services/codex-rules.d.ts +1 -1
  18. package/dist/services/codex-rules.d.ts.map +1 -1
  19. package/dist/services/codex-rules.js +31 -7
  20. package/dist/services/codex-rules.js.map +1 -1
  21. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  22. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  23. package/dist/services/codex-subagent-hook-template.js +4 -1
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/doctor.d.ts.map +1 -1
  26. package/dist/services/doctor.js +3 -1
  27. package/dist/services/doctor.js.map +1 -1
  28. package/dist/services/global-codex-config.d.ts +6 -3
  29. package/dist/services/global-codex-config.d.ts.map +1 -1
  30. package/dist/services/global-codex-config.js +82 -13
  31. package/dist/services/global-codex-config.js.map +1 -1
  32. package/dist/services/global-codex-config.test.js +57 -10
  33. package/dist/services/global-codex-config.test.js.map +1 -1
  34. package/dist/services/install-agents-template.d.ts.map +1 -1
  35. package/dist/services/install-agents-template.js +15 -2
  36. package/dist/services/install-agents-template.js.map +1 -1
  37. package/dist/services/logger.js +1 -1
  38. package/dist/services/logger.js.map +1 -1
  39. package/dist/services/logger.test.js +3 -3
  40. package/dist/services/logger.test.js.map +1 -1
  41. package/dist/services/runtime-template.test.js +21 -5
  42. package/dist/services/runtime-template.test.js.map +1 -1
  43. package/dist/services/template-manifest.d.ts.map +1 -1
  44. package/dist/services/template-manifest.js +2 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/config/agents/catalog.yaml +310 -10
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  57. package/templates/.agents/config/project.yaml +1 -1
  58. package/templates/.agents/dashboard/.zaip-managed.json +659 -163
  59. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  60. package/templates/.agents/dashboard/README.md +48 -97
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
  63. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
  64. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  79. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  80. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
  81. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  89. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
  94. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  102. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  111. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  114. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  116. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
  118. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  120. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  121. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  122. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
  130. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
  131. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  132. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  133. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  177. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  178. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
  179. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  180. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  181. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  182. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  183. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
  184. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  185. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  186. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  187. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  188. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  189. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
  190. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
  195. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  196. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  197. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  198. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  199. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
  200. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  201. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
  202. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
  203. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
  204. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  205. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
  206. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  207. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
  208. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
  209. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
  210. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  211. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  212. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  213. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  214. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  215. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
  217. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
  219. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  220. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  221. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
  222. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  223. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
  232. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  233. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  234. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  235. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  238. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
  239. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
  240. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  241. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  242. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  243. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  244. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  245. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  246. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  247. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
  248. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
  249. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  250. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  251. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  252. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  253. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  255. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
  256. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  257. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  258. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  259. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  260. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  261. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  262. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  263. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  264. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  265. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  266. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  267. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
  269. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  270. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
  271. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
  277. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  278. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  279. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  281. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
  282. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  283. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  284. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
  286. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  288. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  290. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  291. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  292. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
  302. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  307. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  308. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
  310. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
  311. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  312. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  313. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  314. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  315. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  316. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  317. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  318. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  319. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
  320. package/templates/.agents/dashboard/work-priority.json +34 -0
  321. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  322. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  323. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  324. package/templates/.agents/design/.zaip-managed.json +3 -3
  325. package/templates/.agents/design/apps/catalog/package.json +1 -1
  326. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  327. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  328. package/templates/.agents/requirements/comparative-audit.md +1 -1
  329. package/templates/.agents/requirements/context-engine.md +1 -1
  330. package/templates/.agents/requirements/cost-observability.md +1 -1
  331. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  332. package/templates/.agents/requirements/data-export.md +1 -1
  333. package/templates/.agents/requirements/design-system.md +1 -1
  334. package/templates/.agents/requirements/execution-engine.md +1 -1
  335. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  336. package/templates/.agents/requirements/model-orchestration.md +1 -1
  337. package/templates/.agents/requirements/public-distribution.md +9 -6
  338. package/templates/.agents/requirements/software-architecture.md +1 -1
  339. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  340. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  341. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  342. package/templates/.agents/rules/autonomy-decision.md +15 -0
  343. package/templates/.agents/rules/core.md +1 -1
  344. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  345. package/templates/.agents/rules/specialist-routing.md +19 -0
  346. package/templates/.agents/rules/workflow.md +1 -1
  347. package/templates/.agents/runtime/VERSION +1 -1
  348. package/templates/.agents/runtime/bin/zaip.mjs +114 -64
  349. package/templates/.agents/runtime/checksums.sha256 +6 -4
  350. package/templates/.agents/runtime/manifest.json +3 -1
  351. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  352. package/templates/.agents/runtime/provenance.json +11 -0
  353. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  354. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  355. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
  356. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  357. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  358. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  359. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  360. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  361. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  362. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  363. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  364. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  365. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  366. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  367. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  368. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  369. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  370. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  371. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  372. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  373. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
  375. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  377. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  378. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
  380. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
  381. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
  382. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
  383. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
  384. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
  385. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
  386. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  387. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  388. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  389. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  390. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
  392. package/templates/.agents/zaip-aios/INDEX.md +1 -0
  393. package/templates/.agents/zaip-aios/README.md +37 -8
  394. package/templates/.agents/zaip-aios/VERSION +1 -1
  395. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  396. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  397. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  398. package/templates/template-manifest.json +945 -214
  399. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  400. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  401. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  402. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  403. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  404. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  405. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  406. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  407. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  408. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  409. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  410. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -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,73 @@ 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
+ expect((columns.find((column) => column.key === "tokens")?.footer as { props: { children: unknown } }).props.children).toBe("50");
325
+ expect((columns.find((column) => column.key === "cost")?.footer as { props: { children: unknown } }).props.children).toContain("20,00");
326
+ });
327
+ it("renders ZAIP agent identity without a synthetic date column", () => {
328
+ const table = CostGroupsTable({
329
+ rows: [{ ...unavailableGroup, key: "zaip-agent-builder", label: "zaip-agent-builder", persona: "Rafa", job: "Builder" }],
330
+ currency: "BRL",
331
+ locale: "pt-BR",
332
+ showDateTime: false,
333
+ showAgentIdentity: true,
334
+ });
335
+ const columns = table.props.columns as Array<{ key: string; label: string; hidden?: boolean; render?: (row: { persona?: string | null; job?: string | null }) => unknown }>;
336
+ expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
337
+ expect(columns.find((column) => column.key === "persona")?.render?.({ persona: "Rafa" })).toBe("Rafa");
338
+ expect(columns.find((column) => column.key === "job")?.render?.({ job: "Builder" })).toBe("Builder");
339
+ expect(columns.find((column) => column.key === "tasks")).toBeUndefined();
340
+ });
341
+ it("keeps legacy codex identity fields blank and uses the complete paged aggregate in its footer", () => {
342
+ const table = CostGroupsTable({
343
+ rows: [{ ...unavailableGroup, key: "codex", label: "codex", run_count: 1, total_tokens: 10, estimated_brl: 1, estimated_usd: 1 }],
344
+ currency: "BRL",
345
+ locale: "pt-BR",
346
+ showDateTime: false,
347
+ showAgentIdentity: true,
348
+ totals: {
349
+ ...unavailableGroup,
350
+ run_count: 2,
351
+ task_count: 2,
352
+ total_tokens: 30,
353
+ estimated_brl: 3,
354
+ estimated_usd: 3,
355
+ duration: { known_sum: 0, unknown: 1, complete: false, coverage_ratio: 0 },
356
+ },
357
+ });
358
+ const columns = table.props.columns as Array<{ key: string; render?: (row: { persona?: string | null; job?: string | null }) => unknown; footer?: unknown }>;
359
+ expect(columns.find((column) => column.key === "persona")?.render?.({ persona: null })).toBe("");
360
+ expect(columns.find((column) => column.key === "job")?.render?.({ job: null })).toBe("");
361
+ expect(columns.find((column) => column.key === "runs")?.footer).toBe(2);
362
+ expect((columns.find((column) => column.key === "tokens")?.footer as { props: { children: unknown } }).props.children).toBe("30");
363
+ });
364
+ it("renders model groups without date and labels distinct invocation tasks", () => {
365
+ const table = CostGroupsTable({
366
+ rows: [{ ...unavailableGroup, key: "unavailable", label: "unavailable", task_count: 0 }],
367
+ currency: "BRL",
368
+ locale: "pt-BR",
369
+ showDateTime: false,
370
+ showInvocationTasks: true,
371
+ });
372
+ const columns = table.props.columns as Array<{ key: string; label: string; hidden?: boolean }>;
373
+ expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
374
+ expect(columns.find((column) => column.key === "tasks")?.label).toBe("Tarefas com invocação");
375
+ });
268
376
  it("keeps a complete observed zero visible without a partial coverage label", () => {
269
377
  const observedZeroGroup = {
270
378
  ...unavailableGroup,
@@ -279,11 +387,21 @@ describe("grouped cost availability", () => {
279
387
  footer?: { props: { children: unknown } };
280
388
  }>
281
389
  ).find((column) => column.key === "duration");
282
-
283
390
  expect(duration?.render(observedZeroGroup)).toBe(formatAuditableDuration(0, "pt-BR"));
284
391
  expect(duration?.footer?.props.children).toBe(formatAuditableDuration(0, "pt-BR"));
285
392
  });
286
-
393
+ it("presents the factual known portion of a partial duration subtotal", () => {
394
+ const partial = {
395
+ ...unavailableGroup,
396
+ total_tokens: 1_000,
397
+ duration_ms: null,
398
+ duration: { known_sum: 20_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
399
+ };
400
+ const table = CostGroupsTable({ rows: [partial], currency: "BRL", locale: "pt-BR" });
401
+ const duration = (table.props.columns as Array<{ key: string; footer?: { props: { children: unknown } } }>)
402
+ .find((column) => column.key === "duration");
403
+ expect(duration?.footer?.props.children).toBe("20 seg");
404
+ });
287
405
  it("does not expose coverage as a detailed Run column", () => {
288
406
  const table = CostRunsTable({
289
407
  rows: [unavailableGroup] as never,
@@ -294,7 +412,6 @@ describe("grouped cost availability", () => {
294
412
  const columns = table.props.columns as Array<{ key: string }>;
295
413
  expect(columns.some((column) => column.key === "coverage")).toBe(false);
296
414
  });
297
-
298
415
  it("sorts unavailable Run numeric metrics as unavailable", () => {
299
416
  const unavailableRun = { ...unavailableGroup, input_tokens: null, output_tokens: null };
300
417
  const table = CostRunsTable({
@@ -308,28 +425,152 @@ describe("grouped cost availability", () => {
308
425
  sortValue?: (row: typeof unavailableGroup) => unknown;
309
426
  }>;
310
427
  const column = (key: string) => columns.find((candidate) => candidate.key === key);
311
-
312
428
  expect(column("duration")?.sortValue?.(unavailableRun)).toBeNull();
313
429
  expect(column("totalTokens")?.sortValue?.(unavailableRun)).toBeNull();
314
430
  expect(column("cost")?.sortValue?.(unavailableRun)).toBeNull();
315
431
  });
316
-
432
+ it("keeps missing invocation facts unavailable instead of presenting observed zero", () => {
433
+ const unavailableRun = {
434
+ ...unavailableGroup,
435
+ input_tokens: null,
436
+ cached_input_tokens: null,
437
+ uncached_input_tokens: null,
438
+ output_tokens: null,
439
+ reasoning_tokens: null,
440
+ visible_output_tokens: null,
441
+ input_rate_usd_per_million: null,
442
+ cached_input_rate_usd_per_million: null,
443
+ output_rate_usd_per_million: null,
444
+ reasoning_rate_usd_per_million: null,
445
+ context_input_multiplier: null,
446
+ context_output_multiplier: null,
447
+ input_cost_usd: null,
448
+ cached_input_cost_usd: null,
449
+ output_cost_usd: null,
450
+ reasoning_cost_usd: null,
451
+ standard_cost_usd: null,
452
+ speed_uplift_usd: null,
453
+ fx_rate: null,
454
+ recorded_fx_rate: null,
455
+ recorded_brl: null,
456
+ estimated_usd: null,
457
+ estimated_brl: null,
458
+ } as never;
459
+ const table = CostRunsTable({
460
+ rows: [unavailableRun],
461
+ onOpenRun: () => undefined,
462
+ currency: "BRL",
463
+ locale: "pt-BR",
464
+ });
465
+ const columns = table.props.columns as Array<{
466
+ key: string;
467
+ description?: string;
468
+ hidden?: boolean;
469
+ render?: (row: typeof unavailableRun) => unknown;
470
+ }>;
471
+ const column = (key: string) => columns.find((candidate) => candidate.key === key);
472
+ const numericKeys = [
473
+ "duration", "inputTokens", "cachedInputTokens", "outputTokens", "reasoningTokens",
474
+ "totalTokens", "inputRate", "cacheRate",
475
+ "outputRate", "reasoningRate", "contextMultiplier", "inputCost", "cacheCost",
476
+ "outputCost", "reasoningCost", "standardCost", "speedUplift", "finalUsd", "fxRate",
477
+ "recordedFxRate", "recordedBrl", "cost",
478
+ ];
479
+ for (const key of numericKeys) {
480
+ expect(column(key)?.description).toContain("projeção SQLite/API");
481
+ expect(column(key)?.hidden).not.toBe(true);
482
+ }
483
+ expect(column("duration")?.render?.(unavailableRun)).toBe("Indisponível");
484
+ expect(column("inputTokens")?.render?.(unavailableRun)).toBe("0");
485
+ expect(column("inputRate")?.render?.(unavailableRun)).toBe("0,00");
486
+ expect(column("contextMultiplier")?.render?.(unavailableRun)).toBe("Indisponível");
487
+ expect(column("inputCost")?.render?.(unavailableRun)).toContain("0,00");
488
+ expect(column("fxRate")?.render?.(unavailableRun)).toBe("R$ 0,00");
489
+ expect(column("recordedBrl")?.render?.(unavailableRun)).toContain("0,00");
490
+ expect(column("cost")?.render?.(unavailableRun)).toContain("0,00");
491
+ });
317
492
  it("provides a clear scroll label for the detailed Runs table", () => {
318
493
  expect(costRunsScrollLabel("pt-BR")).toBe(
319
494
  "Tabela de custos por invocação com rolagem horizontal",
320
495
  );
321
496
  });
322
- });
497
+ it("presents inclusive input/output totals and only their cache/reasoning subsets", () => {
498
+ const run = {
499
+ ...unavailableGroup,
500
+ input_tokens: 1_000,
501
+ cached_input_tokens: 200,
502
+ output_tokens: 500,
503
+ reasoning_tokens: 100,
504
+ total_tokens: 1_700,
505
+ } as never;
506
+ const table = CostRunsTable({
507
+ rows: [run],
508
+ onOpenRun: () => undefined,
509
+ currency: "BRL",
510
+ locale: "pt-BR",
511
+ });
512
+ const columns = table.props.columns as Array<{
513
+ key: string;
514
+ label?: string;
515
+ sortValue?: (row: typeof run) => unknown;
516
+ }>;
517
+ const column = (key: string) => columns.find((candidate) => candidate.key === key);
323
518
 
519
+ expect(column("inputTokens")?.label).toBe("Input total");
520
+ expect(column("outputTokens")?.label).toBe("Output total");
521
+ expect(column("uncachedInputTokens")).toBeUndefined();
522
+ expect(column("visibleOutputTokens")).toBeUndefined();
523
+ expect(column("totalTokens")?.sortValue?.(run)).toBe(1_500);
524
+ });
525
+ it("uses server pagination without re-applying the visual 100-row truncation", () => {
526
+ const table = CostRunsTable({
527
+ rows: [unavailableGroup] as never,
528
+ onOpenRun: () => undefined,
529
+ currency: "BRL",
530
+ locale: "pt-BR",
531
+ pagination: {
532
+ offset: 100,
533
+ limit: 100,
534
+ total: 250,
535
+ has_more: true,
536
+ loading: false,
537
+ error: null,
538
+ onChange: () => undefined,
539
+ onRetry: () => undefined,
540
+ },
541
+ });
542
+ expect(table.type).toBe(Symbol.for("react.fragment"));
543
+ expect(table.props.children[0].props.pageSize).toBeNull();
544
+ });
545
+ it("keeps an initial server-page error actionable before a page exists", () => {
546
+ const table = CostRunsTable({
547
+ rows: [unavailableGroup] as never,
548
+ onOpenRun: () => undefined,
549
+ currency: "BRL",
550
+ locale: "pt-BR",
551
+ pagination: {
552
+ offset: 0,
553
+ limit: 100,
554
+ total: 1,
555
+ has_more: false,
556
+ loading: false,
557
+ error: "network failed",
558
+ onChange: () => undefined,
559
+ onRetry: () => undefined,
560
+ },
561
+ });
562
+ const pager = table.props.children[1];
563
+ expect(pager.props.pagination.error).toBe("network failed");
564
+ expect(pager.props.pagination.onRetry).toEqual(expect.any(Function));
565
+ });
566
+ });
324
567
  describe("period-driven Cost Monitor loading", () => {
325
568
  it("drops a stale in-memory Cost period response when refresh replaces its base snapshot", () => {
326
569
  const stale = { runs: [{ run_id: "RUN-OBSERVED", duration_ms: 31 * 3_600_000 }] } as never;
327
570
  const refreshed = { runs: [{ run_id: "RUN-PROJECTED", duration_ms: 413_659_026 }] } as never;
328
-
329
571
  expect(activeCostPeriodData(refreshed, stale, stale)).toBe(refreshed);
330
572
  expect(activeCostPeriodData(refreshed, refreshed, refreshed)).toBe(refreshed);
331
573
  });
332
-
333
574
  it("does not issue a second Cost request after an embedded default atomic snapshot", () => {
334
575
  const filters = {
335
576
  query: "",
@@ -343,26 +584,25 @@ describe("period-driven Cost Monitor loading", () => {
343
584
  priority: "",
344
585
  risk: "",
345
586
  };
346
- expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(false);
587
+ expect(shouldFetchCostPeriod({ filters, period: "month", snapshotBacked: true })).toBe(false);
588
+ expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(true);
347
589
  expect(shouldFetchCostPeriod({ filters, period: "7", snapshotBacked: true })).toBe(true);
348
590
  expect(
349
591
  shouldFetchCostPeriod({
350
592
  filters: { ...filters, phase: "execution" },
351
- period: "all",
593
+ period: "month",
352
594
  snapshotBacked: true,
353
595
  }),
354
596
  ).toBe(true);
355
597
  });
356
-
357
- it("uses no date bounds for the default complete-history period", async () => {
358
- expect(defaultCostPeriod).toBe("all");
598
+ it("uses the current month for the default period and keeps All Time explicit", async () => {
599
+ expect(defaultCostPeriod).toBe("month");
359
600
  expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
360
601
  expect(costPeriodDateRange("month", new Date("2026-08-01T03:30:00.000Z"))).toEqual({
361
602
  from: "2026-08-01",
362
603
  to: "2026-08-01",
363
604
  });
364
- // Resetting standalone Cost Monitor to All Time removes the prior month
365
- // bounds instead of carrying them into the next request.
605
+ // Selecting standalone All Time still removes the prior month bounds.
366
606
  expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
367
607
  const calls: string[] = [];
368
608
  await loadCostMonitorPeriod({
@@ -372,9 +612,8 @@ describe("period-driven Cost Monitor loading", () => {
372
612
  return new Response(JSON.stringify({ runs: [] }), { status: 200 });
373
613
  },
374
614
  });
375
- expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL"]);
615
+ expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL&scope=summary"]);
376
616
  });
377
-
378
617
  it("derives an inclusive current-month range without inspecting materialized Runs", () => {
379
618
  expect(costPeriodDateRange("month", new Date("2026-07-26T15:00:00.000Z"))).toEqual({
380
619
  from: "2026-07-01",
@@ -385,7 +624,6 @@ describe("period-driven Cost Monitor loading", () => {
385
624
  to: "2026-07-26",
386
625
  });
387
626
  });
388
-
389
627
  it("requests the selected range from the local runtime and forwards cancellation", async () => {
390
628
  const calls: Array<{ url: string; signal: AbortSignal | null | undefined }> = [];
391
629
  const controller = new AbortController();
@@ -415,20 +653,32 @@ describe("period-driven Cost Monitor loading", () => {
415
653
  });
416
654
  },
417
655
  });
418
-
419
656
  expect(loaded).toEqual(projection);
420
657
  expect(calls).toEqual([
421
658
  {
422
659
  url:
423
- "/api/v2/cost-monitor?currency=BRL&from=2026-07-01&to=2026-07-26" +
660
+ "/api/v2/cost-monitor?currency=BRL&scope=summary&from=2026-07-01&to=2026-07-26" +
424
661
  "&provider=openai&phase=execution&agent=zaip-agent-builder" +
425
662
  "&model=gpt-5.6-terra&status=completed",
426
663
  signal: controller.signal,
427
664
  },
428
665
  ]);
429
666
  });
667
+ it("never leaves period/filter hydration scope-less or on detail", async () => {
668
+ const calls: string[] = [];
669
+ await loadCostMonitorPeriod({
670
+ currency: "USD",
671
+ filters: { ...emptyCostFilters, provider: "openai", model: "gpt-5.6-terra" },
672
+ fetcher: async (url) => {
673
+ calls.push(String(url));
674
+ return new Response(JSON.stringify({ runs: [] }), { status: 200 });
675
+ },
676
+ });
677
+ const request = new URL(calls[0]!, "http://dashboard.local");
678
+ expect(request.searchParams.get("scope")).toBe("summary");
679
+ expect(request.searchParams.get("scope")).not.toBe("detail");
680
+ });
430
681
  });
431
-
432
682
  describe("manifest-first invocation query", () => {
433
683
  it("opens only intersecting monthly manifests and candidate chunks", async () => {
434
684
  const inRange = signedSummary({
@@ -495,7 +745,6 @@ describe("manifest-first invocation query", () => {
495
745
  filters: { providers: ["openai"] },
496
746
  },
497
747
  );
498
-
499
748
  expect(result.summaries.map((summary) => summary.agent_invocation_id)).toEqual([
500
749
  "RUN-JULY-OPENAI",
501
750
  ]);
@@ -509,11 +758,9 @@ describe("manifest-first invocation query", () => {
509
758
  ]);
510
759
  });
511
760
  });
512
-
513
761
  function digest(value: string): string {
514
762
  return createHash("sha256").update(value).digest("hex");
515
763
  }
516
-
517
764
  function dimensions(overrides: Partial<Record<string, readonly string[]>> = {}) {
518
765
  return {
519
766
  providers: [],
@@ -530,7 +777,6 @@ function dimensions(overrides: Partial<Record<string, readonly string[]>> = {})
530
777
  ...overrides,
531
778
  };
532
779
  }
533
-
534
780
  function signedSummary(input: {
535
781
  agent_invocation_id: string;
536
782
  occurred_at: string;
@@ -545,7 +791,6 @@ function signedSummary(input: {
545
791
  };
546
792
  return { ...unsigned, summary_hash: digest(JSON.stringify(unsigned)) };
547
793
  }
548
-
549
794
  function signedManifest(input: {
550
795
  period: { year: number; month: number };
551
796
  from: string;
@@ -582,11 +827,9 @@ function signedManifest(input: {
582
827
  };
583
828
  return { ...unsigned, manifest_hash: digest(JSON.stringify(unsigned)) };
584
829
  }
585
-
586
830
  describe("cost sorting", () => {
587
831
  it("orders the raw BRL values rather than their localized currency labels", () => {
588
832
  const rows = [143.72, 127.78, 21457.76, 1370.63];
589
-
590
833
  expect(
591
834
  rows.sort(
592
835
  (left, right) =>
@@ -595,7 +838,6 @@ describe("cost sorting", () => {
595
838
  ).toEqual([21457.76, 1370.63, 143.72, 127.78]);
596
839
  });
597
840
  });
598
-
599
841
  describe("context uplift", () => {
600
842
  const base = {
601
843
  context_input_multiplier: 1,
@@ -605,11 +847,9 @@ describe("context uplift", () => {
605
847
  output_cost_usd: 8,
606
848
  reasoning_cost_usd: 2,
607
849
  };
608
-
609
850
  it("returns zero for a 1x / 1x call", () => {
610
851
  expect(contextUpliftUsd(base as never)).toBe(0);
611
852
  });
612
-
613
853
  it("extracts the already included context portion from effective costs", () => {
614
854
  expect(
615
855
  contextUpliftUsd({
@@ -620,7 +860,6 @@ describe("context uplift", () => {
620
860
  ).toBeCloseTo(9.333333, 5);
621
861
  });
622
862
  });
623
-
624
863
  describe("model aggregation visibility", () => {
625
864
  it("hides the manual placeholder regardless of casing or whitespace", () => {
626
865
  expect(isDisplayableModel("manual")).toBe(false);
@@ -632,7 +871,6 @@ describe("model aggregation visibility", () => {
632
871
  expect(isDisplayableModel("gpt-5.4")).toBe(true);
633
872
  expect(isDisplayableModel("gpt-5.6-sol")).toBe(true);
634
873
  });
635
-
636
874
  it("hides calls that have no collected usage", () => {
637
875
  const empty = {
638
876
  input_tokens: null,
@@ -648,7 +886,6 @@ describe("model aggregation visibility", () => {
648
886
  expect(hasCollectedUsage({ ...empty, estimated_brl: 0.01 } as never)).toBe(true);
649
887
  });
650
888
  });
651
-
652
889
  describe("model processing duration", () => {
653
890
  it("sums root orchestration Runs without overlapping intake and Sub-Runs", () => {
654
891
  expect(
@@ -666,15 +903,18 @@ describe("model processing duration", () => {
666
903
  ]),
667
904
  ).toBe(210_000);
668
905
  });
669
-
670
- it("groups Runs without an identifiable model as Undefined", () => {
906
+ it("groups Runs without an identifiable model as unavailable", () => {
671
907
  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");
908
+ expect(displayModelName("unknown", "pt-BR")).toBe("Indisponível");
909
+ expect(displayModelName(" ", "en-US")).toBe("Unavailable");
674
910
  expect(displayModelName("manual", "pt-BR")).toBeNull();
675
911
  expect(displayModelName("gpt-5", "pt-BR")).toBeNull();
676
912
  });
677
-
913
+ it("presents genuinely missing aggregate dimensions as unavailable", () => {
914
+ expect(displayCostGroupLabel("unknown", "pt-BR")).toBe("Sem modelo/provedor atribuído");
915
+ expect(displayCostGroupLabel(" ", "en-US")).toBe("No model/provider assigned");
916
+ expect(displayCostGroupLabel("gpt-5.6-sol", "pt-BR")).toBe("gpt-5.6-sol");
917
+ });
678
918
  it("keeps duration-only root orchestration Runs in the model table", () => {
679
919
  expect(
680
920
  isModelAuditRow({