@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
@@ -1,6 +1,7 @@
1
1
  import { createExportSnapshot } from "@zaip-ai/dashboard-contracts";
2
2
  import { Download } from "lucide-react";
3
3
  import { useEffect, useRef, useState } from "react";
4
+ import { formatDeveloperIdentities } from "../developer-identities.js";
4
5
  import { ExportProgressToast, ExportSuccessToast } from "./ExportProgressToast.js";
5
6
  import { ExportController, type ExportState } from "./export-session.js";
6
7
 
@@ -8,9 +9,12 @@ export type ExcelExportInput = {
8
9
  view: string;
9
10
  filters: Readonly<Record<string, unknown>>;
10
11
  rows: readonly Record<string, unknown>[];
11
- pageSource?: PreparedExportPageSource | {
12
- prepare: () => Promise<PreparedExportPageSource>;
13
- } | undefined;
12
+ pageSource?:
13
+ | PreparedExportPageSource
14
+ | {
15
+ prepare: () => Promise<PreparedExportPageSource>;
16
+ }
17
+ | undefined;
14
18
  };
15
19
  export type PreparedExportPageSource = {
16
20
  totalRows: number;
@@ -31,60 +35,347 @@ export const PERIOD_EXPORT_COLUMNS = [
31
35
  "duration_hours",
32
36
  ] as const;
33
37
 
34
- // Board pages contain three canonical entity shapes. Keep their full common
35
- // schema even when the visible first page happens not to contain one shape.
36
- export const KANBAN_EXPORT_COLUMNS = [
37
- "kind",
38
+ // Work views contain PRDs, SPECs, and Tasks. Export the common, user-facing
39
+ // fields instead of the union of their internal lifecycle projections. The
40
+ // latter produces columns that are empty for an entire view (or nearly every
41
+ // row), which makes the workbook much harder to use.
42
+ export const WORK_EXPORT_COLUMNS = [
43
+ "type",
38
44
  "id",
39
45
  "title",
40
- "short_name",
41
- "objective",
42
- "lifecycle_status",
43
- "work_status",
44
46
  "status",
45
47
  "risk",
46
- "priority",
47
- "owner",
48
+ "developers",
49
+ "occurred_at",
50
+ "duration_hours",
51
+ "tokens",
52
+ "cost_brl",
53
+ ] as const;
54
+
55
+ // Execution rows are entities, not period summaries. Keep their schema
56
+ // aligned with the Execution table so the workbook never inherits the empty
57
+ // PRD/SPEC/period columns shown by a different tab.
58
+ export const EXECUTION_EXPORT_COLUMNS = [
59
+ "id",
60
+ "kind",
61
+ "status",
62
+ "origin",
63
+ "task_id",
64
+ "conversation_id",
48
65
  "created_at",
49
- "updated_at",
66
+ "finished_at",
67
+ "duration_hours",
68
+ "tokens",
69
+ "cost_brl",
70
+ "invocations",
71
+ ] as const;
72
+
73
+ export const AGENT_INVOCATION_EXPORT_COLUMNS = [
74
+ "run_id",
75
+ "execution_id",
76
+ "conversation_id",
77
+ "task_id",
78
+ "origin",
79
+ "run_role",
80
+ "run_purpose",
81
+ "phase",
82
+ "status",
83
+ "agent",
84
+ "provider",
85
+ "model",
86
+ "reasoning_effort",
50
87
  "started_at",
51
88
  "finished_at",
52
- "parent_id",
53
- "spec_id",
54
- "change_id",
55
- "manual_order",
56
- "attempt_count",
57
- "progress",
58
- "is_active",
59
- "artifact_path",
60
- "requirement_ids",
61
- "acceptance_ids",
62
- "depends_on",
63
- "write_scopes",
64
- "task_ids",
65
- "execution_ids",
66
- "run_ids",
67
89
  "duration_hours",
68
- "duration_provenance",
90
+ "input_tokens",
91
+ "cached_input_tokens",
92
+ "output_tokens",
93
+ "reasoning_tokens",
69
94
  "total_tokens",
95
+ "estimated_usd",
96
+ "estimated_brl",
97
+ ] as const;
98
+
99
+ export const COMPACT_LIFECYCLE_EXPORT_COLUMNS = [
100
+ "id",
101
+ "title",
102
+ "status",
103
+ "occurred_at",
104
+ "invocations",
105
+ "duration_hours",
106
+ "tokens",
107
+ "cost_brl",
108
+ ] as const;
109
+
110
+ export const COST_GROUP_EXPORT_COLUMNS = [
111
+ "key",
112
+ "label",
113
+ "invocations",
114
+ "tasks",
115
+ "tokens",
116
+ "cost_usd",
117
+ "cost_brl",
118
+ "duration_hours",
119
+ ] as const;
120
+
121
+ export const CONVERSATION_EXPORT_COLUMNS = [
122
+ "conversation_id",
123
+ "status",
124
+ "risk",
125
+ "started_at",
126
+ "finished_at",
127
+ "model",
128
+ "reasoning_effort",
129
+ "invocations",
130
+ "duration_hours",
131
+ "tokens",
70
132
  "cost_brl",
71
133
  ] as const;
72
134
 
135
+ export const CHANGE_EXPORT_COLUMNS = [
136
+ "id",
137
+ "title",
138
+ "status",
139
+ "risk",
140
+ "source_type",
141
+ "source_id",
142
+ "requirement_ids_json",
143
+ "acceptance_ids_json",
144
+ "task_ids_json",
145
+ "occurred_at",
146
+ ] as const;
147
+
148
+ export const DECISION_EXPORT_COLUMNS = [
149
+ "id",
150
+ "title",
151
+ "origin",
152
+ "scope_type",
153
+ "scope_id",
154
+ "occurred_at",
155
+ ] as const;
156
+
157
+ /** @deprecated Use WORK_EXPORT_COLUMNS for Kanban and Work List exports. */
158
+ export const KANBAN_EXPORT_COLUMNS = WORK_EXPORT_COLUMNS;
159
+
73
160
  export async function* exportPageSourceRows(
74
161
  pageSource: PreparedExportPageSource,
162
+ mapRows: (
163
+ rows: readonly Record<string, unknown>[],
164
+ ) => Record<string, unknown>[] = exportRowsWithDurationHours,
75
165
  ): AsyncGenerator<Record<string, unknown>[]> {
76
166
  const seen = new Set<string>();
77
167
  for await (const page of pageSource.pages()) {
78
168
  const unique = page.filter((row) => {
79
- const id = typeof row.id === "string" ? row.id : JSON.stringify(row);
169
+ const id =
170
+ typeof row.id === "string"
171
+ ? row.id
172
+ : typeof row.run_id === "string"
173
+ ? row.run_id
174
+ : typeof row.agent_invocation_id === "string"
175
+ ? row.agent_invocation_id
176
+ : typeof row.key === "string"
177
+ ? row.key
178
+ : JSON.stringify(row);
80
179
  if (seen.has(id)) return false;
81
180
  seen.add(id);
82
181
  return true;
83
182
  });
84
- if (unique.length > 0) yield exportRowsWithDurationHours(unique);
183
+ if (unique.length > 0) yield mapRows(unique);
85
184
  }
86
185
  }
87
186
 
187
+ export function exportWorkRows(
188
+ rows: readonly Record<string, unknown>[],
189
+ ): Record<string, unknown>[] {
190
+ return rows.map((row) => {
191
+ const telemetry = asRecord(row.telemetry);
192
+ const usage = asRecord(row.usage);
193
+ const totalUsage = asRecord(usage?.total);
194
+ const tokenUsage = asRecord(totalUsage?.tokens);
195
+ const costUsage = asRecord(totalUsage?.cost);
196
+ const metrics = asRecord(row.metrics);
197
+ const metricDuration = asRecord(metrics?.duration);
198
+ const metricTokens = asRecord(metrics?.total_tokens);
199
+ const metricCost = asRecord(metrics?.cost);
200
+ const durationMs =
201
+ numberValue(row.duration_ms) ??
202
+ numberValue(telemetry?.duration_ms) ??
203
+ numberValue(row.total_duration) ??
204
+ numberValue(metricDuration?.known_sum);
205
+ return {
206
+ type: row.kind ?? row.entity_kind,
207
+ id: row.id,
208
+ title: row.title,
209
+ // work_status is the Kanban column for macros; Task status is already
210
+ // the canonical work stage for a Task.
211
+ status: row.work_status ?? row.status ?? row.lifecycle_status,
212
+ risk: row.risk ?? null,
213
+ developers: formatDeveloperIdentities(row.developers),
214
+ occurred_at: row.occurred_at ?? row.created_at ?? row.updated_at ?? null,
215
+ duration_hours: durationMs === null ? null : durationMs / 3_600_000,
216
+ tokens:
217
+ numberValue(row.total_tokens) ??
218
+ numberValue(telemetry?.tokens) ??
219
+ numberValue(tokenUsage?.total) ??
220
+ numberValue(metricTokens?.known_sum),
221
+ cost_brl:
222
+ numberValue(row.cost_brl) ??
223
+ numberValue(row.total_cost_brl) ??
224
+ numberValue(telemetry?.cost_brl) ??
225
+ numberValue(costUsage?.brl) ??
226
+ numberValue(metricCost?.known_sum),
227
+ };
228
+ });
229
+ }
230
+
231
+ /** Normalize both the Operations projection and the paginated SQLite view. */
232
+ export function exportExecutionRows(
233
+ rows: readonly Record<string, unknown>[],
234
+ ): Record<string, unknown>[] {
235
+ return rows.map((row) => {
236
+ const origin = asRecord(row.origin);
237
+ const originType =
238
+ typeof origin?.type === "string"
239
+ ? origin.type
240
+ : typeof row.origin_type === "string"
241
+ ? row.origin_type
242
+ : null;
243
+ const durationMs = executionDurationMs(row);
244
+ return {
245
+ id: row.id ?? row.execution_id ?? null,
246
+ kind: row.kind ?? row.execution_kind ?? null,
247
+ status: row.status ?? null,
248
+ origin: originType,
249
+ task_id: row.task_id ?? (originType === "task" ? (origin?.task_id ?? null) : null),
250
+ conversation_id:
251
+ row.conversation_id ??
252
+ (originType === "interaction" ? (origin?.conversation_id ?? null) : null),
253
+ created_at: row.created_at ?? row.started_at ?? null,
254
+ finished_at: row.finished_at ?? null,
255
+ duration_hours: durationMs === null ? null : durationMs / 3_600_000,
256
+ tokens: numberValue(row.total_tokens),
257
+ cost_brl: numberValue(row.cost_brl) ?? numberValue(row.total_cost_brl),
258
+ invocations:
259
+ numberValue(row.orchestrator_run_count) ?? numberValue(row.invocation_count) ?? null,
260
+ };
261
+ });
262
+ }
263
+
264
+ export function exportAgentInvocationRows(
265
+ rows: readonly Record<string, unknown>[],
266
+ ): Record<string, unknown>[] {
267
+ return rows.map((row) => {
268
+ const durationMs = executionDurationMs(row);
269
+ return {
270
+ run_id: row.run_id ?? row.agent_invocation_id ?? row.id ?? null,
271
+ execution_id: row.execution_id ?? null,
272
+ conversation_id: row.conversation_id ?? null,
273
+ task_id: row.task_id ?? null,
274
+ origin: row.origin ?? row.invocation_kind ?? null,
275
+ run_role: row.run_role ?? row.zaip_agent_role ?? null,
276
+ run_purpose: row.run_purpose ?? row.purpose ?? null,
277
+ phase: row.phase ?? null,
278
+ status: row.status ?? null,
279
+ agent: row.agent ?? row.zaip_agent ?? null,
280
+ provider: row.provider ?? null,
281
+ model: row.model ?? null,
282
+ reasoning_effort: row.reasoning_effort ?? null,
283
+ started_at: row.started_at ?? row.source_started_at ?? row.occurred_at ?? null,
284
+ finished_at: row.finished_at ?? row.source_finished_at ?? null,
285
+ duration_hours: durationMs === null ? null : durationMs / 3_600_000,
286
+ input_tokens: numberValue(row.input_tokens),
287
+ cached_input_tokens: numberValue(row.cached_input_tokens),
288
+ output_tokens: numberValue(row.output_tokens),
289
+ reasoning_tokens: numberValue(row.reasoning_tokens),
290
+ total_tokens: numberValue(row.total_tokens),
291
+ estimated_usd: numberValue(row.estimated_usd) ?? numberValue(row.cost_usd),
292
+ estimated_brl: numberValue(row.estimated_brl) ?? numberValue(row.cost_brl),
293
+ };
294
+ });
295
+ }
296
+
297
+ export function exportCompactLifecycleRows(
298
+ rows: readonly Record<string, unknown>[],
299
+ ): Record<string, unknown>[] {
300
+ return rows.map((row) => {
301
+ const metrics = asRecord(row.metrics);
302
+ const duration = asRecord(metrics?.duration);
303
+ const tokens = asRecord(metrics?.total_tokens);
304
+ const cost = asRecord(metrics?.cost);
305
+ const durationMs = numberValue(duration?.known_sum) ?? numberValue(row.total_duration);
306
+ return {
307
+ id: row.id ?? null,
308
+ title: row.title ?? null,
309
+ status: row.status ?? null,
310
+ occurred_at: row.occurred_at ?? null,
311
+ invocations: numberValue(row.run_count) ?? numberValue(row.invocation_count),
312
+ duration_hours: durationMs === null ? null : durationMs / 3_600_000,
313
+ tokens: numberValue(tokens?.known_sum) ?? numberValue(row.total_tokens),
314
+ cost_brl: numberValue(cost?.known_sum) ?? numberValue(row.total_cost_brl),
315
+ };
316
+ });
317
+ }
318
+
319
+ export function exportCostGroupRows(
320
+ rows: readonly Record<string, unknown>[],
321
+ ): Record<string, unknown>[] {
322
+ return rows.map((row) => {
323
+ const durationMs = numberValue(row.duration_ms) ?? numberValue(row.total_duration);
324
+ return {
325
+ key: row.key ?? null,
326
+ label: row.label ?? null,
327
+ invocations: numberValue(row.run_count) ?? numberValue(row.invocation_count),
328
+ tasks: numberValue(row.task_count),
329
+ tokens: numberValue(row.total_tokens),
330
+ cost_usd: numberValue(row.estimated_usd) ?? numberValue(row.total_cost_usd),
331
+ cost_brl: numberValue(row.estimated_brl) ?? numberValue(row.total_cost_brl),
332
+ duration_hours: durationMs === null ? null : durationMs / 3_600_000,
333
+ };
334
+ });
335
+ }
336
+
337
+ export function exportConversationRows(
338
+ rows: readonly Record<string, unknown>[],
339
+ ): Record<string, unknown>[] {
340
+ return rows.map((row) => ({
341
+ conversation_id: row.conversation_id ?? row.id ?? null,
342
+ status: row.status ?? null,
343
+ risk: row.risk ?? null,
344
+ started_at: row.started_at ?? null,
345
+ finished_at: row.finished_at ?? null,
346
+ model: row.model ?? null,
347
+ reasoning_effort: row.reasoning_effort ?? null,
348
+ invocations: numberValue(row.invocation_count),
349
+ duration_hours:
350
+ (numberValue(row.total_duration) ?? numberValue(row.duration_ms)) === null
351
+ ? null
352
+ : Number(numberValue(row.total_duration) ?? numberValue(row.duration_ms)) / 3_600_000,
353
+ tokens: numberValue(row.total_tokens),
354
+ cost_brl: numberValue(row.total_cost_brl) ?? numberValue(row.cost_brl),
355
+ }));
356
+ }
357
+
358
+ function exportSelectedRows(
359
+ rows: readonly Record<string, unknown>[],
360
+ keys: readonly string[],
361
+ ): Record<string, unknown>[] {
362
+ return rows.map((row) => Object.fromEntries(keys.map((key) => [key, row[key] ?? null])));
363
+ }
364
+
365
+ function executionDurationMs(row: Record<string, unknown>): number | null {
366
+ return numberValue(row.duration_ms) ?? numberValue(row.source_duration_ms);
367
+ }
368
+
369
+ function asRecord(value: unknown): Record<string, unknown> | null {
370
+ return value !== null && typeof value === "object" && !Array.isArray(value)
371
+ ? (value as Record<string, unknown>)
372
+ : null;
373
+ }
374
+
375
+ function numberValue(value: unknown): number | null {
376
+ return typeof value === "number" ? value : null;
377
+ }
378
+
88
379
  export function exportRowsWithDurationHours(
89
380
  rows: readonly Record<string, unknown>[],
90
381
  ): Record<string, unknown>[] {
@@ -112,21 +403,58 @@ function orderedExportEntries(row: Record<string, unknown>): [string, unknown][]
112
403
  }
113
404
 
114
405
  function normalizePeriodRow(row: Record<string, unknown>): Record<string, unknown> {
115
- if (Object.keys(row).some((key) => key !== "key" && PERIOD_EXPORT_COLUMNS.includes(key as never)))
406
+ const hasPeriodSourceAliases =
407
+ ("key" in row || "period_key" in row) &&
408
+ ("prd_count" in row ||
409
+ "spec_count" in row ||
410
+ "run_count" in row ||
411
+ "total_run_count" in row ||
412
+ "costBrl" in row ||
413
+ "total_cost_brl" in row ||
414
+ "durationMs" in row ||
415
+ "operations_total_duration" in row ||
416
+ "tasksCreated" in row);
417
+ if (!hasPeriodSourceAliases) {
418
+ if (
419
+ Object.keys(row).some((key) => key !== "key" && PERIOD_EXPORT_COLUMNS.includes(key as never))
420
+ )
421
+ return row;
116
422
  return row;
117
- if (!("prd_count" in row || "spec_count" in row || "run_count" in row)) return row;
423
+ }
118
424
  return {
119
- key: row.key,
120
- prds: row.prd_count,
121
- specs: row.spec_count,
122
- tasks: row.task_count,
123
- runs: row.run_count,
124
- tests: row.test_count,
125
- evidences: row.evidence_count,
425
+ key: row.key ?? row.period_key,
426
+ prds: row.prds ?? row.prd_count,
427
+ specs: row.specs ?? row.spec_count,
428
+ tasks: row.tasks ?? row.tasksCreated ?? row.task_count,
429
+ runs: row.runs ?? row.run_count ?? row.total_run_count ?? row.invocation_count,
430
+ tests: row.tests ?? row.test_count ?? row.validation_count,
431
+ evidences: row.evidences ?? row.evidence_count,
126
432
  duration_hours:
127
- typeof row.duration_ms === "number" ? row.duration_ms / 3_600_000 : row.duration_ms,
128
- tokens: row.total_tokens,
129
- cost: row.estimated_brl,
433
+ typeof (
434
+ row.durationMs ??
435
+ row.duration_ms ??
436
+ row.operations_total_duration ??
437
+ row.total_duration
438
+ ) === "number"
439
+ ? Number(
440
+ row.durationMs ??
441
+ row.duration_ms ??
442
+ row.operations_total_duration ??
443
+ row.total_duration,
444
+ ) / 3_600_000
445
+ : (row.durationMs ??
446
+ row.duration_ms ??
447
+ row.operations_total_duration ??
448
+ row.total_duration ??
449
+ null),
450
+ tokens: row.tokens ?? row.total_tokens,
451
+ cost:
452
+ row.cost ??
453
+ ("costBrl" in row
454
+ ? row.costBrl
455
+ : "total_cost_brl" in row
456
+ ? row.total_cost_brl
457
+ : row.estimated_brl),
130
458
  };
131
459
  }
132
460
 
@@ -137,6 +465,60 @@ function durationHoursKey(key: string): string | null {
137
465
  return key.endsWith("_duration_ms") ? `${key.slice(0, -2)}hours` : null;
138
466
  }
139
467
 
468
+ export function exportHeadersForView(
469
+ view: string,
470
+ rows: readonly Record<string, unknown>[],
471
+ ): string[] {
472
+ const headers: string[] = [];
473
+ const headerSet = new Set<string>();
474
+ const isPeriodView = /-(daily|monthly|annual|yearly)$/.test(view);
475
+ const isWorkView = /-work-(kanban|list)$/.test(view);
476
+ const isExecutionView = /-executions$/.test(view);
477
+ const isCostExecutionView = view === "cost-executions";
478
+ const isAgentInvocationView = /-(?:agentCalls|agent-calls|runs)$/.test(view);
479
+ const isOperationsConversationView = view === "operations-conversations";
480
+ const isCompactLifecycleView =
481
+ /-(?:tasks|specs|prds|conversations)$/.test(view) && !isOperationsConversationView;
482
+ const isCostGroupView = /-(?:agents|models|providers)$/.test(view);
483
+ const isChangeView = view === "operations-changes";
484
+ const isDecisionView = view === "operations-decisions";
485
+ if (isPeriodView) headers.push(...PERIOD_EXPORT_COLUMNS);
486
+ if (isWorkView) headers.push(...WORK_EXPORT_COLUMNS);
487
+ if (isExecutionView && !isCostExecutionView) headers.push(...EXECUTION_EXPORT_COLUMNS);
488
+ if (isCostExecutionView) headers.push(...COMPACT_LIFECYCLE_EXPORT_COLUMNS);
489
+ if (isAgentInvocationView) headers.push(...AGENT_INVOCATION_EXPORT_COLUMNS);
490
+ if (isCompactLifecycleView) headers.push(...COMPACT_LIFECYCLE_EXPORT_COLUMNS);
491
+ if (isCostGroupView) headers.push(...COST_GROUP_EXPORT_COLUMNS);
492
+ if (isOperationsConversationView) headers.push(...CONVERSATION_EXPORT_COLUMNS);
493
+ if (isChangeView) headers.push(...CHANGE_EXPORT_COLUMNS);
494
+ if (isDecisionView) headers.push(...DECISION_EXPORT_COLUMNS);
495
+ for (const key of headers) headerSet.add(key);
496
+ // `cost-executions` has a compact mapped schema. Raw lifecycle fields must
497
+ // not leak into the workbook after those fixed headers.
498
+ const hasExplicitSchema =
499
+ isWorkView ||
500
+ isCostExecutionView ||
501
+ isExecutionView ||
502
+ isAgentInvocationView ||
503
+ isCompactLifecycleView ||
504
+ isCostGroupView ||
505
+ isOperationsConversationView ||
506
+ isChangeView ||
507
+ isDecisionView;
508
+ if (!hasExplicitSchema) {
509
+ for (const row of rows)
510
+ for (const [key] of orderedExportEntries(row)) {
511
+ const header = durationHoursKey(key) ?? key;
512
+ if (!headerSet.has(header)) {
513
+ headerSet.add(header);
514
+ headers.push(header);
515
+ }
516
+ }
517
+ }
518
+ if (headers.length === 0) headers.push("result");
519
+ return headers;
520
+ }
521
+
140
522
  export function ExcelExportAction({ filters, pageSource, rows, view }: ExcelExportInput) {
141
523
  const controller = useRef<ExportController | null>(null);
142
524
  if (controller.current === null) controller.current = new ExportController();
@@ -154,21 +536,17 @@ export function ExcelExportAction({ filters, pageSource, rows, view }: ExcelExpo
154
536
  const timer = setTimeout(() => setShowSuccess(false), EXPORT_SUCCESS_TOAST_MS);
155
537
  return () => clearTimeout(timer);
156
538
  }, [state.status]);
157
- const headers: string[] = [];
158
- const headerSet = new Set<string>();
159
- const isPeriodView = /-(daily|monthly|annual|yearly)$/.test(view);
160
- if (isPeriodView) headers.push(...PERIOD_EXPORT_COLUMNS);
161
- if (pageSource !== undefined && /work-kanban$/.test(view)) headers.push(...KANBAN_EXPORT_COLUMNS);
162
- for (const key of headers) headerSet.add(key);
163
- for (const row of rows)
164
- for (const [key] of orderedExportEntries(row)) {
165
- const header = durationHoursKey(key) ?? key;
166
- if (!headerSet.has(header)) {
167
- headerSet.add(header);
168
- headers.push(header);
169
- }
170
- }
171
- if (headers.length === 0) headers.push("result");
539
+ const headers = exportHeadersForView(view, rows);
540
+ const isWorkView = /-work-(kanban|list)$/.test(view);
541
+ const isExecutionView = /-executions$/.test(view);
542
+ const isCostExecutionView = view === "cost-executions";
543
+ const isAgentInvocationView = /-(?:agentCalls|agent-calls|runs)$/.test(view);
544
+ const isOperationsConversationView = view === "operations-conversations";
545
+ const isCompactLifecycleView =
546
+ /-(?:tasks|specs|prds|conversations)$/.test(view) && !isOperationsConversationView;
547
+ const isCostGroupView = /-(?:agents|models|providers)$/.test(view);
548
+ const isChangeView = view === "operations-changes";
549
+ const isDecisionView = view === "operations-decisions";
172
550
  const createSnapshot = async () => {
173
551
  const preparedPageSource =
174
552
  pageSource === undefined
@@ -184,11 +562,56 @@ export function ExcelExportAction({ filters, pageSource, rows, view }: ExcelExpo
184
562
  totalRows: preparedPageSource?.totalRows ?? rows.length,
185
563
  pages: async function* () {
186
564
  if (preparedPageSource !== undefined) {
187
- yield* exportPageSourceRows(preparedPageSource);
565
+ yield* exportPageSourceRows(
566
+ preparedPageSource,
567
+ isWorkView
568
+ ? exportWorkRows
569
+ : isOperationsConversationView
570
+ ? exportConversationRows
571
+ : isChangeView
572
+ ? (sourceRows: readonly Record<string, unknown>[]) =>
573
+ exportSelectedRows(sourceRows, CHANGE_EXPORT_COLUMNS)
574
+ : isDecisionView
575
+ ? (sourceRows: readonly Record<string, unknown>[]) =>
576
+ exportSelectedRows(sourceRows, DECISION_EXPORT_COLUMNS)
577
+ : isCostExecutionView
578
+ ? exportCompactLifecycleRows
579
+ : isExecutionView
580
+ ? exportExecutionRows
581
+ : isAgentInvocationView
582
+ ? exportAgentInvocationRows
583
+ : isCompactLifecycleView
584
+ ? exportCompactLifecycleRows
585
+ : isCostGroupView
586
+ ? exportCostGroupRows
587
+ : exportRowsWithDurationHours,
588
+ );
188
589
  return;
189
590
  }
190
591
  for (let offset = 0; offset < rows.length; offset += 500)
191
- yield exportRowsWithDurationHours(rows.slice(offset, offset + 500));
592
+ yield (
593
+ isWorkView
594
+ ? exportWorkRows
595
+ : isOperationsConversationView
596
+ ? exportConversationRows
597
+ : isChangeView
598
+ ? (sourceRows: readonly Record<string, unknown>[]) =>
599
+ exportSelectedRows(sourceRows, CHANGE_EXPORT_COLUMNS)
600
+ : isDecisionView
601
+ ? (sourceRows: readonly Record<string, unknown>[]) =>
602
+ exportSelectedRows(sourceRows, DECISION_EXPORT_COLUMNS)
603
+ : isCostExecutionView
604
+ ? exportCompactLifecycleRows
605
+ : isExecutionView
606
+ ? exportExecutionRows
607
+ : isAgentInvocationView
608
+ ? exportAgentInvocationRows
609
+ : isCompactLifecycleView
610
+ ? exportCompactLifecycleRows
611
+ : isCostGroupView
612
+ ? exportCostGroupRows
613
+ : exportRowsWithDurationHours
614
+ )(rows.slice(offset, offset + 500));
192
615
  },
193
616
  });
194
617
  };
@@ -28,10 +28,32 @@ describe("Excel export layout", () => {
28
28
  });
29
29
 
30
30
  it("uses the paginated board source rather than just visible Kanban rows", () => {
31
- expect(operationsPage).toContain('pageSource={\n view === "work-kanban"');
31
+ expect(operationsPage).toContain(
32
+ 'pageSource={\n view === "work-kanban"',
33
+ );
32
34
  expect(operationsPage).toContain("boardExportSource?.({");
33
35
  });
34
36
 
37
+ it("uses the paginated SQLite source for every Operations table, not the visible page", () => {
38
+ expect(operationsPage).toContain("detailExportSource?.(view, {");
39
+ const exportSource = readFileSync(
40
+ new URL("../../../../../apps/frontend/src/use-operations-detail-export.ts", import.meta.url),
41
+ "utf8",
42
+ );
43
+ const pagination = readFileSync(
44
+ new URL("../../../../../apps/frontend/src/sqlite-page-export.ts", import.meta.url),
45
+ "utf8",
46
+ );
47
+ expect(exportSource).toContain('executions: "operations_executions"');
48
+ expect(exportSource).toContain("totalRows: firstPage.total_count");
49
+ expect(pagination).toContain("if (!page.has_more || nextOffset >= page.total_count) return");
50
+ });
51
+
52
+ it("exports factual developer identities with the work-list rows", () => {
53
+ expect(action).toContain('"developers"');
54
+ expect(action).toContain("formatDeveloperIdentities(row.developers)");
55
+ });
56
+
35
57
  it("keeps the Operations action outside the tab nav and fixed at the bar end", () => {
36
58
  const controls = operationsPage.slice(
37
59
  operationsPage.indexOf('<section className="dashboard-global-controls">'),