@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
@@ -11,6 +11,7 @@ import type { CostMonitorProjection } from "../contracts.js";
11
11
  import { normalizeCostProvider } from "../provider.js";
12
12
  import { aggregateTaskCostRows } from "../task-cost-groups.js";
13
13
  import { withTokenBackedCompactDuration } from "./CompactLifecycleCostTable.js";
14
+ import { CostDeveloperAttributionPanel } from "./CostDeveloperAttributionPanel.js";
14
15
  import {
15
16
  type CostFilterState,
16
17
  CostFilters,
@@ -25,6 +26,7 @@ import {
25
26
  } from "./CostFilters.js";
26
27
  import { CostMonitorContent } from "./CostMonitorContent.js";
27
28
  import { ChevronDownIcon, ListFilterIcon, LocaleFlag, SettingsIcon } from "./CostMonitorIcons.js";
29
+ import { CostMonitorLoadErrors } from "./CostMonitorLoadErrors.js";
28
30
  import { CostSummary } from "./CostSummary.js";
29
31
  import {
30
32
  groupRows,
@@ -48,6 +50,7 @@ import {
48
50
  import { findRunDetails, selectDimensionalCostRows } from "./cost-monitor-page-helpers.js";
49
51
  import { summarizeCostRows } from "./cost-monitor-summary.js";
50
52
  import { COST_VIEW_ORDER, type CostView, DEFAULT_COST_VIEW } from "./cost-monitor-views.js";
53
+ import { resolveCompactCostPageRange, resolveCostGroupPageRange } from "./cost-page-range.js";
51
54
  import { enrichPeriodCostGroups } from "./period-cost-groups.js";
52
55
  import {
53
56
  compactReadModelKind,
@@ -73,12 +76,18 @@ export {
73
76
  type CostView,
74
77
  DEFAULT_COST_VIEW,
75
78
  } from "./cost-monitor-views.js";
79
+ export { resolveCompactCostPageRange, resolveCostGroupPageRange } from "./cost-page-range.js";
76
80
 
77
81
  export type { LoadCompactCostPage } from "./use-compact-cost-page.js";
78
82
  export type { LoadCostGroupPage } from "./use-cost-group-page.js";
79
83
  export type LoadCostMonitorDetail = typeof loadCostMonitorDetail;
80
84
  export type LoadCostRunPage = typeof loadCostMonitorRunPage;
81
85
 
86
+ /** The overview is a summary surface, not an exportable table view. */
87
+ export function isCostViewExportEligible(view: CostView): boolean {
88
+ return view !== "overview";
89
+ }
90
+
82
91
  /**
83
92
  * The Cost period request filters Runs, while Operations is the global snapshot
84
93
  * used for shared entity detail. Keep the Executions tab on that same active
@@ -106,33 +115,6 @@ export function isServerCostRunPagingEligible(filters: CostFilterState, globalQu
106
115
  );
107
116
  }
108
117
 
109
- /**
110
- * The embedded default view is backed by the App's all-time atomic snapshot.
111
- * Keep the group pager on that same population until a period, global date, or
112
- * local Cost filter explicitly narrows it.
113
- */
114
- export function resolveCostGroupPageRange({
115
- embedded,
116
- globalDateRange,
117
- hasLocalCostFilters,
118
- period,
119
- runPageRange,
120
- }: {
121
- embedded: boolean;
122
- globalDateRange: { start: string; end: string } | undefined;
123
- hasLocalCostFilters: boolean;
124
- period: CostPeriod;
125
- runPageRange: { from: string; to: string } | undefined;
126
- }): { from: string; to: string } | undefined {
127
- if (
128
- embedded &&
129
- globalDateRange === undefined &&
130
- period === defaultCostPeriod &&
131
- !hasLocalCostFilters
132
- ) return undefined;
133
- return runPageRange;
134
- }
135
-
136
118
  export function CostMonitorPage({
137
119
  capabilityNavigation,
138
120
  data,
@@ -234,6 +216,13 @@ export function CostMonitorPage({
234
216
  period,
235
217
  runPageRange,
236
218
  });
219
+ const compactPageRange = resolveCompactCostPageRange({
220
+ embedded,
221
+ globalDateRange: globalFilters?.dateRange,
222
+ hasLocalCostFilters,
223
+ period,
224
+ runPageRange,
225
+ });
237
226
  const costGroupViewName = (
238
227
  candidate: CostView,
239
228
  ): "daily" | "monthly" | "annual" | "agents" | "models" | "providers" | null =>
@@ -246,24 +235,34 @@ export function CostMonitorPage({
246
235
  ? candidate
247
236
  : null;
248
237
  const groupView = costGroupViewName(view);
238
+ // Visual tables are intentionally bounded. Export sources below retain
239
+ // their independent 50/100-row transport batches and always traverse all
240
+ // pages, so this is never an export limit.
241
+ const compactPageLimit = 10;
242
+ const groupPageLimit = 10;
249
243
  const groupPageState = useCostGroupPage({
244
+ active: groupView !== null,
250
245
  view: groupView ?? "daily",
251
246
  ...(groupPageRange === undefined ? {} : { range: groupPageRange }),
252
247
  globalQuery: globalFilters?.query ?? "",
253
248
  filters,
249
+ limit: groupPageLimit,
254
250
  ...(groupView === null ? {} : { load: loadGroupPage }),
255
251
  });
252
+ const displayedGroupPage = groupPageState.page ?? groupPageState.stalePage;
256
253
  const {
257
254
  compactPageOffset,
258
255
  setCompactPageOffset,
259
256
  compactPage,
257
+ staleCompactPage,
260
258
  compactPageLoading,
261
259
  compactPageError,
262
260
  retryCompactPage,
263
261
  } = useCompactCostPage({
264
262
  view,
265
263
  load: loadReadModelPage,
266
- range: runPageRange,
264
+ limit: compactPageLimit,
265
+ range: compactPageRange,
267
266
  query: globalFilters?.query,
268
267
  filters,
269
268
  });
@@ -284,17 +283,39 @@ export function CostMonitorPage({
284
283
  currency,
285
284
  filters,
286
285
  globalQuery: globalFilters?.query ?? "",
287
- range: runPageRange,
286
+ limit: 10,
287
+ // Agent Invocations follows the same effective snapshot as the other
288
+ // remote tables. In the embedded all-time view, the hidden default month
289
+ // must not silently add a date range and bypass the fast all-time page.
290
+ range: groupPageRange,
288
291
  refresh: lastUpdatedAt,
289
292
  load: loadRunPage,
290
293
  });
291
294
  useEffect(
292
295
  () =>
293
296
  onLoadingChange?.(
294
- loading || periodLoading || runPageLoading || groupPageState.loading || compactPageLoading || detailLoading,
297
+ loading ||
298
+ periodLoading ||
299
+ runPageLoading ||
300
+ groupPageState.loading ||
301
+ compactPageLoading ||
302
+ detailLoading,
295
303
  ),
296
- [compactPageLoading, detailLoading, groupPageState.loading, loading, onLoadingChange, periodLoading, runPageLoading],
304
+ [
305
+ compactPageLoading,
306
+ detailLoading,
307
+ groupPageState.loading,
308
+ loading,
309
+ onLoadingChange,
310
+ periodLoading,
311
+ runPageLoading,
312
+ ],
297
313
  );
314
+ // A global period/filter change unmounts this surface and replaces its atomic snapshot.
315
+ // Requests belonging to the old surface are aborted, so completion cannot clear the
316
+ // host-level loading gate. Always release that gate on unmount; the newly
317
+ // mounted surface will immediately assert its own loading state if needed.
318
+ useEffect(() => () => onLoadingChange?.(false), [onLoadingChange]);
298
319
  useEffect(() => {
299
320
  if (!hasLocalCostFilters) onActiveDataChange?.(activeData);
300
321
  }, [activeData, hasLocalCostFilters, onActiveDataChange]);
@@ -471,13 +492,16 @@ export function CostMonitorPage({
471
492
  : {
472
493
  ...groups,
473
494
  [groupView]:
474
- groupPageState.page === null
495
+ displayedGroupPage === null
475
496
  ? []
476
- : groupView === "agents"
477
- ? includeConfiguredAgentGroups(groupPageState.page.rows, activeData.configured_agents)
478
- : [...groupPageState.page.rows],
497
+ : groupView === "agents" && loadGroupPage === undefined
498
+ ? includeConfiguredAgentGroups(
499
+ displayedGroupPage.rows,
500
+ activeData.configured_agents,
501
+ )
502
+ : [...displayedGroupPage.rows],
479
503
  },
480
- [activeData.configured_agents, groups, groupPageState.page, groupView],
504
+ [activeData.configured_agents, displayedGroupPage, groups, groupView, loadGroupPage],
481
505
  );
482
506
  const overview = useAggregateGroups
483
507
  ? activeData.overview
@@ -520,7 +544,7 @@ export function CostMonitorPage({
520
544
  const compactKind = compactReadModelKind(view);
521
545
  const usingCompactPage = compactKind !== null && loadReadModelPage !== undefined;
522
546
  const exportRows = useMemo(() => {
523
- if (usingCompactPage) return compactPage?.rows ?? [];
547
+ if (usingCompactPage) return compactPage?.rows ?? staleCompactPage?.rows ?? [];
524
548
  if (view === "executions") return visibleExecutions;
525
549
  if (view === "conversations") return groups.conversations;
526
550
  if (view === "tasks") return groups.tasks;
@@ -534,38 +558,143 @@ export function CostMonitorPage({
534
558
  groups,
535
559
  rows,
536
560
  usingCompactPage,
561
+ staleCompactPage?.rows,
537
562
  view,
538
563
  visibleExecutions,
539
564
  visiblePrds,
540
565
  visibleSpecs,
541
566
  ]);
542
567
  const compactExportSource =
543
- usingCompactPage &&
544
- compactKind !== null &&
545
- compactPage !== null &&
546
- loadReadModelPage !== undefined
568
+ usingCompactPage && compactKind !== null && loadReadModelPage !== undefined
547
569
  ? {
548
- totalRows: compactPage.total,
549
- pages: async function* () {
550
- const seen = new Set<string>();
551
- for (let offset = 0; offset < compactPage.total; offset += compactPage.limit) {
552
- const page = await loadReadModelPage({
553
- kind: compactKind,
554
- offset,
555
- limit: compactPage.limit,
556
- filters,
557
- ...(runPageRange === undefined ? {} : runPageRange),
558
- ...(globalFilters?.query ? { query: globalFilters.query } : {}),
559
- });
560
- const unique = page.rows
561
- .filter((row) => {
562
- if (seen.has(row.id)) return false;
563
- seen.add(row.id);
564
- return true;
565
- })
566
- .map(withTokenBackedCompactDuration);
567
- if (unique.length > 0) yield unique as unknown as readonly Record<string, unknown>[];
568
- }
570
+ prepare: async () => {
571
+ const firstPage = await loadReadModelPage({
572
+ kind: compactKind,
573
+ offset: 0,
574
+ limit: 50,
575
+ filters,
576
+ ...(compactPageRange === undefined ? {} : compactPageRange),
577
+ ...(globalFilters?.query ? { query: globalFilters.query } : {}),
578
+ });
579
+ return {
580
+ totalRows: firstPage.total,
581
+ pages: async function* () {
582
+ let page = firstPage;
583
+ const seen = new Set<string>();
584
+ while (true) {
585
+ const unique = page.rows
586
+ .filter((row) => {
587
+ if (seen.has(row.id)) return false;
588
+ seen.add(row.id);
589
+ return true;
590
+ })
591
+ .map(withTokenBackedCompactDuration);
592
+ if (unique.length > 0)
593
+ yield unique as unknown as readonly Record<string, unknown>[];
594
+ const nextOffset = page.offset + page.rows.length;
595
+ if (nextOffset >= page.total || !page.has_more) return;
596
+ page = await loadReadModelPage({
597
+ kind: compactKind,
598
+ offset: nextOffset,
599
+ limit: page.limit,
600
+ filters,
601
+ ...(compactPageRange === undefined ? {} : compactPageRange),
602
+ ...(globalFilters?.query ? { query: globalFilters.query } : {}),
603
+ });
604
+ }
605
+ },
606
+ };
607
+ },
608
+ }
609
+ : undefined;
610
+ const agentInvocationExportSource =
611
+ view === "agentCalls" && serverPagingEligible && loadRunPage !== undefined
612
+ ? {
613
+ prepare: async () => {
614
+ const effectiveFilters = {
615
+ ...filters,
616
+ query: filters.query || globalFilters?.query || "",
617
+ };
618
+ const firstPage = await loadRunPage({
619
+ currency,
620
+ filters: effectiveFilters,
621
+ ...(groupPageRange === undefined ? {} : groupPageRange),
622
+ limit: 100,
623
+ offset: 0,
624
+ refresh: lastUpdatedAt,
625
+ });
626
+ const totalRows = firstPage.run_page.total ?? firstPage.runs.length;
627
+ return {
628
+ totalRows,
629
+ pages: async function* () {
630
+ let page = firstPage;
631
+ while (true) {
632
+ if (page.runs.length === 0) return;
633
+ yield page.runs as unknown as readonly Record<string, unknown>[];
634
+ const nextOffset = page.run_page.offset + page.runs.length;
635
+ if (
636
+ (page.run_page.total !== null && nextOffset >= page.run_page.total) ||
637
+ !page.run_page.has_more
638
+ )
639
+ return;
640
+ page = await loadRunPage({
641
+ currency,
642
+ filters: effectiveFilters,
643
+ ...(groupPageRange === undefined ? {} : groupPageRange),
644
+ limit: 100,
645
+ offset: nextOffset,
646
+ refresh: lastUpdatedAt,
647
+ });
648
+ }
649
+ },
650
+ };
651
+ },
652
+ }
653
+ : undefined;
654
+ // Period views are paginated SQLite projections too. Exporting their
655
+ // already-rendered group rows truncates the workbook to the visible page
656
+ // (and can lose the projection's factual duration). Capture the same
657
+ // paged query used by the table so an All Time selection keeps its unbound
658
+ // range and every other selection retains its exact range and filters.
659
+ const costGroupExportSource =
660
+ (view === "daily" ||
661
+ view === "monthly" ||
662
+ view === "annual" ||
663
+ view === "agents" ||
664
+ view === "models" ||
665
+ view === "providers") &&
666
+ loadGroupPage !== undefined
667
+ ? {
668
+ prepare: async () => {
669
+ const query = filters.query || globalFilters?.query || "";
670
+ const firstPage = await loadGroupPage({
671
+ view,
672
+ offset: 0,
673
+ limit: 50,
674
+ filters,
675
+ ...(query ? { query } : {}),
676
+ ...(groupPageRange === undefined ? {} : groupPageRange),
677
+ });
678
+ return {
679
+ totalRows: firstPage.total_count,
680
+ pages: async function* () {
681
+ let page = firstPage;
682
+ while (true) {
683
+ if (page.rows.length === 0) return;
684
+ yield page.rows as unknown as readonly Record<string, unknown>[];
685
+ const nextOffset = page.offset + page.rows.length;
686
+ if (nextOffset >= page.total_count || !page.has_more) return;
687
+ page = await loadGroupPage({
688
+ view,
689
+ offset: nextOffset,
690
+ limit: page.limit,
691
+ filters,
692
+ ...(query ? { query } : {}),
693
+ ...(groupPageRange === undefined ? {} : groupPageRange),
694
+ });
695
+ }
696
+ },
697
+ };
569
698
  },
570
699
  }
571
700
  : undefined;
@@ -613,13 +742,12 @@ export function CostMonitorPage({
613
742
  title={dashboardTitle}
614
743
  />
615
744
  )}
616
- {periodError ? (
617
- <p className="cost-period-error" role="status">
618
- {locale === "pt-BR"
619
- ? `Não foi possível carregar o período selecionado: ${periodError}`
620
- : `Could not load the selected period: ${periodError}`}
621
- </p>
622
- ) : null}
745
+ <CostMonitorLoadErrors
746
+ groupError={groupView === null ? null : groupPageState.error}
747
+ locale={locale}
748
+ periodError={periodError}
749
+ retryGroup={groupPageState.retry}
750
+ />
623
751
  {embedded ? null : (
624
752
  <>
625
753
  <nav aria-label="Navegação do Cost Monitor" className="cost-monitor-nav">
@@ -789,29 +917,43 @@ export function CostMonitorPage({
789
917
  </button>
790
918
  ))}
791
919
  </nav>
792
- <div className="cost-tab-export">
793
- <ExcelExportAction
794
- filters={{ ...filters, ...globalFilters, period }}
795
- {...(compactExportSource === undefined ? {} : { pageSource: compactExportSource })}
796
- rows={exportRows as unknown as readonly Record<string, unknown>[]}
797
- view={`cost-${view}`}
798
- />
799
- </div>
920
+ {isCostViewExportEligible(view) ? (
921
+ <div className="cost-tab-export">
922
+ <ExcelExportAction
923
+ filters={{ ...filters, ...globalFilters, period }}
924
+ pageSource={
925
+ compactExportSource ?? agentInvocationExportSource ?? costGroupExportSource
926
+ }
927
+ rows={exportRows as unknown as readonly Record<string, unknown>[]}
928
+ view={`cost-${view}`}
929
+ />
930
+ </div>
931
+ ) : null}
800
932
  </div>
801
933
  {/* CostMonitorContent owns `view === "models" && useAggregateGroups ? (` and `rows={groups.models}`. */}
802
934
  <CostMonitorContent
803
935
  canonicalDurationTotal={canonicalDurationTotal}
804
- compactPage={compactPage}
936
+ compactPage={compactPage ?? staleCompactPage}
805
937
  compactPageError={compactPageError}
806
938
  compactPageLoading={compactPageLoading}
807
939
  compactPageOffset={compactPageOffset}
808
940
  currency={currency}
809
941
  detailError={detailError}
810
942
  detailLoading={detailLoading}
943
+ developerPanel={
944
+ view === "developers" ? (
945
+ <CostDeveloperAttributionPanel
946
+ locale={locale}
947
+ {...(runPageRange === undefined
948
+ ? {}
949
+ : { from: runPageRange.from, to: runPageRange.to })}
950
+ />
951
+ ) : null
952
+ }
811
953
  dimensionalDetailPending={dimensionalDetailPending}
812
954
  dimensionalRows={dimensionalRows}
813
955
  groups={displayGroups}
814
- groupPage={groupView === null ? null : groupPageState.page}
956
+ groupPage={groupView === null ? null : displayedGroupPage}
815
957
  groupPageLoading={groupView === null ? false : groupPageState.loading}
816
958
  groupPageOffset={groupPageState.offset}
817
959
  setGroupPageOffset={groupPageState.setOffset}
@@ -0,0 +1,132 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ activeCostPeriodData,
4
+ costPeriodDateRange,
5
+ defaultCostPeriod,
6
+ emptyCostFilters,
7
+ loadCostMonitorPeriod,
8
+ shouldFetchCostPeriod,
9
+ } from "./CostFilters.js";
10
+
11
+ describe("period-driven Cost Monitor loading", () => {
12
+ it("drops a stale in-memory Cost period response when refresh replaces its base snapshot", () => {
13
+ const stale = { runs: [{ run_id: "RUN-OBSERVED", duration_ms: 31 * 3_600_000 }] } as never;
14
+ const refreshed = { runs: [{ run_id: "RUN-PROJECTED", duration_ms: 413_659_026 }] } as never;
15
+ expect(activeCostPeriodData(refreshed, stale, stale)).toBe(refreshed);
16
+ expect(activeCostPeriodData(refreshed, refreshed, refreshed)).toBe(refreshed);
17
+ });
18
+
19
+ it("does not issue a second Cost request after an embedded default atomic snapshot", () => {
20
+ const filters = {
21
+ query: "",
22
+ provider: "",
23
+ phase: "",
24
+ origin: "",
25
+ workType: "",
26
+ agent: "",
27
+ model: "",
28
+ status: "",
29
+ priority: "",
30
+ risk: "",
31
+ };
32
+ expect(shouldFetchCostPeriod({ filters, period: "month", snapshotBacked: true })).toBe(false);
33
+ expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(true);
34
+ expect(shouldFetchCostPeriod({ filters, period: "7", snapshotBacked: true })).toBe(true);
35
+ expect(
36
+ shouldFetchCostPeriod({
37
+ filters: { ...filters, phase: "execution" },
38
+ period: "month",
39
+ snapshotBacked: true,
40
+ }),
41
+ ).toBe(true);
42
+ });
43
+
44
+ it("uses the current month for the default period and keeps All Time explicit", async () => {
45
+ expect(defaultCostPeriod).toBe("month");
46
+ expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
47
+ expect(costPeriodDateRange("month", new Date("2026-08-01T03:30:00.000Z"))).toEqual({
48
+ from: "2026-08-01",
49
+ to: "2026-08-01",
50
+ });
51
+ const calls: string[] = [];
52
+ await loadCostMonitorPeriod({
53
+ currency: "BRL",
54
+ fetcher: async (url) => {
55
+ calls.push(String(url));
56
+ return new Response(JSON.stringify({ runs: [] }), { status: 200 });
57
+ },
58
+ });
59
+ expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL&scope=summary"]);
60
+ });
61
+
62
+ it("derives an inclusive current-month range without inspecting materialized Runs", () => {
63
+ expect(costPeriodDateRange("month", new Date("2026-07-26T15:00:00.000Z"))).toEqual({
64
+ from: "2026-07-01",
65
+ to: "2026-07-26",
66
+ });
67
+ expect(costPeriodDateRange("7", new Date("2026-07-26T15:00:00.000Z"))).toEqual({
68
+ from: "2026-07-20",
69
+ to: "2026-07-26",
70
+ });
71
+ });
72
+
73
+ it("requests the selected range from the local runtime and forwards cancellation", async () => {
74
+ const calls: Array<{ url: string; signal: AbortSignal | null | undefined }> = [];
75
+ const controller = new AbortController();
76
+ const projection = { runs: [] };
77
+ const loaded = await loadCostMonitorPeriod({
78
+ currency: "BRL",
79
+ from: "2026-07-01",
80
+ to: "2026-07-26",
81
+ filters: {
82
+ query: "TASK-1",
83
+ provider: "openai",
84
+ phase: "execution",
85
+ origin: "spec",
86
+ workType: "rework",
87
+ agent: "zaip-agent-builder",
88
+ model: "gpt-5.6-terra",
89
+ status: "completed",
90
+ priority: "high",
91
+ risk: "standard",
92
+ },
93
+ signal: controller.signal,
94
+ fetcher: async (url, init) => {
95
+ calls.push({ url: String(url), signal: init?.signal });
96
+ return new Response(JSON.stringify(projection), {
97
+ headers: { "content-type": "application/json" },
98
+ status: 200,
99
+ });
100
+ },
101
+ });
102
+ expect(loaded).toEqual(projection);
103
+ expect(calls).toEqual([
104
+ {
105
+ url:
106
+ "/api/v2/cost-monitor?currency=BRL&scope=summary&from=2026-07-01&to=2026-07-26" +
107
+ "&provider=openai&phase=execution&agent=zaip-agent-builder" +
108
+ "&model=gpt-5.6-terra&status=completed",
109
+ signal: controller.signal,
110
+ },
111
+ ]);
112
+ });
113
+
114
+ it("never leaves period/filter hydration scope-less or on detail", async () => {
115
+ const calls: string[] = [];
116
+ await loadCostMonitorPeriod({
117
+ currency: "USD",
118
+ filters: { ...emptyCostFilters, provider: "openai", model: "gpt-5.6-terra" },
119
+ fetcher: async (url) => {
120
+ calls.push(String(url));
121
+ return new Response(JSON.stringify({ runs: [] }), { status: 200 });
122
+ },
123
+ });
124
+ const [firstCall] = calls;
125
+ if (firstCall === undefined) {
126
+ throw new Error("Expected a Cost Monitor request.");
127
+ }
128
+ const request = new URL(firstCall, "http://dashboard.local");
129
+ expect(request.searchParams.get("scope")).toBe("summary");
130
+ expect(request.searchParams.get("scope")).not.toBe("detail");
131
+ });
132
+ });
@@ -0,0 +1,70 @@
1
+ import type { CostLocale } from "./cost-monitor-copy.js";
2
+
3
+ /** The bounded Invocation table's server page state. */
4
+ export type CostRunPagination = {
5
+ offset: number;
6
+ limit: number;
7
+ total: number | null;
8
+ has_more: boolean;
9
+ loading: boolean;
10
+ error: string | null;
11
+ onChange: (offset: number) => void;
12
+ onRetry: () => void;
13
+ };
14
+
15
+ export function CostRunServerPagination({
16
+ locale,
17
+ pagination,
18
+ }: {
19
+ locale: CostLocale;
20
+ pagination: CostRunPagination;
21
+ }) {
22
+ const first = pagination.total === 0 ? 0 : pagination.offset + 1;
23
+ const last =
24
+ pagination.total === null
25
+ ? pagination.offset + pagination.limit
26
+ : Math.min(pagination.offset + pagination.limit, pagination.total);
27
+ const previous = Math.max(0, pagination.offset - pagination.limit);
28
+ const next = pagination.offset + pagination.limit;
29
+ return (
30
+ <nav
31
+ aria-label={locale === "pt-BR" ? "Paginação das invocações" : "Invocation pagination"}
32
+ className="ui-table-pagination"
33
+ >
34
+ <button
35
+ disabled={pagination.loading || pagination.offset === 0}
36
+ onClick={() => pagination.onChange(previous)}
37
+ type="button"
38
+ >
39
+ {locale === "pt-BR" ? "Anterior" : "Previous"}
40
+ </button>
41
+ <span aria-live="polite">
42
+ {pagination.loading
43
+ ? locale === "pt-BR"
44
+ ? "Carregando invocações…"
45
+ : "Loading invocations…"
46
+ : pagination.total === null
47
+ ? `${first}–${last}${pagination.has_more ? "+" : ""}`
48
+ : `${first}–${last} ${locale === "pt-BR" ? "de" : "of"} ${pagination.total}`}
49
+ </span>
50
+ <button
51
+ disabled={
52
+ pagination.loading ||
53
+ (!pagination.has_more && (pagination.total === null || next >= pagination.total))
54
+ }
55
+ onClick={() => pagination.onChange(next)}
56
+ type="button"
57
+ >
58
+ {locale === "pt-BR" ? "Próxima" : "Next"}
59
+ </button>
60
+ {pagination.error ? (
61
+ <span role="status">
62
+ {pagination.error}{" "}
63
+ <button onClick={pagination.onRetry} type="button">
64
+ {locale === "pt-BR" ? "Tentar novamente" : "Retry"}
65
+ </button>
66
+ </span>
67
+ ) : null}
68
+ </nav>
69
+ );
70
+ }