@zaip-ai/cli 1.0.7 → 1.0.8

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 (410) hide show
  1. package/README.md +6 -4
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.d.ts.map +1 -1
  4. package/dist/services/adapters.js +15 -5
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/adapters.test.js +1 -1
  7. package/dist/services/agent-adapters.d.ts +9 -0
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +38 -3
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +8 -1
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.d.ts +2 -1
  14. package/dist/services/codex-config-template.d.ts.map +1 -1
  15. package/dist/services/codex-config-template.js +13 -2
  16. package/dist/services/codex-config-template.js.map +1 -1
  17. package/dist/services/codex-rules.d.ts +1 -1
  18. package/dist/services/codex-rules.d.ts.map +1 -1
  19. package/dist/services/codex-rules.js +31 -7
  20. package/dist/services/codex-rules.js.map +1 -1
  21. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  22. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  23. package/dist/services/codex-subagent-hook-template.js +4 -1
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/doctor.d.ts.map +1 -1
  26. package/dist/services/doctor.js +3 -1
  27. package/dist/services/doctor.js.map +1 -1
  28. package/dist/services/global-codex-config.d.ts +6 -3
  29. package/dist/services/global-codex-config.d.ts.map +1 -1
  30. package/dist/services/global-codex-config.js +82 -13
  31. package/dist/services/global-codex-config.js.map +1 -1
  32. package/dist/services/global-codex-config.test.js +57 -10
  33. package/dist/services/global-codex-config.test.js.map +1 -1
  34. package/dist/services/install-agents-template.d.ts.map +1 -1
  35. package/dist/services/install-agents-template.js +15 -2
  36. package/dist/services/install-agents-template.js.map +1 -1
  37. package/dist/services/logger.js +1 -1
  38. package/dist/services/logger.js.map +1 -1
  39. package/dist/services/logger.test.js +3 -3
  40. package/dist/services/logger.test.js.map +1 -1
  41. package/dist/services/runtime-template.test.js +21 -5
  42. package/dist/services/runtime-template.test.js.map +1 -1
  43. package/dist/services/template-manifest.d.ts.map +1 -1
  44. package/dist/services/template-manifest.js +2 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/config/agents/catalog.yaml +310 -10
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  57. package/templates/.agents/config/project.yaml +1 -1
  58. package/templates/.agents/dashboard/.zaip-managed.json +659 -163
  59. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  60. package/templates/.agents/dashboard/README.md +48 -97
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
  63. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
  64. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  79. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  80. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
  81. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  89. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
  94. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  102. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  111. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  114. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  116. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
  118. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  120. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  121. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  122. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
  130. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
  131. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  132. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  133. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  177. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  178. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
  179. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  180. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  181. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  182. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  183. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
  184. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  185. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  186. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  187. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  188. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  189. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
  190. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
  195. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  196. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  197. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  198. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  199. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
  200. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  201. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
  202. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
  203. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
  204. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  205. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
  206. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  207. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
  208. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
  209. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
  210. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  211. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  212. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  213. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  214. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  215. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
  217. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
  219. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  220. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  221. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
  222. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  223. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
  232. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  233. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  234. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  235. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  238. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
  239. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
  240. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  241. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  242. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  243. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  244. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  245. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  246. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  247. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
  248. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
  249. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  250. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  251. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  252. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  253. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  255. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
  256. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  257. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  258. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  259. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  260. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  261. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  262. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  263. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  264. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  265. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  266. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  267. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
  269. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  270. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
  271. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
  277. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  278. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  279. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  281. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
  282. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  283. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  284. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
  286. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  288. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  290. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  291. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  292. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
  302. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  307. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  308. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
  310. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
  311. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  312. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  313. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  314. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  315. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  316. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  317. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  318. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  319. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
  320. package/templates/.agents/dashboard/work-priority.json +34 -0
  321. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  322. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  323. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  324. package/templates/.agents/design/.zaip-managed.json +3 -3
  325. package/templates/.agents/design/apps/catalog/package.json +1 -1
  326. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  327. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  328. package/templates/.agents/requirements/comparative-audit.md +1 -1
  329. package/templates/.agents/requirements/context-engine.md +1 -1
  330. package/templates/.agents/requirements/cost-observability.md +1 -1
  331. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  332. package/templates/.agents/requirements/data-export.md +1 -1
  333. package/templates/.agents/requirements/design-system.md +1 -1
  334. package/templates/.agents/requirements/execution-engine.md +1 -1
  335. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  336. package/templates/.agents/requirements/model-orchestration.md +1 -1
  337. package/templates/.agents/requirements/public-distribution.md +9 -6
  338. package/templates/.agents/requirements/software-architecture.md +1 -1
  339. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  340. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  341. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  342. package/templates/.agents/rules/autonomy-decision.md +15 -0
  343. package/templates/.agents/rules/core.md +1 -1
  344. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  345. package/templates/.agents/rules/specialist-routing.md +19 -0
  346. package/templates/.agents/rules/workflow.md +1 -1
  347. package/templates/.agents/runtime/VERSION +1 -1
  348. package/templates/.agents/runtime/bin/zaip.mjs +114 -64
  349. package/templates/.agents/runtime/checksums.sha256 +6 -4
  350. package/templates/.agents/runtime/manifest.json +3 -1
  351. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  352. package/templates/.agents/runtime/provenance.json +11 -0
  353. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  354. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  355. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
  356. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  357. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  358. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  359. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  360. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  361. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  362. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  363. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  364. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  365. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  366. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  367. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  368. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  369. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  370. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  371. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  372. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  373. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
  375. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  377. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  378. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
  380. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
  381. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
  382. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
  383. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
  384. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
  385. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
  386. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  387. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  388. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  389. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  390. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
  392. package/templates/.agents/zaip-aios/INDEX.md +1 -0
  393. package/templates/.agents/zaip-aios/README.md +37 -8
  394. package/templates/.agents/zaip-aios/VERSION +1 -1
  395. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  396. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  397. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  398. package/templates/template-manifest.json +945 -214
  399. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  400. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  401. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  402. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  403. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  404. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  405. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  406. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  407. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  408. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  409. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  410. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -1,6 +1,8 @@
