@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
@@ -107,6 +107,7 @@ export async function loadCostMonitorRunPage({
107
107
  currency,
108
108
  filters,
109
109
  from,
110
+ limit = 10,
110
111
  offset,
111
112
  refresh,
112
113
  to,
@@ -116,6 +117,7 @@ export async function loadCostMonitorRunPage({
116
117
  currency: CostCurrency;
117
118
  filters?: CostFilterState;
118
119
  from?: string;
120
+ limit?: number;
119
121
  offset: number;
120
122
  refresh?: string | null;
121
123
  to?: string;
@@ -131,7 +133,7 @@ export async function loadCostMonitorRunPage({
131
133
  });
132
134
  query.set("scope", "runs");
133
135
  query.set("offset", String(Math.max(0, offset)));
134
- query.set("limit", "100");
136
+ query.set("limit", String(Math.max(1, limit)));
135
137
  const response = await fetcher(`/api/v2/cost-monitor?${query.toString()}`, {
136
138
  ...(signal === undefined ? {} : { signal }),
137
139
  });
@@ -143,7 +145,7 @@ export async function loadCostMonitorRunPage({
143
145
  return {
144
146
  page_only: true,
145
147
  runs: payload.runs,
146
- run_page: payload.run_page ?? { offset, limit: 100, total: null, has_more: false },
148
+ run_page: payload.run_page ?? { offset, limit, total: null, has_more: false },
147
149
  };
148
150
  }
149
151
 
@@ -212,6 +214,7 @@ export function useCostMonitorPeriod({
212
214
  const [periodLoading, setPeriodLoading] = useState(false);
213
215
  const [periodError, setPeriodError] = useState<string | null>(null);
214
216
  const initialDataRef = useRef(true);
217
+ const generationRef = useRef(0);
215
218
  const loadPeriodRef = useRef(loadPeriod);
216
219
  loadPeriodRef.current = loadPeriod;
217
220
  const requestedRange =
@@ -222,8 +225,16 @@ export function useCostMonitorPeriod({
222
225
  const requestedTo = requestedRange?.to;
223
226
  const shouldFetch = shouldFetchCostPeriod({ filters, period, snapshotBacked });
224
227
  useEffect(() => {
228
+ const generation = ++generationRef.current;
225
229
  if (!shouldFetch) {
226
230
  initialDataRef.current = false;
231
+ // A filtered request can be aborted immediately before this embedded
232
+ // default snapshot becomes sufficient again. There is no successor
233
+ // request in that branch to release the loading gate.
234
+ setPeriodLoading(false);
235
+ setPeriodError(null);
236
+ setPeriodData(null);
237
+ setPeriodDataBase(null);
227
238
  return;
228
239
  }
229
240
  if (initialDataRef.current && Object.values(filters).every((value) => value === "")) {
@@ -255,7 +266,11 @@ export function useCostMonitorPeriod({
255
266
  }
256
267
  })
257
268
  .finally(() => {
258
- if (!controller.signal.aborted) setPeriodLoading(false);
269
+ // An aborted predecessor must not clear a newer request. Conversely,
270
+ // an active request always releases its own loading gate, including an
271
+ // HTTP failure handled above.
272
+ if (!controller.signal.aborted && generation === generationRef.current)
273
+ setPeriodLoading(false);
259
274
  });
260
275
  return () => controller.abort();
261
276
  }, [currency, data, filters, lastUpdatedAt, requestedFrom, requestedTo, shouldFetch]);
@@ -6,8 +6,8 @@ import {
6
6
  formatDurationCoverage,
7
7
  formatTokenBackedDuration,
8
8
  formatUsd,
9
- hasKnownDuration,
10
9
  hasCollectedUsage,
10
+ hasKnownDuration,
11
11
  isDisplayableModel,
12
12
  localizedDescription,
13
13
  scenario,
@@ -1,20 +1,20 @@
1
1
  import { ExecutionTable } from "@zaip-ai/dashboard-operations/react";
2
- import type { ComponentProps } from "react";
2
+ import type { ComponentProps, ReactNode } from "react";
3
3
  import {
4
- CompactLifecycleCostTable,
5
4
  type CompactLifecycleCostSubtotal,
5
+ CompactLifecycleCostTable,
6
6
  } from "./CompactLifecycleCostTable.js";
7
7
  import { CostCharts } from "./CostCharts.js";
8
8
  import { CostPeriodAverageCards } from "./CostPeriodAverageCards.js";
9
9
  import { CostGroupsTable, CostRunsTable } from "./CostTables.js";
10
+ import type { CostCurrency, CostLocale } from "./cost-monitor-copy.js";
11
+ import type { CostView } from "./cost-monitor-views.js";
12
+ import { MacroCostTable } from "./MacroCostTable.js";
10
13
  import {
14
+ type CostGroupTotals,
11
15
  costGroupPageLabel,
12
16
  reconcileCostGroupTotalsWithCards,
13
- type CostGroupTotals,
14
17
  } from "./use-cost-group-page.js";
15
- import type { CostCurrency, CostLocale } from "./cost-monitor-copy.js";
16
- import type { CostView } from "./cost-monitor-views.js";
17
- import { MacroCostTable } from "./MacroCostTable.js";
18
18
 
19
19
  type CostRunRows = ComponentProps<typeof CostRunsTable>["rows"];
20
20
  type CostGroupRows = ComponentProps<typeof CostGroupsTable>["rows"];
@@ -29,6 +29,7 @@ export function CostMonitorContent({
29
29
  currency,
30
30
  detailError,
31
31
  detailLoading,
32
+ developerPanel,
32
33
  dimensionalDetailPending,
33
34
  dimensionalRows,
34
35
  groups,
@@ -76,6 +77,7 @@ export function CostMonitorContent({
76
77
  currency: CostCurrency;
77
78
  detailError: string | null;
78
79
  detailLoading: boolean;
80
+ developerPanel: ReactNode;
79
81
  dimensionalDetailPending: boolean;
80
82
  dimensionalRows: CostRunRows;
81
83
  groups: {
@@ -88,7 +90,13 @@ export function CostMonitorContent({
88
90
  providers: CostGroupRows;
89
91
  tasks: CostGroupRows;
90
92
  };
91
- groupPage: { offset: number; limit: number; total_count: number; has_more: boolean; totals?: CostGroupTotals } | null;
93
+ groupPage: {
94
+ offset: number;
95
+ limit: number;
96
+ total_count: number;
97
+ has_more: boolean;
98
+ totals?: CostGroupTotals;
99
+ } | null;
92
100
  groupPageLoading: boolean;
93
101
  groupPageOffset: number;
94
102
  locale: CostLocale;
@@ -120,15 +128,33 @@ export function CostMonitorContent({
120
128
  visiblePrds: ComponentProps<typeof MacroCostTable>["rows"];
121
129
  visibleSpecs: ComponentProps<typeof MacroCostTable>["rows"];
122
130
  }) {
123
- const groupPager = ["daily", "monthly", "annual", "agents", "models", "providers"].includes(view) && groupPage !== null ? (
124
- <nav aria-label={locale === "pt-BR" ? "Paginação de grupos" : "Group pagination"} className="cost-page-controls">
125
- <button disabled={groupPageLoading || groupPageOffset === 0} onClick={() => setGroupPageOffset(Math.max(0, groupPageOffset - groupPage.limit))} type="button">{locale === "pt-BR" ? "Anterior" : "Previous"}</button>
126
- <output aria-live="polite">{costGroupPageLabel({ locale, page: groupPage })}</output>
127
- <button disabled={groupPageLoading || !groupPage.has_more} onClick={() => setGroupPageOffset(groupPageOffset + groupPage.limit)} type="button">{locale === "pt-BR" ? "Próxima" : "Next"}</button>
128
- </nav>
129
- ) : null;
131
+ const groupPager =
132
+ ["daily", "monthly", "annual", "agents", "models", "providers"].includes(view) &&
133
+ groupPage !== null ? (
134
+ <nav
135
+ aria-label={locale === "pt-BR" ? "Paginação de grupos" : "Group pagination"}
136
+ className="cost-page-controls"
137
+ >
138
+ <button
139
+ disabled={groupPageLoading || groupPageOffset === 0}
140
+ onClick={() => setGroupPageOffset(Math.max(0, groupPageOffset - groupPage.limit))}
141
+ type="button"
142
+ >
143
+ {locale === "pt-BR" ? "Anterior" : "Previous"}
144
+ </button>
145
+ <output aria-live="polite">{costGroupPageLabel({ locale, page: groupPage })}</output>
146
+ <button
147
+ disabled={groupPageLoading || !groupPage.has_more}
148
+ onClick={() => setGroupPageOffset(groupPageOffset + groupPage.limit)}
149
+ type="button"
150
+ >
151
+ {locale === "pt-BR" ? "Próxima" : "Next"}
152
+ </button>
153
+ </nav>
154
+ ) : null;
130
155
  return (
131
156
  <section
157
+ aria-busy={groupPageLoading || compactPageLoading || runPageLoading || undefined}
132
158
  className={`cost-content cost-content-${view} ${view === "overview" ? "cost-content-overview" : ""}`}
133
159
  >
134
160
  {detailLoading || dimensionalDetailPending ? (
@@ -155,22 +181,21 @@ export function CostMonitorContent({
155
181
  {...(useAggregateGroups ? { summaryUsage } : {})}
156
182
  />
157
183
  ) : null}
184
+ {view === "developers" ? developerPanel : null}
158
185
  {view === "agentCalls" ? (
159
186
  <>
160
187
  <CostRunsTable
161
188
  currency={currency}
162
189
  locale={locale}
163
190
  onOpenRun={onOpenRun}
164
- rows={
165
- serverPagingEligible && runPageData !== null ? pagedRunRows : rows
166
- }
191
+ rows={serverPagingEligible && runPageData !== null ? pagedRunRows : rows}
167
192
  {...(serverPagingEligible &&
168
193
  (runPageData?.run_page !== undefined || runPageLoading || runPageError !== null)
169
194
  ? {
170
195
  pagination: {
171
196
  ...(runPageData?.run_page ?? {
172
197
  offset: runPageOffset,
173
- limit: 100,
198
+ limit: 10,
174
199
  total: null,
175
200
  has_more: false,
176
201
  }),
@@ -246,32 +271,37 @@ export function CostMonitorContent({
246
271
  {(["providers", "agents", "models"] as const).map((key) =>
247
272
  view === key && !dimensionalDetailPending && !detailLoading && detailError === null ? (
248
273
  <>
249
- <CostGroupsTable
250
- currency={currency}
251
- key={key}
252
- labelHeading={
253
- key === "models"
254
- ? locale === "pt-BR"
255
- ? "Modelo LLM"
256
- : "LLM model"
257
- : key === "agents"
258
- ? locale === "pt-BR"
259
- ? "Zaip Agentes"
260
- : "ZAIP agents"
261
- : locale === "pt-BR"
262
- ? "Provedor"
263
- : "Providers"
264
- }
265
- locale={locale}
266
- rows={groups[key]}
267
- {...(key === "models" || key === "providers"
268
- ? { totals: summaryTotals }
269
- : groupPage?.totals === undefined
270
- ? {}
271
- : { totals: groupPage.totals })}
272
- {...(key === "agents" ? { showDateTime: false, showAgentIdentity: true } : key === "models" || key === "providers" ? { showDateTime: false, showInvocationTasks: true } : {})}
273
- />
274
- {groupPager}
274
+ <CostGroupsTable
275
+ currency={currency}
276
+ key={key}
277
+ labelHeading={
278
+ key === "models"
279
+ ? locale === "pt-BR"
280
+ ? "Modelo LLM"
281
+ : "LLM model"
282
+ : key === "agents"
283
+ ? locale === "pt-BR"
284
+ ? "Zaip Agentes"
285
+ : "ZAIP agents"
286
+ : locale === "pt-BR"
287
+ ? "Provedor"
288
+ : "Providers"
289
+ }
290
+ locale={locale}
291
+ loading={groupPageLoading}
292
+ rows={groups[key]}
293
+ {...(key === "models" || key === "providers"
294
+ ? { totals: summaryTotals }
295
+ : groupPage?.totals === undefined
296
+ ? {}
297
+ : { totals: groupPage.totals })}
298
+ {...(key === "agents"
299
+ ? { showDateTime: false, showAgentIdentity: true }
300
+ : key === "models" || key === "providers"
301
+ ? { showDateTime: false, showInvocationTasks: true }
302
+ : {})}
303
+ />
304
+ {groupPager}
275
305
  </>
276
306
  ) : null,
277
307
  )}
@@ -286,6 +316,7 @@ export function CostMonitorContent({
286
316
  <CostGroupsTable
287
317
  currency={currency}
288
318
  locale={locale}
319
+ loading={groupPageLoading}
289
320
  period={view}
290
321
  rows={groups[view]}
291
322
  showDateTime={false}
@@ -0,0 +1,35 @@
1
+ import type { CostLocale } from "./cost-monitor-copy.js";
2
+
3
+ export function CostMonitorLoadErrors({
4
+ groupError,
5
+ locale,
6
+ periodError,
7
+ retryGroup,
8
+ }: {
9
+ groupError: string | null;
10
+ locale: CostLocale;
11
+ periodError: string | null;
12
+ retryGroup: () => void;
13
+ }) {
14
+ return (
15
+ <>
16
+ {periodError ? (
17
+ <p className="cost-period-error" role="status">
18
+ {locale === "pt-BR"
19
+ ? `Não foi possível carregar o período selecionado: ${periodError}`
20
+ : `Could not load the selected period: ${periodError}`}
21
+ </p>
22
+ ) : null}
23
+ {groupError ? (
24
+ <p className="cost-period-error" role="status">
25
+ {locale === "pt-BR"
26
+ ? `Não foi possível carregar esta aba: ${groupError}`
27
+ : `Could not load this tab: ${groupError}`}
28
+ <button onClick={retryGroup} type="button">
29
+ {locale === "pt-BR" ? "Tentar novamente" : "Try again"}
30
+ </button>
31
+ </p>
32
+ ) : null}
33
+ </>
34
+ );
35
+ }
@@ -12,63 +12,128 @@ import {
12
12
  withTokenBackedCompactDuration,
13
13
  } from "./CompactLifecycleCostTable.js";
14
14
  import { costPeriodDateRange, defaultCostPeriod, emptyCostFilters } from "./CostFilters.js";
15
- import {
16
- costGroupPageLabel,
17
- effectiveCostGroupQuery,
18
- reconcileCostGroupTotalsWithCards,
19
- } from "./use-cost-group-page.js";
20
15
  import {
21
16
  COST_VIEW_ORDER,
22
17
  DEFAULT_COST_VIEW,
23
18
  findRunDetails,
24
19
  groupRows,
20
+ isCostViewExportEligible,
25
21
  isCurrentCostRunPageGeneration,
26
22
  isServerCostRunPagingEligible,
27
23
  matchesGlobalFilters,
28
24
  matchesPeriodEntity,
25
+ resolveCompactCostPageRange,
29
26
  resolveCostGroupPageRange,
30
27
  selectDimensionalCostRows,
31
28
  visibleExecutionRows,
32
29
  } from "./CostMonitorPage.js";
30
+ import {
31
+ costGroupPageLabel,
32
+ effectiveCostGroupQuery,
33
+ reconcileCostGroupTotalsWithCards,
34
+ } from "./use-cost-group-page.js";
33
35
 
34
36
  describe("cost monitor navigation", () => {
37
+ it("hides Excel export from the overview while retaining it on tabular views", () => {
38
+ expect(isCostViewExportEligible("overview")).toBe(false);
39
+ expect(isCostViewExportEligible("daily")).toBe(true);
40
+ expect(isCostViewExportEligible("agentCalls")).toBe(true);
41
+ });
42
+
35
43
  it("keeps the embedded default group pager on the all-time snapshot without explicit filters", () => {
36
44
  const monthRange = costPeriodDateRange(defaultCostPeriod, new Date("2026-08-17T12:00:00.000Z"));
37
- expect(resolveCostGroupPageRange({
38
- embedded: true,
39
- globalDateRange: undefined,
40
- hasLocalCostFilters: false,
41
- period: defaultCostPeriod,
42
- runPageRange: monthRange,
43
- })).toBeUndefined();
44
- expect(resolveCostGroupPageRange({
45
- embedded: true,
46
- globalDateRange: undefined,
47
- hasLocalCostFilters: false,
48
- period: "30",
49
- runPageRange: monthRange,
50
- })).toEqual(monthRange);
51
- expect(resolveCostGroupPageRange({
52
- embedded: true,
53
- globalDateRange: { start: "2026-07-14", end: "2026-08-17" },
54
- hasLocalCostFilters: false,
55
- period: defaultCostPeriod,
56
- runPageRange: { from: "2026-07-14", to: "2026-08-17" },
57
- })).toEqual({ from: "2026-07-14", to: "2026-08-17" });
58
- expect(resolveCostGroupPageRange({
59
- embedded: true,
60
- globalDateRange: undefined,
61
- hasLocalCostFilters: true,
62
- period: defaultCostPeriod,
63
- runPageRange: monthRange,
64
- })).toEqual(monthRange);
45
+ expect(
46
+ resolveCostGroupPageRange({
47
+ embedded: true,
48
+ globalDateRange: undefined,
49
+ hasLocalCostFilters: false,
50
+ period: defaultCostPeriod,
51
+ runPageRange: monthRange,
52
+ }),
53
+ ).toBeUndefined();
54
+ expect(
55
+ resolveCostGroupPageRange({
56
+ embedded: true,
57
+ globalDateRange: undefined,
58
+ hasLocalCostFilters: false,
59
+ period: "30",
60
+ runPageRange: monthRange,
61
+ }),
62
+ ).toEqual(monthRange);
63
+ expect(
64
+ resolveCostGroupPageRange({
65
+ embedded: true,
66
+ globalDateRange: { start: "2026-07-14", end: "2026-08-17" },
67
+ hasLocalCostFilters: false,
68
+ period: defaultCostPeriod,
69
+ runPageRange: { from: "2026-07-14", to: "2026-08-17" },
70
+ }),
71
+ ).toEqual({ from: "2026-07-14", to: "2026-08-17" });
72
+ expect(
73
+ resolveCostGroupPageRange({
74
+ embedded: true,
75
+ globalDateRange: undefined,
76
+ hasLocalCostFilters: true,
77
+ period: defaultCostPeriod,
78
+ runPageRange: monthRange,
79
+ }),
80
+ ).toEqual(monthRange);
81
+ });
82
+
83
+ it("keeps compact SPEC and PRD pages and their export source on the all-time snapshot", () => {
84
+ const monthRange = costPeriodDateRange(defaultCostPeriod, new Date("2026-08-17T12:00:00.000Z"));
85
+ expect(
86
+ resolveCompactCostPageRange({
87
+ embedded: true,
88
+ globalDateRange: undefined,
89
+ hasLocalCostFilters: false,
90
+ period: defaultCostPeriod,
91
+ runPageRange: monthRange,
92
+ }),
93
+ ).toBeUndefined();
94
+ expect(
95
+ resolveCompactCostPageRange({
96
+ embedded: false,
97
+ globalDateRange: undefined,
98
+ hasLocalCostFilters: false,
99
+ period: defaultCostPeriod,
100
+ runPageRange: monthRange,
101
+ }),
102
+ ).toEqual(monthRange);
103
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
104
+ expect(page).toContain("range: compactPageRange");
105
+ expect(page).toContain("...(compactPageRange === undefined ? {} : compactPageRange)");
106
+ });
107
+
108
+ it("releases the host loading gate when a global filter replaces the Cost Monitor surface", () => {
109
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
110
+
111
+ expect(page).toContain("() => () => onLoadingChange?.(false)");
112
+ });
113
+
114
+ it("does not fetch group pages for a non-group Cost Monitor tab and exposes a retryable error", () => {
115
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
116
+
117
+ expect(page).toContain("active: groupView !== null");
118
+ expect(page).toContain("groupPageState.retry");
119
+ });
120
+
121
+ it("requests exactly ten remote rows for the slow Cost Monitor tabs", () => {
122
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
123
+
124
+ expect(page).toContain("const compactPageLimit = 10;");
125
+ expect(page).toContain("const groupPageLimit = 10;");
126
+ expect(page).toContain("limit: 10,");
127
+ expect(page).toContain("range: groupPageRange");
65
128
  });
66
129
 
67
130
  it("labels daily pagination by its continuous result range", () => {
68
- expect(costGroupPageLabel({
69
- locale: "pt-BR",
70
- page: { offset: 30, limit: 30, total_count: 35 },
71
- })).toBe("31–35 de 35");
131
+ expect(
132
+ costGroupPageLabel({
133
+ locale: "pt-BR",
134
+ page: { offset: 30, limit: 30, total_count: 35 },
135
+ }),
136
+ ).toBe("31–35 de 35");
72
137
  const content = readFileSync(new URL("./CostMonitorContent.tsx", import.meta.url), "utf8");
73
138
  expect(content).toContain("groupPageOffset + groupPage.limit");
74
139
  expect(content).toContain("groupPageOffset - groupPage.limit");
@@ -158,6 +223,8 @@ describe("cost monitor navigation", () => {
158
223
  const runHook = readFileSync(new URL("./use-cost-run-page.ts", import.meta.url), "utf8");
159
224
  const periodHook = readFileSync(new URL("./CostFilters.tsx", import.meta.url), "utf8");
160
225
  expect(compactHook).toContain("const loadRef = useRef(load)");
226
+ expect(compactHook).toContain("const [resolvedKey, setResolvedKey]");
227
+ expect(compactHook).toContain("compactPage: resolvedKey === requestKey ? page : null");
161
228
  expect(compactHook).toContain("const loadPage = loadRef.current");
162
229
  expect(compactHook).toContain("if (loadPage === undefined) return;");
163
230
  expect(compactHook).not.toContain("[attempt, load,");
@@ -198,11 +265,15 @@ describe("cost monitor navigation", () => {
198
265
  expect(isServerCostRunPagingEligible({ ...emptyCostFilters, status: "executing" })).toBe(true);
199
266
  expect(isServerCostRunPagingEligible({ ...emptyCostFilters, query: "edge" })).toBe(true);
200
267
  expect(isServerCostRunPagingEligible(emptyCostFilters, "edge")).toBe(true);
201
- expect(isServerCostRunPagingEligible({ ...emptyCostFilters, query: "local" }, "global")).toBe(false);
268
+ expect(isServerCostRunPagingEligible({ ...emptyCostFilters, query: "local" }, "global")).toBe(
269
+ false,
270
+ );
202
271
  });
203
272
  it("routes global search to lazy invocations and all active dimensions to lazy groups", () => {
204
273
  expect(effectiveCostGroupQuery(emptyCostFilters, "global-edge")).toBe("global-edge");
205
- expect(effectiveCostGroupQuery({ ...emptyCostFilters, query: "local-edge" }, "global-edge")).toBe("local-edge");
274
+ expect(
275
+ effectiveCostGroupQuery({ ...emptyCostFilters, query: "local-edge" }, "global-edge"),
276
+ ).toBe("local-edge");
206
277
  const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
207
278
  const runHook = readFileSync(new URL("./use-cost-run-page.ts", import.meta.url), "utf8");
208
279
  const groupHook = readFileSync(new URL("./use-cost-group-page.ts", import.meta.url), "utf8");
@@ -212,9 +283,19 @@ describe("cost monitor navigation", () => {
212
283
  expect(runHook).toContain("query: filters.query || globalQuery");
213
284
  expect(groupHook).toContain("export type CostGroupFilters = CostFilterState");
214
285
  expect(groupHook).toContain("filters,");
215
- expect(page).toContain("groupPageState.page === null");
286
+ expect(page).toContain(
287
+ "const displayedGroupPage = groupPageState.page ?? groupPageState.stalePage",
288
+ );
216
289
  expect(page).toContain("? []");
217
290
  });
291
+
292
+ it("keeps the Agents visual page bounded when the server page loader is available", () => {
293
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
294
+
295
+ expect(page).toContain('groupView === "agents" && loadGroupPage === undefined');
296
+ expect(page).toContain(": [...displayedGroupPage.rows]");
297
+ expect(page).toContain("const groupPageLimit = 10;");
298
+ });
218
299
  it("uses the Sao Paulo calendar for global daily filtering on both sides of 03:00Z", () => {
219
300
  const base = costRun("RUN-CALENDAR");
220
301
  expect(
@@ -259,6 +340,7 @@ describe("cost monitor navigation", () => {
259
340
  "daily",
260
341
  "monthly",
261
342
  "annual",
343
+ "developers",
262
344
  "overview",
263
345
  "executions",
264
346
  "agentCalls",
@@ -272,6 +354,46 @@ describe("cost monitor navigation", () => {
272
354
  ]);
273
355
  });
274
356
 
357
+ it("places the shared developer table inside the Cost Monitor content section", () => {
358
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
359
+ const content = readFileSync(new URL("./CostMonitorContent.tsx", import.meta.url), "utf8");
360
+
361
+ expect(page).toMatch(
362
+ /developerPanel=\{\s*view === "developers" \? \(\s*<CostDeveloperAttributionPanel\b/,
363
+ );
364
+ expect(page).not.toMatch(/<\/CostMonitorContent>\s*\{view === "developers"/);
365
+ expect(content).toContain('{view === "developers" ? developerPanel : null}');
366
+ });
367
+
368
+ it("prepares Agent Invocations from every server page for export", () => {
369
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
370
+ const exportSection = page.slice(
371
+ page.indexOf("const agentInvocationExportSource"),
372
+ page.indexOf("const costGroupExportSource"),
373
+ );
374
+ expect(page).toContain('view === "agentCalls" && serverPagingEligible');
375
+ expect(page).toContain("agentInvocationExportSource");
376
+ expect(page).toMatch(
377
+ /pageSource=\{\s*compactExportSource \?\? agentInvocationExportSource \?\? costGroupExportSource\s*\}/,
378
+ );
379
+ expect(page).toContain("if (page.runs.length === 0) return");
380
+ expect(exportSection.match(/limit: 100/g)).toHaveLength(2);
381
+ expect(exportSection).toContain("nextOffset >= page.run_page.total");
382
+ expect(exportSection).toContain("...(groupPageRange === undefined ? {} : groupPageRange)");
383
+ expect(exportSection).not.toContain("...(runPageRange === undefined ? {} : runPageRange)");
384
+ });
385
+
386
+ it("prepares every paginated period row for daily, monthly, and annual exports", () => {
387
+ const page = readFileSync(new URL("./CostMonitorPage.tsx", import.meta.url), "utf8");
388
+
389
+ expect(page).toContain('view === "daily" ||');
390
+ expect(page).toContain('view === "monthly" ||');
391
+ expect(page).toContain('view === "annual" ||');
392
+ expect(page).toContain("...(groupPageRange === undefined ? {} : groupPageRange)");
393
+ expect(page).toContain("totalRows: firstPage.total_count");
394
+ expect(page).toContain("nextOffset >= page.total_count || !page.has_more");
395
+ });
396
+
275
397
  it("resolves an Agent Run to its own details", () => {
276
398
  const runs = [{ id: "RUN-001" }, { id: "RUN-002" }];
277
399