@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,126 @@
1
+ import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
2
+ import { describe, expect, it } from "vitest";
3
+ import type { OperationsEntityPage } from "./dashboard-api.js";
4
+ import { projectEntityPage } from "./operations-entity-page-projection.js";
5
+
6
+ describe("projectEntityPage", () => {
7
+ it("preserves an explicit lifecycle elapsed field without replacing observed duration", () => {
8
+ const page = {
9
+ kind: "executions",
10
+ offset: 0,
11
+ limit: 100,
12
+ total: 1,
13
+ aggregation: "canonical_entity",
14
+ aggregate_complete: true,
15
+ rows: [
16
+ {
17
+ id: "EXEC-1",
18
+ started_at: "2026-08-01T10:00:00Z",
19
+ finished_at: "2026-08-01T12:00:00Z",
20
+ task_id: "TASK-1",
21
+ execution_id: "EXEC-1",
22
+ conversation_id: null,
23
+ parent_run_id: null,
24
+ run_kind: "run",
25
+ phase: "execution",
26
+ status: "completed",
27
+ duration_ms: 60_000,
28
+ lifecycle_elapsed_ms: 7_200_000,
29
+ total_tokens: 42,
30
+ cost: 0.5,
31
+ currency: "BRL",
32
+ },
33
+ ],
34
+ } satisfies OperationsEntityPage;
35
+
36
+ const projected = projectEntityPage(
37
+ { runs: [], executions: [] } as unknown as OperationsProjection,
38
+ "executions",
39
+ page,
40
+ );
41
+ expect((projected.runs[0] as { lifecycle_elapsed_ms?: number }).lifecycle_elapsed_ms).toBe(
42
+ 7_200_000,
43
+ );
44
+ expect(
45
+ (projected.executions[0] as { lifecycle_elapsed_ms?: number }).lifecycle_elapsed_ms,
46
+ ).toBe(7_200_000);
47
+ expect(projected.runs[0]?.source_duration_ms).toBe(60_000);
48
+ });
49
+
50
+ it("preserves delegated invocation identity and auditable pricing columns", () => {
51
+ const page = {
52
+ kind: "runs",
53
+ offset: 0,
54
+ limit: 100,
55
+ total: 1,
56
+ rows: [
57
+ {
58
+ id: "AINV-CHILD",
59
+ started_at: "2026-08-12T12:00:00Z",
60
+ finished_at: null,
61
+ task_id: "TASK-1",
62
+ execution_id: "EXEC-1",
63
+ conversation_id: "CONV-1",
64
+ parent_run_id: "AINV-ROOT",
65
+ run_kind: "subrun",
66
+ run_purpose: "execution",
67
+ phase: "execution",
68
+ status: "completed",
69
+ agent: "zaip-agent-builder",
70
+ provider: "openai",
71
+ model: "gpt-5.6-terra",
72
+ reasoning_effort: "high",
73
+ service_tier: "default",
74
+ duration_ms: 120_000,
75
+ source_duration_ms: null,
76
+ duration_provenance: "estimated",
77
+ llm_call_count: 3,
78
+ input_tokens: 1_000,
79
+ cached_input_tokens: 600,
80
+ uncached_input_tokens: 400,
81
+ output_tokens: 200,
82
+ reasoning_tokens: 50,
83
+ total_tokens: 1_200,
84
+ input_rate_usd_per_million: 2.5,
85
+ cached_input_rate_usd_per_million: 0.25,
86
+ output_rate_usd_per_million: 15,
87
+ context_input_multiplier: 1,
88
+ context_output_multiplier: 1,
89
+ speed_cost_multiplier: 1,
90
+ input_cost_usd: 0.001,
91
+ cached_input_cost_usd: 0.00015,
92
+ output_cost_usd: 0.003,
93
+ reasoning_cost_usd: 0,
94
+ calculated_cost_usd: 0.00415,
95
+ cost_usd: 0.00415,
96
+ cost_variance_usd: 0,
97
+ fx_rate: 5.45,
98
+ cost: 0.0226175,
99
+ currency: "BRL",
100
+ },
101
+ ],
102
+ } satisfies OperationsEntityPage;
103
+
104
+ const projected = projectEntityPage(
105
+ { runs: [], executions: [] } as unknown as OperationsProjection,
106
+ "runs",
107
+ page,
108
+ );
109
+ const row = projected.runs[0]!;
110
+ expect(row.run_kind).toBe("subrun");
111
+ expect(row.run_role).toBe("subagent");
112
+ expect(row.parent_run_id).toBe("AINV-ROOT");
113
+ expect(row.duration_ms).toBe(120_000);
114
+ expect(row.duration_provenance).toBe("estimated");
115
+ expect(row.usage.total.tokens).toEqual({
116
+ input: 1_000,
117
+ cached_input: 600,
118
+ output: 200,
119
+ reasoning: 50,
120
+ total: 1_200,
121
+ });
122
+ expect(row.input_cost_usd! + row.cached_input_cost_usd! + row.output_cost_usd!).toBe(
123
+ row.calculated_cost_usd,
124
+ );
125
+ });
126
+ });
@@ -0,0 +1,181 @@
1
+ import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
2
+ import type { OperationsEntityPage, OperationsEntityPageKind } from "./dashboard-api.js";
3
+
4
+ const emptyUsage = {
5
+ events: 0,
6
+ tokens: { input: null, cached_input: null, output: null, reasoning: null, total: null },
7
+ cost: { usd: null, brl: null },
8
+ coverage: { events: 0, tokens: 0, usd: 0, brl: 0 },
9
+ };
10
+
11
+ export function projectEntityPage(
12
+ current: OperationsProjection,
13
+ kind: OperationsEntityPageKind,
14
+ page: OperationsEntityPage,
15
+ ): OperationsProjection {
16
+ const runPurpose = (value: string | null | undefined) =>
17
+ value === "intake" ||
18
+ value === "orchestration" ||
19
+ value === "execution" ||
20
+ value === "review" ||
21
+ value === "audit" ||
22
+ value === "finalization"
23
+ ? value
24
+ : "execution";
25
+ const runs = page.rows.map((row) => ({
26
+ id: row.id,
27
+ artifact_path: `.agents/records/runs/${row.id}`,
28
+ status:
29
+ row.status === "running" || row.status === "failed" || row.status === "cancelled"
30
+ ? row.status
31
+ : "completed",
32
+ phase: row.phase ?? "execution",
33
+ entrypoint: row.conversation_id !== null ? "conversation" : "task",
34
+ work_type: "new",
35
+ run_role: row.run_kind === "subrun" ? "subagent" : "orchestrator",
36
+ run_kind: row.run_kind ?? "run",
37
+ run_purpose: runPurpose(row.run_purpose),
38
+ requires_finalizer: false,
39
+ parent_run_id: row.parent_run_id,
40
+ client: row.client ?? "unknown",
41
+ agent: row.agent ?? "unknown",
42
+ agent_name: row.agent ?? "unknown",
43
+ agent_persona: row.agent_persona ?? null,
44
+ agent_job: row.agent_job ?? null,
45
+ provider: row.provider ?? null,
46
+ model: row.model ?? "unknown",
47
+ reasoning_effort: row.reasoning_effort ?? null,
48
+ effective_model: row.model ?? null,
49
+ effective_reasoning_effort: row.reasoning_effort ?? null,
50
+ effective_config_mixed: row.pricing_mixed ?? false,
51
+ service_tier: row.service_tier ?? null,
52
+ call_count: row.llm_call_count ?? null,
53
+ terminal_call_count: null,
54
+ failed_call_count: null,
55
+ cancelled_call_count: null,
56
+ conversation_id: row.conversation_id ?? row.id,
57
+ execution_id: row.execution_id,
58
+ task_id: row.task_id,
59
+ spec_id: null,
60
+ prd_id: null,
61
+ change_id: null,
62
+ started_at: row.started_at,
63
+ finished_at: row.finished_at,
64
+ duration_ms: row.duration_ms,
65
+ source_duration_ms:
66
+ row.source_duration_ms === undefined ? row.duration_ms : row.source_duration_ms,
67
+ duration_provenance:
68
+ row.duration_provenance === "observed" ||
69
+ row.duration_provenance === "reconciled" ||
70
+ row.duration_provenance === "legacy_inferred" ||
71
+ row.duration_provenance === "estimated"
72
+ ? row.duration_provenance
73
+ : "unavailable",
74
+ llm_call_count: row.llm_call_count ?? null,
75
+ input_tokens: row.input_tokens ?? null,
76
+ cached_input_tokens: row.cached_input_tokens ?? null,
77
+ uncached_input_tokens: row.uncached_input_tokens ?? null,
78
+ output_tokens: row.output_tokens ?? null,
79
+ reasoning_tokens: row.reasoning_tokens ?? null,
80
+ visible_output_tokens: row.visible_output_tokens ?? null,
81
+ input_rate_usd_per_million: row.input_rate_usd_per_million ?? null,
82
+ cached_input_rate_usd_per_million: row.cached_input_rate_usd_per_million ?? null,
83
+ output_rate_usd_per_million: row.output_rate_usd_per_million ?? null,
84
+ reasoning_rate_usd_per_million: row.reasoning_rate_usd_per_million ?? null,
85
+ context_input_multiplier: row.context_input_multiplier ?? null,
86
+ context_output_multiplier: row.context_output_multiplier ?? null,
87
+ speed_cost_multiplier: row.speed_cost_multiplier ?? null,
88
+ pricing_scenario: row.pricing_scenario ?? null,
89
+ standard_cost_usd: row.standard_cost_usd ?? null,
90
+ speed_uplift_usd: row.speed_uplift_usd ?? null,
91
+ input_cost_usd: row.input_cost_usd ?? null,
92
+ cached_input_cost_usd: row.cached_input_cost_usd ?? null,
93
+ output_cost_usd: row.output_cost_usd ?? null,
94
+ reasoning_cost_usd: row.reasoning_cost_usd ?? null,
95
+ calculated_cost_usd: row.calculated_cost_usd ?? null,
96
+ recorded_cost_usd: row.recorded_cost_usd ?? null,
97
+ cost_variance_usd: row.cost_variance_usd ?? null,
98
+ cost_usd: row.cost_usd ?? null,
99
+ cost_brl: row.currency === "BRL" ? row.cost : null,
100
+ fx_rate: row.fx_rate ?? null,
101
+ pricing_segment_count: row.pricing_segment_count ?? null,
102
+ pricing_mixed: row.pricing_mixed ?? false,
103
+ pricing_model: row.pricing_model ?? null,
104
+ pricing_source: row.pricing_source ?? null,
105
+ ...(row.lifecycle_elapsed_ms === undefined
106
+ ? {}
107
+ : { lifecycle_elapsed_ms: row.lifecycle_elapsed_ms }),
108
+ usage: {
109
+ conversation: emptyUsage,
110
+ planning: emptyUsage,
111
+ execution: {
112
+ ...emptyUsage,
113
+ events: row.llm_call_count ?? 0,
114
+ tokens: {
115
+ input: row.input_tokens ?? null,
116
+ cached_input: row.cached_input_tokens ?? null,
117
+ output: row.output_tokens ?? null,
118
+ reasoning: row.reasoning_tokens ?? null,
119
+ total: row.total_tokens,
120
+ },
121
+ cost: { usd: row.cost_usd ?? null, brl: row.currency === "BRL" ? row.cost : null },
122
+ },
123
+ total: {
124
+ ...emptyUsage,
125
+ events: row.llm_call_count ?? 0,
126
+ tokens: {
127
+ input: row.input_tokens ?? null,
128
+ cached_input: row.cached_input_tokens ?? null,
129
+ output: row.output_tokens ?? null,
130
+ reasoning: row.reasoning_tokens ?? null,
131
+ total: row.total_tokens,
132
+ },
133
+ cost: { usd: row.cost_usd ?? null, brl: row.currency === "BRL" ? row.cost : null },
134
+ },
135
+ new_work: emptyUsage,
136
+ rework: emptyUsage,
137
+ },
138
+ })) as OperationsProjection["runs"];
139
+ return {
140
+ ...current,
141
+ runs,
142
+ executions:
143
+ kind === "executions" || kind === "conversations"
144
+ ? (page.rows.map((row, index) => {
145
+ const run = runs[index]!;
146
+ const id = run.execution_id ?? run.conversation_id;
147
+ const status = row.status ?? "unavailable";
148
+ return {
149
+ id,
150
+ kind: kind === "conversations" ? "interaction" : "delivery",
151
+ created_at: run.started_at,
152
+ status,
153
+ work_status: status,
154
+ origin:
155
+ kind === "conversations"
156
+ ? { type: "interaction", conversation_id: run.conversation_id }
157
+ : { type: "task", task_id: run.task_id ?? "unavailable" },
158
+ dag: { nodes: [], topological_order: [] },
159
+ result: null,
160
+ artifact_path: `.agents/records/executions/${id}`,
161
+ agent_call_count: 0,
162
+ orchestrator_run_count: 0,
163
+ subagent_run_count: 0,
164
+ finalizer_run_count: 0,
165
+ finalized_task_count: 0,
166
+ llm_call_count: 0,
167
+ llm_call_count_complete: false,
168
+ task_count: 0,
169
+ spec_count: 0,
170
+ prd_count: 0,
171
+ duration_ms: run.source_duration_ms ?? null,
172
+ ...(row.lifecycle_elapsed_ms === undefined
173
+ ? {}
174
+ : { lifecycle_elapsed_ms: row.lifecycle_elapsed_ms }),
175
+ total_tokens: run.usage.total.tokens.total,
176
+ cost_brl: run.usage.total.cost.brl,
177
+ };
178
+ }) as OperationsProjection["executions"])
179
+ : current.executions,
180
+ };
181
+ }
@@ -0,0 +1,138 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ isCurrentOperationsPageRequest,
4
+ isCurrentOperationsPeriodRequest,
5
+ isCurrentPeriodTransition,
6
+ mergeBoardPages,
7
+ } from "./App.js";
8
+ import { requestPeriodForOperations } from "./operations-period.js";
9
+
10
+ describe("Operations period request contract", () => {
11
+ const range = { start: "2026-08-07", end: "2026-08-08" };
12
+
13
+ it.each([
14
+ "today",
15
+ "yesterday",
16
+ "this-week",
17
+ "last-week",
18
+ "this-month",
19
+ "last-month",
20
+ "last-3-months",
21
+ "last-6-months",
22
+ "this-year",
23
+ "last-year",
24
+ "custom",
25
+ ] as const)("sends the displayed bounds for %s", (preset) => {
26
+ expect(requestPeriodForOperations({ preset, range })).toEqual({
27
+ from: "2026-08-07",
28
+ to: "2026-08-08",
29
+ });
30
+ });
31
+
32
+ it("keeps a Sao Paulo date-only range intact across UTC midnight", () => {
33
+ expect(
34
+ requestPeriodForOperations({
35
+ preset: "custom",
36
+ range: { start: "2026-08-07", end: "2026-08-08" },
37
+ }),
38
+ ).toEqual({ from: "2026-08-07", to: "2026-08-08" });
39
+ expect(requestPeriodForOperations({ preset: "all", range })).toEqual({ from: null, to: null });
40
+ });
41
+
42
+ it("keeps the latest Today/Yesterday selection when rapid requests resolve out of order", () => {
43
+ const today = { start: "2026-08-08", end: "2026-08-08" };
44
+ const yesterday = { start: "2026-08-07", end: "2026-08-07" };
45
+ const selected = { from: yesterday.start, to: yesterday.end };
46
+
47
+ expect(requestPeriodForOperations({ preset: "today", range: today })).toEqual({
48
+ from: today.start,
49
+ to: today.end,
50
+ });
51
+ expect(requestPeriodForOperations({ preset: "yesterday", range: yesterday })).toEqual(selected);
52
+ expect(
53
+ isCurrentOperationsPeriodRequest(1, 2, { from: today.start, to: today.end }, selected),
54
+ ).toBe(false);
55
+ expect(isCurrentOperationsPeriodRequest(2, 2, selected, selected)).toBe(true);
56
+ expect(isCurrentPeriodTransition(1, 2)).toBe(false);
57
+ expect(isCurrentPeriodTransition(2, 2)).toBe(true);
58
+ });
59
+
60
+ it("does not let an older reply hide the newer period overlay", () => {
61
+ let overlayVisible = true;
62
+ const settle = (responseVersion: number, activeVersion: number) => {
63
+ if (isCurrentPeriodTransition(responseVersion, activeVersion)) overlayVisible = false;
64
+ };
65
+
66
+ settle(1, 2);
67
+ expect(overlayVisible).toBe(true);
68
+ settle(2, 2);
69
+ expect(overlayVisible).toBe(false);
70
+ });
71
+
72
+ it("applies only C when A -> B -> C replies complete in reverse order", async () => {
73
+ const a = { from: "2026-06-01", to: "2026-06-30" };
74
+ const b = { from: "2026-07-01", to: "2026-07-31" };
75
+ const c = { from: "2026-08-01", to: "2026-08-31" };
76
+ const pending = [a, b, c].map(() => Promise.withResolvers<void>());
77
+ const applied: string[] = [];
78
+ const reply = async (version: number, period: typeof a, label: string, slot: number) => {
79
+ await pending[slot]!.promise;
80
+ if (isCurrentOperationsPeriodRequest(version, 3, period, c)) applied.push(label);
81
+ };
82
+ const requests = [reply(1, a, "A", 0), reply(2, b, "B", 1), reply(3, c, "C", 2)];
83
+
84
+ pending[2]!.resolve();
85
+ pending[1]!.resolve();
86
+ pending[0]!.resolve();
87
+ await Promise.all(requests);
88
+
89
+ expect(applied).toEqual(["C"]);
90
+ });
91
+
92
+ it("aborts and rejects an older entity filter/page reply", async () => {
93
+ const pending = [Promise.withResolvers<void>(), Promise.withResolvers<void>()];
94
+ const oldRequest = new AbortController();
95
+ const currentRequest = new AbortController();
96
+ const applied: string[] = [];
97
+ const reply = async (
98
+ version: number,
99
+ label: string,
100
+ controller: AbortController,
101
+ slot: number,
102
+ ) => {
103
+ await pending[slot]!.promise;
104
+ if (isCurrentOperationsPageRequest(version, 2, controller.signal)) applied.push(label);
105
+ };
106
+ const requests = [
107
+ reply(1, "old-filter-page", oldRequest, 0),
108
+ reply(2, "new-filter-page", currentRequest, 1),
109
+ ];
110
+
111
+ oldRequest.abort();
112
+ pending[1]!.resolve();
113
+ pending[0]!.resolve();
114
+ await Promise.all(requests);
115
+
116
+ expect(applied).toEqual(["new-filter-page"]);
117
+ });
118
+
119
+ it("does not replace quick overview charts when a board page arrives", () => {
120
+ const quick = {
121
+ prds: [],
122
+ specs: [],
123
+ tasks: [],
124
+ changes: [],
125
+ summary: { overview_metrics: { partial: false, total_tasks: 5 } },
126
+ } as any;
127
+ const board = {
128
+ prds: [],
129
+ specs: [],
130
+ tasks: [{ id: "TASK-1" }],
131
+ changes: [],
132
+ overview_metrics: { partial: false, total_tasks: 999 },
133
+ } as any;
134
+ expect(mergeBoardPages(quick, [board]).summary.overview_metrics).toEqual(
135
+ quick.summary.overview_metrics,
136
+ );
137
+ });
138
+ });
@@ -0,0 +1,105 @@
1
+ import { readFileSync } from "node:fs";
2
+ import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
3
+ import { OperationsPage } from "@zaip-ai/dashboard-operations/react";
4
+ import { createElement } from "react";
5
+ import { renderToStaticMarkup } from "react-dom/server";
6
+ import { describe, expect, it, vi } from "vitest";
7
+ import { PeriodTransitionOverlay, PeriodTransitionShell } from "./App.js";
8
+
9
+ const data = {
10
+ prds: [],
11
+ specs: [],
12
+ tasks: [],
13
+ changes: [],
14
+ decisions: [],
15
+ executions: [],
16
+ runs: [],
17
+ filters: {},
18
+ summary: { source_latest_at: null, periods: { daily: {} } },
19
+ } as unknown as OperationsProjection;
20
+
21
+ function renderPeriod(preset: "today" | "yesterday", loading = false) {
22
+ return renderToStaticMarkup(
23
+ createElement(OperationsPage, {
24
+ capabilityNavigation: createElement("span"),
25
+ data,
26
+ datePreset: preset,
27
+ dateRange: {
28
+ start: preset === "today" ? "2026-08-08" : "2026-08-07",
29
+ end: preset === "today" ? "2026-08-08" : "2026-08-07",
30
+ },
31
+ loading,
32
+ currency: "BRL",
33
+ locale: "pt-BR",
34
+ onDateChange: vi.fn(),
35
+ onLocaleChange: vi.fn(),
36
+ onOpenDocument: vi.fn(),
37
+ onOpenTask: vi.fn(async () => false),
38
+ onPriorityChange: vi.fn(async () => undefined),
39
+ onRefresh: vi.fn(),
40
+ }),
41
+ );
42
+ }
43
+
44
+ describe("App-owned Operations period render", () => {
45
+ it("renders Today then Yesterday while loading omits duplicated period controls", () => {
46
+ const today = renderPeriod("today");
47
+ const yesterdayLoading = renderPeriod("yesterday", true);
48
+
49
+ expect(today).toContain('option value="today" selected=""');
50
+ expect(yesterdayLoading).not.toContain('aria-label="Período"');
51
+ expect(yesterdayLoading).not.toContain("operations-loading-period");
52
+ expect(yesterdayLoading).toContain("operations-content-skeleton");
53
+ expect(yesterdayLoading).not.toContain("DashboardSkeleton");
54
+ });
55
+
56
+ it("renders the synchronous full-viewport transition overlay accessibly", () => {
57
+ const overlay = renderToStaticMarkup(createElement(PeriodTransitionOverlay));
58
+
59
+ expect(overlay).toContain('class="period-transition-overlay"');
60
+ expect(overlay).toContain('role="status"');
61
+ expect(overlay).toContain('aria-live="polite"');
62
+ expect(overlay).toContain('aria-busy="true"');
63
+ expect(overlay).toContain('aria-hidden="true"');
64
+ expect(overlay).toContain("Carregando...");
65
+ });
66
+
67
+ it("makes the complete app shell inert only while the overlay is pending", () => {
68
+ const active = renderToStaticMarkup(
69
+ createElement(
70
+ PeriodTransitionShell,
71
+ { pending: true },
72
+ createElement("select", { "aria-label": "background period" }),
73
+ ),
74
+ );
75
+ const restored = renderToStaticMarkup(
76
+ createElement(
77
+ PeriodTransitionShell,
78
+ { pending: false },
79
+ createElement("select", { "aria-label": "background period" }),
80
+ ),
81
+ );
82
+
83
+ expect(active).toContain("inert");
84
+ expect(active).toContain('aria-hidden="true"');
85
+ expect(restored).not.toContain("inert");
86
+ expect(restored).not.toContain('aria-hidden="true"');
87
+ });
88
+
89
+ it("uses the design overlay, cyan spinner, and reduced-motion rule", () => {
90
+ const css = readFileSync(new URL("./period-transition-overlay.css", import.meta.url), "utf8");
91
+ expect(css).toContain("inset: 0;");
92
+ expect(css).toContain("#0a0e17");
93
+ expect(css).toContain("#00b0f0");
94
+ expect(css).toContain("prefers-reduced-motion: reduce");
95
+ });
96
+
97
+ it("uses the same global loading gate for snapshot, page, and board requests", () => {
98
+ const app = readFileSync(new URL("./App.tsx", import.meta.url), "utf8");
99
+ expect(app).toContain("const globalLoadingPending =");
100
+ expect(app).toContain("loadingArea !== null");
101
+ expect(app).toContain("entityPage.loading");
102
+ expect(app).toContain("Object.values(boardStates).some((state) => state.loading)");
103
+ expect(app).toContain("<PeriodTransitionShell pending={globalLoadingPending}>");
104
+ });
105
+ });
@@ -2,9 +2,12 @@ import { describe, expect, it } from "vitest";
2
2
  import { defaultOperationsPeriod, requestPeriodForOperations } from "./operations-period.js";
