@zaip-ai/cli 1.0.8 → 1.3.1

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 (360) hide show
  1. package/README.md +1 -1
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.js +1 -1
  4. package/dist/services/agent-adapters.js +3 -3
  5. package/dist/services/agent-adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.test.js +7 -1
  7. package/dist/services/agent-adapters.test.js.map +1 -1
  8. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  9. package/dist/services/codex-pre-tool-hook-template.js +89 -7
  10. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  11. package/dist/services/codex-rules.d.ts +1 -1
  12. package/dist/services/codex-rules.d.ts.map +1 -1
  13. package/dist/services/codex-rules.js +7 -0
  14. package/dist/services/codex-rules.js.map +1 -1
  15. package/dist/services/install-agents-template.d.ts.map +1 -1
  16. package/dist/services/install-agents-template.js +1 -0
  17. package/dist/services/install-agents-template.js.map +1 -1
  18. package/dist/services/logger.test.js +2 -2
  19. package/dist/services/runtime-template.test.js +31 -7
  20. package/dist/services/runtime-template.test.js.map +1 -1
  21. package/dist/services/template-manifest.d.ts.map +1 -1
  22. package/dist/services/template-manifest.js +12 -3
  23. package/dist/services/template-manifest.js.map +1 -1
  24. package/package.json +1 -1
  25. package/templates/.agents/architecture/software-architecture.md +131 -0
  26. package/templates/.agents/branding/brandbook.docx +0 -0
  27. package/templates/.agents/branding/brandbook.md +60 -0
  28. package/templates/.agents/config/agents/catalog.yaml +7 -7
  29. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +2 -2
  30. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +2 -2
  31. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  32. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +8 -8
  33. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -1
  34. package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
  35. package/templates/.agents/dashboard/.zaip-managed.json +457 -173
  36. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-Z60df2r-.js → CostCalculationGuidePage-ovxurkIk.js} +1 -1
  37. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-BgVgrfhQ.js +2310 -0
  38. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-Coc6pA-1.js → PricingSettingsDialog-vSvvOHQp.js} +1 -1
  39. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
  40. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-zH758vfs.js +3 -0
  41. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-DLn-Mz2M.js +1 -0
  42. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-CaKwQP43.css → TraceabilityWorkspace-DvvavDLY.css} +1 -1
  43. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DKwP1stV.js +68 -0
  44. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-PoJA2PI1.css +1 -0
  45. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DFBuc_qp.js → icons-vendor-B_lDDHn1.js} +1 -1
  46. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-B31GMG5O.css +1 -0
  47. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-CZQlsLV9.js +2 -0
  48. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CCQOHdVI.js → react-vendor-B3TJrD4O.js} +1 -1
  49. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-pC2_0J8x.js → traceability-7f1j5wx3.js} +1 -1
  50. package/templates/.agents/dashboard/apps/frontend/dist/index.html +7 -7
  51. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  52. package/templates/.agents/dashboard/apps/frontend/playwright.dom.config.ts +32 -0
  53. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +199 -140
  54. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +0 -21
  55. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +20 -11
  56. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +14 -7
  57. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +4 -2
  58. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.dom.e2e.ts +56 -0
  59. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +21 -2
  60. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +89 -19
  61. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +19 -4
  62. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +49 -3
  63. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +29 -10
  64. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +4 -4
  65. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +4 -2
  66. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +36 -26
  67. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
  68. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +47 -6
  69. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +59 -9
  70. package/templates/.agents/dashboard/apps/frontend/src/sqlite-page-export.test.ts +32 -0
  71. package/templates/.agents/dashboard/apps/frontend/src/sqlite-page-export.ts +21 -0
  72. package/templates/.agents/dashboard/apps/frontend/src/styles.css +19 -0
  73. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.test.ts +32 -0
  74. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +36 -0
  75. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +6 -2
  76. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +137 -23
  77. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +229 -35
  78. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +61 -7
  79. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +3 -6
  80. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +7 -1
  81. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-list-page.test.ts +163 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-list-page.ts +136 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/use-operations-detail-export.ts +76 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/work-list-load-dedup.test.ts +23 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/work-list-load-dedup.ts +27 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +39 -15
  87. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +3 -4
  88. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +4 -1
  89. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  90. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +89 -19
  91. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +31 -16
  92. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +43 -14
  93. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +5 -5
  94. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionPanel.tsx +60 -0
  95. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionTable.tsx +191 -0
  96. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.loading.test.ts +14 -0
  97. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.run-page.test.ts +18 -0
  98. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +18 -3
  99. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +1 -1
  100. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +75 -44
  101. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorLoadErrors.tsx +35 -0
  102. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +162 -40
  103. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +221 -79
  104. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.test.ts +132 -0
  105. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.tsx +70 -0
  106. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +203 -155
  107. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +164 -125
  108. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +2 -0
  109. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +3 -1
  110. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +5 -2
  111. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-page-range.ts +35 -0
  112. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +2 -2
  113. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +2 -1
  114. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +32 -9
  115. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +37 -2
  116. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +131 -9
  117. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +34 -17
  118. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +0 -24
  119. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +225 -424
  120. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +24 -15
  121. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +6 -1
  122. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
  123. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
  124. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  125. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +46 -26
  126. package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.test.ts +54 -0
  127. package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.tsx +247 -0
  128. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +31 -11
  129. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +39 -13
  130. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +107 -2
  131. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.macro-metrics.test.ts +55 -0
  132. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +23 -29
  133. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +211 -184
  134. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewTopPanel.tsx +127 -0
  135. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +60 -51
  136. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +1 -4
  137. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
  138. package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.test.tsx +43 -0
  139. package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.tsx +181 -0
  140. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +32 -10
  141. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +9 -3
  142. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +13 -5
  143. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +16 -6
  144. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +14 -4
  145. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +1 -2
  146. package/templates/.agents/dashboard/modules/operations/src/react/developer-identities.test.ts +18 -0
  147. package/templates/.agents/dashboard/modules/operations/src/react/developer-identities.ts +30 -0
  148. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +1 -0
  149. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +393 -4
  150. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +484 -61
  151. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +23 -1
  152. package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
  153. package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
  154. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +4 -4
  155. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +6 -4
  156. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +4 -3
  157. package/templates/.agents/dashboard/modules/operations/src/react/operations-date-filters.css +1 -1
  158. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +4 -1
  159. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +22 -12
  160. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.css +4 -0
  161. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +1 -1
  162. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +53 -6
  163. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +2 -4
  164. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +82 -6
  165. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +1 -0
  166. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +2 -1
  167. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +1 -1
  168. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +19 -7
  169. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +4 -1
  170. package/templates/.agents/dashboard/modules/operations/src/server/metric-coverage.ts +1 -0
  171. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +11 -5
  172. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  173. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  174. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  175. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  176. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  177. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  178. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +533 -338
  179. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +506 -311
  180. package/templates/.agents/dashboard/packages/local-runtime/gitignore.template +2 -0
  181. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  182. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +15 -7
  183. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +44 -13
  184. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +8 -3
  185. package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
  186. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +472 -145
  187. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +15 -3
  188. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +141 -33
  189. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +533 -338
  190. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +6 -2
  191. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +3 -3
  192. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +89 -16
  193. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +33 -16
  194. package/templates/.agents/dashboard/packages/local-runtime/src/server-classification-page.test.ts +87 -0
  195. package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.test.ts +44 -0
  196. package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.ts +125 -0
  197. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +66 -0
  198. package/templates/.agents/dashboard/packages/local-runtime/src/server-request-authority.test.ts +61 -0
  199. package/templates/.agents/dashboard/packages/local-runtime/src/server-request-authority.ts +18 -0
  200. package/templates/.agents/dashboard/packages/local-runtime/src/server-run-projections.test.ts +42 -0
  201. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +97 -0
  202. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -5
  203. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +91 -0
  204. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +7 -3
  205. package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +36 -0
  206. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +230 -132
  207. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +224 -182
  208. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-artifact-counts.ts +28 -0
  209. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.test.ts +63 -0
  210. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.ts +109 -0
  211. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-aggregates.ts +497 -0
  212. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-fast-page-parity.test-support.ts +65 -0
  213. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-page.test.ts +176 -0
  214. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-page.ts +119 -0
  215. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +41 -0
  216. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.test.ts +16 -0
  217. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.ts +29 -0
  218. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +355 -0
  219. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts +121 -0
  220. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-timing.ts +27 -0
  221. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +16 -2
  222. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +15 -0
  223. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.test.ts +223 -0
  224. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.ts +304 -0
  225. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-cache.test-support.ts +23 -0
  226. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +89 -0
  227. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-fixture.ts +227 -0
  228. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +691 -0
  229. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +81 -0
  230. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1655 -567
  231. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +2168 -1268
  232. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-cache.ts +129 -0
  233. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-install.test.ts +26 -0
  234. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-install.ts +28 -0
  235. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +116 -0
  236. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +146 -0
  237. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +165 -0
  238. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-refresh.mjs +140 -0
  239. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +255 -289
  240. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +94 -88
  241. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  242. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +5 -2
  243. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  244. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -1
  245. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-loading.spec.ts +142 -0
  246. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-pagination.spec.ts +232 -0
  247. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +743 -0
  248. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +189 -214
  249. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  250. package/templates/.agents/design/.zaip-managed.json +3 -3
  251. package/templates/.agents/design/apps/catalog/package.json +1 -1
  252. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  253. package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
  254. package/templates/.agents/growth/strategy.md +27 -0
  255. package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
  256. package/templates/.agents/marketing/strategy.md +29 -0
  257. package/templates/.agents/requirements/autonomous-assurance.md +6 -6
  258. package/templates/.agents/requirements/comparative-audit.md +1 -1
  259. package/templates/.agents/requirements/context-engine.md +1 -1
  260. package/templates/.agents/requirements/cost-observability.md +1 -1
  261. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  262. package/templates/.agents/requirements/data-export.md +1 -1
  263. package/templates/.agents/requirements/design-system.md +1 -1
  264. package/templates/.agents/requirements/execution-engine.md +3 -3
  265. package/templates/.agents/requirements/kanban-dashboard.md +10 -2
  266. package/templates/.agents/requirements/model-orchestration.md +1 -1
  267. package/templates/.agents/requirements/public-distribution.md +1 -1
  268. package/templates/.agents/requirements/software-architecture.md +1 -1
  269. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  270. package/templates/.agents/requirements/work-lifecycle.md +4 -4
  271. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  272. package/templates/.agents/rules/dashboard-ui-consistency.md +14 -0
  273. package/templates/.agents/rules/frontend-lite.md +4 -4
  274. package/templates/.agents/rules/run-lifecycle-closure.md +4 -4
  275. package/templates/.agents/runtime/VERSION +1 -1
  276. package/templates/.agents/runtime/bin/zaip.mjs +1142 -1041
  277. package/templates/.agents/runtime/checksums.sha256 +6 -6
  278. package/templates/.agents/runtime/manifest.json +1 -1
  279. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  280. package/templates/.agents/runtime/provenance.json +5 -5
  281. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  282. package/templates/.agents/sales/playbook.md +32 -0
  283. package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
  284. package/templates/.agents/skills/criar-pasta-obsidian/scripts/generate-obsidian-vault.test.mjs +20 -16
  285. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  286. package/templates/.agents/skills/zaip-skill-agent-catalog/SKILL.md +22 -0
  287. package/templates/.agents/skills/zaip-skill-agent-catalog/agents/openai.yaml +4 -0
  288. package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +3 -2
  289. package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +49 -0
  290. package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
  291. package/templates/.agents/skills/zaip-skill-author-skills/scripts/run-skill-tests.mjs +37 -0
  292. package/templates/.agents/skills/zaip-skill-backend/SKILL.md +1 -0
  293. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +9 -2
  294. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
  295. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +1 -1
  296. package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
  297. package/templates/.agents/skills/zaip-skill-change/references/observable-evidence.md +83 -0
  298. package/templates/.agents/skills/zaip-skill-dashboard-diagnostics/SKILL.md +22 -0
  299. package/templates/.agents/skills/zaip-skill-dashboard-diagnostics/agents/openai.yaml +4 -0
  300. package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
  301. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
  302. package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -3
  303. package/templates/.agents/skills/zaip-skill-frontend/agents/openai.yaml +2 -2
  304. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +10 -10
  305. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +6 -0
  306. package/templates/.agents/skills/zaip-skill-lifecycle-closure/SKILL.md +27 -0
  307. package/templates/.agents/skills/zaip-skill-lifecycle-closure/agents/openai.yaml +4 -0
  308. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +6 -0
  309. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +4 -0
  310. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +111 -104
  311. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-explicit-recovery.mjs +223 -0
  312. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +55 -9
  313. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +145 -14
  314. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +19 -9
  315. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +82 -5
  316. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
  317. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +20 -0
  318. package/templates/.agents/skills/zaip-skill-release-qualification/agents/openai.yaml +4 -0
  319. package/templates/.agents/skills/zaip-skill-review/SKILL.md +5 -0
  320. package/templates/.agents/skills/zaip-skill-rules/SKILL.md +1 -1
  321. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +6 -0
  322. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +4 -0
  323. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +22 -90
  324. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +28 -5
  325. package/templates/.agents/zaip-aios/INDEX.md +57 -22
  326. package/templates/.agents/zaip-aios/README.md +24 -13
  327. package/templates/.agents/zaip-aios/VERSION +1 -1
  328. package/templates/.agents/zaip-aios/guides/02-requirements.md +5 -0
  329. package/templates/.agents/zaip-aios/guides/06-execucao.md +13 -4
  330. package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +7 -0
  331. package/templates/.agents/zaip-aios/guides/10-seguranca.md +23 -0
  332. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +6 -6
  333. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +3 -0
  334. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +12 -3
  335. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +5 -5
  336. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
  337. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +95 -0
  338. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +366 -0
  339. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +46 -0
  340. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +74 -0
  341. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
  342. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
  343. package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +19 -0
  344. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +111 -0
  345. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +172 -0
  346. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +149 -0
  347. package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
  348. package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
  349. package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
  350. package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
  351. package/templates/template-manifest.json +756 -235
  352. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cs6dzDmW.js +0 -1505
  353. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +0 -1
  354. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +0 -3
  355. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +0 -1
  356. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +0 -1
  357. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +0 -68
  358. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +0 -2
  359. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +0 -1
  360. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +0 -45
