@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
@@ -0,0 +1,176 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { afterEach, describe, expect, it } from "vitest";
3
+ import { type CostGroupKind, readCostGroupPage } from "./sqlite-cost-group-page.js";
4
+ import { materializeCostGroupDailyProjection } from "./sqlite-cost-group-projection.js";
5
+
6
+ const databases: DatabaseSync[] = [];
7
+
8
+ afterEach(() => {
9
+ for (const database of databases.splice(0)) database.close();
10
+ });
11
+
12
+ function fixture() {
13
+ const database = new DatabaseSync(":memory:");
14
+ databases.push(database);
15
+ database.exec(`
16
+ CREATE TABLE cost_group_daily_projection (
17
+ day TEXT, group_kind TEXT, group_value TEXT,
18
+ invocation_count INTEGER, llm_call_count INTEGER, total_duration REAL,
19
+ total_input_tokens REAL, total_cached_input_tokens REAL,
20
+ total_output_tokens REAL, total_reasoning_tokens REAL, total_tokens REAL,
21
+ total_cost_usd REAL, total_cost_brl REAL
22
+ );
23
+ CREATE TABLE cost_monitor_group_daily_cache AS
24
+ SELECT * FROM cost_group_daily_projection;
25
+ CREATE TABLE cost_group_entity_projection (
26
+ group_kind TEXT, group_value TEXT, title TEXT, status TEXT, risk TEXT,
27
+ PRIMARY KEY (group_kind, group_value)
28
+ );
29
+ CREATE TABLE tasks (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
30
+ CREATE TABLE specs (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
31
+ CREATE TABLE prds (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
32
+ CREATE TABLE executions (id TEXT PRIMARY KEY, status TEXT);
33
+ CREATE TABLE conversations (id TEXT PRIMARY KEY, status TEXT);
34
+ `);
35
+ return database;
36
+ }
37
+
38
+ function insertGroup(database: DatabaseSync, kind: CostGroupKind, id: string, day = "2026-08-10") {
39
+ const values = [day, kind, id, 2, 2, 40, 10, 2, 4, 1, 17, 1.5, 8.25];
40
+ for (const table of ["cost_group_daily_projection", "cost_monitor_group_daily_cache"]) {
41
+ database
42
+ .prepare(`INSERT INTO ${table} VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
43
+ .run(...values);
44
+ }
45
+ const metadata =
46
+ kind === "task" || kind === "spec" || kind === "prd"
47
+ ? [id, `${kind} title`, "completed", "standard"]
48
+ : [id, "completed"];
49
+ database
50
+ .prepare(
51
+ kind === "task" || kind === "spec" || kind === "prd"
52
+ ? `INSERT OR IGNORE INTO ${kind}s VALUES (?, ?, ?, ?)`
53
+ : `INSERT OR IGNORE INTO ${kind}s VALUES (?, ?)`,
54
+ )
55
+ .run(...metadata);
56
+ database
57
+ .prepare(
58
+ `INSERT OR IGNORE INTO cost_group_entity_projection
59
+ VALUES (?, ?, ?, ?, ?)`,
60
+ )
61
+ .run(
62
+ kind,
63
+ id,
64
+ kind === "task" || kind === "spec" || kind === "prd" ? `${kind} title` : null,
65
+ "completed",
66
+ kind === "task" || kind === "spec" || kind === "prd" ? "standard" : null,
67
+ );
68
+ }
69
+
70
+ describe("date-only grouped Cost pages", () => {
71
+ it("materializes entity metadata once instead of joining dynamic entity views per page", () => {
72
+ const database = new DatabaseSync(":memory:");
73
+ databases.push(database);
74
+ database.exec(`
75
+ CREATE TABLE zaip_vw_cost_monitor_group_daily_cache (
76
+ day TEXT, group_kind TEXT, group_value TEXT,
77
+ invocation_count INTEGER, llm_call_count INTEGER, total_duration REAL,
78
+ total_input_tokens REAL, total_cached_input_tokens REAL,
79
+ total_output_tokens REAL, total_reasoning_tokens REAL, total_tokens REAL,
80
+ total_cost_usd REAL, total_cost_brl REAL
81
+ );
82
+ INSERT INTO zaip_vw_cost_monitor_group_daily_cache VALUES
83
+ ('2026-08-10', 'conversation', 'CONV-1', 1, 1, 1, 1, 0, 1, 0, 2, 0.1, 0.5),
84
+ ('2026-08-10', 'task', 'TASK-1', 1, 1, 1, 1, 0, 1, 0, 2, 0.1, 0.5);
85
+ CREATE TABLE conversation_source (id TEXT PRIMARY KEY, status TEXT);
86
+ INSERT INTO conversation_source VALUES ('CONV-1', 'completed');
87
+ CREATE VIEW zaip_vw_conversations AS SELECT * FROM conversation_source;
88
+ CREATE TABLE task_source (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
89
+ INSERT INTO task_source VALUES ('TASK-1', 'Task title', 'executing', 'high');
90
+ CREATE VIEW zaip_vw_tasks AS SELECT * FROM task_source;
91
+ CREATE VIEW zaip_vw_specs AS SELECT * FROM task_source WHERE 0;
92
+ CREATE VIEW zaip_vw_prds AS SELECT * FROM task_source WHERE 0;
93
+ CREATE VIEW zaip_vw_executions AS SELECT id, status FROM conversation_source WHERE 0;
94
+ `);
95
+ materializeCostGroupDailyProjection(database);
96
+
97
+ expect(
98
+ database
99
+ .prepare(
100
+ "SELECT group_kind, group_value, title, status, risk FROM cost_group_entity_projection ORDER BY group_kind",
101
+ )
102
+ .all(),
103
+ ).toEqual([
104
+ {
105
+ group_kind: "conversation",
106
+ group_value: "CONV-1",
107
+ title: null,
108
+ status: "completed",
109
+ risk: null,
110
+ },
111
+ {
112
+ group_kind: "task",
113
+ group_value: "TASK-1",
114
+ title: "Task title",
115
+ status: "executing",
116
+ risk: "high",
117
+ },
118
+ ]);
119
+ expect(
120
+ database
121
+ .prepare(
122
+ "EXPLAIN QUERY PLAN SELECT status FROM cost_group_entity_projection WHERE group_kind='conversation' AND group_value='CONV-1'",
123
+ )
124
+ .all()
125
+ .map((row) => String((row as { detail: string }).detail)),
126
+ ).toContain(
127
+ "SEARCH cost_group_entity_projection USING INDEX cost_group_entity_projection_lookup (group_kind=? AND group_value=?)",
128
+ );
129
+ });
130
+
131
+ it("matches the canonical grouped source for every persisted entity kind", () => {
132
+ const database = fixture();
133
+ const views: Array<[CostGroupKind, string]> = [
134
+ ["execution", "cost_monitor_executions"],
135
+ ["task", "cost_monitor_tasks"],
136
+ ["conversation", "cost_monitor_conversations"],
137
+ ["spec", "cost_monitor_specs"],
138
+ ["prd", "cost_monitor_prds"],
139
+ ];
140
+ for (const [kind, view] of views) {
141
+ const id = `${kind.toUpperCase()}-1`;
142
+ insertGroup(database, kind, id);
143
+ const physical = readCostGroupPage(database, view, kind, {
144
+ from: "2026-08-01",
145
+ to: "2026-08-26",
146
+ limit: 10,
147
+ });
148
+ const canonical = readCostGroupPage(database, view, kind, {
149
+ from: "2026-08-01",
150
+ to: "2026-08-26",
151
+ query: id,
152
+ limit: 10,
153
+ });
154
+ expect(physical.total_count).toBe(1);
155
+ expect(physical.rows).toEqual(canonical.rows);
156
+ expect(physical.totals).toEqual(canonical.totals);
157
+ }
158
+ });
159
+
160
+ it("keeps complete totals and terminal export pages above 200 rows", () => {
161
+ const database = fixture();
162
+ for (let index = 0; index < 205; index += 1) {
163
+ insertGroup(database, "task", `TASK-${String(index).padStart(3, "0")}`);
164
+ }
165
+ const page = readCostGroupPage(database, "cost_monitor_tasks", "task", {
166
+ from: "2026-08-01",
167
+ to: "2026-08-26",
168
+ offset: 200,
169
+ limit: 200,
170
+ });
171
+ expect(page.total_count).toBe(205);
172
+ expect(page.rows).toHaveLength(5);
173
+ expect(page.has_more).toBe(false);
174
+ expect(page.totals).toMatchObject({ entity_count: 205, invocation_count: 410 });
175
+ });
176
+ });
@@ -0,0 +1,119 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import { type DateOnlyCostPageInput, isDateOnlyCostPage } from "./sqlite-cost-agent-page.js";
3
+
4
+ export type CostGroupKind = "task" | "spec" | "prd" | "execution" | "conversation";
5
+
6
+ type CostGroupPageInput = DateOnlyCostPageInput & {
7
+ offset?: number;
8
+ limit?: number;
9
+ };
10
+
11
+ const entityMetadata = {
12
+ task: { title: "entity.title", status: "entity.status", risk: "entity.risk" },
13
+ spec: { title: "entity.title", status: "entity.status", risk: "entity.risk" },
14
+ prd: { title: "entity.title", status: "entity.status", risk: "entity.risk" },
15
+ execution: {
16
+ title: "grouped.group_value",
17
+ status: "entity.status",
18
+ risk: "NULL",
19
+ },
20
+ conversation: {
21
+ title: "grouped.group_value",
22
+ status: "entity.status",
23
+ risk: "NULL",
24
+ },
25
+ } as const;
26
+
27
+ /** Reads one exact grouped Cost page, preferring the immutable daily projection for date-only input. */
28
+ export function readCostGroupPage(
29
+ database: DatabaseSync,
30
+ view: string,
31
+ groupKind: CostGroupKind,
32
+ input: CostGroupPageInput,
33
+ ) {
34
+ const metadata = entityMetadata[groupKind];
35
+ const clauses = ["group_kind = ?", "group_value IS NOT NULL"];
36
+ const values: Array<string | number> = [groupKind];
37
+ if (input.from) {
38
+ clauses.push("day >= ?");
39
+ values.push(input.from.slice(0, 10));
40
+ }
41
+ if (input.to) {
42
+ clauses.push("day <= ?");
43
+ values.push(input.to.slice(0, 10));
44
+ }
45
+ if (input.query) {
46
+ clauses.push("group_value LIKE ?");
47
+ values.push(`%${input.query}%`);
48
+ }
49
+ const where = clauses.join(" AND ");
50
+ const source = isDateOnlyCostPage(input)
51
+ ? "cost_group_daily_projection"
52
+ : "cost_monitor_group_daily_cache";
53
+ const total_count = Number(
54
+ (
55
+ database
56
+ .prepare(`SELECT COUNT(DISTINCT group_value) AS count FROM ${source} WHERE ${where}`)
57
+ .get(...values) as { count: number }
58
+ ).count,
59
+ );
60
+ // Totals precede LIMIT/OFFSET: a page is only a window into the selected population.
61
+ const totals = database
62
+ .prepare(
63
+ `SELECT COUNT(DISTINCT group_value) AS entity_count,
64
+ COALESCE(SUM(invocation_count), 0) AS invocation_count,
65
+ ROUND(SUM(total_duration)) AS total_duration,
66
+ SUM(total_tokens) AS total_tokens,
67
+ SUM(total_cost_usd) AS total_cost_usd,
68
+ SUM(total_cost_brl) AS total_cost_brl
69
+ FROM ${source}
70
+ WHERE ${where}`,
71
+ )
72
+ .get(...values) as Record<string, unknown>;
73
+ const limit = Math.min(200, Math.max(1, input.limit ?? 50));
74
+ const offset = Math.max(0, input.offset ?? 0);
75
+ const rows = database
76
+ .prepare(
77
+ `WITH grouped AS (
78
+ SELECT group_value, MIN(day) AS first_day, MAX(day) AS last_day,
79
+ SUM(invocation_count) AS invocation_count,
80
+ SUM(llm_call_count) AS llm_call_count,
81
+ SUM(total_duration) AS total_duration,
82
+ SUM(total_input_tokens) AS total_input_tokens,
83
+ SUM(total_cached_input_tokens) AS total_cached_input_tokens,
84
+ SUM(total_output_tokens) AS total_output_tokens,
85
+ SUM(total_reasoning_tokens) AS total_reasoning_tokens,
86
+ SUM(total_tokens) AS total_tokens,
87
+ SUM(total_cost_usd) AS total_cost_usd,
88
+ SUM(total_cost_brl) AS total_cost_brl
89
+ FROM ${source}
90
+ WHERE ${where}
91
+ GROUP BY group_value
92
+ )
93
+ SELECT grouped.group_value AS id, grouped.group_value AS key,
94
+ COALESCE(${metadata.title}, grouped.group_value) AS title,
95
+ ${metadata.status} AS status, ${metadata.risk} AS risk,
96
+ grouped.first_day, grouped.last_day,
97
+ grouped.last_day || 'T12:00:00.000Z' AS occurred_at,
98
+ grouped.invocation_count, grouped.llm_call_count, grouped.total_duration,
99
+ grouped.total_input_tokens, grouped.total_cached_input_tokens,
100
+ grouped.total_output_tokens, grouped.total_reasoning_tokens,
101
+ grouped.total_tokens, grouped.total_cost_usd, grouped.total_cost_brl
102
+ FROM grouped
103
+ LEFT JOIN cost_group_entity_projection entity
104
+ ON entity.group_kind = ? AND entity.group_value = grouped.group_value
105
+ ORDER BY grouped.total_cost_brl DESC, grouped.group_value
106
+ LIMIT ? OFFSET ?`,
107
+ )
108
+ .all(...values, groupKind, limit, offset) as Array<Record<string, unknown>>;
109
+ return {
110
+ data_source: "sqlite_read_model" as const,
111
+ view,
112
+ offset,
113
+ limit,
114
+ total_count,
115
+ has_more: offset + rows.length < total_count,
116
+ totals,
117
+ rows,
118
+ };
119
+ }
@@ -0,0 +1,41 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+
3
+ /** Freezes legacy Cost facts and their entity labels once for fast date-only pages. */
4
+ export function materializeCostGroupDailyProjection(database: DatabaseSync): void {
5
+ database.exec(`
6
+ CREATE TABLE cost_group_daily_projection AS SELECT * FROM zaip_vw_cost_monitor_group_daily_cache;
7
+ CREATE INDEX cost_group_daily_projection_lookup ON cost_group_daily_projection(group_kind, day, group_value);
8
+
9
+ -- The public entity views expand canonical records and activities. Reading
10
+ -- them for every grouped page was the remaining multi-second cost, most
11
+ -- visibly for conversations. Persist exactly the three presentation fields
12
+ -- the old LEFT JOIN supplied, keyed by the already-materialized population.
13
+ CREATE TABLE cost_group_entity_projection AS
14
+ SELECT 'task' AS group_kind, groups.group_value, entity.title, entity.status, entity.risk
15
+ FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
16
+ WHERE group_kind = 'task' AND group_value IS NOT NULL) groups
17
+ LEFT JOIN zaip_vw_tasks entity ON entity.id = groups.group_value
18
+ UNION ALL
19
+ SELECT 'spec', groups.group_value, entity.title, entity.status, entity.risk
20
+ FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
21
+ WHERE group_kind = 'spec' AND group_value IS NOT NULL) groups
22
+ LEFT JOIN zaip_vw_specs entity ON entity.id = groups.group_value
23
+ UNION ALL
24
+ SELECT 'prd', groups.group_value, entity.title, entity.status, entity.risk
25
+ FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
26
+ WHERE group_kind = 'prd' AND group_value IS NOT NULL) groups
27
+ LEFT JOIN zaip_vw_prds entity ON entity.id = groups.group_value
28
+ UNION ALL
29
+ SELECT 'execution', groups.group_value, NULL, entity.status, NULL
30
+ FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
31
+ WHERE group_kind = 'execution' AND group_value IS NOT NULL) groups
32
+ LEFT JOIN zaip_vw_executions entity ON entity.id = groups.group_value
33
+ UNION ALL
34
+ SELECT 'conversation', groups.group_value, NULL, entity.status, NULL
35
+ FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
36
+ WHERE group_kind = 'conversation' AND group_value IS NOT NULL) groups
37
+ LEFT JOIN zaip_vw_conversations entity ON entity.id = groups.group_value;
38
+ CREATE UNIQUE INDEX cost_group_entity_projection_lookup
39
+ ON cost_group_entity_projection(group_kind, group_value);
40
+ `);
41
+ }
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { filterCostInvocationProjection } from "./sqlite-cost-invocation-page.js";
3
+
4
+ describe("cost invocation projection page", () => {
5
+ it("uses the Sao Paulo source day for the fast date-only page", () => {
6
+ const rows = [
7
+ { agent_invocation_id: "before", source_started_at: "2026-08-01T02:30:00.000Z" },
8
+ { agent_invocation_id: "inside", source_started_at: "2026-08-01T03:30:00.000Z" },
9
+ ];
10
+ expect(
11
+ filterCostInvocationProjection(rows, { from: "2026-08-01", to: "2026-08-01" }).map(
12
+ (row) => row.agent_invocation_id,
13
+ ),
14
+ ).toEqual(["inside"]);
15
+ });
16
+ });
@@ -0,0 +1,29 @@
1
+ type CostInvocationDateFilter = { from?: string | null; to?: string | null };
2
+
3
+ function costDay(value: string | null | undefined): string | null {
4
+ if (!value) return null;
5
+ if (/^\d{4}-\d{2}-\d{2}$/.test(value)) return value;
6
+ const date = new Date(value);
7
+ if (Number.isNaN(date.valueOf())) return null;
8
+ const values = new Intl.DateTimeFormat("en-CA", {
9
+ timeZone: "America/Sao_Paulo",
10
+ year: "numeric",
11
+ month: "2-digit",
12
+ day: "2-digit",
13
+ }).formatToParts(date);
14
+ return `${values.find((part) => part.type === "year")?.value}-${values.find((part) => part.type === "month")?.value}-${values.find((part) => part.type === "day")?.value}`;
15
+ }
16
+
17
+ /** Filters the rebuild-time invocation projection without expanding its costly view. */
18
+ export function filterCostInvocationProjection(
19
+ rows: Array<Record<string, unknown>>,
20
+ input: CostInvocationDateFilter,
21
+ ) {
22
+ const from = costDay(input.from);
23
+ const to = costDay(input.to);
24
+ return rows.filter((row) => {
25
+ const timestamp = row.source_started_at ?? row.source_occurred_at ?? row.occurred_at;
26
+ const day = typeof timestamp === "string" ? costDay(timestamp) : null;
27
+ return day !== null && (from === null || day >= from) && (to === null || day <= to);
28
+ });
29
+ }