@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
@@ -0,0 +1,68 @@
1
+ import type { OperationsView } from "./operations-page-filters.js";
2
+ import { viewLabels } from "./operations-view-labels.js";
3
+ import type { OperationsLocale } from "./status-labels.js";
4
+
5
+ export function OperationsViewTabs({
6
+ locale,
7
+ onChange,
8
+ view,
9
+ }: {
10
+ locale: OperationsLocale;
11
+ onChange: (view: OperationsView) => void;
12
+ view: OperationsView;
13
+ }) {
14
+ const views = [
15
+ "work-kanban",
16
+ "work-list",
17
+ ] as const;
18
+ return (
19
+ <nav aria-label="Entidades do ciclo de trabalho">
20
+ {views.map((key) => (
21
+ <button
22
+ aria-pressed={view === key}
23
+ className={view === key ? "is-active" : undefined}
24
+ key={key}
25
+ onClick={() => onChange(key)}
26
+ type="button"
27
+ >
28
+ {viewLabels[locale][key]}
29
+ </button>
30
+ ))}
31
+ </nav>
32
+ );
33
+ }
34
+
35
+ export function OperationsEntityPager({
36
+ entityPage,
37
+ locale,
38
+ onChange,
39
+ }: {
40
+ entityPage: { offset: number; total: number | null; loading: boolean; error: string | null };
41
+ locale: OperationsLocale;
42
+ onChange?: ((offset: number) => void) | undefined;
43
+ }) {
44
+ return (
45
+ <div aria-live="polite" className="operations-page-controls">
46
+ {entityPage.error ? <span>{entityPage.error}</span> : null}
47
+ {entityPage.loading ? <span>{locale === "pt-BR" ? "Carregando…" : "Loading…"}</span> : null}
48
+ <button
49
+ disabled={entityPage.loading || entityPage.offset === 0}
50
+ onClick={() => onChange?.(Math.max(0, entityPage.offset - 100))}
51
+ type="button"
52
+ >
53
+ {locale === "pt-BR" ? "Anterior" : "Previous"}
54
+ </button>
55
+ <button
56
+ disabled={
57
+ entityPage.loading ||
58
+ entityPage.total === null ||
59
+ entityPage.offset + 100 >= entityPage.total
60
+ }
61
+ onClick={() => onChange?.(entityPage.offset + 100)}
62
+ type="button"
63
+ >
64
+ {locale === "pt-BR" ? "Próxima" : "Next"}
65
+ </button>
66
+ </div>
67
+ );
68
+ }
@@ -0,0 +1,169 @@
1
+ import type { ComponentProps, ReactNode, RefObject } from "react";
2
+ import { OperationDateFilters } from "./OperationDateFilters.js";
3
+ import { SearchClearIcon } from "./OperationsIcons.js";
4
+ import { OperationsOverview } from "./OperationsOverview.js";
5
+ import {
6
+ dateRangeForPreset,
7
+ type OperationDatePreset,
8
+ type OperationDateRange,
9
+ } from "./operation-date-range.js";
10
+ import type { OperationsLocale } from "./status-labels.js";
11
+
12
+ type OverviewProps = ComponentProps<typeof OperationsOverview>;
13
+
14
+ export function OperationsPageOverview({
15
+ capabilityNavigation,
16
+ currency,
17
+ data,
18
+ datePreset,
19
+ dateRange,
20
+ defaultDateRange,
21
+ factualCostTotal,
22
+ includeLegacyEffort,
23
+ locale,
24
+ onOpenTask,
25
+ onOpenDocument,
26
+ onLoadStatus,
27
+ statusPage,
28
+ onLoadStatusPage,
29
+ classificationPage,
30
+ onLoadClassificationPage,
31
+ prds,
32
+ query,
33
+ resolveRunCost,
34
+ runs,
35
+ searchInputRef,
36
+ setQuery,
37
+ showFilterLoading,
38
+ specs,
39
+ tasks,
40
+ updatePeriod,
41
+ }: {
42
+ capabilityNavigation: ReactNode;
43
+ currency: "BRL" | "USD";
44
+ data: OverviewProps["data"];
45
+ datePreset: OperationDatePreset;
46
+ dateRange: OperationDateRange;
47
+ defaultDateRange: OperationDateRange;
48
+ factualCostTotal: OverviewProps["factualCostTotal"];
49
+ includeLegacyEffort: boolean;
50
+ locale: OperationsLocale;
51
+ onOpenTask: OverviewProps["onOpenTask"];
52
+ onOpenDocument: OverviewProps["onOpenDocument"];
53
+ onLoadStatus: OverviewProps["onLoadStatus"];
54
+ statusPage: OverviewProps["statusPage"];
55
+ onLoadStatusPage: OverviewProps["onLoadStatusPage"];
56
+ classificationPage: OverviewProps["classificationPage"];
57
+ onLoadClassificationPage: OverviewProps["onLoadClassificationPage"];
58
+ prds: NonNullable<OverviewProps["prds"]>;
59
+ query: string;
60
+ resolveRunCost: OverviewProps["resolveRunCost"];
61
+ runs: NonNullable<OverviewProps["runs"]>;
62
+ searchInputRef: RefObject<HTMLInputElement | null>;
63
+ setQuery: (value: string) => void;
64
+ showFilterLoading: () => void;
65
+ specs: NonNullable<OverviewProps["specs"]>;
66
+ tasks: NonNullable<OverviewProps["tasks"]>;
67
+ updatePeriod: (preset: OperationDatePreset, range: OperationDateRange) => void;
68
+ }) {
69
+ return (
70
+ <>
71
+ <OperationsOverview
72
+ data={data}
73
+ currency={currency}
74
+ factualCostTotal={factualCostTotal}
75
+ datePreset={datePreset}
76
+ dateRange={dateRange}
77
+ locale={locale}
78
+ onDatePresetChange={(nextPreset) => {
79
+ showFilterLoading();
80
+ updatePeriod(
81
+ nextPreset,
82
+ nextPreset === "all"
83
+ ? defaultDateRange
84
+ : nextPreset === "custom"
85
+ ? dateRange
86
+ : dateRangeForPreset(nextPreset),
87
+ );
88
+ }}
89
+ onOpenTask={onOpenTask}
90
+ onOpenDocument={onOpenDocument}
91
+ onLoadStatus={onLoadStatus}
92
+ statusPage={statusPage}
93
+ onLoadStatusPage={onLoadStatusPage}
94
+ classificationPage={classificationPage}
95
+ onLoadClassificationPage={onLoadClassificationPage}
96
+ prds={prds}
97
+ runs={runs}
98
+ resolveRunCost={resolveRunCost}
99
+ includeLegacyEffort={includeLegacyEffort}
100
+ specs={specs}
101
+ tasks={tasks}
102
+ />
103
+ <section className="dashboard-global-controls">
104
+ {capabilityNavigation}
105
+ <div className="operations-toolbar-filters dashboard-global-filters">
106
+ <label className="operations-toolbar-field operations-search-field">
107
+ <span>{locale === "pt-BR" ? "Busca" : "Search"}</span>
108
+ <div className="operations-search-control">
109
+ <input
110
+ aria-label={locale === "pt-BR" ? "Busca" : "Search"}
111
+ onChange={(event) => {
112
+ setQuery(event.target.value);
113
+ }}
114
+ placeholder={locale === "pt-BR" ? "Buscar por nome ou ID" : "Search by name or ID"}
115
+ ref={searchInputRef}
116
+ value={query}
117
+ />
118
+ {query ? (
119
+ <button
120
+ aria-label={locale === "pt-BR" ? "Limpar busca" : "Clear search"}
121
+ className="operations-search-clear"
122
+ onMouseDown={(event) => event.preventDefault()}
123
+ onClick={() => {
124
+ // Keep the text control as the active element while its
125
+ // conditional clear button is removed in this render.
126
+ searchInputRef.current?.focus();
127
+ setQuery("");
128
+ }}
129
+ type="button"
130
+ >
131
+ <SearchClearIcon />
132
+ </button>
133
+ ) : null}
134
+ </div>
135
+ </label>
136
+ <OperationDateFilters
137
+ dateRange={dateRange}
138
+ defaultDateRange={defaultDateRange}
139
+ locale={locale}
140
+ onDateRangeChange={(nextRange) => {
141
+ showFilterLoading();
142
+ updatePeriod("custom", nextRange);
143
+ }}
144
+ onPresetChange={(nextPreset, nextRange) => {
145
+ showFilterLoading();
146
+ updatePeriod(nextPreset, nextRange);
147
+ }}
148
+ preset={datePreset}
149
+ />
150
+ </div>
151
+ </section>
152
+ </>
153
+ );
154
+ }
155
+
156
+ export function OperationsPageLoading({ locale }: { locale: OperationsLocale }) {
157
+ return (
158
+ <section
159
+ aria-busy="true"
160
+ aria-live="polite"
161
+ className="operations-content-skeleton"
162
+ role="status"
163
+ >
164
+ <span>
165
+ {locale === "pt-BR" ? "Carregando o período selecionado…" : "Loading selected period…"}
166
+ </span>
167
+ </section>
168
+ );
169
+ }
@@ -9,6 +9,7 @@ import {
9
9
  } from "@zaip-ai/dashboard-ui";
