@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,355 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import { measureFirstFoldQuery } from "./sqlite-first-fold-timing.js";
3
+ import type {
4
+ SqliteFirstFoldAllTime,
5
+ SqliteFirstFoldAllTimeBoard,
6
+ SqliteFirstFoldMonthlyQuick,
7
+ SqliteFirstFoldViewport,
8
+ } from "./sqlite-read-model.js";
9
+
10
+ const number = (value: unknown, fallback = 0) => (typeof value === "number" ? value : fallback);
11
+ const nullableNumber = (value: unknown) => (typeof value === "number" ? value : null);
12
+
13
+ function persisted<T>(database: DatabaseSync, payloadType: string): T | null {
14
+ const row = database
15
+ .prepare(
16
+ "SELECT payload_json FROM zaip_aios_activities WHERE payload_type=? ORDER BY recorded_at DESC LIMIT 1",
17
+ )
18
+ .get(payloadType) as { payload_json?: string } | undefined;
19
+ if (typeof row?.payload_json !== "string") return null;
20
+ try {
21
+ return JSON.parse(row.payload_json) as T;
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ export function readFirstFoldAllTime(
28
+ database: DatabaseSync,
29
+ dailyAggregateCount: () => number,
30
+ viewport?: SqliteFirstFoldViewport,
31
+ ): SqliteFirstFoldAllTime {
32
+ const cached = persisted<SqliteFirstFoldAllTime>(database, "first_fold_all_time_cache");
33
+ if (cached !== null) return cached;
34
+ const timed = <T>(phase: string, action: () => T) => measureFirstFoldQuery(phase, action);
35
+ const row =
36
+ viewport === undefined
37
+ ? (database.prepare("SELECT * FROM zaip_vw_first_fold_overview_all_time").get() as Record<
38
+ string,
39
+ unknown
40
+ >)
41
+ : null;
42
+ const statusRows =
43
+ viewport === undefined
44
+ ? (database
45
+ .prepare("SELECT status, task_count FROM zaip_vw_first_fold_task_status_all_time")
46
+ .all() as Array<{ status: string; task_count: number }>)
47
+ : null;
48
+ const riskRows =
49
+ viewport === undefined
50
+ ? (database
51
+ .prepare("SELECT risk, task_count FROM zaip_vw_first_fold_task_risk_all_time")
52
+ .all() as Array<{ risk: string; task_count: number }>)
53
+ : null;
54
+ const topTasks = timed(
55
+ "first_fold_all_time_top_tasks",
56
+ () =>
57
+ database
58
+ .prepare("SELECT * FROM zaip_vw_first_fold_top_tasks_all_time ORDER BY rank")
59
+ .all() as SqliteFirstFoldAllTime["top_tasks"],
60
+ );
61
+ const readMacroMetrics = (kind: "spec" | "prd") => {
62
+ const statuses = timed(
63
+ `first_fold_${kind}_status`,
64
+ () =>
65
+ database
66
+ .prepare(`SELECT stage, entity_count FROM zaip_vw_first_fold_${kind}_status_all_time`)
67
+ .all() as Array<{ stage: string; entity_count: number }>,
68
+ );
69
+ const classifications = timed(
70
+ `first_fold_${kind}_classification`,
71
+ () =>
72
+ database
73
+ .prepare(
74
+ `SELECT classification, entity_count FROM zaip_vw_first_fold_${kind}_classification_all_time`,
75
+ )
76
+ .all() as Array<{ classification: string; entity_count: number }>,
77
+ );
78
+ const macro = timed(
79
+ `first_fold_${kind}_metrics`,
80
+ () =>
81
+ database
82
+ .prepare(`SELECT * FROM zaip_vw_first_fold_${kind}_metrics_all_time`)
83
+ .get() as Record<string, unknown>,
84
+ );
85
+ const topEntities = timed(
86
+ `first_fold_${kind}_top_entities`,
87
+ () =>
88
+ database
89
+ .prepare(`SELECT * FROM zaip_vw_first_fold_top_${kind}s_all_time ORDER BY rank`)
90
+ .all() as SqliteFirstFoldAllTime["macro_metrics"]["specs"]["top_entities"],
91
+ );
92
+ return {
93
+ status_counts: Object.fromEntries(
94
+ statuses.map((status) => [status.stage, Number(status.entity_count)]),
95
+ ),
96
+ classification_counts: Object.fromEntries(
97
+ classifications.map((item) => [item.classification, Number(item.entity_count)]),
98
+ ),
99
+ entity_count: number(macro.entity_count),
100
+ total_run_count: number(macro.total_run_count),
101
+ total_duration_ms: nullableNumber(macro.total_duration_ms),
102
+ total_tokens: nullableNumber(macro.total_tokens),
103
+ total_cost_usd: nullableNumber(macro.total_cost_usd),
104
+ total_cost_brl: nullableNumber(macro.total_cost_brl),
105
+ average_duration_ms: nullableNumber(macro.average_duration_ms),
106
+ average_tokens: nullableNumber(macro.average_tokens),
107
+ average_cost_usd: nullableNumber(macro.average_cost_usd),
108
+ average_cost_brl: nullableNumber(macro.average_cost_brl),
109
+ latest_created_at:
110
+ typeof macro.latest_created_at === "string" ? macro.latest_created_at : null,
111
+ top_entities: topEntities,
112
+ };
113
+ };
114
+ return {
115
+ aggregate: viewport?.aggregate ?? {
116
+ days:
117
+ typeof row?.start_day === "string" && typeof row.end_day === "string"
118
+ ? dailyAggregateCount()
119
+ : 0,
120
+ start_day: typeof row?.start_day === "string" ? row.start_day : null,
121
+ end_day: typeof row?.end_day === "string" ? row.end_day : null,
122
+ task_count: number(row?.task_count),
123
+ completed_task_count: number(row?.completed_task_count),
124
+ spec_count: number(row?.spec_count),
125
+ completed_spec_count: number(row?.completed_spec_count),
126
+ prd_count: number(row?.prd_count),
127
+ completed_prd_count: number(row?.completed_prd_count),
128
+ total_run_count: number(row?.total_run_count),
129
+ agent_invocation_count: number(row?.agent_invocation_count),
130
+ llm_call_count: nullableNumber(row?.llm_call_count),
131
+ duration_ms: nullableNumber(row?.total_duration_ms),
132
+ total_tokens: nullableNumber(row?.total_tokens),
133
+ total_cost_usd: nullableNumber(row?.total_cost_usd),
134
+ cost_brl: nullableNumber(row?.total_cost_brl),
135
+ execution_day_count: number(row?.execution_day_count),
136
+ latest_task_created_at:
137
+ typeof row?.latest_task_created_at === "string" ? row.latest_task_created_at : null,
138
+ },
139
+ task_status_counts:
140
+ viewport?.task_status_counts ??
141
+ Object.fromEntries(
142
+ statusRows?.map((status) => [status.status, Number(status.task_count)]) ?? [],
143
+ ),
144
+ task_risk_counts:
145
+ viewport?.task_risk_counts ??
146
+ Object.fromEntries(riskRows?.map((risk) => [risk.risk, Number(risk.task_count)]) ?? []),
147
+ task_metrics: viewport
148
+ ? {
149
+ average_duration_ms_per_task:
150
+ viewport.aggregate.task_count === 0 || viewport.aggregate.duration_ms === null
151
+ ? null
152
+ : viewport.aggregate.duration_ms / viewport.aggregate.task_count,
153
+ average_tokens_per_task:
154
+ viewport.aggregate.task_count === 0 || viewport.aggregate.total_tokens === null
155
+ ? null
156
+ : viewport.aggregate.total_tokens / viewport.aggregate.task_count,
157
+ average_cost_usd_per_task:
158
+ viewport.aggregate.task_count === 0 || viewport.aggregate.total_cost_usd === null
159
+ ? null
160
+ : viewport.aggregate.total_cost_usd / viewport.aggregate.task_count,
161
+ average_cost_brl_per_task:
162
+ viewport.aggregate.task_count === 0 || viewport.aggregate.cost_brl === null
163
+ ? null
164
+ : viewport.aggregate.cost_brl / viewport.aggregate.task_count,
165
+ latest_task_created_at: viewport.aggregate.latest_task_created_at,
166
+ }
167
+ : (() => {
168
+ const metrics = database
169
+ .prepare("SELECT * FROM zaip_vw_first_fold_task_metrics_all_time")
170
+ .get() as Record<string, unknown>;
171
+ return {
172
+ average_duration_ms_per_task: nullableNumber(metrics.average_duration_ms_per_task),
173
+ average_tokens_per_task: nullableNumber(metrics.average_tokens_per_task),
174
+ average_cost_usd_per_task: nullableNumber(metrics.average_cost_usd_per_task),
175
+ average_cost_brl_per_task: nullableNumber(metrics.average_cost_brl_per_task),
176
+ latest_task_created_at:
177
+ typeof metrics.latest_task_created_at === "string"
178
+ ? metrics.latest_task_created_at
179
+ : null,
180
+ };
181
+ })(),
182
+ top_tasks: topTasks,
183
+ macro_metrics: { specs: readMacroMetrics("spec"), prds: readMacroMetrics("prd") },
184
+ };
185
+ }
186
+
187
+ export function readFirstFoldViewport(
188
+ database: DatabaseSync,
189
+ timings: Record<string, number>,
190
+ ): SqliteFirstFoldViewport {
191
+ const cached = persisted<SqliteFirstFoldViewport>(database, "first_fold_viewport_cache");
192
+ if (cached !== null) return cached;
193
+ const startedAt = performance.now();
194
+ const row = database
195
+ .prepare(`WITH totals AS (
196
+ SELECT SUM(CASE WHEN activity_source_kind='agent_run' THEN 1 ELSE 0 END) AS agent_invocation_count,
197
+ SUM(llm_call_count) AS llm_call_count, SUM(total_tokens) AS total_tokens,
198
+ SUM(cost_usd) AS total_cost_usd, SUM(cost_brl) AS total_cost_brl FROM activities
199
+ ), run_totals AS (SELECT COUNT(*) AS total_run_count FROM canonical_run_index),
200
+ duration_totals AS (
201
+ SELECT ROUND(SUM(attributed_token_active_ms)) AS total_duration_ms,
202
+ COUNT(DISTINCT occurred_day_sp) AS execution_day_count FROM attributed_token_active_facts
203
+ ), bounds AS (
204
+ SELECT MIN(day) AS start_day, MAX(day) AS end_day, COUNT(*) AS day_count FROM (
205
+ SELECT occurred_day_sp AS day FROM activities UNION SELECT occurred_day_sp AS day FROM canonical_work_items
206
+ UNION SELECT occurred_day_sp AS day FROM canonical_artifacts)
207
+ ), canonical_items AS MATERIALIZED (
208
+ SELECT json_extract(payload_json, '$.entity_kind') AS entity_kind,
209
+ json_extract(payload_json, '$.id') AS id, json_extract(payload_json, '$.status') AS status,
210
+ json_extract(payload_json, '$.risk') AS risk, json_extract(payload_json, '$.occurred_at') AS occurred_at
211
+ FROM zaip_aios_activities WHERE payload_type='work_item'
212
+ ), items AS MATERIALIZED (
213
+ SELECT entity_kind, id, status, risk, occurred_at FROM canonical_items
214
+ UNION ALL SELECT 'task', a.task_id, MAX(a.work_item_status), MAX(a.risk), MIN(a.occurred_at)
215
+ FROM zaip_aios_activities a WHERE a.payload_type IS NULL AND a.task_id IS NOT NULL
216
+ AND NOT EXISTS (SELECT 1 FROM canonical_items c WHERE c.entity_kind='task' AND c.id=a.task_id) GROUP BY task_id
217
+ UNION ALL SELECT 'spec', a.spec_id, MAX(a.work_item_status), MAX(a.risk), MIN(a.occurred_at)
218
+ FROM zaip_aios_activities a WHERE a.payload_type IS NULL AND a.spec_id IS NOT NULL
219
+ AND NOT EXISTS (SELECT 1 FROM canonical_items c WHERE c.entity_kind='spec' AND c.id=a.spec_id) GROUP BY spec_id
220
+ UNION ALL SELECT 'prd', a.prd_id, MAX(a.work_item_status), MAX(a.risk), MIN(a.occurred_at)
221
+ FROM zaip_aios_activities a WHERE a.payload_type IS NULL AND a.prd_id IS NOT NULL
222
+ AND NOT EXISTS (SELECT 1 FROM canonical_items c WHERE c.entity_kind='prd' AND c.id=a.prd_id) GROUP BY prd_id
223
+ ), item_totals AS (
224
+ SELECT SUM(entity_kind='task') AS task_count,
225
+ SUM(entity_kind='task' AND status='completed') AS completed_task_count,
226
+ MAX(CASE WHEN entity_kind='task' THEN occurred_at END) AS latest_task_created_at,
227
+ SUM(entity_kind='spec') AS spec_count, SUM(entity_kind='spec' AND status IN ('completed','delivered')) AS completed_spec_count,
228
+ SUM(entity_kind='prd') AS prd_count, SUM(entity_kind='prd' AND status IN ('completed','delivered')) AS completed_prd_count FROM items
229
+ ), task_status AS (
230
+ SELECT json_group_object(status, task_count) AS task_status_json FROM (
231
+ SELECT COALESCE(status, 'draft') AS status, COUNT(*) AS task_count FROM items WHERE entity_kind='task' GROUP BY COALESCE(status, 'draft'))
232
+ ), task_risk AS (
233
+ SELECT json_group_object(risk, task_count) AS task_risk_json FROM (
234
+ SELECT COALESCE(risk, 'standard') AS risk, COUNT(*) AS task_count FROM items WHERE entity_kind='task' GROUP BY COALESCE(risk, 'standard'))
235
+ )
236
+ SELECT totals.*, run_totals.*, duration_totals.*, bounds.*, item_totals.*, task_status.*, task_risk.*
237
+ FROM totals CROSS JOIN run_totals CROSS JOIN duration_totals CROSS JOIN bounds
238
+ CROSS JOIN item_totals CROSS JOIN task_status CROSS JOIN task_risk`)
239
+ .get() as Record<string, unknown>;
240
+ if (process.env.ZAIP_DASHBOARD_PROFILE_FIRST_FOLD === "1") {
241
+ timings.viewport_overview = Math.round((performance.now() - startedAt) * 10) / 10;
242
+ console.info(
243
+ JSON.stringify({
244
+ event: "dashboard_first_fold_select",
245
+ select: "viewport_overview",
246
+ elapsed_ms: timings.viewport_overview,
247
+ }),
248
+ );
249
+ }
250
+ return {
251
+ aggregate: {
252
+ days: number(row.day_count),
253
+ start_day: typeof row.start_day === "string" ? row.start_day : null,
254
+ end_day: typeof row.end_day === "string" ? row.end_day : null,
255
+ task_count: number(row.task_count),
256
+ completed_task_count: number(row.completed_task_count),
257
+ spec_count: number(row.spec_count),
258
+ completed_spec_count: number(row.completed_spec_count),
259
+ prd_count: number(row.prd_count),
260
+ completed_prd_count: number(row.completed_prd_count),
261
+ total_run_count: number(row.total_run_count),
262
+ agent_invocation_count: number(row.agent_invocation_count),
263
+ llm_call_count: nullableNumber(row.llm_call_count),
264
+ duration_ms: nullableNumber(row.total_duration_ms),
265
+ total_tokens: nullableNumber(row.total_tokens),
266
+ total_cost_usd: nullableNumber(row.total_cost_usd),
267
+ cost_brl: nullableNumber(row.total_cost_brl),
268
+ execution_day_count: number(row.execution_day_count),
269
+ latest_task_created_at:
270
+ typeof row.latest_task_created_at === "string" ? row.latest_task_created_at : null,
271
+ },
272
+ task_status_counts:
273
+ typeof row.task_status_json === "string" ? JSON.parse(row.task_status_json) : {},
274
+ task_risk_counts: typeof row.task_risk_json === "string" ? JSON.parse(row.task_risk_json) : {},
275
+ };
276
+ }
277
+
278
+ export function readFirstFoldBoardAllTime(
279
+ database: DatabaseSync,
280
+ fallback: () => SqliteFirstFoldAllTimeBoard,
281
+ ): SqliteFirstFoldAllTimeBoard {
282
+ return (
283
+ persisted<SqliteFirstFoldAllTimeBoard>(database, "first_fold_all_time_board_cache") ??
284
+ fallback()
285
+ );
286
+ }
287
+
288
+ export function readFirstFoldTopTasksAllTime(
289
+ database: DatabaseSync,
290
+ ): SqliteFirstFoldAllTime["top_tasks"] {
291
+ return database
292
+ .prepare("SELECT * FROM zaip_vw_first_fold_top_tasks_all_time ORDER BY rank")
293
+ .all() as SqliteFirstFoldAllTime["top_tasks"];
294
+ }
295
+
296
+ export function readFirstFoldMonthlyQuick(
297
+ database: DatabaseSync,
298
+ existing: SqliteFirstFoldMonthlyQuick | null | undefined,
299
+ filter: { from: string | null; to: string | null },
300
+ ): { cache: SqliteFirstFoldMonthlyQuick | null; result: SqliteFirstFoldMonthlyQuick | null } {
301
+ let cache = existing;
302
+ if (cache === undefined) {
303
+ const candidate = persisted<Partial<SqliteFirstFoldMonthlyQuick>>(
304
+ database,
305
+ "first_fold_monthly_quick_cache",
306
+ );
307
+ cache =
308
+ candidate !== null &&
309
+ typeof candidate.from_day === "string" &&
310
+ typeof candidate.to_day === "string" &&
311
+ candidate.aggregate !== undefined &&
312
+ candidate.pages !== undefined &&
313
+ Array.isArray(candidate.top_tasks)
314
+ ? (candidate as SqliteFirstFoldMonthlyQuick)
315
+ : null;
316
+ }
317
+ if (cache === null) return { cache, result: null };
318
+ const from = filter.from?.slice(0, 10) ?? null;
319
+ const to = filter.to?.slice(0, 10) ?? null;
320
+ const exactRange = from === cache.from_day && to === cache.to_day;
321
+ const sameMonthLaterDay =
322
+ from === cache.from_day &&
323
+ to !== null &&
324
+ to > cache.to_day &&
325
+ to.slice(0, 7) === cache.from_day.slice(0, 7);
326
+ const noUncoveredFacts =
327
+ cache.source_latest_day === null || cache.source_latest_day <= cache.to_day;
328
+ if (exactRange || (sameMonthLaterDay && noUncoveredFacts)) return { cache, result: cache };
329
+ const latestMonth =
330
+ cache.source_latest_day === null
331
+ ? cache.from_day.slice(0, 7)
332
+ : cache.source_latest_day.slice(0, 7);
333
+ if (from === null || to === null || from.slice(0, 7) <= latestMonth)
334
+ return { cache, result: null };
335
+ return {
336
+ cache,
337
+ result: {
338
+ from_day: from,
339
+ to_day: to,
340
+ source_latest_day: cache.source_latest_day,
341
+ aggregate: {
342
+ days: 0,
343
+ total_run_count: 0,
344
+ agent_invocation_count: 0,
345
+ llm_call_count: null,
346
+ duration_ms: null,
347
+ total_tokens: null,
348
+ cost_brl: null,
349
+ execution_day_count: 0,
350
+ },
351
+ pages: { task: [], spec: [], prd: [] },
352
+ top_tasks: [],
353
+ },
354
+ };
355
+ }
@@ -0,0 +1,121 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { DatabaseSync } from "node:sqlite";
3
+
4
+ const technicalPayloads = [
5
+ ["first_fold_viewport_cache", "first_fold_viewport_cache:all_time"],
6
+ ["first_fold_all_time_cache", "first_fold_all_time_cache:all_time"],
7
+ ["first_fold_all_time_board_cache", "first_fold_all_time_board_cache:all_time"],
8
+ ["cost_monitor_summary_cache", "cost_monitor_summary_cache:all_time"],
9
+ ["cost_monitor_summary_month_cache", "cost_monitor_summary_month_cache:current"],
10
+ ["first_fold_monthly_quick_cache", "first_fold_monthly_quick_cache:default"],
11
+ ] as const;
12
+
13
+ export type FirstFoldPayloads = Record<(typeof technicalPayloads)[number][0], string>;
14
+
15
+ type BoardPayload = { pages?: Record<string, unknown>; from_day?: unknown; to_day?: unknown };
16
+
17
+ function readPayload(database: DatabaseSync, payloadType: string): BoardPayload | null {
18
+ const row = database
19
+ .prepare(
20
+ "SELECT payload_json FROM zaip_aios_activities WHERE payload_type=? ORDER BY recorded_at DESC LIMIT 1",
21
+ )
22
+ .get(payloadType) as { payload_json?: string } | undefined;
23
+ if (typeof row?.payload_json !== "string") return null;
24
+ try {
25
+ const payload = JSON.parse(row.payload_json) as unknown;
26
+ return payload !== null && typeof payload === "object" ? (payload as BoardPayload) : null;
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+
32
+ function exactWorkPageCounts(database: DatabaseSync, from?: string, to?: string) {
33
+ // Technical payload rows are recorded when the snapshot is built, so the
34
+ // table-level occurred_day_sp describes the rebuild day. Monthly eligibility
35
+ // must use the canonical work item's own day persisted inside payload_json;
36
+ // otherwise every historical item appears to belong to the rebuild month and
37
+ // a complete immutable seed is rejected on every launcher start.
38
+ const canonicalDay = "json_extract(payload_json, '$.occurred_day_sp')";
39
+ const where = from && to ? ` AND ${canonicalDay} >= ? AND ${canonicalDay} <= ?` : "";
40
+ const rows = database
41
+ .prepare(
42
+ `SELECT json_extract(payload_json, '$.entity_kind') AS kind, COUNT(*) AS count
43
+ FROM zaip_aios_activities WHERE payload_type='work_item'${where} GROUP BY kind`,
44
+ )
45
+ .all(...(from && to ? [from, to] : [])) as Array<{ kind: string; count: number }>;
46
+ return Object.fromEntries(rows.map((row) => [row.kind, Number(row.count)]));
47
+ }
48
+
49
+ function matchesWorkPopulation(
50
+ database: DatabaseSync,
51
+ payload: BoardPayload,
52
+ monthly = false,
53
+ ): boolean {
54
+ const from = typeof payload.from_day === "string" ? payload.from_day : undefined;
55
+ const to = typeof payload.to_day === "string" ? payload.to_day : undefined;
56
+ if (monthly && (!from || !to)) return false;
57
+ const expected = exactWorkPageCounts(
58
+ database,
59
+ monthly ? from : undefined,
60
+ monthly ? to : undefined,
61
+ );
62
+ return ["task", "spec", "prd"].every(
63
+ (kind) =>
64
+ Array.isArray(payload.pages?.[kind]) &&
65
+ payload.pages?.[kind].length === (expected[kind] ?? 0),
66
+ );
67
+ }
68
+
69
+ /** A seed is eligible only after every first-fold payload has been committed. */
70
+ export function hasRequiredFirstFoldPayloads(database: DatabaseSync): boolean {
71
+ const count = Number(
72
+ (
73
+ database
74
+ .prepare(
75
+ `SELECT COUNT(DISTINCT payload_type) AS count FROM zaip_aios_activities
76
+ WHERE payload_type IN (${technicalPayloads.map(() => "?").join(", ")})`,
77
+ )
78
+ .get(...technicalPayloads.map(([payloadType]) => payloadType)) as { count?: number }
79
+ ).count ?? 0,
80
+ );
81
+ if (count !== technicalPayloads.length) return false;
82
+ const allTime = readPayload(database, "first_fold_all_time_board_cache");
83
+ const monthly = readPayload(database, "first_fold_monthly_quick_cache");
84
+ return (
85
+ allTime !== null &&
86
+ monthly !== null &&
87
+ matchesWorkPopulation(database, allTime) &&
88
+ matchesWorkPopulation(database, monthly, true)
89
+ );
90
+ }
91
+
92
+ export function persistFirstFoldPayloads(
93
+ paths: readonly string[],
94
+ payloads: FirstFoldPayloads,
95
+ ): void {
96
+ for (const path of paths) {
97
+ const database = new DatabaseSync(path);
98
+ try {
99
+ const insert = database.prepare(`INSERT INTO zaip_aios_activities(
100
+ activity_row_id, activity_source_kind, activity_key, source_path, source_hash,
101
+ recorded_at, run_role, root_run_id, payload_type, payload_json
102
+ ) VALUES (?, 'technical_payload', ?, ?, '', datetime('now'), 'technical', 'technical', ?, ?)`);
103
+ database.exec("BEGIN;");
104
+ for (const [payloadType, key] of technicalPayloads) {
105
+ insert.run(
106
+ `TECH-${randomUUID().toLowerCase()}`,
107
+ key,
108
+ `sqlite://${payloadType}/${key.split(":")[1]}`,
109
+ payloadType,
110
+ payloads[payloadType],
111
+ );
112
+ }
113
+ database.exec("COMMIT;");
114
+ } catch (error) {
115
+ database.exec("ROLLBACK;");
116
+ throw error;
117
+ } finally {
118
+ database.close();
119
+ }
120
+ }
121
+ }
@@ -0,0 +1,27 @@
1
+ export function measureFirstFold<T>(
2
+ enabled: boolean,
3
+ report: (phase: string, percent: number, detail: string) => void,
4
+ phase: string,
5
+ action: () => T,
6
+ ): T {
7
+ const startedAt = performance.now();
8
+ const result = action();
9
+ if (enabled) {
10
+ const elapsedMs = Math.round(performance.now() - startedAt);
11
+ report(phase, 82, `${phase}: ${elapsedMs}ms.`);
12
+ process.stderr.write(
13
+ `${JSON.stringify({ event: "dashboard_sqlite_first_fold", phase, elapsed_ms: elapsedMs })}\n`,
14
+ );
15
+ }
16
+ return result;
17
+ }
18
+
19
+ export function measureFirstFoldQuery<T>(phase: string, action: () => T): T {
20
+ const startedAt = performance.now();
21
+ const result = action();
22
+ if (process.env.ZAIP_DASHBOARD_LAUNCH_PROGRESS === "1")
23
+ process.stderr.write(
24
+ `${JSON.stringify({ event: "dashboard_sqlite_first_fold_query", phase, elapsed_ms: Math.round(performance.now() - startedAt) })}\n`,
25
+ );
26
+ return result;
27
+ }
@@ -110,7 +110,14 @@ export const SQLITE_VIEW_CONTRACTS = [
110
110
  ],
111
111
  ["cost_monitor_zaip_agents", "cost-monitor", canonicalRunMetrics, "agent totals", "offset", xlsx],
112
112
  ["cost_monitor_models", "cost-monitor", canonicalRunMetrics, "model totals", "offset", xlsx],
113
- ["cost_monitor_providers", "cost-monitor", canonicalRunMetrics, "provider totals", "offset", xlsx],
113
+ [
114
+ "cost_monitor_providers",
115
+ "cost-monitor",
116
+ canonicalRunMetrics,
117
+ "provider totals",
118
+ "offset",
119
+ xlsx,
120
+ ],
114
121
  ["cost_monitor_tasks", "cost-monitor", canonicalRunMetrics, "task totals", "offset", xlsx],
115
122
  ["cost_monitor_specs", "cost-monitor", canonicalRunMetrics, "SPEC totals", "offset", xlsx],
116
123
  ["cost_monitor_prds", "cost-monitor", canonicalRunMetrics, "PRD totals", "offset", xlsx],
@@ -171,7 +178,14 @@ export const SQLITE_VIEW_CONTRACTS = [
171
178
  "offset",
172
179
  xlsx,
173
180
  ],
174
- ["operations_daily", "operations", canonicalRunMetrics, "daily operations totals", "offset", xlsx],
181
+ [
182
+ "operations_daily",
183
+ "operations",
184
+ canonicalRunMetrics,
185
+ "daily operations totals",
186
+ "offset",
187
+ xlsx,
188
+ ],
175
189
  [
176
190
  "operations_monthly",
177
191
  "operations",
@@ -0,0 +1,15 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+
3
+ /** Persists the exact canonical Board summary so runtime pages never re-expand its lineage CTE. */
4
+ export function materializeOperationsWorkProjection(database: DatabaseSync): void {
5
+ database.exec(`
6
+ CREATE TABLE operations_work_projection AS
7
+ SELECT summary.*, canonical.stage, canonical.spec_id,
8
+ COALESCE(canonical.change_id, (SELECT change.id FROM canonical_changes change, json_each(change.task_ids_json) task WHERE task.value=canonical.id ORDER BY change.created_at DESC, change.id DESC LIMIT 1)) AS change_id,
9
+ (SELECT change.source_type FROM canonical_changes change WHERE change.id=COALESCE(canonical.change_id, (SELECT fallback.id FROM canonical_changes fallback, json_each(fallback.task_ids_json) task WHERE task.value=canonical.id ORDER BY fallback.created_at DESC, fallback.id DESC LIMIT 1))) AS origin,
10
+ CASE WHEN canonical.entity_kind='task' THEN CASE WHEN canonical.spec_id IS NOT NULL OR COALESCE((SELECT change.source_type FROM canonical_changes change WHERE change.id=COALESCE(canonical.change_id, (SELECT fallback.id FROM canonical_changes fallback, json_each(fallback.task_ids_json) task WHERE task.value=canonical.id ORDER BY fallback.created_at DESC, fallback.id DESC LIMIT 1))) IN ('spec','prd'), 0) THEN 'task' ELSE 'standalone-task' END ELSE canonical.entity_kind END AS kind
11
+ FROM zaip_vw_operations_work_kanban summary
12
+ JOIN canonical_work_items canonical ON canonical.entity_kind=summary.entity_kind AND canonical.id=summary.id;
13
+ CREATE INDEX operations_work_projection_order ON operations_work_projection(occurred_at DESC, id DESC);
14
+ `);
15
+ }