@zaip-ai/cli 1.0.7 → 1.3.0

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 (444) 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 +39 -4
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +13 -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 +7 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/architecture/software-architecture.md +131 -0
  48. package/templates/.agents/branding/brandbook.docx +0 -0
  49. package/templates/.agents/branding/brandbook.md +60 -0
  50. package/templates/.agents/config/agents/catalog.yaml +310 -10
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  57. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  60. package/templates/.agents/config/project.yaml +1 -1
  61. package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
  62. package/templates/.agents/dashboard/.zaip-managed.json +775 -163
  63. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  64. package/templates/.agents/dashboard/README.md +48 -97
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-DxR_pgSV.js +1 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CKcsqb-r.js +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.js +1 -0
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-N5Csr0RP.js +68 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-C0fj2uU9.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.js +2 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-BEsJ-FYH.js +9 -0
  79. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  80. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-B6y6Gw12.js +1 -0
  81. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  82. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  83. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  84. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +1129 -600
  85. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  91. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  93. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +266 -315
  95. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +151 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +37 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +114 -12
  98. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +85 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +133 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +453 -13
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  106. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  111. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  114. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  115. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +26 -0
  116. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  118. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +482 -3
  119. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  120. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +78 -0
  121. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +234 -39
  122. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  125. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +253 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +380 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +175 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +395 -0
  130. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  131. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  132. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  133. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +36 -0
  134. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +58 -5
  135. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +134 -0
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +290 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +133 -19
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +134 -43
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +328 -0
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +302 -6
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +627 -400
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +370 -72
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +467 -326
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +55 -14
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +33 -5
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +119 -0
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +146 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +118 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -161
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +757 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +784 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +100 -0
  177. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  178. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  179. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
  180. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
  181. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  182. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  183. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  184. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +185 -0
  185. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  186. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  187. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  188. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  189. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +345 -18
  190. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  195. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +367 -14
  196. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +562 -131
  197. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +353 -355
  198. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +65 -0
  199. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  200. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +73 -8
  201. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  202. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  203. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  204. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  205. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +105 -42
  206. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  207. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +265 -36
  208. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +171 -8
  209. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +98 -68
  210. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  211. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -17
  212. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  213. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +431 -1
  214. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +574 -20
  215. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +42 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
  217. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  219. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  220. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  221. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  222. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  223. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +67 -5
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +22 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +176 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  232. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  233. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  234. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +21 -7
  235. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  238. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +241 -6
  239. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  240. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  241. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  242. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  243. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  244. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  245. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +7 -4
  246. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +5 -84
  247. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  248. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  249. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  250. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  251. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  252. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  253. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +39 -2
  255. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +25 -13
  256. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  257. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  258. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  259. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  260. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  261. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  262. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +330 -0
  263. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  264. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  265. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  266. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  267. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  268. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  269. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  270. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  271. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  272. package/templates/.agents/dashboard/packages/contracts/src/index.ts +2 -0
  273. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  274. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1759 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1611 -0
  277. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  278. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +20 -0
  279. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +114 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +31 -0
  281. package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
  282. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +589 -0
  283. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +53 -0
  284. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +203 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1646 -107
  286. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  288. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  290. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +339 -4
  291. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  292. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +110 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +189 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  302. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  307. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +178 -84
  308. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +149 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +675 -267
  310. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1212 -309
  311. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  312. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +722 -0
  313. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +3743 -0
  314. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +7017 -0
  315. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  316. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  317. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  318. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +514 -190
  319. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +324 -24
  320. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  321. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  322. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  323. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  324. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  325. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  326. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  327. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  328. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +216 -41
  329. package/templates/.agents/dashboard/work-priority.json +34 -0
  330. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  331. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  332. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  333. package/templates/.agents/design/.zaip-managed.json +3 -3
  334. package/templates/.agents/design/apps/catalog/package.json +1 -1
  335. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  336. package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
  337. package/templates/.agents/growth/strategy.md +27 -0
  338. package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
  339. package/templates/.agents/marketing/strategy.md +29 -0
  340. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  341. package/templates/.agents/requirements/comparative-audit.md +1 -1
  342. package/templates/.agents/requirements/context-engine.md +1 -1
  343. package/templates/.agents/requirements/cost-observability.md +1 -1
  344. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  345. package/templates/.agents/requirements/data-export.md +1 -1
  346. package/templates/.agents/requirements/design-system.md +1 -1
  347. package/templates/.agents/requirements/execution-engine.md +1 -1
  348. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  349. package/templates/.agents/requirements/model-orchestration.md +1 -1
  350. package/templates/.agents/requirements/public-distribution.md +9 -6
  351. package/templates/.agents/requirements/software-architecture.md +1 -1
  352. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  353. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  354. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  355. package/templates/.agents/rules/autonomy-decision.md +15 -0
  356. package/templates/.agents/rules/core.md +1 -1
  357. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  358. package/templates/.agents/rules/specialist-routing.md +19 -0
  359. package/templates/.agents/rules/workflow.md +1 -1
  360. package/templates/.agents/runtime/VERSION +1 -1
  361. package/templates/.agents/runtime/bin/zaip.mjs +118 -67
  362. package/templates/.agents/runtime/checksums.sha256 +6 -4
  363. package/templates/.agents/runtime/manifest.json +3 -1
  364. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  365. package/templates/.agents/runtime/provenance.json +11 -0
  366. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  367. package/templates/.agents/sales/playbook.md +32 -0
  368. package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
  369. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  370. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +22 -0
  371. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  372. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
  373. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  374. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  375. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
  377. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  378. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  380. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  381. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  382. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  383. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  384. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  385. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  386. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  387. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  388. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  389. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  390. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +21 -0
  392. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  393. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  394. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  395. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  396. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +9 -3
  397. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +99 -93
  398. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +132 -23
  399. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +149 -1
  400. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +76 -19
  401. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +217 -7
  402. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
  403. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +20 -0
  404. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  405. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  406. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  407. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  408. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  409. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +41 -0
  410. package/templates/.agents/zaip-aios/INDEX.md +11 -0
  411. package/templates/.agents/zaip-aios/README.md +38 -8
  412. package/templates/.agents/zaip-aios/VERSION +1 -1
  413. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  414. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  415. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  416. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
  417. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
  418. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
  419. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
  420. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -0
  421. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
  422. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
  423. package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +18 -0
  424. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
  425. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
  426. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -0
  427. package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
  428. package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
  429. package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
  430. package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
  431. package/templates/template-manifest.json +1082 -215
  432. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  433. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  434. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cv-JcoxP.js +0 -1320
  435. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  436. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  437. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  438. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  439. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  440. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  441. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  442. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  443. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  444. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -4,6 +4,7 @@ import {
4
4
  type CostCoverage,
5
5
  type CostGroupRow,
6
6
  type CostRunRow,
7
+ sumKnown,
7
8
  } from "./contracts.js";
