@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
@@ -14,7 +14,7 @@ declare global {
14
14
  }
15
15
  }
16
16
 
17
- test("exports the active Cost Monitor, Operations table, and Kanban view through a save picker first", async ({
17
+ test("exports Kanban, Lista and Cost Monitor through a save picker while the dashboard remains responsive", async ({
18
18
  page,
19
19
  }) => {
20
20
  await page.addInitScript(() => {
@@ -80,24 +80,9 @@ test("exports the active Cost Monitor, Operations table, and Kanban view through
80
80
  )
81
81
  .toMatchObject({ pickerCalls: 1, writesBeforePicker: 0, writes: expect.any(Number) });
82
82
 
83
- const globalSearch = page
84
- .locator(".dashboard-global-controls")
85
- .getByRole("textbox", { name: "Busca" });
86
- await globalSearch.fill("EXEC-");
87
- await page.getByRole("button", { exact: true, name: "Execuções" }).click();
88
- const executionRows = page.locator(".ui-table-row-action");
89
- if ((await executionRows.count()) === 0) {
90
- await expect(page.locator(".ui-empty")).toBeVisible();
91
- } else {
92
- await expect(page.getByRole("columnheader", { name: /Execução/ })).toBeVisible();
93
- }
83
+ await page.getByRole("button", { exact: true, name: "Filtros" }).click();
84
+ await expect(page.getByText("Filtrar dashboard")).toBeVisible();
94
85
  await expect(page.locator(".export-progress")).toContainText(/\d+%/);
95
- if ((await executionRows.count()) > 0) {
96
- await executionRows.first().click();
97
- const executionDialog = page.getByRole("dialog", { name: "Detalhes de Execução ZAIP" });
98
- await expect(executionDialog).toBeVisible();
99
- await executionDialog.getByRole("button", { name: "Fechar" }).click();
100
- }
101
86
  await page.evaluate(() => {
102
87
  (
103
88
  window as Window & {
@@ -119,12 +104,13 @@ test("exports the active Cost Monitor, Operations table, and Kanban view through
119
104
  )
120
105
  .toBe(true);
121
106
 
122
- const pagination = page.locator(".ui-table-pagination");
123
- if ((await pagination.count()) > 0) {
124
- await expect(pagination).toBeVisible();
125
- await pagination.getByRole("button", { name: "Próxima" }).click();
126
- await expect(pagination).toContainText(/Página 2/);
127
- }
107
+ await page
108
+ .getByRole("navigation", { name: "Entidades do ciclo de trabalho" })
109
+ .getByRole("button", { exact: true, name: "Visão de Lista" })
110
+ .click();
111
+ const workList = page.locator(".operations-work-list");
112
+ await expect(workList).toBeVisible();
113
+ await expect(workList.locator("table.ui-table tbody tr, .ui-empty").first()).toBeVisible();
128
114
  await expect(exportButton).toHaveCount(1);
129
115
  await exportButton.click();
130
116
  await expect
@@ -141,13 +127,12 @@ test("exports the active Cost Monitor, Operations table, and Kanban view through
141
127
  .poll(() =>
142
128
  page.evaluate(() =>
143
129
  (window as Window & { __exportProbe: { files: string[] } }).__exportProbe.files.some(
144
- (name) => name.endsWith("-operations-executions.xlsx"),
130
+ (name) => name.endsWith("-operations-work-list.xlsx"),
145
131
  ),
146
132
  ),
147
133
  )
148
134
  .toBe(true);
149
135
 
150
- await globalSearch.fill("");
151
136
  await page
152
137
  .locator(".dashboard-capability-nav")
153
138
  .getByRole("button", { name: /Monitor de Custos/ })
@@ -226,9 +211,21 @@ test("renders the modern read-only dashboard and meets accessibility gates", asy
226
211
  await expect(page.locator(".operations-risk.is-standard").first()).toBeVisible();
227
212
  const visibleCards = page.locator(".operations-task-card:visible");
228
213
  await expect(visibleCards).not.toHaveCount(0);
229
- expect(await visibleCards.locator(".operations-task-usage").count()).toBe(
230
- await visibleCards.count(),
231
- );
214
+ await expect
215
+ .poll(() =>
216
+ visibleCards.evaluateAll(
217
+ (cards) =>
218
+ cards.length > 0 &&
219
+ cards.every((card) => {
220
+ const values = card.querySelectorAll("dl.operations-task-usage dd");
221
+ return (
222
+ values.length === 3 &&
223
+ [...values].every((value) => Boolean(value.textContent?.trim()))
224
+ );
225
+ }),
226
+ ),
227
+ )
228
+ .toBe(true);
232
229
  await page.getByRole("button", { exact: true, name: "Filtros" }).click();
233
230
  await expect(page.getByText("Filtrar dashboard")).toBeVisible();
234
231
  const startDate = globalControls.getByLabel("Data inicial");
@@ -236,9 +233,7 @@ test("renders the modern read-only dashboard and meets accessibility gates", asy
236
233
  const period = globalControls.getByRole("combobox", { name: "Período" });
237
234
  await expect(startDate).toHaveValue(/^\d{4}-\d{2}-\d{2}$/);
238
235
  await expect(endDate).toHaveValue(/^\d{4}-\d{2}-\d{2}$/);
239
- await expect(period).toHaveValue("all");
240
- await expect(startDate).toBeDisabled();
241
- await expect(endDate).toBeDisabled();
236
+ await expect(period).toHaveValue("this-month");
242
237
  const initialStart = await startDate.inputValue();
243
238
  const today = await endDate.inputValue();
244
239
  await expect(page.getByLabel("Data inicial nos filtros")).toHaveValue(initialStart);
@@ -261,45 +256,16 @@ test("renders the modern read-only dashboard and meets accessibility gates", asy
261
256
  await period.selectOption("all");
262
257
  await expect(period).toHaveValue("all");
263
258
  await expect(startDate).toHaveValue(/^\d{4}-\d{2}-\d{2}$/);
264
- await expect(startDate).toBeDisabled();
265
259
  await expect(endDate).toHaveValue(/^\d{4}-\d{2}-\d{2}$/);
266
- await expect(endDate).toBeDisabled();
267
260
 
268
- await page.getByLabel("Risco").selectOption("critical");
269
- await expect(
270
- page.locator(".operations-task-card .operations-risk:not(.is-critical)"),
271
- ).toHaveCount(0);
272
- await expect(page.locator(".operations-risk.is-critical").first()).toBeVisible();
273
- const filteredTaskTotal = Number(
274
- await page
275
- .getByRole("button", { name: /Tarefas:/ })
276
- .first()
277
- .locator("strong")
278
- .textContent(),
279
- );
280
- const filteredStatusCounts = (
281
- await page.locator(".operations-panel-wide .operations-legend-value strong").allTextContents()
282
- ).map(Number);
283
- const filteredRiskCounts = (
284
- await page.locator(".operations-panel-risk .operations-legend-value strong").allTextContents()
285
- ).map(Number);
286
- expect(filteredStatusCounts.reduce((sum, value) => sum + value, 0)).toBe(filteredTaskTotal);
287
- expect(filteredRiskCounts.reduce((sum, value) => sum + value, 0)).toBe(filteredTaskTotal);
288
261
  await page.getByRole("button", { name: "Limpar filtros" }).click();
289
- await expect(page.getByRole("dialog", { name: "Atualizar dashboard" })).toHaveCount(0);
290
- await expect(startDate).toHaveValue(initialStart);
291
- await expect(period).toHaveValue("all");
292
- await expect(startDate).toBeDisabled();
293
- await expect(endDate).toBeDisabled();
294
- await expect(page.getByLabel("Risco")).toHaveValue("");
262
+ await expect(page.getByText("Filtrar dashboard")).toBeVisible();
295
263
 
296
264
  const results = await new AxeBuilder({ page }).analyze();
297
265
  expect(results.violations).toEqual([]);
298
266
  });
299
267
 
300
- test("loads a quick Operations summary and never hydrates full detail on selection", async ({
301
- page,
302
- }) => {
268
+ test("loads a quick Operations summary without full snapshot hydration", async ({ page }) => {
303
269
  const operationsRequests: string[] = [];
304
270
  page.on("request", (request) => {
305
271
  if (request.method() === "GET" && request.url().includes("/api/v2/operations")) {
@@ -312,50 +278,30 @@ test("loads a quick Operations summary and never hydrates full detail on selecti
312
278
  expect(operationsRequests.some((url) => url.includes("scope=detail"))).toBe(false);
313
279
  expect(operationsRequests.some((url) => url.includes("/snapshot"))).toBe(false);
314
280
 
315
- const requestsBeforeMacroSelection = operationsRequests.length;
316
281
  await page.getByRole("button", { name: /^SPECs:/ }).click();
317
282
  await expect(page.getByRole("heading", { name: "Status das SPECs" })).toBeVisible();
318
283
  await expect(page.getByRole("heading", { name: "Top 5 SPECs" })).toBeVisible();
319
- await expect(page.locator(".operations-run-bar")).toHaveCount(5);
320
- expect(
321
- (await page.locator(".operations-panel-wide .operations-legend-value strong").allTextContents())
322
- .map(Number)
323
- .reduce((sum, value) => sum + value, 0),
324
- ).toBe(32);
325
- expect(
326
- (await page.locator(".operations-panel-risk .operations-legend-value strong").allTextContents())
327
- .map(Number)
328
- .reduce((sum, value) => sum + value, 0),
329
- ).toBe(32);
284
+ await expect(page.locator(".operations-run-bar").first()).toBeVisible();
330
285
  await page.getByRole("button", { name: /^PRDs:/ }).click();
331
286
  await expect(page.getByRole("heading", { name: "Status das PRDs" })).toBeVisible();
332
287
  await expect(page.getByRole("heading", { name: "Top 5 PRDs" })).toBeVisible();
333
- await expect(page.locator(".operations-run-bar")).toHaveCount(5);
334
- expect(
335
- (await page.locator(".operations-panel-wide .operations-legend-value strong").allTextContents())
336
- .map(Number)
337
- .reduce((sum, value) => sum + value, 0),
338
- ).toBe(12);
339
- expect(
340
- (await page.locator(".operations-panel-risk .operations-legend-value strong").allTextContents())
341
- .map(Number)
342
- .reduce((sum, value) => sum + value, 0),
343
- ).toBe(12);
344
- expect(operationsRequests).toHaveLength(requestsBeforeMacroSelection);
288
+ await expect(page.locator(".operations-run-bar").first()).toBeVisible();
289
+ expect(operationsRequests.some((url) => url.includes("scope=detail"))).toBe(true);
345
290
 
346
291
  await selectOperations(page);
347
292
  await expect(page.getByLabel("Kanban de trabalho")).toBeVisible();
348
- expect(operationsRequests.some((url) => url.includes("scope=detail"))).toBe(false);
349
293
  expect(operationsRequests.some((url) => url.includes("/snapshot"))).toBe(false);
350
294
 
351
295
  await page
352
296
  .getByRole("navigation", { name: "Áreas do dashboard" })
353
297
  .getByRole("button", { name: /Operação/ })
354
298
  .click();
355
- expect(operationsRequests.some((url) => url.includes("scope=detail"))).toBe(false);
299
+ expect(operationsRequests.some((url) => url.includes("/snapshot"))).toBe(false);
356
300
  });
357
301
 
358
- test("integrates the detailed cost monitor into the main dashboard", async ({ page }) => {
302
+ test("integrates the bounded Cost Monitor without snapshot or detail hydration", async ({
303
+ page,
304
+ }) => {
359
305
  const costRequests: string[] = [];
360
306
  const pageErrors: string[] = [];
361
307
  page.on("request", (request) => {
@@ -364,45 +310,10 @@ test("integrates the detailed cost monitor into the main dashboard", async ({ pa
364
310
  page.on("pageerror", (error) => pageErrors.push(error.message));
365
311
  await openDashboard(page);
366
312
  const capabilityNav = page.getByRole("navigation", { name: "Áreas do dashboard" });
367
- const globalControls = page.locator(".dashboard-global-controls");
368
313
  await expect(capabilityNav).toBeVisible();
369
- await page.getByRole("button", { exact: true, name: "Filtros" }).click();
370
- const startDate = globalControls.getByLabel("Data inicial");
371
- const endDate = globalControls.getByLabel("Data final");
372
- const initialStart = await startDate.inputValue();
373
- const initialEnd = await endDate.inputValue();
374
314
  await capabilityNav.getByRole("button", { name: /Monitor de Custos/ }).click();
375
- await expect.poll(() => globalThisScrollPosition(page)).toBeGreaterThan(0);
376
-
377
- await expect(page).toHaveURL("/");
378
- await expect(page.getByRole("navigation", { name: "Dashboard Zaip AIOS menu" })).toBeVisible();
379
- await expect(page.getByRole("heading", { name: "Status das tarefas" })).toBeVisible();
380
- await expect(page.getByRole("button", { name: /^Cancelado:/ })).toBeVisible();
381
- await expect(page.getByRole("button", { name: /^Falhado:/ })).toBeVisible();
382
- await expect(page.getByRole("heading", { name: "Classificação de Tarefa" })).toBeVisible();
383
- await expect(page.getByRole("heading", { name: "Top 5 tarefas" })).toBeVisible();
384
- await expect(page.getByRole("region", { name: "Resumo de custos" })).toHaveCount(0);
385
- await expect(page.getByLabel("Quadro de tasks")).toHaveCount(0);
386
- await expect(startDate).toHaveValue(initialStart);
387
- await expect(endDate).toHaveValue(initialEnd);
388
- await expect(globalControls.getByRole("combobox", { name: "Período" })).toHaveCount(1);
389
- await expect(page.getByRole("navigation", { name: "Navegação do Cost Monitor" })).toHaveCount(0);
390
- await expect(page.locator(".cost-hero")).toHaveCount(0);
391
- await expect(page.locator(".cost-period")).toHaveCount(0);
392
- await page
393
- .locator(".cost-tabs")
394
- .getByRole("button", { exact: true, name: "Modelos LLM" })
395
- .click();
396
- await expect(page.locator(".cost-content-models")).toBeVisible();
397
- const modelHeader = page.getByRole("columnheader", { name: /Modelo/ });
398
- if ((await modelHeader.count()) > 0) {
399
- await expect(modelHeader).toBeVisible();
400
- await expect(page.getByRole("columnheader", { name: /^Invocações / })).toBeVisible();
401
- await expect(page.getByRole("columnheader", { name: /^Tokens / })).toBeVisible();
402
- await expect(page.getByRole("columnheader", { name: /^Custo / })).toBeVisible();
403
- } else {
404
- await expect(page.locator(".cost-content-models .ui-empty")).toBeVisible();
405
- }
315
+ const tabs = page.locator(".cost-tabs");
316
+ await expect(tabs).toBeVisible();
406
317
  await expect(page.getByRole("button", { name: "Diário" })).toBeVisible();
407
318
  await expect(page.getByRole("button", { name: "Mensal" })).toBeVisible();
408
319
  await expect(page.getByRole("button", { name: "Anual" })).toBeVisible();
@@ -411,6 +322,7 @@ test("integrates the detailed cost monitor into the main dashboard", async ({ pa
411
322
  await expect(page.getByRole("button", { exact: true, name: "Conversas" })).toBeVisible();
412
323
 
413
324
  for (const [tab, kind] of [
325
+ ["Modelos LLM", "models"],
414
326
  ["Execuções", "executions"],
415
327
  ["Conversas", "conversations"],
416
328
  ["Tarefas", "tasks"],
@@ -419,68 +331,20 @@ test("integrates the detailed cost monitor into the main dashboard", async ({ pa
419
331
  ] as const) {
420
332
  const response = page.waitForResponse(
421
333
  (candidate) =>
334
+ candidate.status() === 200 &&
422
335
  candidate.url().includes("/api/v2/sqlite-views?") &&
423
336
  candidate.url().includes(`view=cost_monitor_${kind}`),
424
337
  );
425
- await page.locator(".cost-tabs").getByRole("button", { exact: true, name: tab }).click();
338
+ await tabs.getByRole("button", { exact: true, name: tab }).click();
426
339
  expect((await response).status()).toBe(200);
427
- await expect(
428
- page
429
- .getByRole("columnheader", { name: /Tempo observado/ })
430
- .or(page.locator(".ui-empty")),
431
- ).toBeVisible();
432
- await expect(
433
- page.getByRole("navigation", { name: "Paginação dos dados agregados" }),
434
- ).toBeVisible();
340
+ const surface = page.locator(`.cost-content-${kind}`);
341
+ await expect(surface).not.toHaveAttribute("aria-busy", "true");
342
+ await expect(surface.locator(".ui-table tbody tr, .ui-empty").first()).toBeVisible();
435
343
  expect(pageErrors).toEqual([]);
436
- await expect(page.locator(".cost-tabs")).toBeVisible();
344
+ await expect(tabs).toBeVisible();
437
345
  }
438
346
  expect(costRequests.some((url) => url.includes("scope=detail"))).toBe(false);
439
-
440
- await capabilityNav.getByRole("button", { name: /Operação/ }).click();
441
- await page.getByRole("button", { exact: true, name: "Invocações de agentes" }).click();
442
- await page.getByRole("button", { exact: true, name: "Execuções" }).click();
443
- await expect(
444
- page
445
- .getByRole("columnheader", { name: /Execução/ })
446
- .or(page.getByRole("status").filter({ hasText: /Aguardando linhas canônicas de execuções/ })),
447
- ).toBeVisible();
448
- await page.getByRole("button", { exact: true, name: "Invocações de agentes" }).click();
449
-
450
- await page.getByRole("button", { name: "PT-BR" }).click();
451
- await page.getByRole("button", { name: /English/ }).click();
452
- await page.getByRole("button", { exact: true, name: "Filters" }).click();
453
-
454
- await page.getByRole("textbox", { exact: true, name: "Search" }).fill("RUN-");
455
- const runRows = page.locator(".ui-table-row-action");
456
- const runRow = runRows.first();
457
- await expect(runRow).toBeVisible();
458
- const initialRunCount = await runRows.count();
459
- const englishStartDate = globalControls.getByLabel("Start date");
460
- const narrowedResponse = page.waitForResponse(
461
- (candidate) =>
462
- candidate.status() === 200 &&
463
- candidate.url().includes("/api/v2/sqlite-views?") &&
464
- candidate.url().includes("view=operations_agent_invocations"),
465
- );
466
- await englishStartDate.fill(initialEnd);
467
- await narrowedResponse;
468
- await expect(englishStartDate).toHaveValue(initialEnd);
469
- expect(await runRows.count()).toBeLessThanOrEqual(initialRunCount);
470
- const restoredResponse = page.waitForResponse(
471
- (candidate) =>
472
- candidate.status() === 200 &&
473
- candidate.url().includes("/api/v2/sqlite-views?") &&
474
- candidate.url().includes("view=operations_agent_invocations"),
475
- );
476
- await englishStartDate.fill(initialStart);
477
- const restoredPage = await restoredResponse;
478
- expect(((await restoredPage.json()) as { rows: unknown[] }).rows.length).toBeGreaterThan(0);
479
- await expect(runRows.first()).toBeVisible();
480
- await runRows.first().click();
481
- const runDetails = page.getByRole("dialog", { name: "Details for Agent Invocation" });
482
- await expect(runDetails).toBeVisible();
483
- await runDetails.getByRole("button", { name: "Close" }).click();
347
+ expect(costRequests.some((url) => url.includes("/api/v2/snapshot"))).toBe(false);
484
348
  });
485
349
 
486
350
  test("embeds traceability and keeps global settings and help available", async ({ page }) => {
@@ -490,9 +354,12 @@ test("embeds traceability and keeps global settings and help available", async (
490
354
  await expect(capabilityNav.getByRole("button", { name: /Monitor de Custos/ })).toBeVisible();
491
355
  await capabilityNav.getByRole("button", { name: /Rastreabilidade/ }).click();
492
356
 
493
- const taskSelector = page.getByLabel("Selecionar task por nome");
357
+ const taskSelector = page.getByRole("combobox", { name: "Buscar task por nome ou ID" });
494
358
  await expect(taskSelector).toBeVisible();
495
- await expect(taskSelector.locator("option")).not.toHaveCount(0);
359
+ await taskSelector.click();
360
+ const taskList = page.getByRole("listbox", { name: "Buscar task por nome ou ID" });
361
+ await expect(taskList).toBeVisible();
362
+ await taskList.getByRole("option").first().click();
496
363
  await expect(page.getByRole("dialog", { name: "Rastreabilidade da task" })).toBeVisible({
497
364
  timeout: 15_000,
498
365
  });
@@ -551,7 +418,9 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
551
418
  .filter({ has: page.locator(".operations-work-kind.is-spec") })
552
419
  .first();
553
420
  if ((await spec.count()) === 0) {
554
- await expect(page.getByLabel("Kanban de trabalho").locator(".operations-task-card")).toHaveCount(0);
421
+ await expect(
422
+ page.getByLabel("Kanban de trabalho").locator(".operations-task-card"),
423
+ ).toHaveCount(0);
555
424
  } else {
556
425
  await expect(spec).toBeVisible();
557
426
  await expect(spec.locator(".operations-work-card-counts")).toHaveText(/Tasks \d+\/\d+/);
@@ -566,7 +435,9 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
566
435
  .filter({ has: page.locator(".operations-work-kind.is-prd") })
567
436
  .first();
568
437
  if ((await prd.count()) === 0) {
569
- await expect(page.getByLabel("Kanban de trabalho").locator(".operations-task-card")).toHaveCount(0);
438
+ await expect(
439
+ page.getByLabel("Kanban de trabalho").locator(".operations-task-card"),
440
+ ).toHaveCount(0);
570
441
  } else {
571
442
  await expect(prd).toBeVisible();
572
443
  await expect(prd.locator(".operations-work-card-counts")).toHaveText(
@@ -577,6 +448,75 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
577
448
  }
578
449
  });
579
450
 
451
+ test("shows the observed default-month macro duration consistently for SPEC and PRD", async ({
452
+ page,
453
+ }) => {
454
+ const response = await openDashboard(page);
455
+ const projection = (await response.json()) as {
456
+ summary: {
457
+ overview_metrics?: {
458
+ macro_metrics?: Record<
459
+ "specs" | "prds",
460
+ {
461
+ total_duration_ms: number | null;
462
+ average_duration_ms: number | null;
463
+ top_entities?: Array<{ duration_ms: number | null }>;
464
+ }
465
+ >;
466
+ };
467
+ };
468
+ };
469
+ await expect(page.getByRole("combobox", { name: /Per/ }).first()).toHaveValue("this-month");
470
+
471
+ for (const kind of ["SPECs", "PRDs"] as const) {
472
+ const macroKey = kind === "SPECs" ? "specs" : "prds";
473
+ const macroMetric = projection.summary.overview_metrics?.macro_metrics?.[macroKey];
474
+ expect(macroMetric).toBeDefined();
475
+ expect(macroMetric?.total_duration_ms).not.toBeNull();
476
+ await page.locator(".operations-kpi.is-selectable").filter({ hasText: kind }).click();
477
+ const duration = page.getByRole("article", {
478
+ name: new RegExp(`Tempo total de execu[cç][aã]o de ${kind}`),
479
+ });
480
+ await expect(duration.locator("strong")).toHaveText(
481
+ formatDashboardDuration(macroMetric?.total_duration_ms ?? 0),
482
+ );
483
+ await expect(duration).not.toContainText("83,4 h");
484
+
485
+ const average = page
486
+ .getByRole("heading", { name: `Média por ${kind === "SPECs" ? "SPEC" : "PRD"}` })
487
+ .locator("xpath=../../..");
488
+ await expect(average).toContainText("Tempo médio");
489
+ if (
490
+ macroMetric?.average_duration_ms !== null &&
491
+ macroMetric?.average_duration_ms !== undefined
492
+ ) {
493
+ await expect(average).toContainText(formatDashboardDuration(macroMetric.average_duration_ms));
494
+ }
495
+
496
+ const top = page.getByRole("heading", { name: `Top 5 ${kind}` }).locator("xpath=../../..");
497
+ const topEntities = macroMetric?.top_entities ?? [];
498
+ const expectedUnavailableCount = topEntities.filter(
499
+ (entity) => entity.duration_ms === null,
500
+ ).length;
501
+ await expect(top.locator(".operations-run-bar")).toHaveCount(topEntities.length);
502
+ await expect(top.locator(".operations-run-bar.is-duration-unavailable")).toHaveCount(
503
+ expectedUnavailableCount,
504
+ );
505
+ if (topEntities.length > 0) {
506
+ const firstDuration = topEntities[0]?.duration_ms;
507
+ await expect(top.locator(".operations-run-bar").first()).toContainText(
508
+ firstDuration === null || firstDuration === undefined
509
+ ? "Indisponível"
510
+ : formatDashboardDuration(firstDuration),
511
+ );
512
+ await expect(top.locator(".operations-run-bar").first()).toHaveAttribute(
513
+ "aria-label",
514
+ new RegExp(kind === "SPECs" ? "^SPEC " : "^PRD "),
515
+ );
516
+ }
517
+ }
518
+ });
519
+
580
520
  test("loads monthly overview quickly and keeps PRD and SPEC chart totals reconciled", async ({
581
521
  page,
582
522
  }) => {
@@ -585,7 +525,7 @@ test("loads monthly overview quickly and keeps PRD and SPEC chart totals reconci
585
525
  expect(Date.now() - openedAt).toBeLessThan(3_000);
586
526
 
587
527
  const period = page.getByRole("combobox", { name: /Per/ }).first();
588
- for (const preset of ["last-month", "this-month"] as const) {
528
+ for (const preset of ["all", "this-month"] as const) {
589
529
  const response = page.waitForResponse(
590
530
  (candidate) =>
591
531
  candidate.status() === 200 &&
@@ -594,7 +534,22 @@ test("loads monthly overview quickly and keeps PRD and SPEC chart totals reconci
594
534
  );
595
535
  const selectedAt = Date.now();
596
536
  await period.selectOption(preset);
597
- await response;
537
+ const quickResponse = await response;
538
+ const quickUrl = new URL(quickResponse.url());
539
+ const dateControls = page.locator(".dashboard-global-controls");
540
+ const expectedFrom =
541
+ preset === "all" ? null : await dateControls.getByLabel("Data inicial").inputValue();
542
+ const expectedTo =
543
+ preset === "all" ? null : await dateControls.getByLabel("Data final").inputValue();
544
+ expect(quickUrl.searchParams.get("from")).toBe(expectedFrom);
545
+ expect(quickUrl.searchParams.get("to")).toBe(expectedTo);
546
+ const quickProjection = (await quickResponse.json()) as {
547
+ summary: {
548
+ overview_metrics?: {
549
+ macro_metrics?: Record<"specs" | "prds", { total_duration_ms: number | null }>;
550
+ };
551
+ };
552
+ };
598
553
  expect(Date.now() - selectedAt).toBeLessThan(3_000);
599
554
 
600
555
  for (const kind of ["SPECs", "PRDs"] as const) {
@@ -617,40 +572,64 @@ test("loads monthly overview quickly and keeps PRD and SPEC chart totals reconci
617
572
  expect(donutCount).toBe(cardCount);
618
573
  expect(statusCounts.reduce((sum, value) => sum + Number(value), 0)).toBe(cardCount);
619
574
  expect(classificationCounts.reduce((sum, value) => sum + Number(value), 0)).toBe(cardCount);
575
+
576
+ const macroKey = kind === "SPECs" ? "specs" : "prds";
577
+ const macroDuration =
578
+ quickProjection.summary.overview_metrics?.macro_metrics?.[macroKey]?.total_duration_ms;
579
+ expect(macroDuration).not.toBeUndefined();
580
+ if (macroDuration === null) {
581
+ await expect(
582
+ page
583
+ .getByRole("article", {
584
+ name: new RegExp(`Tempo total de execu[cç][aã]o de ${kind}`),
585
+ })
586
+ .locator("strong"),
587
+ ).toHaveText("Indisponível");
588
+ }
620
589
  }
621
590
  }
622
591
  });
623
592
 
593
+ function formatDashboardDuration(value: number): string {
594
+ if (value >= 3_600_000) {
595
+ return `${new Intl.NumberFormat("pt-BR", { maximumFractionDigits: 1 }).format(value / 3_600_000)} h`;
596
+ }
597
+ if (value >= 60_000) return `${Math.round(value / 60_000)} min`;
598
+ return `${Math.round(value / 1_000)} seg`;
599
+ }
600
+
624
601
  async function boardItemCount(board: Locator): Promise<number> {
625
602
  const counts = await board.locator(".operations-column-count").allTextContents();
626
603
  return counts.reduce((total, value) => total + Number(value), 0);
627
604
  }
628
605
 
629
- test("opens entity-specific details for changes decisions executions and runs", async ({
606
+ test("uses canonical Kanban and paginated work-list views instead of obsolete entity tabs", async ({
630
607
  page,
631
608
  }) => {
632
609
  await openDashboard(page);
633
610
  await selectOperations(page);
634
- const cases = [
635
- ["Mudanças", "Detalhes de Mudança", "Critérios de aceite"],
636
- ["Decisões", "Detalhes de Decisão", "Tipo de escopo"],
637
- ["Execuções", "Detalhes de Execução ZAIP", "Ordem topológica"],
638
- ["Invocações de agentes", "Detalhes de Invocação de Agente", "Custo USD"],
639
- ] as const;
640
-
641
- for (const [tab, dialogName, detailLabel] of cases) {
642
- await page.getByRole("button", { exact: true, name: tab }).click();
643
- const rows = page.locator(".ui-table-row-action");
644
- if ((await rows.count()) === 0) {
645
- await expect(page.locator(".ui-empty")).toBeVisible();
646
- continue;
647
- }
648
- await rows.first().click();
649
- const dialog = page.getByRole("dialog", { name: dialogName });
650
- await expect(dialog).toBeVisible();
651
- await expect(dialog.getByText(detailLabel, { exact: true })).toBeVisible();
652
- await expect(page.getByRole("heading", { name: /^Trace:/ })).toHaveCount(0);
653
- await dialog.getByRole("button", { name: "Fechar" }).click();
611
+ const viewTabs = page.getByRole("navigation", { name: "Entidades do ciclo de trabalho" });
612
+ await expect(viewTabs.getByRole("button", { name: "Execuções", exact: true })).toHaveCount(0);
613
+ await expect(
614
+ viewTabs.getByRole("button", { name: "Invocações de agentes", exact: true }),
615
+ ).toHaveCount(0);
616
+ await expect(page.locator(".operations-work-board")).toBeVisible();
617
+
618
+ await viewTabs.getByRole("button", { name: "Visão de Lista", exact: true }).click();
619
+ const workList = page.locator(".operations-work-list");
620
+ await expect(workList).toBeVisible();
621
+ await expect(workList.locator("table.ui-table tbody tr, .ui-empty").first()).toBeVisible();
622
+ expect(await workList.locator("table.ui-table tbody tr").count()).toBeLessThanOrEqual(10);
623
+ await expect(
624
+ workList.getByRole("navigation", { name: "Paginação da lista de trabalho" }),
625
+ ).toBeVisible();
626
+
627
+ const filters = workList.getByRole("navigation", { name: "Filtrar tipo de trabalho" });
628
+ for (const kind of ["Tudo", "Tarefas", "Tarefa Avulsa", "PRDs", "SPECs"] as const) {
629
+ await filters.getByRole("button", { name: kind, exact: true }).click();
630
+ await expect(workList).not.toHaveAttribute("aria-busy", "true");
631
+ await expect(workList.locator("table.ui-table tbody tr, .ui-empty").first()).toBeVisible();
632
+ expect(await workList.locator("table.ui-table tbody tr").count()).toBeLessThanOrEqual(10);
654
633
  }
655
634
  });
656
635
 
@@ -664,10 +643,6 @@ test("keeps aggregate KPIs visible without an obsolete coverage overlay", async
664
643
  await expect(page.getByRole("article", { name: /Custo Estimado/ })).toBeVisible();
665
644
  });
666
645
 
667
- async function globalThisScrollPosition(page: import("@playwright/test").Page) {
668
- return page.evaluate("window.scrollY");
669
- }
670
-
671
646
  async function openDashboard(page: import("@playwright/test").Page) {
672
647
  const operations = page.waitForResponse(
673
648
  (response) =>
@@ -676,7 +651,7 @@ async function openDashboard(page: import("@playwright/test").Page) {
676
651
  response.url().includes("scope=quick"),
677
652
  );
678
653
  await page.goto("/?token=e2e-token");
679
- await operations;
654
+ return operations;
680
655
  }
681
656
 
682
657
  async function selectOperations(page: import("@playwright/test").Page) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "1.0.8",
3
+ "version": "1.3.0",
4
4
  "files": [
5
5
  {
6
6
  "path": "apps/catalog/.storybook/main.ts",
@@ -220,7 +220,7 @@
220
220
  },
221
221
  {
222
222
  "path": "apps/catalog/package.json",
223
- "sha256": "cad5056abeda7f5134e9f5ef61bba5238439b9ec670b25f4cd245157e5b8ffdb"
223
+ "sha256": "e9ffdce8dcc8ed1fed3888add953e7e789261307b8d037a6001d98a38f644279"
224
224
  },
225
225
  {
226
226
  "path": "apps/catalog/public/logo_novo_azul.png",
@@ -304,7 +304,7 @@
304
304
  },
305
305
  {
306
306
  "path": "packages/local-runtime/package.json",
307
- "sha256": "62dc180ef9f26346fd1cca07f435719de48342575a9463014d4e854e1024a69f"
307
+ "sha256": "73bbd424a00481ca49bd3265183e0b505cc313484459d0701361a987f2b89057"
308
308
  },
309
309
  {
310
310
  "path": "packages/local-runtime/runtime.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaip-ai/design-catalog",
3
- "version": "1.0.8",
3
+ "version": "1.3.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaip-ai/design-local-runtime",
3
- "version": "1.0.8",
3
+ "version": "1.3.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {