@zaip-ai/cli 1.0.8 → 1.3.1

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 (360) hide show
  1. package/README.md +1 -1
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.js +1 -1
  4. package/dist/services/agent-adapters.js +3 -3
  5. package/dist/services/agent-adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.test.js +7 -1
  7. package/dist/services/agent-adapters.test.js.map +1 -1
  8. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  9. package/dist/services/codex-pre-tool-hook-template.js +89 -7
  10. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  11. package/dist/services/codex-rules.d.ts +1 -1
  12. package/dist/services/codex-rules.d.ts.map +1 -1
  13. package/dist/services/codex-rules.js +7 -0
  14. package/dist/services/codex-rules.js.map +1 -1
  15. package/dist/services/install-agents-template.d.ts.map +1 -1
  16. package/dist/services/install-agents-template.js +1 -0
  17. package/dist/services/install-agents-template.js.map +1 -1
  18. package/dist/services/logger.test.js +2 -2
  19. package/dist/services/runtime-template.test.js +31 -7
  20. package/dist/services/runtime-template.test.js.map +1 -1
  21. package/dist/services/template-manifest.d.ts.map +1 -1
  22. package/dist/services/template-manifest.js +12 -3
  23. package/dist/services/template-manifest.js.map +1 -1
  24. package/package.json +1 -1
  25. package/templates/.agents/architecture/software-architecture.md +131 -0
  26. package/templates/.agents/branding/brandbook.docx +0 -0
  27. package/templates/.agents/branding/brandbook.md +60 -0
  28. package/templates/.agents/config/agents/catalog.yaml +7 -7
  29. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +2 -2
  30. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +2 -2
  31. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  32. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +8 -8
  33. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -1
  34. package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
  35. package/templates/.agents/dashboard/.zaip-managed.json +457 -173
  36. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-Z60df2r-.js → CostCalculationGuidePage-ovxurkIk.js} +1 -1
  37. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-BgVgrfhQ.js +2310 -0
  38. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-Coc6pA-1.js → PricingSettingsDialog-vSvvOHQp.js} +1 -1
  39. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
  40. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-zH758vfs.js +3 -0
  41. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-DLn-Mz2M.js +1 -0
  42. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-CaKwQP43.css → TraceabilityWorkspace-DvvavDLY.css} +1 -1
  43. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DKwP1stV.js +68 -0
  44. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-PoJA2PI1.css +1 -0
  45. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DFBuc_qp.js → icons-vendor-B_lDDHn1.js} +1 -1
  46. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-B31GMG5O.css +1 -0
  47. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-CZQlsLV9.js +2 -0
  48. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CCQOHdVI.js → react-vendor-B3TJrD4O.js} +1 -1
  49. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-pC2_0J8x.js → traceability-7f1j5wx3.js} +1 -1
  50. package/templates/.agents/dashboard/apps/frontend/dist/index.html +7 -7
  51. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  52. package/templates/.agents/dashboard/apps/frontend/playwright.dom.config.ts +32 -0
  53. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +199 -140
  54. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +0 -21
  55. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +20 -11
  56. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +14 -7
  57. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +4 -2
  58. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.dom.e2e.ts +56 -0
  59. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +21 -2
  60. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +89 -19
  61. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +19 -4
  62. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +49 -3
  63. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +29 -10
  64. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +4 -4
  65. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +4 -2
  66. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +36 -26
  67. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
  68. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +47 -6
  69. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +59 -9
  70. package/templates/.agents/dashboard/apps/frontend/src/sqlite-page-export.test.ts +32 -0
  71. package/templates/.agents/dashboard/apps/frontend/src/sqlite-page-export.ts +21 -0
  72. package/templates/.agents/dashboard/apps/frontend/src/styles.css +19 -0
  73. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.test.ts +32 -0
  74. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +36 -0
  75. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +6 -2
  76. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +137 -23
  77. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +229 -35
  78. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +61 -7
  79. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +3 -6
  80. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +7 -1
  81. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-list-page.test.ts +163 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-list-page.ts +136 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/use-operations-detail-export.ts +76 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/work-list-load-dedup.test.ts +23 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/work-list-load-dedup.ts +27 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +39 -15
  87. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +3 -4
  88. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +4 -1
  89. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  90. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +89 -19
  91. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +31 -16
  92. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +43 -14
  93. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +5 -5
  94. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionPanel.tsx +60 -0
  95. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionTable.tsx +191 -0
  96. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.loading.test.ts +14 -0
  97. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.run-page.test.ts +18 -0
  98. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +18 -3
  99. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +1 -1
  100. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +75 -44
  101. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorLoadErrors.tsx +35 -0
  102. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +162 -40
  103. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +221 -79
  104. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.test.ts +132 -0
  105. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.tsx +70 -0
  106. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +203 -155
  107. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +164 -125
  108. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +2 -0
  109. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +3 -1
  110. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +5 -2
  111. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-page-range.ts +35 -0
  112. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +2 -2
  113. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +2 -1
  114. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +32 -9
  115. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +37 -2
  116. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +131 -9
  117. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +34 -17
  118. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +0 -24
  119. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +225 -424
  120. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +24 -15
  121. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +6 -1
  122. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
  123. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
  124. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  125. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +46 -26
  126. package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.test.ts +54 -0
  127. package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.tsx +247 -0
  128. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +31 -11
  129. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +39 -13
  130. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +107 -2
  131. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.macro-metrics.test.ts +55 -0
  132. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +23 -29
  133. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +211 -184
  134. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewTopPanel.tsx +127 -0
  135. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +60 -51
  136. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +1 -4
  137. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
  138. package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.test.tsx +43 -0
  139. package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.tsx +181 -0
  140. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +32 -10
  141. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +9 -3
  142. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +13 -5
  143. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +16 -6
  144. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +14 -4
  145. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +1 -2
  146. package/templates/.agents/dashboard/modules/operations/src/react/developer-identities.test.ts +18 -0
  147. package/templates/.agents/dashboard/modules/operations/src/react/developer-identities.ts +30 -0
  148. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +1 -0
  149. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +393 -4
  150. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +484 -61
  151. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +23 -1
  152. package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
  153. package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
  154. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +4 -4
  155. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +6 -4
  156. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +4 -3
  157. package/templates/.agents/dashboard/modules/operations/src/react/operations-date-filters.css +1 -1
  158. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +4 -1
  159. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +22 -12
  160. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.css +4 -0
  161. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +1 -1
  162. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +53 -6
  163. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +2 -4
  164. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +82 -6
  165. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +1 -0
  166. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +2 -1
  167. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +1 -1
  168. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +19 -7
  169. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +4 -1
  170. package/templates/.agents/dashboard/modules/operations/src/server/metric-coverage.ts +1 -0
  171. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +11 -5
  172. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  173. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  174. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  175. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  176. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  177. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  178. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +533 -338
  179. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +506 -311
  180. package/templates/.agents/dashboard/packages/local-runtime/gitignore.template +2 -0
  181. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  182. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +15 -7
  183. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +44 -13
  184. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +8 -3
  185. package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
  186. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +472 -145
  187. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +15 -3
  188. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +141 -33
  189. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +533 -338
  190. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +6 -2
  191. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +3 -3
  192. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +89 -16
  193. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +33 -16
  194. package/templates/.agents/dashboard/packages/local-runtime/src/server-classification-page.test.ts +87 -0
  195. package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.test.ts +44 -0
  196. package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.ts +125 -0
  197. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +66 -0
  198. package/templates/.agents/dashboard/packages/local-runtime/src/server-request-authority.test.ts +61 -0
  199. package/templates/.agents/dashboard/packages/local-runtime/src/server-request-authority.ts +18 -0
  200. package/templates/.agents/dashboard/packages/local-runtime/src/server-run-projections.test.ts +42 -0
  201. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +97 -0
  202. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -5
  203. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +91 -0
  204. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +7 -3
  205. package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +36 -0
  206. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +230 -132
  207. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +224 -182
  208. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-artifact-counts.ts +28 -0
  209. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.test.ts +63 -0
  210. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.ts +109 -0
  211. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-aggregates.ts +497 -0
  212. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-fast-page-parity.test-support.ts +65 -0
  213. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-page.test.ts +176 -0
  214. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-page.ts +119 -0
  215. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +41 -0
  216. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.test.ts +16 -0
  217. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.ts +29 -0
  218. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +355 -0
  219. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts +121 -0
  220. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-timing.ts +27 -0
  221. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +16 -2
  222. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +15 -0
  223. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.test.ts +223 -0
  224. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.ts +304 -0
  225. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-cache.test-support.ts +23 -0
  226. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +89 -0
  227. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-fixture.ts +227 -0
  228. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +691 -0
  229. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +81 -0
  230. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1655 -567
  231. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +2168 -1268
  232. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-cache.ts +129 -0
  233. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-install.test.ts +26 -0
  234. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-install.ts +28 -0
  235. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +116 -0
  236. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +146 -0
  237. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +165 -0
  238. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-refresh.mjs +140 -0
  239. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +255 -289
  240. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +94 -88
  241. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  242. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +5 -2
  243. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  244. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -1
  245. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-loading.spec.ts +142 -0
  246. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-pagination.spec.ts +232 -0
  247. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +743 -0
  248. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +189 -214
  249. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  250. package/templates/.agents/design/.zaip-managed.json +3 -3
  251. package/templates/.agents/design/apps/catalog/package.json +1 -1
  252. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  253. package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
  254. package/templates/.agents/growth/strategy.md +27 -0
  255. package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
  256. package/templates/.agents/marketing/strategy.md +29 -0
  257. package/templates/.agents/requirements/autonomous-assurance.md +6 -6
  258. package/templates/.agents/requirements/comparative-audit.md +1 -1
  259. package/templates/.agents/requirements/context-engine.md +1 -1
  260. package/templates/.agents/requirements/cost-observability.md +1 -1
  261. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  262. package/templates/.agents/requirements/data-export.md +1 -1
  263. package/templates/.agents/requirements/design-system.md +1 -1
  264. package/templates/.agents/requirements/execution-engine.md +3 -3
  265. package/templates/.agents/requirements/kanban-dashboard.md +10 -2
  266. package/templates/.agents/requirements/model-orchestration.md +1 -1
  267. package/templates/.agents/requirements/public-distribution.md +1 -1
  268. package/templates/.agents/requirements/software-architecture.md +1 -1
  269. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  270. package/templates/.agents/requirements/work-lifecycle.md +4 -4
  271. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  272. package/templates/.agents/rules/dashboard-ui-consistency.md +14 -0
  273. package/templates/.agents/rules/frontend-lite.md +4 -4
  274. package/templates/.agents/rules/run-lifecycle-closure.md +4 -4
  275. package/templates/.agents/runtime/VERSION +1 -1
  276. package/templates/.agents/runtime/bin/zaip.mjs +1142 -1041
  277. package/templates/.agents/runtime/checksums.sha256 +6 -6
  278. package/templates/.agents/runtime/manifest.json +1 -1
  279. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  280. package/templates/.agents/runtime/provenance.json +5 -5
  281. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  282. package/templates/.agents/sales/playbook.md +32 -0
  283. package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
  284. package/templates/.agents/skills/criar-pasta-obsidian/scripts/generate-obsidian-vault.test.mjs +20 -16
  285. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  286. package/templates/.agents/skills/zaip-skill-agent-catalog/SKILL.md +22 -0
  287. package/templates/.agents/skills/zaip-skill-agent-catalog/agents/openai.yaml +4 -0
  288. package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +3 -2
  289. package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +49 -0
  290. package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
  291. package/templates/.agents/skills/zaip-skill-author-skills/scripts/run-skill-tests.mjs +37 -0
  292. package/templates/.agents/skills/zaip-skill-backend/SKILL.md +1 -0
  293. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +9 -2
  294. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
  295. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +1 -1
  296. package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
  297. package/templates/.agents/skills/zaip-skill-change/references/observable-evidence.md +83 -0
  298. package/templates/.agents/skills/zaip-skill-dashboard-diagnostics/SKILL.md +22 -0
  299. package/templates/.agents/skills/zaip-skill-dashboard-diagnostics/agents/openai.yaml +4 -0
  300. package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
  301. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
  302. package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -3
  303. package/templates/.agents/skills/zaip-skill-frontend/agents/openai.yaml +2 -2
  304. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +10 -10
  305. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +6 -0
  306. package/templates/.agents/skills/zaip-skill-lifecycle-closure/SKILL.md +27 -0
  307. package/templates/.agents/skills/zaip-skill-lifecycle-closure/agents/openai.yaml +4 -0
  308. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +6 -0
  309. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +4 -0
  310. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +111 -104
  311. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-explicit-recovery.mjs +223 -0
  312. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +55 -9
  313. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +145 -14
  314. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +19 -9
  315. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +82 -5
  316. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
  317. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +20 -0
  318. package/templates/.agents/skills/zaip-skill-release-qualification/agents/openai.yaml +4 -0
  319. package/templates/.agents/skills/zaip-skill-review/SKILL.md +5 -0
  320. package/templates/.agents/skills/zaip-skill-rules/SKILL.md +1 -1
  321. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +6 -0
  322. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +4 -0
  323. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +22 -90
  324. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +28 -5
  325. package/templates/.agents/zaip-aios/INDEX.md +57 -22
  326. package/templates/.agents/zaip-aios/README.md +24 -13
  327. package/templates/.agents/zaip-aios/VERSION +1 -1
  328. package/templates/.agents/zaip-aios/guides/02-requirements.md +5 -0
  329. package/templates/.agents/zaip-aios/guides/06-execucao.md +13 -4
  330. package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +7 -0
  331. package/templates/.agents/zaip-aios/guides/10-seguranca.md +23 -0
  332. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +6 -6
  333. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +3 -0
  334. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +12 -3
  335. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +5 -5
  336. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
  337. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +95 -0
  338. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +366 -0
  339. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +46 -0
  340. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +74 -0
  341. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
  342. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
  343. package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +19 -0
  344. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +111 -0
  345. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +172 -0
  346. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +149 -0
  347. package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
  348. package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
  349. package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
  350. package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
  351. package/templates/template-manifest.json +756 -235
  352. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cs6dzDmW.js +0 -1505
  353. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +0 -1
  354. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +0 -3
  355. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +0 -1
  356. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +0 -1
  357. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +0 -68
  358. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +0 -2
  359. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +0 -1
  360. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +0 -45
@@ -8,21 +8,47 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
8
8
  it("renders the server subtotal as the final DataTable row with all metrics", () => {
9
9
  const view = CompactLifecycleCostTable({
10
10
  locale: "pt-BR",
11
- rows: [{
12
- id: "TASK-PAGE-50", title: "Página 2", kind: "task", status: "active", risk: null,
13
- occurred_at: "2026-08-04T12:00:00.000Z", parent_id: null, run_count: 1, cost_currency: "BRL",
14
- metrics: { duration: known(1_000), total_tokens: known(2), cost: known(5) },
15
- }],
11
+ rows: [
12
+ {
13
+ id: "TASK-PAGE-50",
14
+ title: "Página 2",
15
+ kind: "task",
16
+ status: "active",
17
+ risk: null,
18
+ occurred_at: "2026-08-04T12:00:00.000Z",
19
+ parent_id: null,
20
+ run_count: 1,
21
+ cost_currency: "BRL",
22
+ metrics: { duration: known(1_000), total_tokens: known(2), cost: known(5) },
23
+ },
24
+ ],
16
25
  subtotal: {
17
26
  entity_count: 270,
18
27
  run_count: known(270),
19
- metrics: { duration: known(270_000), total_tokens: known(540), cost_brl: known(1_350), cost_usd: known(270) },
28
+ metrics: {
29
+ duration: known(270_000),
30
+ total_tokens: known(540),
31
+ cost_brl: known(1_350),
32
+ cost_usd: known(270),
33
+ },
34
+ },
35
+ pagination: {
36
+ offset: 50,
37
+ limit: 50,
38
+ total: 270,
39
+ has_more: true,
40
+ loading: false,
41
+ error: null,
42
+ onChange: () => undefined,
43
+ onRetry: () => undefined,
20
44
  },
21
- pagination: { offset: 50, limit: 50, total: 270, has_more: true, loading: false, error: null, onChange: () => undefined, onRetry: () => undefined },
22
45
  });
23
- const [table] = view.props.children as readonly { props: { columns: Array<{ key: string; footer?: unknown }> } }[];
46
+ const [table] = view.props.children as readonly {
47
+ props: { columns: Array<{ key: string; footer?: unknown }> };
48
+ }[];
24
49
  expect(table).toBeDefined();
25
- const footer = (key: string) => table!.props.columns.find((column) => column.key === key)?.footer;
50
+ const footer = (key: string) =>
51
+ table!.props.columns.find((column) => column.key === key)?.footer;
26
52
  expect(footer("occurredAt")).toContain("Subtotal filtrado");
27
53
  expect(footer("entity")).toBe("270");
28
54
  expect(footer("runs")).toBe("270");
@@ -34,13 +60,35 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
34
60
 
35
61
  it("renders unknown numeric subtotals as zero", () => {
36
62
  const view = CompactLifecycleCostTable({
37
- locale: "pt-BR", rows: [],
38
- subtotal: { entity_count: 0, run_count: known(0), metrics: { duration: unavailable, total_tokens: known(0), cost_brl: known(0), cost_usd: unavailable } },
39
- pagination: { offset: 0, limit: 50, total: 0, has_more: false, loading: false, error: null, onChange: () => undefined, onRetry: () => undefined },
63
+ locale: "pt-BR",
64
+ rows: [],
65
+ subtotal: {
66
+ entity_count: 0,
67
+ run_count: known(0),
68
+ metrics: {
69
+ duration: unavailable,
70
+ total_tokens: known(0),
71
+ cost_brl: known(0),
72
+ cost_usd: unavailable,
73
+ },
74
+ },
75
+ pagination: {
76
+ offset: 0,
77
+ limit: 50,
78
+ total: 0,
79
+ has_more: false,
80
+ loading: false,
81
+ error: null,
82
+ onChange: () => undefined,
83
+ onRetry: () => undefined,
84
+ },
40
85
  });
41
- const [table] = view.props.children as readonly { props: { columns: Array<{ key: string; footer?: unknown }> } }[];
86
+ const [table] = view.props.children as readonly {
87
+ props: { columns: Array<{ key: string; footer?: unknown }> };
88
+ }[];
42
89
  expect(table).toBeDefined();
43
- const footer = (key: string) => table!.props.columns.find((column) => column.key === key)?.footer;
90
+ const footer = (key: string) =>
91
+ table!.props.columns.find((column) => column.key === key)?.footer;
44
92
  expect(footer("runs")).toBe("0");
45
93
  expect(footer("tokens")).toBe("0");
46
94
  expect(footer("duration")).toBe("0");
@@ -48,12 +96,34 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
48
96
 
49
97
  it("does not render a subtotal row when all lifecycle metrics are unavailable", () => {
50
98
  const view = CompactLifecycleCostTable({
51
- locale: "pt-BR", rows: [],
52
- subtotal: { entity_count: 1, run_count: unavailable, metrics: { duration: unavailable, total_tokens: unavailable, cost_brl: unavailable, cost_usd: unavailable } },
53
- pagination: { offset: 0, limit: 50, total: 0, has_more: false, loading: false, error: null, onChange: () => undefined, onRetry: () => undefined },
99
+ locale: "pt-BR",
100
+ rows: [],
101
+ subtotal: {
102
+ entity_count: 1,
103
+ run_count: unavailable,
104
+ metrics: {
105
+ duration: unavailable,
106
+ total_tokens: unavailable,
107
+ cost_brl: unavailable,
108
+ cost_usd: unavailable,
109
+ },
110
+ },
111
+ pagination: {
112
+ offset: 0,
113
+ limit: 50,
114
+ total: 0,
115
+ has_more: false,
116
+ loading: false,
117
+ error: null,
118
+ onChange: () => undefined,
119
+ onRetry: () => undefined,
120
+ },
54
121
  });
55
- const [table] = view.props.children as readonly { props: { columns: Array<{ key: string; footer?: unknown }> } }[];
56
- const footer = (key: string) => table!.props.columns.find((column) => column.key === key)?.footer;
122
+ const [table] = view.props.children as readonly {
123
+ props: { columns: Array<{ key: string; footer?: unknown }> };
124
+ }[];
125
+ const footer = (key: string) =>
126
+ table!.props.columns.find((column) => column.key === key)?.footer;
57
127
  expect(footer("occurredAt")).toBeUndefined();
58
128
  expect(footer("entity")).toBeUndefined();
59
129
  expect(footer("runs")).toBeUndefined();
@@ -88,8 +88,7 @@ export function CompactLifecycleCostTable({
88
88
  const durationMetric = (row: CompactLifecycleCostRow) => {
89
89
  const value = row.metrics.duration;
90
90
  const effective = compactLifecycleDurationMs(row);
91
- if (effective === null || (value.unknown > 0 && effective === 0))
92
- return "0";
91
+ if (effective === null || (value.unknown > 0 && effective === 0)) return "0";
93
92
  return formatDurationMs(effective, locale);
94
93
  };
95
94
  const subtotalMetric = (value: KnownMetric, format: (known: number) => string) => {
@@ -98,21 +97,24 @@ export function CompactLifecycleCostTable({
98
97
  };
99
98
  const subtotalMetricUnavailable = (value: KnownMetric) =>
100
99
  value.unknown > 0 && value.known_sum === 0;
101
- const showSubtotal = subtotal !== null && ![
102
- subtotal.run_count,
103
- subtotal.metrics.duration,
104
- subtotal.metrics.total_tokens,
105
- subtotal.metrics.cost_brl,
106
- ].every(subtotalMetricUnavailable);
100
+ const showSubtotal =
101
+ subtotal !== null &&
102
+ ![
103
+ subtotal.run_count,
104
+ subtotal.metrics.duration,
105
+ subtotal.metrics.total_tokens,
106
+ subtotal.metrics.cost_brl,
107
+ ].every(subtotalMetricUnavailable);
107
108
  const number = (value: number) => new Intl.NumberFormat(locale).format(value);
108
109
  const subtotalLabel = !showSubtotal
109
110
  ? undefined
110
111
  : subtotal === null
111
- ? "Total"
112
- : `${locale === "pt-BR" ? "Subtotal filtrado" : "Filtered subtotal"} · ${number(subtotal.entity_count)} ${locale === "pt-BR" ? "registros" : "records"}`;
113
- const subtotalCost = !showSubtotal || subtotal === null
114
- ? undefined
115
- : subtotalMetric(subtotal.metrics.cost_brl, (brl) => formatCurrency(brl, "BRL", locale));
112
+ ? "Total"
113
+ : `${locale === "pt-BR" ? "Subtotal filtrado" : "Filtered subtotal"} · ${number(subtotal.entity_count)} ${locale === "pt-BR" ? "registros" : "records"}`;
114
+ const subtotalCost =
115
+ !showSubtotal || subtotal === null
116
+ ? undefined
117
+ : subtotalMetric(subtotal.metrics.cost_brl, (brl) => formatCurrency(brl, "BRL", locale));
116
118
  return (
117
119
  <>
118
120
  <DataTable
@@ -140,14 +142,22 @@ export function CompactLifecycleCostTable({
140
142
  label: locale === "pt-BR" ? "Invocações" : "Invocations",
141
143
  render: (row) => new Intl.NumberFormat(locale).format(row.run_count),
142
144
  align: "right",
143
- footer: !showSubtotal || subtotal === null ? undefined : subtotalMetric(subtotal.run_count, number),
145
+ footer:
146
+ !showSubtotal || subtotal === null
147
+ ? undefined
148
+ : subtotalMetric(subtotal.run_count, number),
144
149
  },
145
150
  {
146
151
  key: "duration",
147
152
  label: locale === "pt-BR" ? "Tempo observado" : "Observed time",
148
153
  render: durationMetric,
149
154
  align: "right",
150
- footer: !showSubtotal || subtotal === null ? undefined : subtotalMetric(subtotal.metrics.duration, (value) => value === 0 ? "0" : formatDurationMs(value, locale)),
155
+ footer:
156
+ !showSubtotal || subtotal === null
157
+ ? undefined
158
+ : subtotalMetric(subtotal.metrics.duration, (value) =>
159
+ value === 0 ? "0" : formatDurationMs(value, locale),
160
+ ),
151
161
  },
152
162
  {
153
163
  key: "tokens",
@@ -155,7 +165,12 @@ export function CompactLifecycleCostTable({
155
165
  render: (row) =>
156
166
  metric(row.metrics.total_tokens, (value) => formatCompactNumber(value, locale)),
157
167
  align: "right",
158
- footer: !showSubtotal || subtotal === null ? undefined : subtotalMetric(subtotal.metrics.total_tokens, (value) => formatCompactNumber(value, locale)),
168
+ footer:
169
+ !showSubtotal || subtotal === null
170
+ ? undefined
171
+ : subtotalMetric(subtotal.metrics.total_tokens, (value) =>
172
+ formatCompactNumber(value, locale),
173
+ ),
159
174
  },
160
175
  {
161
176
  key: "cost",
@@ -56,11 +56,7 @@ describe("lastSevenDays", () => {
56
56
 
57
57
  const result = lastSevenDays(rows, "BRL");
58
58
 
59
- expect(result.map((day) => day.key)).toEqual([
60
- "2026-07-08",
61
- "2026-07-10",
62
- "2026-07-15",
63
- ]);
59
+ expect(result.map((day) => day.key)).toEqual(["2026-07-08", "2026-07-10", "2026-07-15"]);
64
60
  expect(result.map((day) => day.value)).toEqual([99, 12.5, 8]);
65
61
  });
66
62
 
@@ -93,7 +89,11 @@ describe("aggregate-only overview metrics", () => {
93
89
  const usage = {
94
90
  conversation: metric({ input: 10, cached_input: 1, output: 5, reasoning: 3, total: 15 }, 2),
95
91
  planning: metric({ input: 20, cached_input: 2, output: 10, reasoning: 6, total: 30 }, 3),
96
- execution: metric({ input: 30, cached_input: 3, output: 15, reasoning: 9, total: 45 }, 4, 12_000),
92
+ execution: metric(
93
+ { input: 30, cached_input: 3, output: 15, reasoning: 9, total: 45 },
94
+ 4,
95
+ 12_000,
96
+ ),
97
97
  total: metric({ input: 60, cached_input: 6, output: 30, reasoning: 18, total: 90 }, 9),
98
98
  };
99
99
 
@@ -113,8 +113,32 @@ describe("aggregate-only overview metrics", () => {
113
113
  planning: metric({ input: 0, cached_input: 0, output: 0, reasoning: 0, total: 0 }, 0),
114
114
  total: metric({ input: 0, cached_input: 0, output: 0, reasoning: 0, total: 0 }, 0),
115
115
  };
116
- expect(chartPhaseMetrics("execution", [], { ...base, execution: metric({ input: 0, cached_input: 0, output: 0, reasoning: 0, total: 0 }, 0, 0) }, "BRL").duration).toBe(0);
117
- expect(chartPhaseMetrics("execution", [], { ...base, execution: metric({ input: 0, cached_input: 0, output: 0, reasoning: 0, total: 0 }, 0, null) }, "BRL").duration).toBeNull();
116
+ expect(
117
+ chartPhaseMetrics(
118
+ "execution",
119
+ [],
120
+ {
121
+ ...base,
122
+ execution: metric({ input: 0, cached_input: 0, output: 0, reasoning: 0, total: 0 }, 0, 0),
123
+ },
124
+ "BRL",
125
+ ).duration,
126
+ ).toBe(0);
127
+ expect(
128
+ chartPhaseMetrics(
129
+ "execution",
130
+ [],
131
+ {
132
+ ...base,
133
+ execution: metric(
134
+ { input: 0, cached_input: 0, output: 0, reasoning: 0, total: 0 },
135
+ 0,
136
+ null,
137
+ ),
138
+ },
139
+ "BRL",
140
+ ).duration,
141
+ ).toBeNull();
118
142
  });
119
143
 
120
144
  it("marks an invalid cached or reasoning subset unavailable without changing inclusive totals", () => {
@@ -132,15 +156,20 @@ describe("aggregate-only overview metrics", () => {
132
156
 
133
157
  it("preserves canonical output when a partial source total diverges", () => {
134
158
  const usage = {
135
- total: metric({ input: 400_000, cached_input: 390_000, output: 30_000, reasoning: 10_000, total: 445_099 }, 1),
159
+ total: metric(
160
+ {
161
+ input: 400_000,
162
+ cached_input: 390_000,
163
+ output: 30_000,
164
+ reasoning: 10_000,
165
+ total: 445_099,
166
+ },
167
+ 1,
168
+ ),
136
169
  };
137
170
 
138
171
  expect(chartTokenMix([], usage, costChartsCopy("pt-BR")).map(([, value]) => value)).toEqual([
139
- 10_000,
140
- 390_000,
141
- 20_000,
142
- 10_000,
143
- 430_000,
172
+ 10_000, 390_000, 20_000, 10_000, 430_000,
144
173
  ]);
145
174
  });
146
175
  });
@@ -169,7 +169,10 @@ export function CostCharts({
169
169
  export function chartTokenMix(
170
170
  rows: readonly CostRunRow[],
171
171
  summaryUsage: Pick<UsageProjection, "total"> | undefined,
172
- copy: Pick<ReturnType<typeof costChartsCopy>, "inputWithoutCache" | "cachedInput" | "visibleOutput" | "reasoning" | "total">,
172
+ copy: Pick<
173
+ ReturnType<typeof costChartsCopy>,
174
+ "inputWithoutCache" | "cachedInput" | "visibleOutput" | "reasoning" | "total"
175
+ >,
173
176
  ) {
174
177
  const tokens = summaryUsage?.total.tokens;
175
178
  const input = tokens?.input ?? observed(rows.map((row) => row.input_tokens));
@@ -321,10 +324,7 @@ function inclusiveTokenTotal(
321
324
  return input !== null && output !== null ? input + output : reportedTotal;
322
325
  }
323
326
 
324
- export function lastSevenDays(
325
- daily: readonly CostGroupRow[],
326
- currency: CostCurrency,
327
- ) {
327
+ export function lastSevenDays(daily: readonly CostGroupRow[], currency: CostCurrency) {
328
328
  const values = new Map(daily.map((row) => [row.key, cost(row, currency)]));
329
329
  const buckets = [...values.keys()].sort().slice(-7);
330
330
  return buckets.map((key) => {
@@ -0,0 +1,60 @@
1
+ import { useEffect, useState } from "react";
2
+ import { type CostDeveloperAttributionRow, CostDeveloperAttributionTable } from "./CostTables.js";
3
+ import type { CostLocale } from "./cost-monitor-copy.js";
4
+
5
+ /** Cost-specific rendering of the factual developer aggregate endpoint. */
6
+ export function CostDeveloperAttributionPanel({
7
+ from,
8
+ to,
9
+ locale,
10
+ }: {
11
+ from?: string;
12
+ to?: string;
13
+ locale: CostLocale;
14
+ }) {
15
+ const [state, setState] = useState<{
16
+ loading: boolean;
17
+ error: string | null;
18
+ rows: readonly CostDeveloperAttributionRow[];
19
+ }>({ loading: true, error: null, rows: [] });
20
+ useEffect(() => {
21
+ const controller = new AbortController();
22
+ const params = new URLSearchParams();
23
+ if (from) params.set("from", from);
24
+ if (to) params.set("to", to);
25
+ setState((previous) => ({ ...previous, loading: true, error: null }));
26
+ fetch(`/api/v2/developers${params.size === 0 ? "" : `?${params}`}`, {
27
+ signal: controller.signal,
28
+ })
29
+ .then(async (response) => {
30
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
31
+ return response.json() as Promise<{ rows?: CostDeveloperAttributionRow[] }>;
32
+ })
33
+ .then((payload) => setState({ loading: false, error: null, rows: payload.rows ?? [] }))
34
+ .catch((error: unknown) => {
35
+ if ((error as { name?: string }).name !== "AbortError")
36
+ setState({
37
+ loading: false,
38
+ error: error instanceof Error ? error.message : "unknown",
39
+ rows: [],
40
+ });
41
+ });
42
+ return () => controller.abort();
43
+ }, [from, to]);
44
+ if (state.loading)
45
+ return (
46
+ <p className="operations-empty" role="status">
47
+ {locale === "pt-BR" ? "Carregando desenvolvedores…" : "Loading developers…"}
48
+ </p>
49
+ );
50
+ if (state.error)
51
+ return (
52
+ <p className="operations-empty" role="alert">
53
+ {locale === "pt-BR"
54
+ ? "Não foi possível carregar desenvolvedores."
55
+ : "Could not load developers."}{" "}
56
+ {state.error}
57
+ </p>
58
+ );
59
+ return <CostDeveloperAttributionTable locale={locale} rows={state.rows} />;
60
+ }
@@ -0,0 +1,191 @@
1
+ import {
2
+ DataTable,
3
+ formatCompactNumber,
4
+ formatCurrency as formatDashboardCurrency,
5
+ formatDurationMs,
6
+ } from "@zaip-ai/dashboard-ui";
7
+ import type { CostLocale } from "./cost-monitor-copy.js";
8
+
9
+ export type CostDeveloperAttributionRow = {
10
+ account_id: string;
11
+ login_snapshot: string | null;
12
+ prd_count: number;
13
+ spec_count: number;
14
+ task_count: number;
15
+ run_count: number;
16
+ test_count: number | null;
17
+ evidence_count: number | null;
18
+ total_duration_ms: number | null;
19
+ total_tokens: number | null;
20
+ total_cost_brl: number | null;
21
+ duration_covered_runs: number;
22
+ token_covered_runs: number;
23
+ brl_covered_runs: number;
24
+ };
25
+
26
+ const visuallyHiddenStyle = {
27
+ clip: "rect(0, 0, 0, 0)",
28
+ height: 1,
29
+ margin: -1,
30
+ overflow: "hidden",
31
+ position: "absolute",
32
+ whiteSpace: "nowrap",
33
+ width: 1,
34
+ } as const;
35
+
36
+ function formatCount(value: number | null, locale: CostLocale): string {
37
+ return value === null
38
+ ? "—"
39
+ : new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(value);
40
+ }
41
+
42
+ function formatDuration(value: number | null, locale: CostLocale): string {
43
+ if (value === null) return locale === "pt-BR" ? "Indisponível" : "Unavailable";
44
+ return value === 0 ? "0" : formatDurationMs(value, locale);
45
+ }
46
+
47
+ function formatBrlCurrency(value: number | null, locale: CostLocale): string {
48
+ return value === null ? "—" : formatDashboardCurrency(value, "BRL", locale);
49
+ }
50
+
51
+ function formatTokens(value: number | null, locale: CostLocale): string {
52
+ return value === null
53
+ ? locale === "pt-BR"
54
+ ? "Indisponível"
55
+ : "Unavailable"
56
+ : formatCompactNumber(value, locale);
57
+ }
58
+
59
+ function partialMetric(
60
+ formatted: string,
61
+ coveredRuns: number,
62
+ runCount: number,
63
+ locale: CostLocale,
64
+ ) {
65
+ if (coveredRuns >= runCount) return formatted;
66
+ const label =
67
+ locale === "pt-BR"
68
+ ? `Valor parcial: telemetria conhecida em ${coveredRuns} de ${runCount} runs.`
69
+ : `Partial value: telemetry is known for ${coveredRuns} of ${runCount} runs.`;
70
+ return (
71
+ <span title={label}>
72
+ <span aria-hidden="true">{formatted}</span>
73
+ <span style={visuallyHiddenStyle}>{`${label} ${formatted}`}</span>
74
+ </span>
75
+ );
76
+ }
77
+
78
+ /**
79
+ * Developer facts are intentionally separate from the Operations table. The
80
+ * Cost Monitor reports only structural and financial facts tied to an
81
+ * attributed developer Run.
82
+ */
83
+ export function CostDeveloperAttributionTable({
84
+ locale,
85
+ rows,
86
+ }: {
87
+ locale: CostLocale;
88
+ rows: readonly CostDeveloperAttributionRow[];
89
+ }) {
90
+ return (
91
+ <DataTable
92
+ columns={[
93
+ {
94
+ key: "developer",
95
+ label: locale === "pt-BR" ? "Desenvolvedor" : "Developer",
96
+ render: (row) => (
97
+ <>
98
+ <strong>{row.login_snapshot ?? row.account_id}</strong>
99
+ <small>#{row.account_id}</small>
100
+ </>
101
+ ),
102
+ sortValue: (row) => row.login_snapshot ?? row.account_id,
103
+ },
104
+ {
105
+ key: "prds",
106
+ label: "PRDs",
107
+ render: (row) => formatCount(row.prd_count, locale),
108
+ align: "right",
109
+ },
110
+ {
111
+ key: "specs",
112
+ label: "SPECs",
113
+ render: (row) => formatCount(row.spec_count, locale),
114
+ align: "right",
115
+ },
116
+ {
117
+ key: "tasks",
118
+ label: locale === "pt-BR" ? "Tarefas" : "Tasks",
119
+ render: (row) => formatCount(row.task_count, locale),
120
+ align: "right",
121
+ },
122
+ {
123
+ key: "runs",
124
+ label: "Runs",
125
+ render: (row) => formatCount(row.run_count, locale),
126
+ align: "right",
127
+ },
128
+ {
129
+ key: "tests",
130
+ label: locale === "pt-BR" ? "Testes" : "Tests",
131
+ render: (row) => formatCount(row.test_count, locale),
132
+ align: "right",
133
+ },
134
+ {
135
+ key: "evidences",
136
+ label: locale === "pt-BR" ? "Evidências" : "Evidence",
137
+ render: (row) => formatCount(row.evidence_count, locale),
138
+ align: "right",
139
+ },
140
+ {
141
+ key: "duration",
142
+ label: locale === "pt-BR" ? "Tempo" : "Time",
143
+ render: (row) =>
144
+ partialMetric(
145
+ formatDuration(row.total_duration_ms, locale),
146
+ row.duration_covered_runs,
147
+ row.run_count,
148
+ locale,
149
+ ),
150
+ sortValue: (row) => row.total_duration_ms,
151
+ align: "right",
152
+ },
153
+ {
154
+ key: "tokens",
155
+ label: "Tokens",
156
+ render: (row) =>
157
+ partialMetric(
158
+ formatTokens(row.total_tokens, locale),
159
+ row.token_covered_runs,
160
+ row.run_count,
161
+ locale,
162
+ ),
163
+ sortValue: (row) => row.total_tokens,
164
+ align: "right",
165
+ },
166
+ {
167
+ key: "cost",
168
+ label: locale === "pt-BR" ? "Custos" : "Costs",
169
+ render: (row) =>
170
+ partialMetric(
171
+ formatBrlCurrency(row.total_cost_brl, locale),
172
+ row.brl_covered_runs,
173
+ row.run_count,
174
+ locale,
175
+ ),
176
+ sortValue: (row) => row.total_cost_brl,
177
+ align: "right",
178
+ },
179
+ ]}
180
+ defaultSort={{ key: "cost", direction: "desc" }}
181
+ emptyMessage={locale === "pt-BR" ? "Nenhum dado disponível." : "No data available."}
182
+ locale={locale}
183
+ pageSize={10}
184
+ rowKey={(row) => row.account_id}
185
+ rows={rows}
186
+ scrollLabel={locale === "pt-BR" ? "Métricas por desenvolvedor" : "Developer metrics"}
187
+ showColumnInfo
188
+ sortable
189
+ />
190
+ );
191
+ }
@@ -0,0 +1,14 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ describe("Cost period loading lifecycle", () => {
5
+ it("clears a filtered request when the embedded snapshot becomes sufficient", () => {
6
+ const source = readFileSync(new URL("./CostFilters.tsx", import.meta.url), "utf8");
7
+
8
+ expect(source).toContain("const generation = ++generationRef.current;");
9
+ expect(source).toContain("if (!shouldFetch)");
10
+ expect(source).toContain("setPeriodLoading(false);");
11
+ expect(source).toContain("setPeriodData(null);");
12
+ expect(source).toContain("generation === generationRef.current");
13
+ });
14
+ });
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { loadCostMonitorRunPage } from "./CostFilters.js";
3
+
4
+ describe("Cost Monitor invocation page loading", () => {
5
+ it("uses a ten-row default for the remote invocation page", async () => {
6
+ const calls: string[] = [];
7
+ await loadCostMonitorRunPage({
8
+ currency: "BRL",
9
+ offset: 0,
10
+ fetcher: async (url) => {
11
+ calls.push(String(url));
12
+ return new Response(JSON.stringify({ runs: [] }), { status: 200 });
13
+ },
14
+ });
15
+
16
+ expect(new URL(calls[0]!, "http://dashboard.local").searchParams.get("limit")).toBe("10");
17
+ });
18
+ });