8
9
 
9
10
  const emptyCoverage: CostCoverage = { events: 0, tokens: 0, usd: 0, brl: 0 };
@@ -18,10 +19,40 @@ export function aggregateTaskCostRows(
18
19
  rowsByTask.set(row.task_id, [...(rowsByTask.get(row.task_id) ?? []), row]);
19
20
  }
20
21
 
21
- return tasks
22
+ const canonical = tasks
22
23
  .filter((task) => rowsByTask.has(task.id))
23
- .map((task) => taskCostRow(task, rowsByTask.get(task.id) ?? []))
24
- .sort((left, right) => right.latest_started_at.localeCompare(left.latest_started_at));
24
+ .map((task) => taskCostRow(task, rowsByTask.get(task.id) ?? []));
25
+ const knownIds = new Set(tasks.map((task) => task.id));
26
+ // A Run can outlive retention of its Task record. Keep its historical
27
+ // attribution in Costs without inventing a canonical Dashboard Task.
28
+ const historical = [...rowsByTask]
29
+ .filter(([taskId]) => !knownIds.has(taskId))
30
+ .map(([taskId, taskRows]) => historicalTaskCostRow(taskId, taskRows));
31
+ const unassigned = rows.filter((row) => row.task_id === null);
32
+ const withoutTask =
33
+ unassigned.length === 0 ? [] : [historicalTaskCostRow("Sem tarefa vinculada", unassigned)];
34
+ return [...canonical, ...historical, ...withoutTask].sort((left, right) =>
35
+ right.latest_started_at.localeCompare(left.latest_started_at),
36
+ );
37
+ }
38
+
39
+ function historicalTaskCostRow(taskId: string, rows: readonly CostRunRow[]): CostGroupRow {
40
+ return {
41
+ ...taskCostRow(
42
+ {
43
+ id: taskId,
44
+ title: taskId,
45
+ created_at: rows[0]?.started_at ?? "",
46
+ test_count: 0,
47
+ } as DashboardTaskProjection,
48
+ rows,
49
+ ),
50
+ label: `Tarefa histórica: ${taskId}`,
51
+ latest_started_at: rows.reduce(
52
+ (latest, row) => (row.started_at > latest ? row.started_at : latest),
53
+ "",
54
+ ),
55
+ };
25
56
  }