1
+ import { readFileSync } from "node:fs";
1
2
  import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
3
  import { tmpdir } from "node:os";
3
4
  import { join } from "node:path";
5
+ import { canonicalAllTimeDurationMs } from "@zaip-ai/dashboard-operations/contracts";
4
6
  import { describe, expect, it } from "vitest";
5
7
  import { createDashboardApp } from "./server.js";
6
8
  import { pricedUsageBucket, pricingCatalog } from "./server.test-fixtures.js";
@@ -25,7 +27,7 @@ describe("dashboard backend snapshot", () => {
25
27
  " name: dashboard-fixture",
26
28
  " timezone: UTC",
27
29
  "stack:",
28
- " id: typescript-hono-kysely",
30
+ " id: zaip-aios-stack",
29
31
  " overrides: {}",
30
32
  "clients:",
31
33
  " codex: true",
@@ -43,7 +45,7 @@ describe("dashboard backend snapshot", () => {
43
45
  [
44
46
  "lock_version: 1",
45
47
  "framework:",
46
- " version: 1.0.0",
48
+ " version: 1.0.8",
47
49
  " distribution_sha256: null",
48
50
  "layout:",
49
51
  " version: 3",
@@ -304,6 +306,55 @@ describe("dashboard backend snapshot", () => {
304
306
  `${v2Run("RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-LIFECYCLE", false)}\n`,
305
307
  "utf8",
306
308
  );
309
+ // The daily-first API intentionally does not fall back to summary.json.
310
+ // Materialize the compact overview and empty entity collections that a
311
+ // normal lifecycle refresh writes alongside the legacy fixture records.
312
+ const viewsRoot = join(fixtureRoot, ".agents", "records", "lifecycle", "views");
313
+ await mkdir(viewsRoot, { recursive: true });
314
+ const overviewPath = ".agents/records/lifecycle/views/overview-fixture.json";
315
+ await writeFile(
316
+ join(viewsRoot, "overview-fixture.json"),
317
+ `${JSON.stringify({
318
+ schema_version: 1,
319
+ days: {
320
+ "2026-07-14": {
321
+ prds: 0,
322
+ specs: 0,
323
+ tasks: 1,
324
+ validations: 0,
325
+ evidences: 0,
326
+ runs: 2,
327
+ usage: {
328
+ input_tokens: { known_sum: 10, unknown: 1, complete: false, coverage_ratio: 0.5 },
329
+ output_tokens: { known_sum: 5, unknown: 1, complete: false, coverage_ratio: 0.5 },
330
+ total_tokens: { known_sum: 15, unknown: 1, complete: false, coverage_ratio: 0.5 },
331
+ cost: {
332
+ known_sum: 6.25,
333
+ unknown: 1,
334
+ complete: false,
335
+ coverage_ratio: 0.5,
336
+ currency: "BRL",
337
+ },
338
+ },
339
+ duration: { known_sum: 5_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
340
+ events: { known_sum: 1, unknown: 1, complete: false, coverage_ratio: 0.5 },
341
+ },
342
+ },
343
+ })}\n`,
344
+ "utf8",
345
+ );
346
+ await writeFile(
347
+ join(viewsRoot, "manifest.json"),
348
+ `${JSON.stringify({
349
+ schema_version: 1,
350
+ snapshot_id: updatedAt,
351
+ source_latest_at: updatedAt,
352
+ shard_count: 16,
353
+ overview_path: overviewPath,
354
+ collections: { tasks: [], specs: [], prds: [], executions: [], conversations: [] },
355
+ })}\n`,
356
+ "utf8",
357
+ );
307
358
 
308
359
  try {
309
360
  const app = createDashboardApp(fixtureRoot, "test-session");
@@ -326,6 +377,13 @@ describe("dashboard backend snapshot", () => {
326
377
  const operations = await app.request("/api/v2/operations", {
327
378
  headers: { "x-zaip-session": "test-session" },
328
379
  });
380
+ const quickOperations = await app.request("/api/v2/operations?scope=quick", {
381
+ headers: { "x-zaip-session": "test-session" },
382
+ });
383
+ // Daily summary uses the aggregate cache rather than the old snapshot
384
+ // cache; absence proves it did not take the snapshot fallback path.
385
+ expect(allCosts.headers.get("x-zaip-snapshot-cache")).toBeNull();
386
+ expect(operations.headers.get("x-zaip-snapshot-cache")).toBe("hit");
329
387
  const portableServerPath = new URL("../server.mjs", import.meta.url).href;
330
388
  const { createDashboardApp: createPortableDashboardApp } = await import(portableServerPath);
331
389
  const portableApp = createPortableDashboardApp(fixtureRoot, "test-session");
@@ -337,16 +395,14 @@ describe("dashboard backend snapshot", () => {
337
395
  { headers: { "x-zaip-session": "test-session" } },
338
396
  );
339
397
 
340
- expect(monthlyCosts.status, await monthlyCosts.clone().text()).toBe(200);
341
- expect(allCosts.status, await allCosts.clone().text()).toBe(200);
342
- await expect(monthlyCosts.clone().json()).resolves.toMatchObject({
343
- readonly: true,
344
- currency: "BRL",
345
- });
346
- expect(response.status, await response.clone().text()).toBe(200);
347
- expect(julySnapshot.status, await julySnapshot.clone().text()).toBe(200);
348
- expect(operations.status, await operations.clone().text()).toBe(200);
349
- const allOperationsPayload = (await operations.clone().json()) as {
398
+ expect(monthlyCosts.status).toBe(200);
399
+ expect(allCosts.status).toBe(200);
400
+ expect(response.status).toBe(200);
401
+ expect(julySnapshot.status).toBe(200);
402
+ expect(operations.status).toBe(200);
403
+ const allOperationsPayload = (await operations.json()) as {
404
+ tasks: Array<{ id: string; status: string }>;
405
+ executions: Array<{ id: string; status: string }>;
350
406
  runs: Array<{
351
407
  id: string;
352
408
  duration_ms: number | null;
@@ -366,95 +422,79 @@ describe("dashboard backend snapshot", () => {
366
422
  total_tokens: number | null;
367
423
  estimated_brl: number | null;
368
424
  };
369
- const julyOperationsPayload = (await julyOperations.json()) as { runs: OperationRunMetric[] };
370
- const allCostsPayload = (await allCosts.json()) as {
371
- runs: Array<{
372
- run_id: string;
373
- duration_ms: number | null;
374
- total_tokens: number | null;
375
- estimated_brl: number | null;
376
- }>;
377
- };
378
- const julyCostsPayload = (await monthlyCosts.clone().json()) as { runs: CostRunMetric[] };
379
- const portableAllCostsPayload = (await portableAllCosts.json()) as { runs: CostRunMetric[] };
380
- const portableJulyCostsPayload = (await portableJulyCosts.json()) as {
425
+ type CostSummaryPayload = {
381
426
  runs: CostRunMetric[];
427
+ groups: Record<
428
+ "daily" | "monthly" | "annual",
429
+ Array<{
430
+ key: string;
431
+ duration_ms: number | null;
432
+ total_tokens: number | null;
433
+ estimated_brl: number | null;
434
+ }>
435
+ >;
382
436
  };
383
- const julySnapshotPayload = (await julySnapshot.json()) as {
384
- operations: { summary: { execution_duration_ms: number } };
385
- costs: {
386
- groups: Record<"daily" | "monthly" | "annual", Array<{ duration_ms: number | null }>>;
437
+ type QuickOperationsPayload = {
438
+ summary: {
439
+ overview_metrics: { duration_ms: number | null } | null;
440
+ periods: {
441
+ daily: Record<
442
+ string,
443
+ {
444
+ duration?: { known_sum: number };
445
+ usage: { total_tokens: { known_sum: number }; cost: { known_sum: number } };
446
+ }
447
+ >;
448
+ };
387
449
  };
388
450
  };
451
+ const julyOperationsPayload = (await julyOperations.json()) as { runs: OperationRunMetric[] };
452
+ const allCostsPayload = (await allCosts.json()) as CostSummaryPayload;
453
+ const julyCostsPayload = (await monthlyCosts.json()) as CostSummaryPayload;
454
+ expect(allCostsPayload).toMatchObject({ readonly: true, aggregate_only: true });
455
+ expect(julyCostsPayload).toMatchObject({ readonly: true, currency: "BRL" });
456
+ const portableAllCostsPayload = (await portableAllCosts.json()) as CostSummaryPayload;
457
+ const portableJulyCostsPayload = (await portableJulyCosts.json()) as CostSummaryPayload;
458
+ const quickOperationsPayload = (await quickOperations.json()) as QuickOperationsPayload;
389
459
  const runIds = (rows: readonly { id: string }[] | readonly { run_id: string }[]) =>
390
460
  rows.map((row) => ("id" in row ? row.id : row.run_id)).sort();
391
- expect(runIds(allCostsPayload.runs)).toEqual(runIds(allOperationsPayload.runs));
392
- expect(runIds(julyCostsPayload.runs)).toEqual(runIds(julyOperationsPayload.runs));
393
- expect(runIds(portableAllCostsPayload.runs)).toEqual(runIds(allCostsPayload.runs));
394
- expect(runIds(portableJulyCostsPayload.runs)).toEqual(runIds(julyCostsPayload.runs));
395
- const expectMetricParity = (
396
- costRows: readonly CostRunMetric[],
397
- operationRows: readonly OperationRunMetric[],
398
- ) => {
399
- const operationsById = new Map(operationRows.map((run) => [run.id, run] as const));
400
- for (const cost of costRows) {
401
- const operation = operationsById.get(cost.run_id);
402
- expect(operation).toBeDefined();
403
- expect(cost).toMatchObject({
404
- duration_ms: operation?.source_duration_ms ?? operation?.duration_ms,
405
- total_tokens: operation?.usage.total.tokens.total,
406
- estimated_brl: operation?.usage.total.cost.brl,
407
- });
408
- }
409
- };
410
- expectMetricParity(allCostsPayload.runs, allOperationsPayload.runs);
411
- expectMetricParity(julyCostsPayload.runs, julyOperationsPayload.runs);
412
- expect(portableAllCostsPayload.runs).toEqual(allCostsPayload.runs);
413
- expect(portableJulyCostsPayload.runs).toEqual(julyCostsPayload.runs);
461
+ // scope=summary is intentionally aggregate-only: no Run/Sub-Run payload
462
+ // is loaded or returned. Detail parity remains covered by Operations.
463
+ expect(allCostsPayload.runs).toEqual([]);
464
+ expect(julyCostsPayload.runs).toEqual([]);
465
+ expect(portableAllCostsPayload.runs).toEqual([]);
466
+ expect(portableJulyCostsPayload.runs).toEqual([]);
414
467
  const groupDuration = (group: readonly { duration_ms: number | null }[]) =>
415
468
  group.reduce((sum, row) => sum + (row.duration_ms ?? 0), 0);
416
- expect(julySnapshotPayload.operations.summary.execution_duration_ms).toBe(
417
- groupDuration(julySnapshotPayload.costs.groups.daily),
418
- );
419
- expect(julySnapshotPayload.operations.summary.execution_duration_ms).toBe(
420
- groupDuration(julySnapshotPayload.costs.groups.monthly),
469
+ // Both first-fold routes consume the same daily overview and must retain
470
+ // the identical hybrid legacy/factual duration budget.
471
+ expect(quickOperationsPayload.summary.overview_metrics?.duration_ms).toBe(
472
+ canonicalAllTimeDurationMs(groupDuration(allCostsPayload.groups.daily)),
421
473
  );
422
- expect(julySnapshotPayload.operations.summary.execution_duration_ms).toBe(
423
- groupDuration(julySnapshotPayload.costs.groups.annual),
474
+ const costsByDay = new Map(
475
+ allCostsPayload.groups.daily.map((row) => [row.key, row] as const),
424
476
  );
477
+ for (const [day, period] of Object.entries(quickOperationsPayload.summary.periods.daily)) {
478
+ if (period.usage.total_tokens.known_sum <= 0) continue;
479
+ const cost = costsByDay.get(day);
480
+ expect(cost, `missing Cost bucket ${day}`).toBeDefined();
481
+ expect(period.usage.cost.known_sum, `Operations cost ${day}`).toBeGreaterThan(0);
482
+ expect(period.duration?.known_sum, `Operations duration ${day}`).toBeGreaterThan(0);
483
+ expect(cost!.estimated_brl, `Cost cost ${day}`).toBeGreaterThan(0);
484
+ expect(cost!.duration_ms, `Cost duration ${day}`).toBeGreaterThan(0);
485
+ expect(period.usage.total_tokens.known_sum).toBe(cost!.total_tokens);
486
+ expect(period.usage.cost.known_sum).toBe(cost!.estimated_brl);
487
+ expect(period.duration?.known_sum).toBe(cost!.duration_ms);
488
+ }
425
489
  const rootOperations = allOperationsPayload.runs.find(
426
490
  (run) => run.id === "RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-A1B2",
427
491
  );
428
- const rootCosts = allCostsPayload.runs.find(
429
- (run) => run.run_id === "RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-A1B2",
430
- );
431
492
  expect(
432
493
  allOperationsPayload.runs.filter(
433
494
  (run) => run.id === "RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-A1B2",
434
495
  ),
435
496
  ).toHaveLength(1);
436
- expect(
437
- allCostsPayload.runs.filter(
438
- (run) => run.run_id === "RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-A1B2",
439
- ),
440
- ).toHaveLength(1);
441
- expect(rootCosts).toMatchObject({
442
- // Cost reports analytical duration, which is the observed source
443
- // duration when it exists; Operations also exposes lifecycle elapsed
444
- // separately as duration_ms.
445
- duration_ms: rootOperations?.source_duration_ms ?? rootOperations?.duration_ms,
446
- total_tokens: rootOperations?.usage.total.tokens.total,
447
- estimated_brl: rootOperations?.usage.total.cost.brl,
448
- });
449
- expect(
450
- allCostsPayload.runs.find(
451
- (run) => run.run_id === "RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-LIFECYCLE",
452
- ),
453
- ).toMatchObject({
454
- total_tokens: null,
455
- estimated_brl: null,
456
- });
457
- await expect(operations.json()).resolves.toMatchObject({
497
+ expect(allOperationsPayload).toMatchObject({
458
498
  tasks: [
459
499
  {
460
500
  id: "TASK-2026-07-14-00-00-DASHBOARD-FIXTURE-A1B2",
@@ -470,7 +510,7 @@ describe("dashboard backend snapshot", () => {
470
510
  });
471
511
  await expect(response.json()).resolves.toMatchObject({
472
512
  dashboard: {
473
- title: "Dashboard Zaip AIOS",
513
+ title: "Dashboard Zaip AIOS SQLite",
474
514
  repository_name: "",
475
515
  },
476
516
  operations: { readonly: true, summary: { source_latest_at: "2026-07-14T00:00:05.000Z" } },
@@ -524,3 +564,42 @@ describe("dashboard backend snapshot", () => {
524
564
  }
525
565
  });
526
566
  });
567
+
568
+ describe("Cost Monitor daily summary route", () => {
569
+ it("does not route summary requests through summary.json, snapshots, or Run transport", () => {
570
+ const source = readFileSync(new URL("./server.ts", import.meta.url), "utf8");
571
+ const start = source.indexOf('if (scope === "summary")');
572
+ const end = source.indexOf('if (scope === "runs")', start);
573
+ const summaryRoute = source.slice(start, end);
574
+ expect(summaryRoute).toContain("firstFoldCostSource(filesystem");
575
+ expect(summaryRoute).not.toContain("summary.json");
576
+ expect(summaryRoute).not.toContain("readSnapshot(context)");
577
+ expect(summaryRoute).not.toContain("readAggregate(");
578
+ expect(summaryRoute).not.toContain("buildFirstFoldQuickProjection(");
579
+ expect(summaryRoute).not.toContain('readDailyReadModels("overview")');
580
+ });
581
+
582
+ it("uses only the bounded SQL aggregate for the Cost first fold", () => {
583
+ const source = readFileSync(new URL("./server.ts", import.meta.url), "utf8");
584
+ const start = source.indexOf("async function firstFoldCostSource(");
585
+ const end = source.indexOf("function buildSqliteTaskTrace(", start);
586
+ const firstFoldCostSource = source.slice(start, end);
587
+ expect(firstFoldCostSource).toContain("costMonitorSummaryAggregate(filters)");
588
+ expect(firstFoldCostSource).not.toContain("costMonitorFinancialActivityRows(");
589
+ expect(firstFoldCostSource).not.toContain("run_metrics:");
590
+ expect(firstFoldCostSource).not.toContain("rows.map(");
591
+ });
592
+
593
+ it("keeps the Daily first-fold response to its displayed-column allowlist", () => {
594
+ const source = readFileSync(new URL("./sqlite-read-model.ts", import.meta.url), "utf8");
595
+ const dailyBranch = source.slice(
596
+ source.indexOf('if (filteredCostGroup !== undefined && temporalCostGroup && !hasDimensionalCostFilter)'),
597
+ source.indexOf('if (filteredCostGroup !== undefined && (!temporalCostGroup || hasDimensionalCostFilter))'),
598
+ );
599
+ expect(dailyBranch).not.toContain("costMonitorFactualDurationByDay(");
600
+ expect(dailyBranch).toContain("Daily first fold is an allowlisted table contract");
601
+ for (const field of ["prd_count", "spec_count", "task_count", "total_run_count", "validation_count", "evidence_count", "total_duration", "duration_known", "total_tokens", "total_cost_brl"])
602
+ expect(dailyBranch).toContain(`${field}:`);
603
+ expect(dailyBranch).not.toContain("...row,");
604
+ });
605
+ });
@@ -0,0 +1,145 @@
1
+ import { execFile } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { resolve } from "node:path";
4
+ import { promisify } from "node:util";
5
+ import type { WorkspaceFileSystem } from "@zaip-ai/core";
6
+
7
+ const DASHBOARD_CONFIG_PATH = ".agents/dashboard/dashboard.config.json";
8
+ const execFileAsync = promisify(execFile);
9
+
10
+ export async function dashboardIdentity(
11
+ filesystem: WorkspaceFileSystem,
12
+ workspaceRoot: string,
13
+ ): Promise<{ title: string; repository_name: string }> {
14
+ let title = process.env.ZAIP_DASHBOARD_TITLE?.trim() || "Dashboard Zaip AIOS SQLite";
15
+ let repositorySetting = "auto";
16
+ try {
17
+ if (await filesystem.exists(DASHBOARD_CONFIG_PATH)) {
18
+ const config = JSON.parse(await filesystem.readText(DASHBOARD_CONFIG_PATH)) as {
19
+ github_repository?: unknown;
20
+ title?: unknown;
21
+ };
22
+ if (typeof config.title === "string" && config.title.trim()) title = config.title.trim();
23
+ if (typeof config.github_repository === "string") {
24
+ repositorySetting = config.github_repository.trim();
25
+ }
26
+ }
27
+ } catch {
28
+ // Visual configuration must never prevent dashboard startup.
29
+ }
30
+ if (repositorySetting.toLowerCase() !== "auto") {
31
+ return { title, repository_name: githubRepositoryFromRemote(repositorySetting) ?? "" };
32
+ }
33
+ try {
34
+ const { stdout } = await execFileAsync(
35
+ "git",
36
+ ["-C", workspaceRoot, "remote", "get-url", "origin"],
37
+ { encoding: "utf8", windowsHide: true },
38
+ );
39
+ return { title, repository_name: githubRepositoryFromRemote(stdout) ?? "" };
40
+ } catch {
41
+ return { title, repository_name: "" };
42
+ }
43
+ }
44
+
45
+ export function githubRepositoryFromRemote(remote: string): string | null {
46
+ const trimmed = remote.trim();
47
+ const match =
48
+ trimmed.match(/github\.com(?::|\/)([^/\s]+)\/([^/\s]+?)(?:\.git)?$/i) ??
49
+ trimmed.match(/^([^/:\s]+)\/([^/\s]+?)(?:\.git)?$/);
50
+ return match ? `${match[1]}/${match[2]}` : null;
51
+ }
52
+
53
+ export function dashboardWorkspaceKey(workspaceRoot: string): string {
54
+ return createHash("sha256").update(`${resolve(workspaceRoot)}:dashboard-sqlite`).digest("hex").slice(0, 16);
55
+ }
56
+
57
+ export interface ReconciliationItem {
58
+ id: string;
59
+ reason: string | null;
60
+ }
61
+
62
+ export interface ReconciliationResult {
63
+ reconciled_ids: string[];
64
+ blocked: ReconciliationItem[];
65
+ not_reconciled: ReconciliationItem[];
66
+ }
67
+
68
+ export async function reconcileOpenWork(
69
+ filesystem: WorkspaceFileSystem,
70
+ workspaceRoot: string,
71
+ ): Promise<ReconciliationResult> {
72
+ if (!(await filesystem.exists(".agents/runtime/bin/zaip.mjs"))) {
73
+ return { reconciled_ids: [], blocked: [], not_reconciled: [] };
74
+ }
75
+ const cliPath = resolve(workspaceRoot, ".agents", "runtime", "bin", "zaip.mjs");
76
+ const { stdout } = await execFileAsync(
77
+ process.execPath,
78
+ [cliPath, "run", "reconcile", "--open", "--json"],
79
+ { cwd: workspaceRoot, windowsHide: true, timeout: 120_000, maxBuffer: 10 * 1_024 * 1_024 },
80
+ );
81
+ return reconciliationResult(JSON.parse(stdout) as unknown);
82
+ }
83
+
84
+ export function reconciliationResult(value: unknown): ReconciliationResult {
85
+ const reconciled = new Set<string>();
86
+ const blocked = new Map<string, string | null>();
87
+ const notReconciled = new Map<string, string | null>();
88
+ const remember = (target: Map<string, string | null>, id: unknown, reason: unknown): void => {
89
+ if (typeof id !== "string") return;
90
+ target.set(id, typeof reason === "string" && reason.trim() ? reason : null);
91
+ };
92
+ const records =
93
+ typeof value === "object" && value !== null ? (value as Record<string, unknown>) : {};
94
+ const reconciliations = Array.isArray(records.reconciliations) ? records.reconciliations : [];
95
+ for (const candidate of reconciliations) {
96
+ if (typeof candidate !== "object" || candidate === null) continue;
97
+ const item = candidate as Record<string, unknown>;
98
+ const reason = item.error;
99
+ const entities = ["tasks", "changes", "executions", "specs", "prds"].flatMap((key) =>
100
+ Array.isArray(item[key]) ? item[key] : [],
101
+ );
102
+ for (const entity of entities) {
103
+ if (typeof entity !== "object" || entity === null) continue;
104
+ const record = entity as Record<string, unknown>;
105
+ if (
106
+ item.status === "closed" &&
107
+ record.status === "completed" &&
108
+ typeof record.id === "string"
109
+ ) {
110
+ reconciled.add(record.id);
111
+ } else if (record.status === "blocked") {
112
+ remember(blocked, record.id, record.status_reason ?? reason);
113
+ } else if (item.status === "deferred") {
114
+ remember(notReconciled, record.id, reason);
115
+ }
116
+ }
117
+ }
118
+ const orphanedExecutions = Array.isArray(records.orphaned_executions)
119
+ ? records.orphaned_executions
120
+ : [];
121
+ orphanedExecutions.forEach((id) => {
122
+ remember(blocked, id, "Execution orphaned after the reconciliation grace period.");
123
+ });
124
+ const errors = Array.isArray(records.reconciliation_errors) ? records.reconciliation_errors : [];
125
+ errors.forEach((candidate) => {
126
+ if (typeof candidate !== "object" || candidate === null) return;
127
+ const item = candidate as Record<string, unknown>;
128
+ remember(notReconciled, item.run_id, item.error);
129
+ });
130
+ const unresolved = Array.isArray(records.unresolved_running_run_ids)
131
+ ? records.unresolved_running_run_ids
132
+ : [];
133
+ unresolved.forEach((id) => {
134
+ remember(notReconciled, id, "Invocation is still running.");
135
+ });
136
+ const entries = (items: Map<string, string | null>): ReconciliationItem[] =>
137
+ [...items.entries()]
138
+ .map(([id, reason]) => ({ id, reason }))
139
+ .sort((left, right) => left.id.localeCompare(right.id));
140
+ return {
141
+ reconciled_ids: [...reconciled].sort(),
142
+ blocked: entries(blocked),
143
+ not_reconciled: entries(notReconciled),
144
+ };
145
+ }