@@ -0,0 +1,127 @@
1
+ import {
2
+ formatCompactNumber,
3
+ formatCurrency,
4
+ formatDurationMs,
5
+ formatPercent,
6
+ } from "@zaip-ai/dashboard-ui";
7
+ import type { EntityMetric } from "./OperationsOverview.helpers.js";
8
+ import type { OperationsLocale } from "./status-labels.js";
9
+
10
+ type OverviewView = "tasks" | "specs" | "prds";
11
+
12
+ const duration = (value: number | null, locale: OperationsLocale) =>
13
+ value === null
14
+ ? locale === "pt-BR"
15
+ ? "Indisponível"
16
+ : "Unavailable"
17
+ : formatDurationMs(value, locale);
18
+
19
+ export function OperationsOverviewTopPanel({
20
+ copy,
21
+ currency,
22
+ locale,
23
+ maxDuration,
24
+ onOpenTask,
25
+ summary,
26
+ text,
27
+ topCost,
28
+ topEntities,
29
+ view,
30
+ }: {
31
+ copy: { empty: string; hint: string; title: string };
32
+ currency: "BRL" | "USD";
33
+ locale: OperationsLocale;
34
+ maxDuration: number;
35
+ onOpenTask: (taskId: string) => Promise<boolean>;
36
+ summary: {
37
+ durationMs: number | null;
38
+ durationShare: number;
39
+ runCount: number;
40
+ tokens: number | null;
41
+ };
42
+ text: {
43
+ accumulatedTime: string;
44
+ associatedRuns: string;
45
+ concentration: string;
46
+ totalMeasuredTime: string;
47
+ topFiveCost: string;
48
+ tokensUnavailable: string;
49
+ };
50
+ topCost: number | null;
51
+ topEntities: readonly EntityMetric[];
52
+ view: OverviewView;
53
+ }) {
54
+ const entityKind = view === "specs" ? "SPEC" : "PRD";
55
+ return (
56
+ <article className="operations-panel">
57
+ <header className="operations-panel-header">
58
+ <div className="operations-panel-header-title">
59
+ <h2>{copy.title}</h2>
60
+ </div>
61
+ <small>{copy.hint}</small>
62
+ </header>
63
+ {topEntities.length === 0 ? (
64
+ <p className="operations-empty">{copy.empty}</p>
65
+ ) : (
66
+ <>
67
+ <div className="operations-run-bars">
68
+ {topEntities.map((entity, index) => {
69
+ const measuredDuration = duration(entity.durationMs, locale);
70
+ const label =
71
+ view === "tasks"
72
+ ? `${locale === "pt-BR" ? "Abrir detalhes da tarefa" : "Open task details for"} ${entity.title}: ${measuredDuration}`
73
+ : `${entityKind} ${entity.title}: ${measuredDuration}`;
74
+ return (
75
+ <button
76
+ aria-label={label}
77
+ className={`operations-run-bar${entity.durationMs === null ? " is-duration-unavailable" : ""}`}
78
+ disabled={view !== "tasks"}
79
+ key={entity.id}
80
+ onClick={() => void onOpenTask(entity.id)}
81
+ title={`${entity.title}: ${measuredDuration}`}
82
+ type="button"
83
+ >
84
+ <strong>{measuredDuration}</strong>
85
+ <i
86
+ style={{
87
+ height:
88
+ entity.durationMs === null
89
+ ? "0%"
90
+ : `${Math.max(8, (entity.durationMs / maxDuration) * 100)}%`,
91
+ }}
92
+ />
93
+ <span>{`#${index + 1} ${entity.id.slice(-4)}`}</span>
94
+ </button>
95
+ );
96
+ })}
97
+ </div>
98
+ <div className="operations-top-task-metrics">
99
+ <div>
100
+ <span>{text.accumulatedTime}</span>
101
+ <strong>{duration(summary.durationMs, locale)}</strong>
102
+ <small>{`${summary.runCount} ${text.associatedRuns}`}</small>
103
+ </div>
104
+ <div>
105
+ <span>{text.concentration}</span>
106
+ <strong>{formatPercent(summary.durationShare, locale)}</strong>
107
+ <small>{text.totalMeasuredTime}</small>
108
+ </div>
109
+ <div>
110
+ <span>{text.topFiveCost}</span>
111
+ <strong>
112
+ {topCost === null
113
+ ? duration(null, locale)
114
+ : formatCurrency(topCost, currency, locale)}
115
+ </strong>
116
+ <small>
117
+ {summary.tokens === null
118
+ ? text.tokensUnavailable
119
+ : `${formatCompactNumber(summary.tokens, locale)} tokens`}
120
+ </small>
121
+ </div>
122
+ </div>
123
+ </>
124
+ )}
125
+ </article>
126
+ );
127
+ }
@@ -32,18 +32,20 @@ import {
32
32
  type OperationDatePreset,
33
33
  type OperationDateRange,
34
34
  } from "./operation-date-range.js";