3
3
 
4
4
  describe("dashboard default Operations period", () => {
5
- it("keeps the complete history unbounded at an August rollover", () => {
6
- expect(defaultOperationsPeriod.preset).toBe("all");
7
- expect(requestPeriodForOperations(defaultOperationsPeriod)).toEqual({ from: null, to: null });
5
+ it("opens in This Month with its visible date bounds", () => {
6
+ expect(defaultOperationsPeriod.preset).toBe("this-month");
7
+ expect(requestPeriodForOperations(defaultOperationsPeriod)).toEqual({
8
+ from: defaultOperationsPeriod.range.start,
9
+ to: defaultOperationsPeriod.range.end,
10
+ });
8
11
  });
9
12
 
10
13
  it("keeps an explicit Sao Paulo This Month selection bounded", () => {
@@ -1,17 +1,21 @@
1
- import type { OperationDatePreset, OperationDateRange } from "@zaip-ai/dashboard-operations/react";
1
+ import {
2
+ dateRangeForPreset,
3
+ type OperationDatePreset,
4
+ type OperationDateRange,
5
+ } from "@zaip-ai/dashboard-operations/react";
2
6
 
3
7
  export interface OperationsPeriodState {
4
8
  preset: OperationDatePreset;
5
9
  range: OperationDateRange;
6
10
  }
7
11
 
8
- /** The dashboard opens over the complete project history. */
12
+ /** Operations opens on the current Sao Paulo month, like every dashboard tab. */
9
13
  export const defaultOperationsPeriod: OperationsPeriodState = {
10
- preset: "all",
11
- range: { start: "", end: "" },
14
+ preset: "this-month",
15
+ range: dateRangeForPreset("this-month"),
12
16
  };
13
17
 
14
- /** Only an explicit period selection may add API date bounds. */
18
+ /** Every period other than All Time carries the bounds shown in Operations. */
15
19
  export function requestPeriodForOperations(period: OperationsPeriodState): {
16
20
  from: string | null;
17
21
  to: string | null;
@@ -0,0 +1,24 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ const source = readFileSync(new URL("./App.tsx", import.meta.url), "utf8");
5
+
6
+ describe("overview status page loading", () => {
7
+ it("requests a dedicated stage and kind page instead of reusing the mixed board page", () => {
8
+ expect(source).toContain("const loadOverviewStatusPage");
9
+ expect(source).toContain("api.operationsBoard(period, stage, offset, { kind })");
10
+ expect(source).toContain("kind === \"task\" ? page.tasks : kind === \"spec\" ? page.specs : page.prds");
11
+ });
12
+
13
+ it("keeps a dedicated collection paginated by the loaded typed rows", () => {
14
+ expect(source).toContain("overviewStatusPages");
15
+ expect(source).toContain("offset === 0 ? items");
16
+ expect(source).toContain("...(previous[key]?.items ?? []), ...items");
17
+ });
18
+
19
+ it("loads the classification dialog from its canonical kind and classification page", () => {
20
+ expect(source).toContain("const loadOverviewClassificationPage");
21
+ expect(source).toContain("api.operationsClassification(period, kind, classification, offset)");
22
+ expect(source).toContain("overviewClassificationPages");
23
+ });
24
+ });
@@ -0,0 +1,44 @@
1
+ .period-transition-overlay {
2
+ align-items: center;
3
+ background: #0a0e17;
4
+ color: #f1f5f9;
5
+ display: flex;
6
+ font-family: Inter, ui-sans-serif, system-ui, sans-serif;
7
+ inset: 0;
8
+ justify-content: center;
9
+ position: fixed;
10
+ z-index: 9999;
11
+ }
12
+
13
+ .period-transition-overlay__content {
14
+ align-items: center;
15
+ display: flex;
16
+ gap: 16px;
17
+ }
18
+
19
+ .period-transition-overlay__spinner {
20
+ animation: period-transition-spin 800ms linear infinite;
21
+ border: 3px solid rgba(241, 245, 249, 0.28);
22
+ border-radius: 999px;
23
+ border-top-color: #00b0f0;
24
+ height: 32px;
25
+ width: 32px;
26
+ }
27
+
28
+ .period-transition-overlay__label {
29
+ font-size: clamp(1rem, 3vw, 1.25rem);
30
+ font-weight: 700;
31
+ }
32
+
33
+ @keyframes period-transition-spin {
34
+ to {
35
+ transform: rotate(360deg);
36
+ }
37
+ }
38
+
39
+ @media (prefers-reduced-motion: reduce) {
40
+ .period-transition-overlay__spinner {
41
+ animation: none;
42
+ border-top-color: #00b0f0;
43
+ }
44
+ }