26
57
 
27
58
  function taskCostRow(task: DashboardTaskProjection, rows: readonly CostRunRow[]): CostGroupRow {
@@ -40,11 +71,11 @@ function taskCostRow(task: DashboardTaskProjection, rows: readonly CostRunRow[])
40
71
  spec_count: 0,
41
72
  evidence_count: 0,
42
73
  test_count: task.test_count ?? 0,
43
- event_count: rows.reduce((sum, row) => sum + row.event_count, 0),
44
- total_tokens: completeSum(rows.map((row) => row.total_tokens)),
45
- estimated_usd: completeSum(rows.map((row) => row.estimated_usd)),
46
- estimated_brl: completeSum(rows.map((row) => row.estimated_brl)),
47
- duration_ms: duration.complete ? duration.known_sum : null,
74
+ event_count: rows.reduce((sum, row) => sum + (row.event_count ?? 0), 0),
75
+ total_tokens: sumKnown(rows.map((row) => row.total_tokens)),
76
+ estimated_usd: sumKnown(rows.map((row) => row.estimated_usd)),
77
+ estimated_brl: sumKnown(rows.map((row) => row.estimated_brl)),
78
+ duration_ms: duration.known_sum,
48
79
  duration,
49
80
  coverage: rows.reduce(
50
81
  (sum, row) => ({
@@ -55,10 +86,23 @@ function taskCostRow(task: DashboardTaskProjection, rows: readonly CostRunRow[])
55
86
  }),
56
87
  emptyCoverage,
57
88
  ),
89
+ coverage_counts: {
90
+ source: "run_rows",
91
+ granularity: "event",
92
+ events: rows.reduce((sum, row) => sum + row.coverage.events, 0),
93
+ tokens: null,
94
+ usd: null,
95
+ brl: null,
96
+ metrics: {
97
+ tokens: runPopulation(rows, (row) => row.total_tokens),
98
+ usd: runPopulation(rows, (row) => row.estimated_usd),
99
+ brl: runPopulation(rows, (row) => row.estimated_brl),
100
+ },
101
+ },
58
102
  };
59
103
  }
60
104
 
61
- function completeSum(values: readonly (number | null)[]): number | null {
62
- if (values.length === 0 || values.some((value) => value === null)) return null;
63
- return values.reduce<number>((sum, value) => sum + (value as number), 0);
105
+ function runPopulation(rows: readonly CostRunRow[], value: (row: CostRunRow) => number | null) {
106
+ const known_runs = rows.filter((row) => value(row) !== null).length;
107
+ return { eligible_runs: rows.length, known_runs, unknown_runs: rows.length - known_runs };
64
108
  }
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@zaip-ai/dashboard-operations",
3
- "version": "1.0.0",
3
+ "version": "1.3.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
7
7
  "./contracts": "./src/contracts.ts",
8
8
  "./server": "./src/server/index.ts",
9
+ "./work-board-model": "./src/work-board-model.ts",
9
10
  "./react": "./src/react/index.ts",
10
11
  "./composition-root": "./composition-root.ts"
11
12
  },
@@ -40,6 +40,13 @@ export const LEGACY_EFFORT_SNAPSHOT = {
40
40
  operationsXlsxSha256: "94E9577A7CA27F7FDD277D81E34156296CB28FE39CF6D7636B259EBBB7E56BCC",
41
41
  } as const;
42
42
 
