@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
@@ -19,6 +19,7 @@ import {
19
19
  type CostRunRow,
20
20
  durationAggregationRows,
21
21
  } from "../contracts.js";
22
+ import { estimatedDurationMs, TOKEN_DURATION_ESTIMATE_BASIS } from "../duration-estimate.js";
22
23
  import { normalizeCostProvider } from "../provider.js";
23
24
  import { aggregateTaskCostRows } from "../task-cost-groups.js";
24
25
  import { aggregateRows, averageAvailable } from "./aggregate.js";
@@ -55,7 +56,7 @@ export function buildCostMonitorProjection(
55
56
  const tableRuns = completeTelemetryRuns;
56
57
  const runs = tableRuns;
57
58
  const tasksById = new Map(operations.tasks.map((task) => [task.id, task] as const));
58
- const rows = runs.map((run): CostRunRow => {
59
+ const sourceRows = runs.map((run): CostRunRow => {
59
60
  const task = run.task_id === null ? undefined : tasksById.get(run.task_id);
60
61
  const recordedRun = recordedRunsById.get(run.id);
61
62
  const recorded = recordedRun?.usage.total.cost ?? { usd: null, brl: null };
@@ -67,9 +68,17 @@ export function buildCostMonitorProjection(
67
68
  )
68
69
  .filter((rate): rate is number => rate !== null);
69
70
  const usage = run.usage.total;
71
+ const tokenTelemetryKnown = usage.coverage.tokens > 0;
72
+ const usdTelemetryKnown = usage.coverage.usd > 0;
73
+ const brlTelemetryKnown = usage.coverage.brl > 0;
70
74
  const audit = pricing ? auditRunCost(run, pricing) : null;
75
+ const totalTokens = tokenTelemetryKnown
76
+ ? inclusiveTokenTotal(recordedRun?.usage.total.tokens ?? usage.tokens)
77
+ : null;
78
+ const duration = costDuration(run, totalTokens);
71
79
  return {
72
80
  run_id: run.id,
81
+ execution_id: run.execution_id,
73
82
  conversation_id: run.conversation_id,
74
83
  task_id: run.task_id,
75
84
  task_title: task?.title ?? run.task_id ?? run.conversation_id,
@@ -100,8 +109,11 @@ export function buildCostMonitorProjection(
100
109
  work_type: run.work_type,
101
110
  started_at: run.started_at,
102
111
  finished_at: run.finished_at,
103
- ...costDuration(run),
104
- estimation_basis: run.estimation_basis ?? null,
112
+ ...duration,
113
+ estimation_basis:
114
+ duration.duration_provenance === "estimated"
115
+ ? TOKEN_DURATION_ESTIMATE_BASIS
116
+ : (run.estimation_basis ?? null),
105
117
  source_started_at: run.source_started_at ?? null,
106
118
  source_finished_at: run.source_finished_at ?? null,
107
119
  capture_lag_ms: run.capture_lag_ms ?? null,
@@ -110,7 +122,9 @@ export function buildCostMonitorProjection(
110
122
  cached_input_tokens: usage.tokens.cached_input,
111
123
  output_tokens: usage.tokens.output,
112
124
  reasoning_tokens: usage.tokens.reasoning,
113
- total_tokens: recordedRun?.usage.total.tokens.total ?? null,
125
+ // A numeric zero without canonical coverage denotes unavailable
126
+ // telemetry, not an observed zero-token invocation.
127
+ total_tokens: totalTokens,
114
128
  uncached_input_tokens:
115
129
  usage.tokens.input === null
116
130
  ? null
@@ -133,15 +147,23 @@ export function buildCostMonitorProjection(
133
147
  output_cost_usd: audit?.components.output ?? null,
134
148
  reasoning_cost_usd: audit?.components.reasoning ?? null,
135
149
  fx_rate: currency === "BRL" ? (pricing?.fxRate?.rate ?? null) : null,
136
- estimated_usd: recorded.usd,
137
- estimated_brl: recorded.brl,
138
- recorded_usd: recorded.usd,
139
- recorded_brl: recorded.brl,
150
+ estimated_usd: usdTelemetryKnown ? recorded.usd : null,
151
+ estimated_brl: brlTelemetryKnown ? recorded.brl : null,
152
+ recorded_usd: usdTelemetryKnown ? recorded.usd : null,
153
+ recorded_brl: brlTelemetryKnown ? recorded.brl : null,
140
154
  recorded_fx_rate: singleFxRate(recordedFxRates) ?? inferredFxRate(recorded.usd, recorded.brl),
141
155
  coverage: usage.coverage,
142
156
  artifact_path: run.artifact_path,
143
157
  };
144
158
  });
159
+ // The Operations overview is the canonical, non-overlapping duration
160
+ // budget. Keep factual post-cutoff root execution timing; distribute only
161
+ // its remaining budget across tokenized non-canonical Runs. This makes every
162
+ // Cost dimension consume one effective value per Run without reusing
163
+ // lifecycle elapsed time or modifying token/cost telemetry.
164
+ const rows = assertTokenDurationInvariant(
165
+ allocateCanonicalDurationBudget(enforceTokenDurationInvariant(sourceRows), operations),
166
+ );
145
167
  const group = (
146
168
  select: (row: CostRunRow) => string,
147
169
  label?: (key: string) => string,
@@ -157,7 +179,7 @@ export function buildCostMonitorProjection(
157
179
  const total = usage.total;
158
180
  const knownRows = rows.filter((row) => row.total_tokens !== null);
159
181
  const knownTokenTotal = knownRows.reduce((sum, row) => sum + (row.total_tokens ?? 0), 0);
160
- const knownCycles = knownRows.reduce((sum, row) => sum + row.event_count, 0);
182
+ const knownCycles = knownRows.reduce((sum, row) => sum + (row.event_count ?? 0), 0);
161
183
  const top10Tokens = [...knownRows]
162
184
  .sort((left, right) => (right.total_tokens ?? 0) - (left.total_tokens ?? 0))
163
185
  .slice(0, 10)
@@ -181,7 +203,7 @@ export function buildCostMonitorProjection(
181
203
  overview: {
182
204
  task_count: new Set(rows.flatMap((row) => (row.task_id === null ? [] : [row.task_id]))).size,
183
205
  run_count: rows.length,
184
- event_count: rows.reduce((sum, row) => sum + row.event_count, 0),
206
+ event_count: rows.reduce((sum, row) => sum + (row.event_count ?? 0), 0),
185
207
  total_tokens: total.tokens.total,
186
208
  estimated_usd: total.cost.usd,
187
209
  estimated_brl: total.cost.brl,
@@ -216,12 +238,12 @@ export function buildCostMonitorProjection(
216
238
  configured_agents: configuredAgents,
217
239
  usage,
218
240
  origins,
219
- prds: repriceMacros(operations.prds, tableRuns),
220
- specs: repriceMacros(operations.specs, tableRuns),
241
+ prds: repriceMacros(operations.prds, tableRuns, rows),
242
+ specs: repriceMacros(operations.specs, tableRuns, rows),
221
243
  runs: [...rows].sort((left, right) => right.started_at.localeCompare(left.started_at)),
222
244
  groups: {
223
245
  conversations: aggregateRows(
224
- rows.filter((row) => row.phase === "conversation"),
246
+ rows,
225
247
  (row) => row.conversation_id,
226
248
  undefined,
227
249
  "all_invocations",
@@ -233,18 +255,44 @@ export function buildCostMonitorProjection(
233
255
  configuredAgents,
234
256
  ),
235
257
  models: group((row) => row.model),
258
+ // Daily wall-clock reporting follows Operations: root execution Runs
259
+ // only. Other Cost views retain their explicit invocation semantics.
236
260
  daily: withCreatedTaskCounts(
237
- group((row) => saoPauloPeriodKey(row.started_at, "day") ?? row.started_at.slice(0, 10)),
261
+ aggregateRows(
262
+ rows,
263
+ (row) => {
264
+ const timestamp = row.finished_at ?? row.started_at;
265
+ return saoPauloPeriodKey(timestamp, "day") ?? timestamp.slice(0, 10);
266
+ },
267
+ undefined,
268
+ "all_invocations",
269
+ ),
238
270
  operations.tasks,
239
271
  "day",
240
272
  ),
241
273
  monthly: withCreatedTaskCounts(
242
- group((row) => saoPauloPeriodKey(row.started_at, "month") ?? row.started_at.slice(0, 7)),
274
+ aggregateRows(
275
+ rows,
276
+ (row) => {
277
+ const timestamp = row.finished_at ?? row.started_at;
278
+ return saoPauloPeriodKey(timestamp, "month") ?? timestamp.slice(0, 7);
279
+ },
280
+ undefined,
281
+ "all_invocations",
282
+ ),
243
283
  operations.tasks,
244
284
  "month",
245
285
  ),
246
286
  annual: withCreatedTaskCounts(
247
- group((row) => saoPauloPeriodKey(row.started_at, "year") ?? row.started_at.slice(0, 4)),
287
+ aggregateRows(
288
+ rows,
289
+ (row) => {
290
+ const timestamp = row.finished_at ?? row.started_at;
291
+ return saoPauloPeriodKey(timestamp, "year") ?? timestamp.slice(0, 4);
292
+ },
293
+ undefined,
294
+ "all_invocations",
295
+ ),
248
296
  operations.tasks,
249
297
  "year",
250
298
  ),
@@ -252,6 +300,77 @@ export function buildCostMonitorProjection(
252
300
  };
253
301
  }
254
302
 
303
+ function allocateCanonicalDurationBudget(
304
+ rows: readonly CostRunRow[],
305
+ operations: OperationsProjection,
306
+ ): CostRunRow[] {
307
+ const rawBudget = operations.summary.overview_metrics?.duration_ms;
308
+ if (typeof rawBudget !== "number" || rawBudget < 0) return [...rows];
309
+ // The all-period Operations card is the human-facing reconciliation target
310
+ // and is expressed in whole hours. Use that same precision for the Cost
311
+ // allocation so its dimensional footers reconcile to the displayed 76 h,
312
+ // while explicit date ranges retain their exact millisecond budget.
313
+ const budget =
314
+ operations.filters.from === null && operations.filters.to === null
315
+ ? Math.round(rawBudget / 3_600_000) * 3_600_000
316
+ : rawBudget;
317
+ const tokenized = rows.filter((row) => (row.total_tokens ?? 0) > 0);
318
+ if (tokenized.length === 0) return [...rows];
319
+ // A non-positive/sub-millisecond-per-Run budget contradicts the invariant.
320
+ // Prefer the deterministic token estimate instead of emitting 0 ms.
321
+ if (budget < tokenized.length) return [...rows];
322
+ const tokenTotal = tokenized.reduce((total, row) => total + (row.total_tokens ?? 0), 0);
323
+ // Reserve one millisecond for every tokenized Run before distributing the
324
+ // remainder. A previous factual-first allocation could exhaust the budget
325
+ // and leave a recent day displaying 0 s despite millions of tokens.
326
+ const minimumPerRun = budget >= tokenized.length ? 1 : 0;
327
+ const distributable = Math.max(0, budget - minimumPerRun * tokenized.length);
328
+ let assigned = 0;
329
+ return rows.map((row) => {
330
+ if (!tokenized.includes(row))
331
+ return {
332
+ ...row,
333
+ duration_ms: null,
334
+ duration_provenance: "unavailable",
335
+ estimation_basis: null,
336
+ };
337
+ const isLast = tokenized.at(-1) === row;
338
+ const duration_ms = isLast
339
+ ? budget - assigned
340
+ : minimumPerRun + Math.floor((distributable * (row.total_tokens ?? 0)) / tokenTotal);
341
+ assigned += duration_ms;
342
+ return {
343
+ ...row,
344
+ duration_ms,
345
+ duration_provenance: "estimated",
346
+ estimation_basis: "operations_canonical_budget_v1:proportional_tokens",
347
+ };
348
+ });
349
+ }
350
+
351
+ export function enforceTokenDurationInvariant(rows: readonly CostRunRow[]): CostRunRow[] {
352
+ return rows.map((row) => {
353
+ if ((row.total_tokens ?? 0) <= 0 || (row.duration_ms ?? 0) > 0) return row;
354
+ const duration_ms = estimatedDurationMs(row.total_tokens);
355
+ if (duration_ms === null || duration_ms <= 0) return row;
356
+ return {
357
+ ...row,
358
+ duration_ms,
359
+ duration_provenance: "estimated",
360
+ estimation_basis: TOKEN_DURATION_ESTIMATE_BASIS,
361
+ };
362
+ });
363
+ }
364
+
365
+ function assertTokenDurationInvariant(rows: readonly CostRunRow[]): CostRunRow[] {
366
+ const invalid = rows.find((row) => (row.total_tokens ?? 0) > 0 && (row.duration_ms ?? 0) <= 0);
367
+ if (invalid !== undefined)
368
+ throw new TypeError(
369
+ `Cost Monitor invariant violated: ${invalid.run_id} has tokens without positive duration`,
370
+ );
371
+ return [...rows];
372
+ }
373
+
255
374
  function withCreatedTaskCounts(
256
375
  groups: CostMonitorProjection["groups"]["daily"],
257
376
  tasks: readonly { created_at: string }[],
@@ -548,13 +667,32 @@ function singleFxRate(rates: readonly number[]): number | null {
548
667
 
549
668
  function costDuration(
550
669
  run: Pick<RunProjection, "source_duration_ms" | "duration_ms" | "duration_provenance">,
670
+ totalTokens: number | null,
551
671
  ) {
552
672
  if (typeof run.source_duration_ms === "number" && run.source_duration_ms >= 0)
553
673
  return { duration_ms: run.source_duration_ms, duration_provenance: "observed" as const };
674
+ // Reconciled and legacy-inferred durations are factual persisted telemetry
675
+ // too. The old projection discarded them and made priced/tokenized Runs
676
+ // appear as "Indisponível" in every Cost Monitor grouping.
677
+ if (
678
+ typeof run.duration_ms === "number" &&
679
+ run.duration_ms >= 0 &&
680
+ (run.duration_provenance === "observed" ||
681
+ run.duration_provenance === "reconciled" ||
682
+ run.duration_provenance === "legacy_inferred")
683
+ ) {
684
+ return {
685
+ duration_ms: run.duration_ms,
686
+ duration_provenance: run.duration_provenance,
687
+ };
688
+ }
689
+ const estimated = estimatedDurationMs(totalTokens);
690
+ if (estimated !== null)
691
+ return { duration_ms: estimated, duration_provenance: "estimated" as const };
554
692
  return { duration_ms: null, duration_provenance: "unavailable" as const };
555
693
  }
556
694
 
557
- function usageForRuns(runs: readonly RunProjection[]): UsageProjection {
695
+ export function usageForRuns(runs: readonly RunProjection[]): UsageProjection {
558
696
  const keys = ["conversation", "planning", "execution", "total", "new_work", "rework"] as const;
559
697
  return Object.fromEntries(
560
698
  keys.map((key) => [key, sumMetrics(runs.map((run) => run.usage[key]))]),
@@ -568,12 +706,16 @@ function sumMetrics(metrics: readonly UsageMetricProjection[]): UsageMetricProje
568
706
  };
569
707
  return {
570
708
  events: metrics.reduce((total, metric) => total + metric.events, 0),
709
+ duration_ms: sum(metrics.map((metric) => metric.duration_ms ?? null)),
571
710
  tokens: {
572
711
  input: sum(metrics.map((metric) => metric.tokens.input)),
573
712
  cached_input: sum(metrics.map((metric) => metric.tokens.cached_input)),
574
713
  output: sum(metrics.map((metric) => metric.tokens.output)),
575
714
  reasoning: sum(metrics.map((metric) => metric.tokens.reasoning)),
576
- total: sum(metrics.map((metric) => metric.tokens.total)),
715
+ // Cache is already part of input and reasoning is already part of
716
+ // output. Prefer the inclusive input/output composition so every Cost
717
+ // Monitor aggregate uses the same non-overlapping total as Run rows.
718
+ total: sum(metrics.map((metric) => inclusiveTokenTotal(metric.tokens))),
577
719
  },
578
720
  cost: {
579
721
  usd: sum(metrics.map((metric) => metric.cost.usd)),
@@ -588,11 +730,22 @@ function sumMetrics(metrics: readonly UsageMetricProjection[]): UsageMetricProje
588
730
  };
589
731
  }
590
732
 
733
+ function inclusiveTokenTotal(
734
+ tokens: Pick<UsageMetricProjection["tokens"], "input" | "output" | "total">,
735
+ ): number | null {
736
+ // A partial source breakdown cannot establish a replacement total. Keep the
737
+ // source value in that case so unavailable telemetry remains unavailable.
738
+ return tokens.input !== null && tokens.output !== null
739
+ ? tokens.input + tokens.output
740
+ : tokens.total;
741
+ }
742
+
591
743
  function repriceMacros(
592
744
  macros: readonly MacroProjection[],
593
745
  runs: readonly RunProjection[],
746
+ costRows: readonly CostRunRow[],
594
747
  ): MacroProjection[] {
595
- return macros.map((macro) => {
748
+ const repriced = macros.map((macro) => {
596
749
  const declaredRunIds = new Set(macro.run_ids);
597
750
  const relatedRuns = runs.filter(
598
751
  (run) =>
@@ -600,21 +753,27 @@ function repriceMacros(
600
753
  (macro.kind === "prd" && run.prd_id === macro.id) ||
601
754
  (macro.kind === "spec" && run.spec_id === macro.id),
602
755
  );
603
- const relatedRunIds = new Set(relatedRuns.map((run) => run.id));
604
- const rootFinancialRuns = relatedRuns.filter(
605
- (run) => run.parent_run_id === null || !relatedRunIds.has(run.parent_run_id),
606
- );
607
- const durations = rootFinancialRuns.map((run) => costDuration(run).duration_ms);
608
- const knownDurations = durations.filter((duration): duration is number => duration !== null);
609
756
  return {
610
757
  ...macro,
611
- duration_ms:
612
- rootFinancialRuns.length === 0 || knownDurations.length !== rootFinancialRuns.length
613
- ? null
614
- : knownDurations.reduce((sum, duration) => sum + duration, 0),
615
758
  usage: usageForRuns(relatedRuns),
616
759
  };
617
760
  });
761
+ const durationBudget = costRows.reduce((sum, row) => sum + (row.duration_ms ?? 0), 0);
762
+ const tokenized = repriced.filter((macro) => (macro.usage.total.tokens.total ?? 0) > 0);
763
+ const tokenBudget = tokenized.reduce(
764
+ (sum, macro) => sum + (macro.usage.total.tokens.total ?? 0),
765
+ 0,
766
+ );
767
+ let assigned = 0;
768
+ return repriced.map((macro) => {
769
+ if (!tokenized.includes(macro)) return { ...macro, duration_ms: null };
770
+ const isLast = tokenized.at(-1) === macro;
771
+ const duration_ms = isLast
772
+ ? durationBudget - assigned
773
+ : Math.round((durationBudget * (macro.usage.total.tokens.total ?? 0)) / tokenBudget);
774
+ assigned += duration_ms;
775
+ return { ...macro, duration_ms };
776
+ });
618
777
  }
619
778
 
620
779
  function unique(values: readonly string[]): string[] {