35
- import {
36
- filterStatusLabel,
37
- type OperationsView,
38
- statusesForView,
39
- } from "./operations-page-filters.js";
35
+ import type { OperationsView } from "./operations-page-filters.js";
40
36
  import { macrosWithPeriodActivity } from "./operations-period-scope.js";
41
37
  import { matchesQuery } from "./operations-query.js";
42
38
  import { viewLabels } from "./operations-view-labels.js";
43
- import { aggregateManifestPeriodSummary, aggregatePeriodSummary } from "./period-summary.js";
39
+ import { applyFactualPeriodCosts, applyFactualPeriodDurations } from "./PeriodSummaryTable.js";
40
+ import {
41
+ aggregateManifestPeriodSummary,
42
+ aggregatePeriodSummary,
43
+ type PeriodGranularity,
44
+ type PeriodSummaryRow,
45
+ } from "./period-summary.js";
44
46
  import { periodSummaryPopulation } from "./period-summary-population.js";
45
47
  import { scopeRunsToEntities } from "./run-scope.js";
46
- import { type OperationsLocale, riskLabel } from "./status-labels.js";
48
+ import { riskLabel } from "./status-labels.js";
47
49
  import {
48
50
  matchesTaskOrigin,
49
51
  type TaskOrigin,
@@ -63,12 +65,24 @@ import "./operations-date-filters.css";
63
65
  import "./operations-filter-panel.css";
64
66
  import "./operations-responsive.css";
65
67
 
68
+ /** Applies Cost Monitor duration facts only to the Operations period exports that share them. */
69
+ export function factualDurationRowsForExport(
70
+ granularity: PeriodGranularity,
71
+ rows: readonly PeriodSummaryRow[],
72
+ factualRows?: readonly { key: string; duration_ms: number | null }[],
73
+ ): PeriodSummaryRow[] {
74
+ return granularity === "month" || granularity === "year"
75
+ ? applyFactualPeriodDurations(rows, factualRows)
76
+ : [...rows];
77
+ }
78
+
66
79
  export function OperationsPage({
67
80
  alternateContent,
68
81
  boardTotals,
69
82
  boardKindTotals,
70
83
  boardStates,
71
84
  boardExportSource,
85
+ detailExportSource,
72
86
  capabilityNavigation,
73
87
  currency,
74
88
  data,
@@ -80,7 +94,7 @@ export function OperationsPage({
80
94
  onOpenDocument,
81
95
  onOpenTask,
82
96
  onPriorityChange,
83
- onDetailDataRequest,
97
+ onLoadMacroMetrics,
84
98
  entityPage,
85
99
  onEntityPageChange,
86
100
  onEntityFiltersChange,
@@ -88,6 +102,8 @@ export function OperationsPage({
88
102
  onWorkListFiltersChange,
89
103
  onBoardTypeChange,
90
104
  onWorkListTypeChange,
105
+ onWorkListPageChange,
106
+ workListPage,
91
107
  onLoadMoreBoard,
92
108
  onLoadStatusPage,
93
109
  statusPage,
@@ -172,24 +188,6 @@ export function OperationsPage({
172
188
  showFilterLoading();
173
189
  const nextWorkListType = workListTypeOnViewChange(nextView);
174
190
  if (nextWorkListType !== null) onWorkListTypeChange?.(nextWorkListType);
175
- // Calendar reports are served by the compact canonical daily summary;
176
- // they must not hydrate entity detail merely to render month/year rolls.
177
- if (
178
- ![
179
- "work-kanban",
180
- "work-list",
181
- "daily",
182
- "monthly",
183
- "yearly",
184
- "runs",
185
- "conversations",
186
- "executions",
187
- "changes",
188
- "decisions",
189
- ].includes(nextView)
190
- ) {
191
- onDetailDataRequest?.(nextView);
192
- }
193
191
  setView(nextView);
194
192
  setStatusFilter("");
195
193
  setRiskFilter("");
@@ -232,10 +230,6 @@ export function OperationsPage({
232
230
  statusFilter,
233
231
  view,
234
232
  ]);
235
- const availableStatuses = statusesForView(data, view);
236
- const supportsStatus = !["decisions", "daily", "monthly", "yearly"].includes(view);
237
- const supportsRisk = view === "work-kanban" || view === "work-list" || view === "changes";
238
- const supportsOrigin = view === "work-kanban" || view === "work-list";
239
233
  // Only work views interpret a status option as a canonical work stage.
240
234
  // Runs, Changes and Executions use their respective persisted statuses.
241
235
  const hasEntityStageStatus =
@@ -383,8 +377,25 @@ export function OperationsPage({
383
377
  ),
384
378
  granularity,
385
379
  );
380
+ // Export the exact period facts shown in the report. In particular, the
381
+ // compact Operations summary can carry a stale/missing cost while Cost
382
+ // Monitor has the factual selected-currency amount for the same key.
383
+ // Keep null when neither source has a factual value.
384
+ const costRows = applyFactualPeriodCosts(
385
+ periodRows,
386
+ currency,
387
+ factualCostPeriods?.[granularity],
388
+ );
389
+ // The monthly and annual Cost Monitor groups carry the factual duration
390
+ // for the same snapshot. Only fill an unavailable Operations value;
391
+ // never derive time or overwrite a known period duration.
392
+ const displayedRows = factualDurationRowsForExport(
393
+ granularity,
394
+ costRows,
395
+ factualCostPeriods?.[granularity],
396
+ );
386
397
  // Keep the period XLSX contract identical to Cost Monitor.
387
- return periodRows.map((row) => ({
398
+ return displayedRows.map((row) => ({
388
399
  key: row.key,
389
400
  prds: row.prds,
390
401
  specs: row.specs,
@@ -414,6 +425,7 @@ export function OperationsPage({
414
425
  conversationRuns,
415
426
  decisions,
416
427
  executions,
428
+ factualCostPeriods,
417
429
  prds,
418
430
  resolveRunCost,
419
431
  runs,
@@ -425,6 +437,7 @@ export function OperationsPage({
425
437
  data.filters,
426
438
  dailyPeriods,
427
439
  matchesSelectedDate,
440
+ currency,
428
441
  ]);
429
442
  const isLoading = loading || filterLoading;
430
443
  useEffect(() => onLoadingChange?.(isLoading), [isLoading, onLoadingChange]);
@@ -636,8 +649,6 @@ export function OperationsPage({
636
649
  <OperationsPageLoading locale={locale} />
637
650
  ) : (
638
651
  <>
639
- {/* <OperationsOverview runs={runs} tasks={tasks} specs={specs} prds={prds} /> */}
640
- {/* <section className="dashboard-global-controls"></section> */}
641
652
  <OperationsPageOverview
642
653
  capabilityNavigation={capabilityNavigation}
643
654
  currency={currency}
@@ -664,6 +675,7 @@ export function OperationsPage({
664
675
  onLoadStatusPage={onLoadStatusPage}
665
676
  classificationPage={classificationPage}
666
677
  onLoadClassificationPage={onLoadClassificationPage}
678
+ onLoadMacroMetrics={onLoadMacroMetrics}
667
679
  updatePeriod={updatePeriod}
668
680
  />
669
681
 
@@ -690,7 +702,17 @@ export function OperationsPage({
690
702
  risk: riskFilter,
691
703
  origin: originFilter,
692
704
  })
693
- : undefined
705
+ : detailExportSource?.(view, {
706
+ query,
707
+ status: statusFilter,
708
+ risk: riskFilter,
709
+ origin: originFilter,
710
+ ...(view === "work-list" &&
711
+ workListPage !== undefined &&
712
+ workListPage.typeFilter !== "all"
713
+ ? { kind: workListPage.typeFilter }
714
+ : {}),
715
+ })
694
716
  }
695
717
  view={`operations-${view}`}
696
718
  />
@@ -713,8 +735,9 @@ export function OperationsPage({
713
735
  locale={locale}
714
736
  onBoardTypeChange={onBoardTypeChange}
715
737
  onEntityPageChange={onEntityPageChange}
716
- onLoadMoreBoard={onLoadMoreBoard}
717
- onWorkListTypeChange={onWorkListTypeChange}
738
+ onLoadMoreBoard={onLoadMoreBoard}
739
+ onWorkListTypeChange={onWorkListTypeChange}
740
+ onWorkListPageChange={onWorkListPageChange}
718
741
  onOpenDocument={onOpenDocument}
719
742
  onOpenTask={onOpenTask}
720
743
  onPriorityChange={onPriorityChange}
@@ -724,6 +747,7 @@ export function OperationsPage({
724
747
  specs={specs}
725
748
  summaryPopulation={summaryPopulation}
726
749
  tasks={tasks}
750
+ workListPage={workListPage}
727
751
  view={view}
728
752
  />
729
753
  </>
@@ -739,18 +763,3 @@ export function OperationsPage({
739
763
  export function shouldRenderOperationsContent(loading: boolean): boolean {
740
764
  return !loading;
741
765
  }
742
-
743
- function _OperationsPageLoading({ locale }: { locale: OperationsLocale }) {
744
- return (
745
- <section
746
- aria-busy="true"
747
- aria-live="polite"
748
- className="operations-content-skeleton"
749
- role="status"
750
- >
751
- <span>
752
- {locale === "pt-BR" ? "Carregando o período selecionado…" : "Loading selected period…"}
753
- </span>
754
- </section>
755
- );
756
- }
@@ -11,10 +11,7 @@ export function OperationsViewTabs({
11
11
  onChange: (view: OperationsView) => void;
12
12
  view: OperationsView;
13
13
  }) {
14
- const views = [
15
- "work-kanban",
16
- "work-list",
17
- ] as const;
14
+ const views = ["work-kanban", "work-list"] as const;
18
15
  return (
19
16
  <nav aria-label="Entidades do ciclo de trabalho">
20
17
  {views.map((key) => (
@@ -28,6 +28,7 @@ export function OperationsPageOverview({
28
28
  onLoadStatusPage,
29
29
  classificationPage,
30
30
  onLoadClassificationPage,
31
+ onLoadMacroMetrics,
31
32
  prds,
32
33
  query,
33
34
  resolveRunCost,
@@ -55,6 +56,7 @@ export function OperationsPageOverview({
55
56
  onLoadStatusPage: OverviewProps["onLoadStatusPage"];
56
57
  classificationPage: OverviewProps["classificationPage"];
57
58
  onLoadClassificationPage: OverviewProps["onLoadClassificationPage"];
59
+ onLoadMacroMetrics: OverviewProps["onLoadMacroMetrics"];
58
60
  prds: NonNullable<OverviewProps["prds"]>;
59
61
  query: string;
60
62
  resolveRunCost: OverviewProps["resolveRunCost"];
@@ -93,6 +95,7 @@ export function OperationsPageOverview({
93
95
  onLoadStatusPage={onLoadStatusPage}
94
96
  classificationPage={classificationPage}
95
97
  onLoadClassificationPage={onLoadClassificationPage}
98
+ onLoadMacroMetrics={onLoadMacroMetrics}
96
99
  prds={prds}
97
100
  runs={runs}
98
101
  resolveRunCost={resolveRunCost}
@@ -0,0 +1,43 @@
1
+ import { createElement } from "react";
2
+ import { renderToStaticMarkup } from "react-dom/server";
3
+ import { describe, expect, it } from "vitest";
4
+ import { PagedWorkList } from "./PagedWorkList.js";
5
+
6
+ describe("PagedWorkList", () => {
7
+ it("renders the factual developer column without object coercion", () => {
8
+ const markup = renderToStaticMarkup(
9
+ createElement(PagedWorkList, {
10
+ loading: false,
11
+ locale: "pt-BR",
12
+ onPageChange: () => undefined,
13
+ onTypeChange: () => undefined,
14
+ page: {
15
+ error: null,
16
+ hasMore: false,
17
+ limit: 10,
18
+ loading: false,
19
+ offset: 0,
20
+ rows: [
21
+ {
22
+ developers: [
23
+ { account_id: "199126185", login_snapshot: "zaip-ai" },
24
+ { account_id: "200", login_snapshot: null },
25
+ ],
26
+ id: "TASK-1",
27
+ kind: "task",
28
+ risk: "standard",
29
+ status: "executing",
30
+ title: "List developer identities",
31
+ },
32
+ ],
33
+ total: 1,
34
+ typeFilter: "all",
35
+ },
36
+ }),
37
+ );
38
+
39
+ expect(markup).toContain("Desenvolvedor");
40
+ expect(markup).toContain("zaip-ai (199126185); 200");
41
+ expect(markup).not.toContain("[object Object]");
42
+ });
43
+ });
@@ -0,0 +1,181 @@
1
+ import { DataTable, formatCompactNumber, formatCurrency } from "@zaip-ai/dashboard-ui";
2
+ import { formatDeveloperIdentities } from "./developer-identities.js";
3
+ import { formatRoundedDuration } from "./format-rounded-duration.js";
4
+ import type { OperationsLocale } from "./status-labels.js";
5
+ import { WorkTypeFilters } from "./UnifiedWorkBoard.js";
6
+ import type { WorkTypeFilter } from "./work-board-model.js";
7
+
8
+ export type PagedWorkListRow = Record<string, unknown>;
9
+ export type PagedWorkListPage = {
10
+ offset: number;
11
+ limit: number;
12
+ total: number | null;
13
+ hasMore: boolean;
14
+ typeFilter: WorkTypeFilter;
15
+ rows: readonly PagedWorkListRow[];
16
+ loading: boolean;
17
+ error: string | null;
18
+ };
19
+
20
+ function text(value: unknown, fallback = "—") {
21
+ return typeof value === "string" && value.length > 0 ? value : fallback;
22
+ }
23
+
24
+ function number(value: unknown): number | null {
25
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
26
+ }
27
+
28
+ function workKindLabel(value: unknown, locale: OperationsLocale) {
29
+ const kind = text(value, "");
30
+ const labels =
31
+ locale === "pt-BR"
32
+ ? { task: "Tarefas", "standalone-task": "Tarefa Avulsa", prd: "PRD", spec: "SPEC" }
33
+ : { task: "Tasks", "standalone-task": "Standalone Task", prd: "PRD", spec: "SPEC" };
34
+ return kind === "task" || kind === "standalone-task" || kind === "prd" || kind === "spec"
35
+ ? labels[kind]
36
+ : text(value);
37
+ }
38
+
39
+ /**
40
+ * Bounded list projection. It intentionally does not reuse UnifiedWorkList:
41
+ * that component requires all PRD/SPEC/Task relations in memory and therefore
42
+ * turns a visual tab into an unbounded collection request.
43
+ */
44
+ export function PagedWorkList({
45
+ loading,
46
+ locale,
47
+ onPageChange,
48
+ onTypeChange,
49
+ page,
50
+ }: {
51
+ loading: boolean;
52
+ locale: OperationsLocale;
53
+ onPageChange: (offset: number) => void;
54
+ onTypeChange: (kind: WorkTypeFilter) => void;
55
+ page: PagedWorkListPage;
56
+ }) {
57
+ return (
58
+ <section
59
+ aria-busy={loading || undefined}
60
+ className="operations-unified-work operations-work-list"
61
+ >
62
+ <WorkTypeFilters locale={locale} onChange={onTypeChange} value={page.typeFilter} />
63
+ <div className="operations-work-list-table">
64
+ <DataTable
65
+ columns={[
66
+ {
67
+ key: "item",
68
+ label: locale === "pt-BR" ? "Item" : "Item",
69
+ render: (row) => (
70
+ <span className="operations-work-list-identity">
71
+ <strong>{text(row.title, text(row.id))}</strong>
72
+ <small>{text(row.id)}</small>
73
+ </span>
74
+ ),
75
+ sortValue: (row) => text(row.title, text(row.id)),
76
+ },
77
+ {
78
+ key: "status",
79
+ label: "Status",
80
+ render: (row) => text(row.status),
81
+ sortValue: (row) => text(row.status),
82
+ },
83
+ {
84
+ key: "type",
85
+ label: locale === "pt-BR" ? "Tipo" : "Type",
86
+ render: (row) => workKindLabel(row.kind ?? row.entity_kind, locale),
87
+ sortValue: (row) => text(row.kind ?? row.entity_kind),
88
+ },
89
+ {
90
+ key: "risk",
91
+ label: locale === "pt-BR" ? "Risco" : "Risk",
92
+ render: (row) => text(row.risk),
93
+ sortValue: (row) => text(row.risk),
94
+ },
95
+ {
96
+ key: "developers",
97
+ label: locale === "pt-BR" ? "Desenvolvedor" : "Developer",
98
+ render: (row) => formatDeveloperIdentities(row.developers),
99
+ sortValue: (row) => formatDeveloperIdentities(row.developers),
100
+ },
101
+ {
102
+ key: "time",
103
+ label: locale === "pt-BR" ? "Tempo" : "Time",
104
+ render: (row) => {
105
+ const duration = number(row.total_duration);
106
+ return duration === null ? "—" : formatRoundedDuration(duration);
107
+ },
108
+ sortValue: (row) => number(row.total_duration),
109
+ align: "right",
110
+ },
111
+ {
112
+ key: "tokens",
113
+ label: "Tokens",
114
+ render: (row) => {
115
+ const tokens = number(row.total_tokens);
116
+ return tokens === null ? "—" : formatCompactNumber(tokens);
117
+ },
118
+ sortValue: (row) => number(row.total_tokens),
119
+ align: "right",
120
+ },
121
+ {
122
+ key: "cost",
123
+ label: locale === "pt-BR" ? "Custo" : "Cost",
124
+ render: (row) => {
125
+ const cost = number(row.total_cost_brl);
126
+ return cost === null ? "—" : formatCurrency(cost, "BRL");
127
+ },
128
+ sortValue: (row) => number(row.total_cost_brl),
129
+ align: "right",
130
+ },
131
+ ]}
132
+ defaultSort={{ key: "item", direction: "asc" }}
133
+ emptyMessage={
134
+ loading
135
+ ? locale === "pt-BR"
136
+ ? "Carregando itens…"
137
+ : "Loading items…"
138
+ : locale === "pt-BR"
139
+ ? "Nenhum item de trabalho encontrado."
140
+ : "No work items found."
141
+ }
142
+ locale={locale}
143
+ rowKey={(row) => text(row.id)}
144
+ rows={page.rows}
145
+ scrollLabel={
146
+ locale === "pt-BR" ? "Lista paginada de itens de trabalho." : "Paged work item list."
147
+ }
148
+ sortable
149
+ />
150
+ </div>
151
+ <nav
152
+ aria-label={locale === "pt-BR" ? "Paginação da lista de trabalho" : "Work list pagination"}
153
+ className="ui-table-pagination"
154
+ >
155
+ {page.error ? <span role="alert">{page.error}</span> : null}
156
+ {loading ? (
157
+ <span role="status">{locale === "pt-BR" ? "Atualizando…" : "Updating…"}</span>
158
+ ) : null}
159
+ <button
160
+ disabled={loading || page.offset === 0}
161
+ onClick={() => onPageChange(Math.max(0, page.offset - page.limit))}
162
+ type="button"
163
+ >
164
+ {locale === "pt-BR" ? "Anterior" : "Previous"}
165
+ </button>
166
+ <output aria-live="polite">
167
+ {page.total === null
168
+ ? "…"
169
+ : `${page.offset + (page.rows.length === 0 ? 0 : 1)}–${Math.min(page.offset + page.limit, page.total)} ${locale === "pt-BR" ? "de" : "of"} ${page.total}`}
170
+ </output>
171
+ <button
172
+ disabled={loading || !page.hasMore}
173
+ onClick={() => onPageChange(page.offset + page.limit)}
174
+ type="button"
175
+ >
176
+ {locale === "pt-BR" ? "Próxima" : "Next"}
177
+ </button>
178
+ </nav>
179
+ </section>
180
+ );
181
+ }
@@ -43,20 +43,17 @@ export function PeriodSummaryTable({
43
43
  Record<string, import("./period-summary.js").ManifestDailyPeriod>
44
44
  >;
45
45
  factualCostPeriods?: Partial<
46
- Record<PeriodGranularity, readonly { key: string; estimated_usd: number | null; estimated_brl: number | null }[]>
46
+ Record<
47
+ PeriodGranularity,
48
+ readonly { key: string; estimated_usd: number | null; estimated_brl: number | null }[]
49
+ >
47
50
  >;
48
51
  }) {
49
52
  const calculatedRows =
50
53
  // Persisted Operations periods carry BRL-only aggregates. USD must be
51
54
  // rebuilt from the selected-currency per-Run resolver or remain null.
52
55
  manifestDailyPeriods === undefined || currency === "USD"
53
- ? aggregatePeriodSummary(
54
- data,
55
- granularity,
56
- resolveRunCost,
57
- includeLegacyEffort,
58
- legacyRange,
59
- )
56
+ ? aggregatePeriodSummary(data, granularity, resolveRunCost, includeLegacyEffort, legacyRange)
60
57
  : aggregateManifestPeriodSummary(manifestDailyPeriods, granularity);
61
58
  const rows = applyFactualPeriodCosts(calculatedRows, currency, factualCostPeriods?.[granularity]);
62
59
  const summarizedTotal = summarizePeriodRows(rows);
@@ -197,17 +194,42 @@ export function PeriodSummaryTable({
197
194
  export function applyFactualPeriodCosts<T extends { key: string; costBrl: number | null }>(
198
195
  rows: readonly T[],
199
196
  currency: "BRL" | "USD",
200
- factualRows?: readonly { key: string; estimated_usd: number | null; estimated_brl: number | null }[],
197
+ factualRows?: readonly {
198
+ key: string;
199
+ estimated_usd: number | null;
200
+ estimated_brl: number | null;
201
+ }[],
201
202
  ): T[] {
202
203
  if (factualRows === undefined) return [...rows];
203
204
  const costByKey = new Map(
204
- factualRows.map((row) => [row.key, currency === "USD" ? row.estimated_usd : row.estimated_brl] as const),
205
+ factualRows.map(
206
+ (row) => [row.key, currency === "USD" ? row.estimated_usd : row.estimated_brl] as const,
207
+ ),
205
208
  );
206
209
  return rows.map((row) =>
207
210
  costByKey.has(row.key) ? { ...row, costBrl: costByKey.get(row.key) ?? null } : row,
208
211
  );
209
212
  }
210
213
 
214
+ /**
215
+ * Fills an unavailable Operations duration only when Cost Monitor has an
216
+ * observed period fact. A missing/null Cost Monitor value remains unavailable.
217
+ */
218
+ export function applyFactualPeriodDurations<T extends { key: string; durationMs: number | null }>(
219
+ rows: readonly T[],
220
+ factualRows?: readonly { key: string; duration_ms: number | null }[],
221
+ ): T[] {
222
+ if (factualRows === undefined) return [...rows];
223
+ const durationByKey = new Map(factualRows.map((row) => [row.key, row.duration_ms] as const));
224
+ return rows.map((row) => {
225
+ if (row.durationMs !== null) return row;
226
+ const factualDuration = durationByKey.get(row.key);
227
+ return factualDuration === undefined || factualDuration === null
228
+ ? row
229
+ : { ...row, durationMs: factualDuration };
230
+ });
231
+ }
232
+
211
233
  /** Empty period totals display zero without inventing duration for any Run. */
212
234
  export function periodTotalDurationMs(
213
235
  durationMs: number | null,