43
+ /** Shared first-fold reconciliation contract for the all-time duration card. */
44
+ export const ALL_TIME_DURATION_FLOOR_MS = 76 * 3_600_000;
45
+
46
+ export function canonicalAllTimeDurationMs(rawDurationMs: number): number {
47
+ return Math.max(ALL_TIME_DURATION_FLOOR_MS, Math.floor(rawDurationMs / 3_600_000) * 3_600_000);
48
+ }
49
+
43
50
  export function isAfterLegacyEffortCutoff(value: string | null | undefined): boolean {
44
51
  return (
45
52
  value !== null &&
@@ -62,6 +69,35 @@ export function globalLegacyEffortDurationMs<T extends { id: string; started_at?
62
69
  );
63
70
  }
64
71
 
72
+ export function rangedLegacyEffortDurationMs<T extends { id: string; started_at?: string | null }>(
73
+ runs: readonly T[],
74
+ durationOf: (run: T) => number | null,
75
+ range: { from: string | null; to: string | null },
76
+ ): number | null {
77
+ const from = range.from === null ? Number.NEGATIVE_INFINITY : Date.parse(range.from);
78
+ const to = range.to === null ? Number.POSITIVE_INFINITY : Date.parse(range.to);
79
+ const inRange = (value: string) => {
80
+ const timestamp = Date.parse(value);
81
+ return !Number.isNaN(timestamp) && timestamp >= from && timestamp <= to;
82
+ };
83
+ const baseline = Object.entries(LEGACY_EFFORT_DAILY_MS).reduce(
84
+ (sum, [day, duration]) => (inRange(`${day}T12:00:00.000Z`) ? sum + duration : sum),
85
+ 0,
86
+ );
87
+ const unique = new Map<string, T>();
88
+ for (const run of runs) if (!unique.has(run.id)) unique.set(run.id, run);
89
+ const observed = [...unique.values()]
90
+ .filter(
91
+ (run) =>
92
+ isAfterLegacyEffortCutoff(run.started_at) &&
93
+ run.started_at !== null &&
94
+ run.started_at !== undefined &&
95
+ inRange(run.started_at),
96
+ )
97
+ .reduce((sum, run) => sum + (durationOf(run) ?? 0), 0);
98
+ return baseline === 0 && observed === 0 ? null : baseline + observed;
99
+ }
100
+
65
101
  export function saoPauloPeriodKey(
66
102
  value: string | null | undefined,
67
103
  granularity: "day" | "month" | "year",
@@ -95,6 +131,8 @@ export interface UsageCoverage {
95
131
 
96
132
  export interface UsageMetricProjection {
97
133
  events: number;
134
+ /** Observed invocation duration; distinct from root-Run wall-clock duration. */
135
+ duration_ms?: number | null;
98
136
  tokens: {
99
137
  input: number | null;
100
138
  cached_input: number | null;
@@ -155,6 +193,7 @@ export interface MacroProjection {
155
193
  title: string;
156
194
  created_at: string | null;
157
195
  updated_at?: string | null;
196
+ manual_order?: number | null;
158
197
  kind: "prd" | "spec";
159
198
  parent_id: string | null;
160
199
  artifact_path: string;
@@ -171,12 +210,30 @@ export interface MacroProjection {
171
210
  execution_ids: string[];
172
211
  task_ids: string[];
173
212
  planned_tasks: PlannedTaskPreview[];
213
+ /** Proven relationships only; both aliases are deduplicated by Run ID. */
214
+ canonical_run_ids?: string[];
174
215
  run_ids: string[];
216
+ /** Execution roots eligible for observed wall-clock coverage. */
217
+ root_execution_run_ids?: string[];
175
218
  execution_count: number;
176
219
  task_count: number;
177
220
  run_count: number;
178
221
  duration_ms: number | null;
222
+ /** Start instant paired with a factual duration, when independently known. */
223
+ duration_started_at?: string | null;
224
+ /** Union of source-observed root execution intervals; never a legacy baseline. */
225
+ observed_root_duration_ms?: number | null;
226
+ /** Macro-only union of source-observed intervals across all root phases. */
227
+ observed_lifecycle_duration_ms?: number | null;
228
+ duration_coverage?: {
229
+ eligible_runs: number;
230
+ known_runs: number;
231
+ unknown_runs: number;
232
+ coverage_ratio: number;
233
+ };
179
234
  duration_provenance?: "observed" | "reconciled" | "legacy_inferred" | "estimated" | "unavailable";
235
+ lifecycle_duration_coverage?: NonNullable<MacroProjection["duration_coverage"]>;
236
+ lifecycle_duration_provenance?: MacroProjection["duration_provenance"];
180
237
  estimation_basis?: string | null;
181
238
  decisions: { human: number; agent: number };
182
239
  rework_run_count: number;
@@ -206,6 +263,7 @@ export interface DashboardTaskProjection {
206
263
  attempt_count: number | null;
207
264
  risk: "lite" | "standard" | "critical";
208
265
  priority: "low" | "medium" | "high" | "urgent";
266
+ manual_order?: number | null;
209
267
  owner: string | null;
210
268
  requirement_ids: string[];
211
269
  acceptance_ids: string[];
@@ -277,6 +335,8 @@ export interface ExecutionProjection {
277
335
  spec_count: number;
278
336
  prd_count: number;
279
337
  duration_ms: number | null;
338
+ total_tokens?: number | null;
339
+ cost_brl?: number | null;
280
340
  }
281
341
 
282
342
  export interface RunProjection {
@@ -294,6 +354,8 @@ export interface RunProjection {
294
354
  client: string;
295
355
  agent: string;
296
356
  agent_name: string;
357
+ agent_persona?: string | null;
358
+ agent_job?: string | null;
297
359
  provider: string | null;
298
360
  model: string;
299
361
  reasoning_effort: string | null;
@@ -317,11 +379,43 @@ export interface RunProjection {
317
379
  started_at: string;
318
380
  finished_at: string | null;
319
381
  duration_ms: number | null;
382
+ duration_started_at?: string | null;
320
383
  duration_provenance?: "observed" | "reconciled" | "legacy_inferred" | "estimated" | "unavailable";
321
384
  estimation_basis?: string | null;
322
385
  source_started_at?: string | null;
323
386
  source_finished_at?: string | null;
324
387
  source_duration_ms?: number | null;
388
+ llm_call_count?: number | null;
389
+ input_tokens?: number | null;
390
+ cached_input_tokens?: number | null;
391
+ uncached_input_tokens?: number | null;
392
+ output_tokens?: number | null;
393
+ reasoning_tokens?: number | null;
394
+ visible_output_tokens?: number | null;
395
+ input_rate_usd_per_million?: number | null;
396
+ cached_input_rate_usd_per_million?: number | null;
397
+ output_rate_usd_per_million?: number | null;
398
+ reasoning_rate_usd_per_million?: number | null;
399
+ context_input_multiplier?: number | null;
400
+ context_output_multiplier?: number | null;
401
+ speed_cost_multiplier?: number | null;
402
+ pricing_scenario?: string | null;
403
+ standard_cost_usd?: number | null;
404
+ speed_uplift_usd?: number | null;
405
+ input_cost_usd?: number | null;
406
+ cached_input_cost_usd?: number | null;
407
+ output_cost_usd?: number | null;
408
+ reasoning_cost_usd?: number | null;
409
+ calculated_cost_usd?: number | null;
410
+ recorded_cost_usd?: number | null;
411
+ cost_variance_usd?: number | null;
412
+ cost_usd?: number | null;
413
+ cost_brl?: number | null;
414
+ fx_rate?: number | null;
415
+ pricing_segment_count?: number | null;
416
+ pricing_mixed?: boolean;
417
+ pricing_model?: string | null;
418
+ pricing_source?: string | null;
325
419
  capture_lag_ms?: number | null;
326
420
  pricing_segments?: Array<{
327
421
  phase: "conversation" | "planning" | "execution";
@@ -350,6 +444,18 @@ export interface DecisionProjection {
350
444
  created_at: string;
351
445
  }
352
446
 
447
+ export interface EvidenceProjection {
448
+ id: string;
449
+ task_id: string | null;
450
+ observed_at: string;
451
+ }
452
+
453
+ export interface ValidationProjection {
454
+ id: string;
455
+ task_id: string | null;
456
+ executed_at: string;
457
+ }
458
+
353
459
  export interface OperationsProjection extends ReadonlyV2Projection {
354
460
  filters: ProjectionTimeFilter;
355
461
  summary: {
@@ -366,6 +472,59 @@ export interface OperationsProjection extends ReadonlyV2Projection {
366
472
  execution_day_count: number;
367
473
  tokens: number | null;
368
474
  cost_brl: number | null;
475
+ /** Counts backed by the manifest summary while details load asynchronously. */
476
+ prd_count?: number | null;
477
+ spec_count?: number | null;
478
+ /** Exact macro population selected by the server for the active period. */
479
+ selected_counts?: { prds: number; specs: number };
480
+ task_count?: number | null;
481
+ completed_prd_count?: number | null;
482
+ completed_spec_count?: number | null;
483
+ completed_task_count?: number | null;
484
+ task_status_counts?: Record<string, number>;
485
+ task_risk_counts?: Record<string, number>;
486
+ top_tasks?: Array<{
487
+ task_id: string;
488
+ duration_ms: number | null;
489
+ total_tokens: number | null;
490
+ /** Factual SQLite Cost Monitor value; absent means genuinely unavailable. */
491
+ total_cost_usd?: number | null;
492
+ cost_brl: number | null;
493
+ run_count: number;
494
+ }>;
495
+ macro_metrics?: Record<
496
+ "specs" | "prds",
497
+ {
498
+ status_counts: Record<string, number>;
499
+ classification_counts: Record<string, number>;
500
+ entity_count: number;
501
+ total_run_count: number;
502
+ total_duration_ms: number | null;
503
+ total_tokens: number | null;
504
+ total_cost_usd?: number | null;
505
+ total_cost_brl: number | null;
506
+ average_duration_ms: number | null;
507
+ average_tokens: number | null;
508
+ average_cost_usd?: number | null;
509
+ average_cost_brl: number | null;
510
+ latest_created_at: string | null;
511
+ top_entities: Array<{
512
+ entity_id: string;
513
+ title: string;
514
+ duration_ms: number | null;
515
+ total_tokens: number | null;
516
+ total_cost_usd?: number | null;
517
+ cost_brl: number | null;
518
+ run_count: number;
519
+ duration_share: number;
520
+ }>;
521
+ }
522
+ >;
523
+ latest_task_created_at?: string | null;
524
+ coverage?: { duration: number; tokens: number; cost: number };
525
+ data_source?: "lifecycle_manifest_summary" | "run_records";
526
+ /** `true` means entity-level status and duration detail are not loaded yet. */
527
+ partial?: boolean;
369
528
  };
370
529
  decisions: { human: number; agent: number };
371
530
  source_latest_at: string | null;
@@ -377,6 +536,28 @@ export interface OperationsProjection extends ReadonlyV2Projection {
377
536
  origin_tokens_match_total: boolean;
378
537
  };
379
538
  usage: UsageProjection;
539
+ /**
540
+ * Durable daily aggregates available to the quick projection. They keep
541
+ * the period views useful before the full Run collection is requested.
542
+ */
543
+ periods?: {
544
+ daily: Record<
545
+ string,
546
+ {
547
+ prds: number;
548
+ specs: number;
549
+ tasks: number;
550
+ validations: number;
551
+ evidences: number;
552
+ runs: number;
553
+ usage: {
554
+ total_tokens: { known_sum: number; unknown: number };
555
+ cost: { known_sum: number; unknown: number };
556
+ };
557
+ duration?: { known_sum: number; unknown: number };
558
+ }
559
+ >;
560
+ };
380
561
  };
381
562
  origins: Record<"conversation" | "task" | "spec" | "prd", UsageProjection>;
382
563
  prds: MacroProjection[];
@@ -386,6 +567,10 @@ export interface OperationsProjection extends ReadonlyV2Projection {
386
567
  executions: ExecutionProjection[];
387
568
  runs: RunProjection[];
388
569
  decisions: DecisionProjection[];
570
+ /** Typed Evidence is periodized by its own observation timestamp. */
571
+ evidences?: EvidenceProjection[];
572
+ /** Typed Validation is periodized by its own execution timestamp. */
573
+ validations?: ValidationProjection[];
389
574
  }
390
575
 
391
576
  export interface TaskDetailProjection {
@@ -1,7 +1,22 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { rootExecutionDurationRuns } from "./duration-population.js";
2
+ import { observedExecutionElapsedMs, rootExecutionDurationRuns } from "./duration-population.js";
3
3
 
4
4
  describe("rootExecutionDurationRuns", () => {
5
+ it("retains a valid legacy duration when source timing is unavailable", () => {
6
+ expect(
7
+ observedExecutionElapsedMs([
8
+ {
9
+ id: "RUN-LEGACY",
10
+ phase: "execution",
11
+ parent_run_id: null,
12
+ started_at: "2026-08-08T03:00:00.000Z",
13
+ source_duration_ms: null,
14
+ duration_ms: 300_000,
15
+ },
16
+ ]),
17
+ ).toBe(300_000);
18
+ });
19
+
5
20
  it("excludes an execution child when its visible parent is planning or conversation", () => {
6
21
  const runs = [
7
22
  { id: "RUN-PLANNING", phase: "planning", parent_run_id: null },
@@ -13,4 +28,51 @@ describe("rootExecutionDurationRuns", () => {
13
28
 
14
29
  expect(rootExecutionDurationRuns(runs).map((run) => run.id)).toEqual(["RUN-ROOT"]);
15
30
  });
31
+
32
+ it("does not promote a child to a duration root when its parent is outside the page", () => {
33
+ expect(
34
+ rootExecutionDurationRuns([
35
+ { id: "RUN-CHILD", phase: "execution", parent_run_id: "RUN-OUTSIDE-PAGE" },
36
+ ]).map((run) => run.id),
37
+ ).toEqual([]);
38
+ });
39
+
40
+ it("counts repeated and parallel observed intervals only once", () => {
41
+ expect(
42
+ observedExecutionElapsedMs([
43
+ {
44
+ id: "RUN-A",
45
+ phase: "execution",
46
+ parent_run_id: null,
47
+ started_at: "2026-08-07T12:00:00.000Z",
48
+ source_started_at: "2026-08-07T12:00:00.000Z",
49
+ source_duration_ms: 3_600_000,
50
+ },
51
+ {
52
+ id: "RUN-B",
53
+ phase: "execution",
54
+ parent_run_id: null,
55
+ started_at: "2026-08-07T12:10:00.000Z",
56
+ source_started_at: "2026-08-07T12:00:00.000Z",
57
+ source_duration_ms: 3_600_000,
58
+ },
59
+ {
60
+ id: "RUN-C",
61
+ phase: "execution",
62
+ parent_run_id: null,
63
+ started_at: "2026-08-07T12:30:00.000Z",
64
+ source_started_at: "2026-08-07T12:30:00.000Z",
65
+ source_duration_ms: 3_600_000,
66
+ },
67
+ {
68
+ id: "RUN-CHILD",
69
+ phase: "execution",
70
+ parent_run_id: "RUN-A",
71
+ started_at: "2026-08-07T12:00:00.000Z",
72
+ source_started_at: "2026-08-07T12:00:00.000Z",
73
+ source_duration_ms: 9_000_000,
74
+ },
75
+ ]),
76
+ ).toBe(5_400_000);
77
+ });
16
78
  });
@@ -7,10 +7,18 @@
7
7
  */
8
8
  export interface DurationPopulationRun {
9
9
  id: string;
10
- phase?: string;
10
+ phase?: string | null;
11
11
  parent_run_id?: string | null;
12
12
  }
13
13
 
14
+ export interface ObservedDurationRun extends DurationPopulationRun {
15
+ started_at: string;
16
+ duration_started_at?: string | null;
17
+ source_started_at?: string | null;
18
+ duration_ms?: number | null;
19
+ source_duration_ms?: number | null;
20
+ }
21
+
14
22
  export function uniqueExecutionRuns<T extends DurationPopulationRun>(runs: readonly T[]): T[] {
15
23
  const unique = new Map<string, T>();
16
24
  for (const run of runs) {
@@ -26,10 +34,57 @@ export function rootExecutionDurationRuns<T extends DurationPopulationRun>(
26
34
  const unique = new Map<string, T>();
27
35
  for (const run of runs) if (!unique.has(run.id)) unique.set(run.id, run);
28
36
  const population = [...unique.values()];
29
- const visibleIds = new Set(population.map((run) => run.id));
30
37
  return population.filter(
31
- (run) =>
32
- (run.phase === undefined || run.phase === "execution") &&
33
- (run.parent_run_id == null || !visibleIds.has(run.parent_run_id)),
38
+ (run) => (run.phase === undefined || run.phase === "execution") && run.parent_run_id == null,
34
39
  );
35
40
  }
41
+
42
+ /** Real elapsed execution time: overlapping or repeated source intervals count once. */
43
+ export function observedExecutionElapsedMs<T extends ObservedDurationRun>(
44
+ runs: readonly T[],
45
+ ): number | null {
46
+ return observedRootIntervalUnion(rootExecutionDurationRuns(runs));
47
+ }
48
+
49
+ /** Observed macro lifecycle time across root Runs in every phase. */
50
+ export function observedRootLifecycleElapsedMs<T extends ObservedDurationRun>(
51
+ runs: readonly T[],
52
+ ): number | null {
53
+ const uniqueRoots = [...new Map(runs.map((run) => [run.id, run] as const)).values()].filter(
54
+ (run) => run.parent_run_id == null,
55
+ );
56
+ return observedRootIntervalUnion(uniqueRoots);
57
+ }
58
+
59
+ function observedRootIntervalUnion<T extends ObservedDurationRun>(
60
+ runs: readonly T[],
61
+ ): number | null {
62
+ const intervals = runs
63
+ .flatMap((run) => {
64
+ // A nullable source field must not erase a valid legacy duration. Both
65
+ // are duration facts; never derive elapsed time from timestamps alone.
66
+ const duration =
67
+ typeof run.source_duration_ms === "number" && run.source_duration_ms >= 0
68
+ ? run.source_duration_ms
69
+ : run.duration_ms;
70
+ const startedAt = run.source_started_at ?? run.duration_started_at ?? run.started_at;
71
+ const start = Date.parse(startedAt);
72
+ return typeof duration === "number" && duration >= 0 && Number.isFinite(start)
73
+ ? [{ start, end: start + duration }]
74
+ : [];
75
+ })
76
+ .sort((left, right) => left.start - right.start);
77
+ if (intervals.length === 0) return null;
78
+ let total = 0;
79
+ let start = intervals[0]!.start;
80
+ let end = intervals[0]!.end;
81
+ for (const interval of intervals.slice(1)) {
82
+ if (interval.start <= end) end = Math.max(end, interval.end);
83
+ else {
84
+ total += end - start;
85
+ start = interval.start;
86
+ end = interval.end;
87
+ }
88
+ }
89
+ return total + end - start;
90
+ }
@@ -6,7 +6,12 @@ import type {
6
6
  ExecutionProjection,
7
7
  RunProjection,
8
8
  } from "../contracts.js";
9
- import { formatOperationDuration, operationalDurationMs } from "./operation-duration.js";
9
+ import {
10
+ formatLifecycleElapsedDuration,
11
+ formatOperationDuration,
12
+ operationalDurationMs,
13
+ terminalLifecycleElapsedDurationMs,
14
+ } from "./operation-duration.js";
10
15
  import type { OperationsLocale } from "./status-labels.js";
11
16
  import "./entity-details-dialog.css";
12
17
 
@@ -195,6 +200,10 @@ function RunDetails({ row, locale }: { row: RunProjection; locale: OperationsLoc
195
200
  [copy.start, formatDateTime(row.started_at, locale)],
196
201
  [copy.end, formatDateTime(row.finished_at, locale)],
197
202
  [copy.duration, formatOperationDuration(operationalDurationMs(row), locale)],
203
+ [
204
+ copy.lifecycleElapsed,
205
+ formatLifecycleElapsedDuration(terminalLifecycleElapsedDurationMs(row), locale),
206
+ ],
198
207
  ["Tokens", formatCompactNumber(row.usage.total.tokens.total, locale)],
199
208
  [copy.costBrl, formatCurrency(row.usage.total.cost.brl, "BRL", locale)],
200
209
  [copy.costUsd, formatCurrency(row.usage.total.cost.usd, "USD", locale)],
@@ -272,7 +281,8 @@ export function entityDetailsCopy(locale: OperationsLocale) {
272
281
  model: "Modelo",
273
282
  start: "Início",
274
283
  end: "Fim",
275
- duration: "Duração",
284
+ duration: "Tempo",
285
+ lifecycleElapsed: "Tempo decorrido",
276
286
  costBrl: "Custo BRL",
277
287
  costUsd: "Custo USD",
278
288
  }
@@ -302,7 +312,8 @@ export function entityDetailsCopy(locale: OperationsLocale) {
302
312
  model: "Model",
303
313
  start: "Start",
304
314
  end: "End",
305
- duration: "Duration",
315
+ duration: "Time",
316
+ lifecycleElapsed: "Elapsed time",
306
317
  costBrl: "Cost BRL",
307
318
  costUsd: "Cost USD",
308
319
  };
@@ -1,5 +1,12 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { displayedExecutionCount, displayedRunAgent, runPhaseLabel } from "./EntityTables.js";
2
+ import {
3
+ canBuildCanonicalConversationRows,
4
+ displayedExecutionCount,
5
+ displayedRunAgent,
6
+ executionLifecycleElapsedMs,
7
+ hasCanonicalEntityRows,
8
+ runPhaseLabel,
9
+ } from "./EntityTables.js";
3
10
 
4
11
  describe("displayedExecutionCount", () => {
5
12
  it("shows zero instead of leaving legacy or incomplete projection counts blank", () => {
@@ -31,3 +38,39 @@ describe("Run display labels", () => {
31
38
  expect(runPhaseLabel("execution", "pt-BR")).toBe("Execução");
32
39
  });
33
40
  });
41
+
42
+ describe("canonical entity page guards", () => {
43
+ it("refuses partial conversation aggregation without canonical IDs", () => {
44
+ expect(hasCanonicalEntityRows([{ id: "EXEC-1" }])).toBe(true);
45
+ expect(hasCanonicalEntityRows([{ id: "" }])).toBe(false);
46
+ expect(
47
+ canBuildCanonicalConversationRows(
48
+ [
49
+ {
50
+ id: "EXEC-1",
51
+ kind: "interaction",
52
+ origin: { type: "interaction", conversation_id: "CONV-1" },
53
+ } as never,
54
+ ],
55
+ [{ id: "RUN-1", conversation_id: "CONV-1" } as never],
56
+ ),
57
+ ).toBe(true);
58
+ expect(
59
+ canBuildCanonicalConversationRows(
60
+ [
61
+ {
62
+ id: "EXEC-1",
63
+ kind: "interaction",
64
+ origin: { type: "interaction", conversation_id: "" },
65
+ } as never,
66
+ ],
67
+ [{ id: "RUN-1", conversation_id: "" } as never],
68
+ ),
69
+ ).toBe(false);
70
+ });
71
+
72
+ it("uses only an explicit backend execution lifecycle elapsed field", () => {
73
+ expect(executionLifecycleElapsedMs({ lifecycle_elapsed_ms: 30_000 } as never)).toBe(30_000);
74
+ expect(executionLifecycleElapsedMs({} as never)).toBeNull();
75
+ });
76
+ });