10
10
  import type { OperationsProjection } from "../contracts.js";
11
11
  import {
12
+ aggregateManifestPeriodSummary,
12
13
  aggregatePeriodSummary,
13
14
  averagePeriodSummaryRows,
14
15
  type PeriodGranularity,
@@ -18,19 +19,46 @@ import type { OperationsLocale } from "./status-labels.js";
18
19
  import "./period-summary.css";
19
20
 
20
21
  export function PeriodSummaryTable({
22
+ currency,
21
23
  data,
22
24
  granularity,
23
25
  locale,
24
- resolveRunCostBrl,
26
+ resolveRunCost,
25
27
  includeLegacyEffort = false,
28
+ legacyRange,
29
+ manifestDailyPeriods,
30
+ factualCostPeriods,
26
31
  }: {
27
- data: Pick<OperationsProjection, "prds" | "specs" | "tasks" | "runs">;
32
+ currency: "BRL" | "USD";
33
+ data: Pick<
34
+ OperationsProjection,
35
+ "prds" | "specs" | "tasks" | "runs" | "evidences" | "validations"
36
+ >;
28
37
  granularity: PeriodGranularity;
29
38
  locale: OperationsLocale;
30
- resolveRunCostBrl?: ((runId: string) => number | null) | undefined;
39
+ resolveRunCost?: ((runId: string) => number | null) | undefined;
31
40
  includeLegacyEffort?: boolean;
41
+ legacyRange?: { from: string | null; to: string | null };
42
+ manifestDailyPeriods?: Readonly<
43
+ Record<string, import("./period-summary.js").ManifestDailyPeriod>
44
+ >;
45
+ factualCostPeriods?: Partial<
46
+ Record<PeriodGranularity, readonly { key: string; estimated_usd: number | null; estimated_brl: number | null }[]>
47
+ >;
32
48
  }) {
33
- const rows = aggregatePeriodSummary(data, granularity, resolveRunCostBrl, includeLegacyEffort);
49
+ const calculatedRows =
50
+ // Persisted Operations periods carry BRL-only aggregates. USD must be
51
+ // rebuilt from the selected-currency per-Run resolver or remain null.
52
+ manifestDailyPeriods === undefined || currency === "USD"
53
+ ? aggregatePeriodSummary(
54
+ data,
55
+ granularity,
56
+ resolveRunCost,
57
+ includeLegacyEffort,
58
+ legacyRange,
59
+ )
60
+ : aggregateManifestPeriodSummary(manifestDailyPeriods, granularity);
61
+ const rows = applyFactualPeriodCosts(calculatedRows, currency, factualCostPeriods?.[granularity]);
34
62
  const summarizedTotal = summarizePeriodRows(rows);
35
63
  const total = {
36
64
  ...summarizedTotal,
@@ -81,7 +109,7 @@ export function PeriodSummaryTable({
81
109
  granularity,
82
110
  locale,
83
111
  ),
84
- value: formatCurrency(average.costBrl, "BRL", locale),
112
+ value: formatCurrency(average.costBrl, currency, locale),
85
113
  },
86
114
  ]}
87
115
  />
@@ -138,12 +166,12 @@ export function PeriodSummaryTable({
138
166
  key: "cost",
139
167
  label: locale === "pt-BR" ? "Custos" : "Costs",
140
168
  align: "right",
141
- render: (row) => formatCurrency(row.costBrl, "BRL"),
169
+ render: (row) => formatCurrency(row.costBrl, currency, locale),
142
170
  footer: (
143
171
  <output
144
- aria-label={`${totalLabel} — ${locale === "pt-BR" ? "Custos" : "Costs"}: ${formatCurrency(total.costBrl, "BRL")}`}
172
+ aria-label={`${totalLabel} — ${locale === "pt-BR" ? "Custos" : "Costs"}: ${formatCurrency(total.costBrl, currency, locale)}`}
145
173
  >
146
- {formatCurrency(total.costBrl, "BRL")}
174
+ {formatCurrency(total.costBrl, currency, locale)}
147
175
  </output>
148
176
  ),
149
177
  sortValue: (row) => row.costBrl,
@@ -165,6 +193,21 @@ export function PeriodSummaryTable({
165
193
  );
166
194
  }
167
195
 
196
+ /** Replaces only the display currency with matching factual Cost Monitor periods. */
197
+ export function applyFactualPeriodCosts<T extends { key: string; costBrl: number | null }>(
198
+ rows: readonly T[],
199
+ currency: "BRL" | "USD",
200
+ factualRows?: readonly { key: string; estimated_usd: number | null; estimated_brl: number | null }[],
201
+ ): T[] {
202
+ if (factualRows === undefined) return [...rows];
203
+ const costByKey = new Map(
204
+ factualRows.map((row) => [row.key, currency === "USD" ? row.estimated_usd : row.estimated_brl] as const),
205
+ );
206
+ return rows.map((row) =>
207
+ costByKey.has(row.key) ? { ...row, costBrl: costByKey.get(row.key) ?? null } : row,
208
+ );
209
+ }
210
+
168
211
  /** Empty period totals display zero without inventing duration for any Run. */
169
212
  export function periodTotalDurationMs(
170
213
  durationMs: number | null,
@@ -0,0 +1,32 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ const component = source("PrdDocumentDialog.tsx");
5
+ const styles = source("macro-planning-dialog.css");
6
+ const app = source("../../../../apps/frontend/src/App.tsx");
7
+ const traceDocuments = source("../../../../apps/frontend/src/use-app-trace-documents.ts");
8
+ describe("MacroDocumentDialog loading states", () => {
9
+ it("keeps known identity visible before body hydration", () => {
10
+ expect(component).toContain("detail?.title ?? preview.title");
11
+ expect(component).toContain("detail?.id ?? preview.id");
12
+ expect(component).toContain("detail?.artifact_path ?? preview.artifact_path");
13
+ });
14
+ it("includes animated loading and retryable error", () => {
15
+ expect(component).toContain("operations-prd-document-spinner");
16
+ expect(component).toContain("operations-prd-document-skeleton");
17
+ expect(component).toContain("onRetry={onRetry}");
18
+ expect(styles).toContain("@keyframes operations-document-spin");
19
+ expect(styles).toContain("@media (prefers-reduced-motion: reduce)");
20
+ expect(styles).toContain("animation: none");
21
+ });
22
+ it("invalidates an in-flight request when the reader closes", () => {
23
+ expect(app).toContain("useAppTraceDocuments({");
24
+ expect(traceDocuments).toContain("const documentRequestId = useRef(0)");
25
+ expect(traceDocuments).toContain("if (documentRequestId.current !== requestId) return");
26
+ expect(traceDocuments).toContain("documentRequestId.current += 1;");
27
+ expect(traceDocuments).toContain("function closeDocument()");
28
+ });
29
+ });
30
+ function source(file: string): string {
31
+ return readFileSync(new URL(file, import.meta.url), "utf8");
32
+ }
@@ -1,4 +1,4 @@
1
- import { FileText, X } from "lucide-react";
1
+ import { FileText, LoaderCircle, RotateCw, X } from "lucide-react";
2
2
  import { Fragment } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import type { PrdDetailProjection, SpecDetailProjection } from "../contracts.js";
@@ -6,14 +6,22 @@ import type { OperationsLocale } from "./status-labels.js";
6
6
 
7
7
  export function MacroDocumentDialog({
8
8
  detail,
9
+ error,
9
10
  label,
11
+ loading = false,
10
12
  locale,
11
13
  onClose,
14
+ onRetry,
15
+ preview,
12
16
  }: {
13
- detail: PrdDetailProjection | SpecDetailProjection;
17
+ detail: PrdDetailProjection | SpecDetailProjection | undefined;
18
+ error: string | undefined;
14
19
  label: "PRD" | "SPEC";
20
+ loading?: boolean;
15
21
  locale: OperationsLocale;
16
22
  onClose: () => void;
23
+ onRetry: (() => void) | undefined;
24
+ preview: Pick<PrdDetailProjection, "id" | "title" | "artifact_path">;
17
25
  }) {
18
26
  const isPortuguese = locale === "pt-BR";
19
27
  return createPortal(
@@ -35,17 +43,19 @@ export function MacroDocumentDialog({
35
43
  <span>
36
44
  <FileText aria-hidden="true" size={16} /> {label}
37
45
  </span>
38
- <h2>{detail.title}</h2>
39
- <p>{detail.id}</p>
46
+ <h2>{detail?.title ?? preview.title}</h2>
47
+ <p>{detail?.id ?? preview.id}</p>
40
48
  </div>
41
49
  <button aria-label={isPortuguese ? "Fechar" : "Close"} onClick={onClose} type="button">
42
50
  <X aria-hidden="true" size={20} />
43
51
  </button>
44
52
  </header>
45
53
  <div className="operations-prd-document-scroll">
46
- <MarkdownDocument content={detail.body} />
54
+ {detail ? <MarkdownDocument content={detail.body} /> : null}
55
+ {loading ? <DocumentLoading locale={locale} /> : null}
56
+ {error ? <DocumentLoadError error={error} locale={locale} onRetry={onRetry} /> : null}
47
57
  </div>
48
- <footer>{detail.artifact_path}</footer>
58
+ <footer>{detail?.artifact_path ?? preview.artifact_path}</footer>
49
59
  </section>
50
60
  </div>,
51
61
  document.body,
@@ -56,6 +66,52 @@ export function PrdDocumentDialog(props: Omit<Parameters<typeof MacroDocumentDia
56
66
  return <MacroDocumentDialog {...props} label="PRD" />;
57
67
  }
58
68
 
69
+ function DocumentLoading({ locale }: { locale: OperationsLocale }) {
70
+ const isPortuguese = locale === "pt-BR";
71
+ return (
72
+ <section aria-busy="true" aria-live="polite" className="operations-prd-document-loading">
73
+ <div className="operations-prd-document-loading-copy">
74
+ <LoaderCircle aria-hidden="true" className="operations-prd-document-spinner" size={20} />
75
+ <div>
76
+ <strong>{isPortuguese ? "Carregando documento" : "Loading document"}</strong>
77
+ <p>{isPortuguese ? "Preparando a leitura completa…" : "Preparing the full reader…"}</p>
78
+ </div>
79
+ </div>
80
+ <div aria-hidden="true" className="operations-prd-document-skeleton">
81
+ <i />
82
+ <i />
83
+ <i />
84
+ <i />
85
+ </div>
86
+ </section>
87
+ );
88
+ }
89
+
90
+ function DocumentLoadError({
91
+ error,
92
+ locale,
93
+ onRetry,
94
+ }: {
95
+ error: string;
96
+ locale: OperationsLocale;
97
+ onRetry: (() => void) | undefined;
98
+ }) {
99
+ const isPortuguese = locale === "pt-BR";
100
+ return (
101
+ <section aria-live="assertive" className="operations-prd-document-error" role="alert">
102
+ <strong>
103
+ {isPortuguese ? "Não foi possível carregar o documento." : "Unable to load document."}
104
+ </strong>
105
+ <p>{error}</p>
106
+ {onRetry ? (
107
+ <button onClick={onRetry} type="button">
108
+ <RotateCw aria-hidden="true" size={15} /> {isPortuguese ? "Tentar novamente" : "Retry"}
109
+ </button>
110
+ ) : null}
111
+ </section>
112
+ );
113
+ }
114
+
59
115
  type MarkdownBlock =
60
116
  | { kind: "heading"; level: 1 | 2 | 3; content: string }
61
117
  | { kind: "paragraph"; content: string }
@@ -71,6 +71,30 @@ describe("taskTotals", () => {
71
71
  });
72
72
  });
73
73
 
74
+ it("keeps time unavailable while preserving independently known tokens and cost", () => {
75
+ const totals = taskTotals([
76
+ run({ duration_ms: null, status: "completed", tokens: 321, costBrl: 1.75 }),
77
+ ]);
78
+
79
+ expect(totals.get("TASK-1")).toEqual({ durationMs: null, tokens: 321, costBrl: 1.75 });
80
+ });
81
+
82
+ it("counts observed root duration but excludes child-only duration from Task time", () => {
83
+ const root = run({ duration_ms: 60_000, status: "completed", tokens: 1, costBrl: 1 });
84
+ const child = {
85
+ ...run({ duration_ms: 120_000, status: "completed", tokens: 2, costBrl: 2 }),
86
+ id: "RUN-CHILD",
87
+ parent_run_id: root.id,
88
+ run_kind: "subrun" as const,
89
+ };
90
+ expect(taskTotals([root, child]).get("TASK-1")).toEqual({
91
+ durationMs: 60_000,
92
+ tokens: 3,
93
+ costBrl: 3,
94
+ });
95
+ expect(taskTotals([child]).get("TASK-1")).toEqual({ durationMs: null, tokens: 2, costBrl: 2 });
96
+ });
97
+
74
98
  it("does not count an intake Run as Task execution time", () => {
75
99
  const totals = taskTotals([
76
100
  run({
@@ -104,11 +128,40 @@ describe("taskTotals", () => {
104
128
  costBrl: 1.25,
105
129
  });
106
130
  });
131
+
132
+ it("keeps canonical ready-Task metrics when the Run page contains another Task", () => {
133
+ const totals = taskTotals(
134
+ [
135
+ {
136
+ ...run({ duration_ms: 10, status: "completed", tokens: 1, costBrl: 0.01 }),
137
+ id: "RUN-OTHER-TASK",
138
+ task_id: "TASK-OTHER",
139
+ },
140
+ ],
141
+ [
142
+ {
143
+ id: "TASK-READY",
144
+ title: "Prepare dashboard metric correction",
145
+ telemetry: { duration_ms: 0, tokens: 0, cost_brl: 0 },
146
+ } as DashboardTaskProjection,
147
+ {
148
+ id: "TASK-UNKNOWN",
149
+ title: "Await observed telemetry",
150
+ telemetry: { duration_ms: null, tokens: null, cost_brl: null },
151
+ } as DashboardTaskProjection,
152
+ ],
153
+ );
154
+
155
+ expect(totals.get("TASK-READY")).toEqual({ durationMs: 0, tokens: 0, costBrl: 0 });
156
+ expect(totals.get("TASK-UNKNOWN")).toEqual({ durationMs: null, tokens: null, costBrl: null });
157
+ expect(totals.get("TASK-OTHER")).toEqual({ durationMs: 10, tokens: 1, costBrl: 0.01 });
158
+ });
107
159
  });
108
160
 
109
161
  function run({
110
162
  costBrl,
111
163
  duration_ms,
164
+ source_duration_ms = duration_ms,
112
165
  execution_id = "EXEC-1",
113
166
  phase = "execution",
114
167
  started_at = "2026-07-15T03:20:00.000Z",
@@ -117,6 +170,7 @@ function run({
117
170
  }: {
118
171
  costBrl: number | null;
119
172
  duration_ms: number | null;
173
+ source_duration_ms?: number | null;
120
174
  execution_id?: string | null;
121
175
  phase?: string;
122
176
  started_at?: string;
@@ -131,6 +185,7 @@ function run({
131
185
  status,
132
186
  started_at,
133
187
  duration_ms,
188
+ source_duration_ms,
134
189
  usage: {
135
190
  total: {
136
191
  tokens: { total: tokens },
@@ -291,27 +291,35 @@ export function taskTotals(
291
291
  runs: readonly RunProjection[],
292
292
  tasks: readonly DashboardTaskProjection[] = [],
293
293
  ): Map<string, Totals> {
294
- if (runs.length === 0) {
295
- return new Map(
296
- tasks.flatMap((task) =>
297
- task.telemetry === null || task.telemetry === undefined
298
- ? []
299
- : [
300
- [
301
- task.id,
302
- {
303
- durationMs: task.telemetry.duration_ms,
304
- tokens: task.telemetry.tokens,
305
- costBrl: task.telemetry.cost_brl,
306
- },
307
- ] as const,
308
- ],
309
- ),
310
- );
311
- }
312
- const totals = new Map<string, Totals>();
294
+ // The task projection is the complete canonical aggregate. The Run page is
295
+ // intentionally paginated, so it must not replace a known aggregate merely
296
+ // because the page also contains another Task's Run.
297
+ const canonicalTaskIds = new Set(
298
+ tasks
299
+ .filter((task) => task.telemetry !== null && task.telemetry !== undefined)
300
+ .map((task) => task.id),
301
+ );
302
+ const totals = new Map(
303
+ tasks.flatMap((task) =>
304
+ task.telemetry === null || task.telemetry === undefined
305
+ ? []
306
+ : [
307
+ [
308
+ task.id,
309
+ {
310
+ durationMs: task.telemetry.duration_ms,
311
+ tokens: task.telemetry.tokens,
312
+ costBrl: task.telemetry.cost_brl,
313
+ },
314
+ ] as const,
315
+ ],
316
+ ),
317
+ );
313
318
  for (const run of runs) {
314
319
  if (run.task_id === null) continue;
320
+ // Preserve null as unavailable in the canonical projection; neither an
321
+ // unrelated page nor partial Run data may manufacture a metric.
322
+ if (canonicalTaskIds.has(run.task_id)) continue;
315
323
  const current = totals.get(run.task_id) ?? { durationMs: null, tokens: null, costBrl: null };
316
324
  totals.set(run.task_id, {
317
325
  durationMs: sumObserved(