@zaip-ai/cli 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/services/adapters.d.ts +1 -1
  2. package/dist/services/adapters.d.ts.map +1 -1
  3. package/dist/services/adapters.js +4 -3
  4. package/dist/services/adapters.js.map +1 -1
  5. package/dist/services/agent-catalog-upgrade.d.ts +3 -0
  6. package/dist/services/agent-catalog-upgrade.d.ts.map +1 -0
  7. package/dist/services/agent-catalog-upgrade.js +35 -0
  8. package/dist/services/agent-catalog-upgrade.js.map +1 -0
  9. package/dist/services/install-agents-template.d.ts.map +1 -1
  10. package/dist/services/install-agents-template.js +22 -22
  11. package/dist/services/install-agents-template.js.map +1 -1
  12. package/dist/services/install-template-policy.d.ts +3 -0
  13. package/dist/services/install-template-policy.d.ts.map +1 -0
  14. package/dist/services/install-template-policy.js +21 -0
  15. package/dist/services/install-template-policy.js.map +1 -0
  16. package/dist/services/logger.test.js +12 -2
  17. package/dist/services/logger.test.js.map +1 -1
  18. package/dist/services/sqlite-bootstrap.d.ts +1 -0
  19. package/dist/services/sqlite-bootstrap.d.ts.map +1 -1
  20. package/dist/services/sqlite-bootstrap.js +10 -1
  21. package/dist/services/sqlite-bootstrap.js.map +1 -1
  22. package/package.json +2 -2
  23. package/templates/.agents/config/agents/discovery.json +1 -1
  24. package/templates/.agents/dashboard/.zaip-managed.json +286 -126
  25. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-BBFDrn64.js → CostCalculationGuidePage-C5NgEcVh.js} +1 -1
  26. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cd-qo9w7.js → DashboardHelpDialog-CCMVnkkI.js} +1 -1
  27. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-J7L5m8lk.js → PricingSettingsDialog-CGYcJ5EB.js} +1 -1
  28. package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-B9GWkEyN.css → ProjectSettingsPage-CQMhvzvJ.css} +1 -1
  29. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-D46WWIKr.js +3 -0
  30. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-BzVtGLWS.js → TraceabilityWorkspace-BKBpJyLh.js} +1 -1
  31. package/templates/.agents/dashboard/apps/frontend/dist/assets/{cost-monitor-PoJA2PI1.css → cost-monitor-BsMfGfQi.css} +1 -1
  32. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-j3aUYH5G.js +68 -0
  33. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-CWzf_RiP.js → icons-vendor-x8xxL9yW.js} +1 -1
  34. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Bas2TVju.js +2 -0
  35. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-CxrG_wRI.css +1 -0
  36. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CtHdbZk3.js → react-vendor-CNOXIJHN.js} +1 -1
  37. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-BKrDH2TR.js → traceability-CcpbpT1s.js} +1 -1
  38. package/templates/.agents/dashboard/apps/frontend/dist/index.html +7 -7
  39. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  40. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +12 -1
  41. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsCard.tsx +5 -0
  42. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsField.tsx +21 -0
  43. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +12 -1
  44. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +16 -28
  45. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +25 -4
  46. package/templates/.agents/dashboard/apps/frontend/src/WorkspaceStatus.test.tsx +51 -0
  47. package/templates/.agents/dashboard/apps/frontend/src/WorkspaceStatus.tsx +39 -0
  48. package/templates/.agents/dashboard/apps/frontend/src/app-work-board-options.ts +41 -0
  49. package/templates/.agents/dashboard/apps/frontend/src/dashboard-runtime-status.ts +25 -0
  50. package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +13 -4
  51. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +25 -1
  52. package/templates/.agents/dashboard/apps/frontend/src/project-settings-workspace.css +28 -0
  53. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +39 -0
  54. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +1 -1
  55. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +5 -1
  56. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.test.ts +140 -0
  57. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +28 -41
  58. package/templates/.agents/dashboard/apps/frontend/src/use-runtime-status.ts +38 -0
  59. package/templates/.agents/dashboard/apps/frontend/src/workspace-status.css +20 -0
  60. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  61. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +25 -3
  62. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +17 -19
  63. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +13 -167
  64. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +2 -9
  65. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +8 -8
  66. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +29 -52
  67. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.test.ts +1 -1
  68. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +2 -2
  69. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +4 -27
  70. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +2 -2
  71. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +4 -3
  72. package/templates/.agents/dashboard/modules/cost-monitor/src/react/agent-model-presentation.test.ts +26 -0
  73. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-embedded.css +7 -0
  74. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-loaders.ts +173 -0
  75. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-props.ts +47 -0
  76. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +1 -7
  77. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-page-range.ts +3 -9
  78. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +44 -83
  79. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +11 -111
  80. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +47 -181
  81. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +63 -91
  82. package/templates/.agents/dashboard/modules/cost-monitor/src/server/cost-monitor-unavailable.test.ts +55 -0
  83. package/templates/.agents/dashboard/modules/cost-monitor/src/server/cost-summary-duration.test.ts +189 -0
  84. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  85. package/templates/.agents/dashboard/modules/operations/src/react/OperationsEntityFilters.tsx +82 -0
  86. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +22 -31
  87. package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.test.tsx +13 -1
  88. package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.tsx +16 -3
  89. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +11 -27
  90. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +44 -193
  91. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportColumns.ts +186 -0
  92. package/templates/.agents/dashboard/modules/operations/src/react/export/excel-agent-participations.test.ts +28 -0
  93. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +2 -1
  94. package/templates/.agents/dashboard/modules/operations/src/react/operations-export-duration.ts +13 -0
  95. package/templates/.agents/dashboard/modules/operations/src/react/operations-filter-panel.css +4 -0
  96. package/templates/.agents/dashboard/modules/operations/src/react/use-operation-filter-feedback.ts +18 -0
  97. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +11 -0
  98. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +10 -2
  99. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +1 -1
  100. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  101. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  102. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  103. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  104. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +395 -341
  105. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +346 -294
  106. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  107. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +2 -1
  108. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +42 -8
  109. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +395 -341
  110. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.test.ts +95 -0
  111. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +102 -12
  112. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +2 -3
  113. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +1 -1
  114. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +75 -1
  115. package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +10 -0
  116. package/templates/.agents/dashboard/packages/local-runtime/src/server-lifecycle-diagnostics.ts +50 -0
  117. package/templates/.agents/dashboard/packages/local-runtime/src/server-macro-population.test.ts +165 -0
  118. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-page-filters.ts +65 -0
  119. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +111 -0
  120. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +53 -63
  121. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +19 -5
  122. package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.ts +11 -2
  123. package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +16 -9
  124. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +46 -2
  125. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +10 -2
  126. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +4 -3
  127. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +43 -1
  128. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +46 -11
  129. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-filter-matrix.test.ts +188 -0
  130. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-summary-details.test.ts +85 -0
  131. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-summary-details.ts +147 -0
  132. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +64 -54
  133. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-macro-classification.test.ts +172 -0
  134. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +1 -1
  135. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +2 -1
  136. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.test.ts +7 -7
  137. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.ts +2 -1
  138. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +10 -1
  139. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-pricing-provenance.test.ts +39 -0
  140. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +18 -82
  141. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-cached-cost-page.ts +169 -0
  142. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-developer.ts +205 -0
  143. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +13 -4
  144. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +22 -23
  145. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +42 -209
  146. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +18 -4
  147. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +9 -2
  148. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +76 -83
  149. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +25 -161
  150. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +20 -47
  151. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +2 -2
  152. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +16 -16
  153. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +1 -1
  154. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +47 -22
  155. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +3 -2
  156. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +11 -0
  157. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-rebuild-result.ts +15 -0
  158. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +4 -4
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +15 -56
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-macro-classification.ts +48 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-summary-cursor.ts +15 -0
  162. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-token-active-allocation.ts +46 -0
  163. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-work-stages.ts +60 -0
  164. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +5 -1
  165. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-claims.test.mjs +7 -1
  166. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +17 -2
  167. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-ownership.mjs +65 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-ownership.test.mjs +72 -0
  169. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +32 -9
  170. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +39 -45
  171. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +5 -2
  172. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  173. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  174. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +1 -18
  175. package/templates/.agents/dashboard/tests/e2e/specs/export-row-identity.spec.ts +20 -0
  176. package/templates/.agents/dashboard/tests/e2e/specs/export-row-identity.ts +20 -0
  177. package/templates/.agents/design/.zaip-managed.json +105 -69
  178. package/templates/.agents/design/apps/catalog/dist/assets/index-0W0Gj_Gs.css +1 -0
  179. package/templates/.agents/design/apps/catalog/dist/assets/index-32GZO95T.js +72 -0
  180. package/templates/.agents/design/apps/catalog/dist/assets/{index-D_lfqoyx.js → index-BP8IxOxt.js} +3 -3
  181. package/templates/.agents/design/apps/catalog/dist/assets/index-D1JaPXfV.css +1 -0
  182. package/templates/.agents/design/apps/catalog/dist/assets/index-D2miO4-O.js +72 -0
  183. package/templates/.agents/design/apps/catalog/dist/assets/{index-BOjCcUaU.js → index-QJsgr9Ht.js} +3 -3
  184. package/templates/.agents/design/apps/catalog/dist/assets/{index-CqtYXZfV.js → index-mvD5mwcC.js} +3 -3
  185. package/templates/.agents/design/apps/catalog/dist/index.html +2 -2
  186. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BJ8b4xZr.js +1 -0
  187. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-Cm-yJJz_.js → Color-6AOWCN3U-CQLHzznn.js} +1 -1
  188. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-kxWwSKin.js +146 -0
  189. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DashboardFilters.stories-Chm_dXV7.js +9 -0
  190. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DashboardFiltersSpecimen-9CaCbGIZ.js +1 -0
  191. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-ED52wFjY.js +1 -0
  192. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-Belk4jRr.js → DocsRenderer-JROSPFPF-BcLgM80v.js} +4 -4
  193. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Primitives-DV6Bpudf.js +1 -0
  194. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-DoPvjkS1.js → WithTooltip-7X4HQR7L-BKNiAz_E.js} +1 -1
  195. package/templates/.agents/design/apps/catalog/dist/storybook/assets/WorkspaceStatus.stories-BL19HGOo.js +17 -0
  196. package/templates/.agents/design/apps/catalog/dist/storybook/assets/WorkspaceStatusSpecimen-DQnSS6s9.js +1 -0
  197. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-B1itKXEN.js → chunk-DRQKCCAG-DZBcXL-p.js} +1 -1
  198. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-C-Eb5SPY.js → chunk-W22LQPXL-CF3y2mfo.js} +1 -1
  199. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-DnyKLwhj.js → components-BVjxMRGq.js} +5 -5
  200. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-Do9sjqiW.js +1 -0
  201. package/templates/.agents/design/apps/catalog/dist/storybook/assets/iframe-0W0Gj_Gs.css +1 -0
  202. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-DcXBsFPz.js → iframe-CTWGZcEe.js} +4 -4
  203. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-CRM89QRf.js → react-18-B9_a4mHb.js} +1 -1
  204. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-NrUxok8K.js +1 -0
  205. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-B03jQGTF.js → syntaxhighlighter-YFXUGROL-F_p8E2xc.js} +1 -1
  206. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-4ZyufAga.js → theming-fbSD9ZLF.js} +1 -1
  207. package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +2 -2
  208. package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
  209. package/templates/.agents/design/apps/catalog/dist/storybook/sb-addons/a11y-2/manager-bundle.js +3 -3
  210. package/templates/.agents/design/apps/catalog/dist/storybook/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +3 -3
  211. package/templates/.agents/design/apps/catalog/package.json +1 -1
  212. package/templates/.agents/design/apps/catalog/src/components/DashboardFiltersSpecimen.tsx +61 -0
  213. package/templates/.agents/design/apps/catalog/src/components/Primitives.tsx +24 -0
  214. package/templates/.agents/design/apps/catalog/src/components/StackVersionFieldSpecimen.tsx +70 -0
  215. package/templates/.agents/design/apps/catalog/src/components/WorkspaceStatusSpecimen.tsx +42 -0
  216. package/templates/.agents/design/apps/catalog/src/design-contract.test.ts +27 -13
  217. package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +52 -0
  218. package/templates/.agents/design/apps/catalog/src/pages/DesignSystemPage.tsx +15 -1
  219. package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +32 -0
  220. package/templates/.agents/design/apps/catalog/src/stories/DashboardFilters.stories.tsx +7 -0
  221. package/templates/.agents/design/apps/catalog/src/stories/WorkspaceStatus.stories.tsx +12 -0
  222. package/templates/.agents/design/apps/catalog/src/styles/components.css +84 -3
  223. package/templates/.agents/design/apps/catalog/src/styles/stack-version-field.css +17 -0
  224. package/templates/.agents/design/apps/catalog/src/styles.css +2 -0
  225. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  226. package/templates/.agents/design/tokens.json +32 -0
  227. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  228. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  229. package/templates/.agents/requirements/comparative-audit.md +1 -1
  230. package/templates/.agents/requirements/context-engine.md +1 -1
  231. package/templates/.agents/requirements/cost-observability.md +1 -1
  232. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  233. package/templates/.agents/requirements/data-export.md +1 -1
  234. package/templates/.agents/requirements/design-system.md +1 -1
  235. package/templates/.agents/requirements/execution-engine.md +1 -1
  236. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  237. package/templates/.agents/requirements/model-orchestration.md +1 -1
  238. package/templates/.agents/requirements/public-distribution.md +9 -3
  239. package/templates/.agents/requirements/software-architecture.md +1 -1
  240. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  241. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  242. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  243. package/templates/.agents/rules/autonomy-decision.md +1 -0
  244. package/templates/.agents/rules/workflow.md +2 -2
  245. package/templates/.agents/runtime/VERSION +1 -1
  246. package/templates/.agents/runtime/bin/zaip.mjs +27 -26
  247. package/templates/.agents/runtime/checksums.sha256 +5 -5
  248. package/templates/.agents/runtime/manifest.json +1 -1
  249. package/templates/.agents/runtime/provenance.json +4 -4
  250. package/templates/.agents/runtime/sbom.cdx.json +1 -1
  251. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +13 -0
  252. package/templates/.agents/skills/zaip-skill-execution/references/autonomous-continuation.md +17 -0
  253. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +2 -2
  254. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -6
  255. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +1 -1
  256. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +11 -9
  257. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +2 -2
  258. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +1 -2
  259. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +9 -1
  260. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +23 -0
  261. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +2 -6
  262. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +15 -1
  263. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +4 -0
  264. package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +4 -0
  265. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +3 -3
  266. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +11 -8
  267. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +13 -12
  268. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +17 -2
  269. package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +1 -1
  270. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +2 -2
  271. package/templates/.agents/zaip-aios/VERSION +1 -1
  272. package/templates/template-manifest.json +445 -245
  273. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BpsAFy0g.js +0 -3
  274. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor--iPcnZdx.js +0 -68
  275. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Cmlx8OYH.css +0 -1
  276. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DfdlGa7c.js +0 -2
  277. package/templates/.agents/design/apps/catalog/dist/assets/index-BEmIE7WE.css +0 -1
  278. package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +0 -72
  279. package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +0 -72
  280. package/templates/.agents/design/apps/catalog/dist/assets/index-CqqYWY2f.js +0 -9
  281. package/templates/.agents/design/apps/catalog/dist/assets/index-D9pj7Jlf.js +0 -9
  282. package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +0 -9
  283. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +0 -1
  284. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +0 -137
  285. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +0 -1
  286. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +0 -1
  287. package/templates/.agents/design/apps/catalog/dist/storybook/assets/iframe-BEmIE7WE.css +0 -1
  288. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +0 -1
@@ -1,25 +1,19 @@
1
- import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
2
- import { type Dispatch, type RefObject, type SetStateAction, useCallback, useEffect } from "react";
1
+ import { useCallback, useEffect } from "react";
3
2
  import { isAbortError, mergeBoardPages } from "./AppRequestGuards.js";
4
3
  import {
5
- type BoardStageState,
6
4
  initialWorkBoardStages,
7
5
  type OverviewClassification,
8
- type OverviewClassificationPages,
9
6
  type OverviewStatusKind,
10
- type OverviewStatusPages,
11
7
  overviewClassificationPageKey,
12
8
  overviewStatusPageKey,
13
9
  } from "./AppWorkBoard.js";
10
+ import type { AppWorkBoardOptions } from "./app-work-board-options.js";
14
11
  import type {
15
- DashboardApiClient,
16
12
  OperationsBoardPage,
17
13
  OperationsPageFilters,
18
14
  WorkBoardStage,
19
15
  } from "./dashboard-api.js";
20
- import { type OperationsPeriodState, requestPeriodForOperations } from "./operations-period.js";
21
-
22
- type StateSetter<T> = Dispatch<SetStateAction<T>>;
16
+ import { requestPeriodForOperations } from "./operations-period.js";
23
17
 
24
18
  export function useAppWorkBoard({
25
19
  api,
@@ -42,30 +36,7 @@ export function useAppWorkBoard({
42
36
  setOperations,
43
37
  setOverviewClassificationPages,
44
38
  setOverviewStatusPages,
45
- }: {
46
- api: DashboardApiClient;
47
- boardAbortControllersRef: RefObject<Map<WorkBoardStage, AbortController>>;
48
- boardFilterKeyRef: RefObject<string>;
49
- boardFiltersRef: RefObject<OperationsPageFilters>;
50
- boardInFlightRef: RefObject<Set<WorkBoardStage>>;
51
- boardInitialPageRef: RefObject<Set<WorkBoardStage>>;
52
- boardLoadedRef: RefObject<Partial<Record<WorkBoardStage, number>>>;
53
- boardRequestVersionRef: RefObject<number>;
54
- dashboardView: "operations" | "cost-monitor" | "traceability" | null;
55
- operations: OperationsProjection | null;
56
- operationsPeriod: OperationsPeriodState;
57
- operationsPeriodRef: RefObject<OperationsPeriodState>;
58
- overviewStatusInFlightRef: RefObject<Set<string>>;
59
- quickOverviewMetricsRef: RefObject<OperationsProjection["summary"]["overview_metrics"]>;
60
- setBoardKindTotals: StateSetter<
61
- Partial<Record<WorkBoardStage, OperationsBoardPage["totals_by_kind"]>>
62
- >;
63
- setBoardStates: StateSetter<Partial<Record<WorkBoardStage, BoardStageState>>>;
64
- setBoardTotals: StateSetter<Partial<Record<WorkBoardStage, number>>>;
65
- setOperations: StateSetter<OperationsProjection | null>;
66
- setOverviewClassificationPages: StateSetter<OverviewClassificationPages>;
67
- setOverviewStatusPages: StateSetter<OverviewStatusPages>;
68
- }) {
39
+ }: AppWorkBoardOptions) {
69
40
  const resetBoard = useCallback(() => {
70
41
  boardRequestVersionRef.current += 1;
71
42
  for (const controller of boardAbortControllersRef.current.values()) controller.abort();
@@ -365,26 +336,42 @@ export function useAppWorkBoard({
365
336
  useEffect(() => {
366
337
  if (dashboardView !== "operations" || operations === null) return;
367
338
  let cancelled = false;
339
+ // resetBoard invalidates an older filter generation before React has had
340
+ // a chance to run this effect's cleanup. Do not let that older idle
341
+ // callback mark stages as initialized: its responses are rejected by
342
+ // loadMoreBoard, and the new generation would otherwise never hydrate.
343
+ const hydrationRequestVersion = boardRequestVersionRef.current;
344
+ const isCurrentHydration = () =>
345
+ !cancelled && hydrationRequestVersion === boardRequestVersionRef.current;
368
346
  const hydrateBoard = async () => {
347
+ if (!isCurrentHydration()) return;
369
348
  const pending = initialWorkBoardStages.filter(
370
349
  (stage) => !boardInitialPageRef.current.has(stage) && !boardInFlightRef.current.has(stage),
371
350
  );
372
- for (let offset = 0; offset < pending.length && !cancelled; offset += 3) {
351
+ for (let offset = 0; offset < pending.length && isCurrentHydration(); offset += 3) {
373
352
  const batch = pending.slice(offset, offset + 3);
353
+ if (!isCurrentHydration()) return;
374
354
  for (const stage of batch) boardInitialPageRef.current.add(stage);
375
355
  await Promise.all(batch.map((stage) => loadMoreBoard(stage)));
376
356
  }
377
357
  };
378
- const idle =
379
- typeof window.requestIdleCallback === "function"
380
- ? { kind: "idle" as const, id: window.requestIdleCallback(() => void hydrateBoard()) }
381
- : { kind: "timeout" as const, id: window.setTimeout(() => void hydrateBoard(), 0) };
358
+ // This board is the visible Operations surface. requestIdleCallback has
359
+ // no delivery deadline and can remain deferred during rapid interaction,
360
+ // leaving every cleared column empty despite a current API population.
361
+ // Schedule it after the current paint instead, with a cancellable timer.
362
+ const timer = window.setTimeout(() => void hydrateBoard(), 0);
382
363
  return () => {
383
364
  cancelled = true;
384
- if (idle.kind === "idle") window.cancelIdleCallback(idle.id);
385
- else window.clearTimeout(idle.id);
365
+ window.clearTimeout(timer);
386
366
  };
387
- }, [boardInFlightRef, boardInitialPageRef, dashboardView, loadMoreBoard, operations]);
367
+ }, [
368
+ boardInFlightRef,
369
+ boardInitialPageRef,
370
+ boardRequestVersionRef,
371
+ dashboardView,
372
+ loadMoreBoard,
373
+ operations,
374
+ ]);
388
375
 
389
376
  return {
390
377
  boardExportSource,
@@ -0,0 +1,38 @@
1
+ import { useEffect, useState } from "react";
2
+ import {
3
+ type DashboardRuntimeStatus,
4
+ readDashboardRuntimeStatus,
5
+ } from "./dashboard-runtime-status.js";
6
+
7
+ export function useRuntimeStatus() {
8
+ const [status, setStatus] = useState<DashboardRuntimeStatus | null>(null);
9
+ const [unavailable, setUnavailable] = useState(false);
10
+ useEffect(() => {
11
+ let disposed = false;
12
+ let timer: ReturnType<typeof setTimeout>;
13
+ let controller: AbortController;
14
+ async function poll() {
15
+ controller = new AbortController();
16
+ const timeout = setTimeout(() => controller.abort(), 4000);
17
+ try {
18
+ const next = await readDashboardRuntimeStatus(controller.signal);
19
+ if (!disposed) {
20
+ setStatus(next);
21
+ setUnavailable(false);
22
+ }
23
+ } catch {
24
+ if (!disposed) setUnavailable(true);
25
+ } finally {
26
+ clearTimeout(timeout);
27
+ if (!disposed) timer = setTimeout(poll, 5000);
28
+ }
29
+ }
30
+ void poll();
31
+ return () => {
32
+ disposed = true;
33
+ clearTimeout(timer);
34
+ controller?.abort();
35
+ };
36
+ }, []);
37
+ return { status, unavailable };
38
+ }
@@ -0,0 +1,20 @@
1
+ .workspace-status {
2
+ position: sticky;
3
+ top: 0;
4
+ z-index: 61;
5
+ padding: 8px 24px;
6
+ background: var(--surface-muted, #111827);
7
+ color: var(--text, #f1f5f9);
8
+ border-bottom: 1px solid var(--border, rgba(255, 255, 255, 0.12));
9
+ font-size: 12px;
10
+ }
11
+ .workspace-status__warning {
12
+ margin: 0;
13
+ color: var(--error-text, #fecaca);
14
+ }
15
+ .workspace-status__warning p {
16
+ margin: 4px 0;
17
+ }
18
+ .workspace-status code {
19
+ overflow-wrap: anywhere;
20
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaip-ai/dashboard-cost-monitor",
3
- "version": "3.3.0",
3
+ "version": "3.5.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
@@ -44,7 +44,9 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
44
44
  },
45
45
  });
46
46
  const [table] = view.props.children as readonly {
47
- props: { columns: Array<{ key: string; footer?: unknown }> };
47
+ props: {
48
+ columns: Array<{ key: string; footer?: unknown; render?: (row: unknown) => unknown }>;
49
+ };
48
50
  }[];
49
51
  expect(table).toBeDefined();
50
52
  const footer = (key: string) =>
@@ -56,9 +58,29 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
56
58
  expect(footer("tokens")).toBe("540");
57
59
  expect(footer("cost")).toContain("R$");
58
60
  expect(footer("cost")).not.toContain("US$");
61
+ const unknownRow = {
62
+ metrics: { duration: unavailable, total_tokens: known(15), cost: unavailable },
63
+ };
64
+ const render = (key: string) =>
65
+ table!.props.columns.find((column) => column.key === key)?.render?.(unknownRow);
66
+ expect(render("duration")).toBe("Indisponível");
67
+ expect(render("cost")).toBe("Indisponível");
68
+ expect(render("tokens")).toBe("15");
69
+ const partialRow = {
70
+ metrics: {
71
+ duration: { ...unavailable, known_sum: 1000, coverage_ratio: 0.5 },
72
+ cost: { ...unavailable, coverage_ratio: 0.5 },
73
+ },
74
+ };
75
+ expect(
76
+ table!.props.columns.find((column) => column.key === "duration")?.render?.(partialRow),
77
+ ).toBe("1 seg (parcial)");
78
+ expect(table!.props.columns.find((column) => column.key === "cost")?.render?.(partialRow)).toBe(
79
+ "0 (parcial)",
80
+ );
59
81
  });
60
82
 
61
- it("renders unknown numeric subtotals as zero", () => {
83
+ it("distinguishes unavailable duration from observed zero subtotals", () => {
62
84
  const view = CompactLifecycleCostTable({
63
85
  locale: "pt-BR",
64
86
  rows: [],
@@ -91,7 +113,7 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
91
113
  table!.props.columns.find((column) => column.key === key)?.footer;
92
114
  expect(footer("runs")).toBe("0");
93
115
  expect(footer("tokens")).toBe("0");
94
- expect(footer("duration")).toBe("0");
116
+ expect(footer("duration")).toBe("Indisponível");
95
117
  });
96
118
 
97
119
  it("does not render a subtotal row when all lifecycle metrics are unavailable", () => {
@@ -4,7 +4,6 @@ import {
4
4
  formatCurrency,
5
5
  formatDurationMs,
6
6
  } from "@zaip-ai/dashboard-ui";
7
- import { estimatedDurationMs } from "../duration-estimate.js";
8
7
  import type { CostLocale } from "./cost-monitor-copy.js";
9
8
  import { formatDateTime } from "./cost-table-presentation.js";
10
9
 
@@ -83,17 +82,23 @@ export function CompactLifecycleCostTable({
83
82
  onOpenTrace?: (id: string) => void;
84
83
  }) {
85
84
  const metric = (value: KnownMetric, format: (known: number) => string) => {
86
- return format(value.known_sum ?? 0);
85
+ if (value.known_sum === 0 && !value.complete && value.coverage_ratio === 0)
86
+ return locale === "pt-BR" ? "Indisponível" : "Unavailable";
87
+ const formatted = format(value.known_sum ?? 0);
88
+ return value.complete
89
+ ? formatted
90
+ : `${formatted} (${locale === "pt-BR" ? "parcial" : "partial"})`;
87
91
  };
88
92
  const durationMetric = (row: CompactLifecycleCostRow) => {
89
- const value = row.metrics.duration;
90
93
  const effective = compactLifecycleDurationMs(row);
91
- if (effective === null || (value.unknown > 0 && effective === 0)) return "0";
92
- return formatDurationMs(effective, locale);
94
+ if (effective === null) return locale === "pt-BR" ? "Indisponível" : "Unavailable";
95
+ return metric(row.metrics.duration, (value) =>
96
+ value === 0 ? "0" : formatDurationMs(value, locale),
97
+ );
93
98
  };
94
99
  const subtotalMetric = (value: KnownMetric, format: (known: number) => string) => {
95
100
  if (subtotal === null) return undefined;
96
- return format(value.known_sum ?? 0);
101
+ return metric(value, format);
97
102
  };
98
103
  const subtotalMetricUnavailable = (value: KnownMetric) =>
99
104
  value.unknown > 0 && value.known_sum === 0;
@@ -210,24 +215,17 @@ export function CompactLifecycleCostTable({
210
215
  }
211
216
 
212
217
  export function compactLifecycleDurationMs(row: CompactLifecycleCostRow): number | null {
213
- return withTokenBackedCompactDuration(row).metrics.duration.known_sum;
218
+ const duration = row.metrics.duration;
219
+ return duration.known_sum === 0 && !duration.complete && duration.coverage_ratio === 0
220
+ ? null
221
+ : duration.known_sum;
214
222
  }
215
223
 
216
224
  export function withTokenBackedCompactDuration(
217
225
  row: CompactLifecycleCostRow,
218
226
  ): CompactLifecycleCostRow {
219
- const duration = row.metrics.duration;
220
- const tokenTotal = row.metrics.total_tokens.known_sum;
221
- if (tokenTotal <= 0 || duration.known_sum > 0) return row;
222
- const durationMs = estimatedDurationMs(tokenTotal);
223
- if (durationMs === null || durationMs <= 0) return row;
224
- return {
225
- ...row,
226
- metrics: {
227
- ...row.metrics,
228
- duration: { known_sum: durationMs, unknown: 0, complete: true, coverage_ratio: 1 },
229
- },
230
- };
227
+ // Compatibility export: token volume does not establish observed elapsed time.
228
+ return row;
231
229
  }
232
230
 
233
231
  function CompactLifecyclePagination({
@@ -3,6 +3,15 @@ import { useEffect, useRef, useState } from "react";
3
3
  import type { CostMonitorProjection } from "../contracts.js";
4
4
  import type { CostCurrency, CostLocale } from "./cost-monitor-copy.js";
5
5
 
6
+ export {
7
+ type CostRunPage,
8
+ loadCostMonitorDetail,
9
+ loadCostMonitorPeriod,
10
+ loadCostMonitorRunPage,
11
+ } from "./cost-monitor-loaders.js";
12
+
13
+ import type { loadCostMonitorPeriod } from "./cost-monitor-loaders.js";
14
+
6
15
  export type CostPeriod = "all" | "7" | "30" | "90" | "month";
7
16
  /** Cost Monitor opens on the current Sao Paulo month, matching Operations. */
8
17
  export const defaultCostPeriod: CostPeriod = "month";
@@ -21,171 +30,6 @@ export function costPeriodDateRange(
21
30
  return { from: saoPauloPeriodKey(from.toISOString(), "day") ?? to, to };
22
31
  }
23
32
 
24
- export async function loadCostMonitorPeriod({
25
- currency,
26
- filters,
27
- from,
28
- refresh,
29
- to,
30
- signal,
31
- fetcher = fetch,
32
- }: {
33
- currency: CostCurrency;
34
- filters?: CostFilterState;
35
- from?: string;
36
- refresh?: string | null;
37
- to?: string;
38
- signal?: AbortSignal;
39
- fetcher?: typeof fetch;
40
- }): Promise<CostMonitorProjection> {
41
- const query = new URLSearchParams({ currency });
42
- // Period and filter changes hydrate aggregate read models only. Entity
43
- // detail is loaded through its dedicated bounded page route.
44
- query.set("scope", "summary");
45
- if (from !== undefined) query.set("from", from);
46
- if (to !== undefined) query.set("to", to);
47
- if (filters) {
48
- const manifestFilters = [
49
- ["provider", filters.provider],
50
- ["phase", filters.phase],
51
- ["agent", filters.agent],
52
- ["model", filters.model],
53
- ["status", filters.status],
54
- ] as const;
55
- for (const [key, value] of manifestFilters) {
56
- if (value) query.set(key, value);
57
- }
58
- }
59
- if (refresh) query.set("refresh", refresh);
60
- const response = await fetcher(`/api/v2/cost-monitor?${query.toString()}`, {
61
- ...(signal === undefined ? {} : { signal }),
62
- });
63
- if (!response.ok) {
64
- const detail = (await response.text()).trim();
65
- throw new Error(detail || `Cost Monitor period request failed (${response.status})`);
66
- }
67
- return (await response.json()) as CostMonitorProjection;
68
- }
69
-
70
- /** Exact dimensional projection, requested only after a dimensional tab opens. */
71
- export async function loadCostMonitorDetail({
72
- currency,
73
- filters,
74
- from,
75
- refresh,
76
- to,
77
- signal,
78
- fetcher = fetch,
79
- }: {
80
- currency: CostCurrency;
81
- filters?: CostFilterState;
82
- from?: string;
83
- refresh?: string | null;
84
- to?: string;
85
- signal?: AbortSignal;
86
- fetcher?: typeof fetch;
87
- }): Promise<CostMonitorProjection> {
88
- const query = costMonitorQuery({
89
- currency,
90
- ...(filters === undefined ? {} : { filters }),
91
- ...(from === undefined ? {} : { from }),
92
- ...(refresh === undefined ? {} : { refresh }),
93
- ...(to === undefined ? {} : { to }),
94
- });
95
- query.set("scope", "detail");
96
- const response = await fetcher(`/api/v2/cost-monitor?${query.toString()}`, {
97
- ...(signal === undefined ? {} : { signal }),
98
- });
99
- if (!response.ok)
100
- throw new Error(
101
- (await response.text()).trim() || `Cost Monitor detail request failed (${response.status})`,
102
- );
103
- return (await response.json()) as CostMonitorProjection;
104
- }
105
-
106
- export async function loadCostMonitorRunPage({
107
- currency,
108
- filters,
109
- from,
110
- limit = 10,
111
- offset,
112
- refresh,
113
- to,
114
- signal,
115
- fetcher = fetch,
116
- }: {
117
- currency: CostCurrency;
118
- filters?: CostFilterState;
119
- from?: string;
120
- limit?: number;
121
- offset: number;
122
- refresh?: string | null;
123
- to?: string;
124
- signal?: AbortSignal;
125
- fetcher?: typeof fetch;
126
- }): Promise<CostRunPage> {
127
- const query = costMonitorQuery({
128
- currency,
129
- ...(filters === undefined ? {} : { filters }),
130
- ...(from === undefined ? {} : { from }),
131
- ...(refresh === undefined ? {} : { refresh }),
132
- ...(to === undefined ? {} : { to }),
133
- });
134
- query.set("scope", "runs");
135
- query.set("offset", String(Math.max(0, offset)));
136
- query.set("limit", String(Math.max(1, limit)));
137
- const response = await fetcher(`/api/v2/cost-monitor?${query.toString()}`, {
138
- ...(signal === undefined ? {} : { signal }),
139
- });
140
- if (!response.ok) {
141
- const detail = (await response.text()).trim();
142
- throw new Error(detail || `Cost Monitor run page request failed (${response.status})`);
143
- }
144
- const payload = (await response.json()) as Pick<CostMonitorProjection, "runs" | "run_page">;
145
- return {
146
- page_only: true,
147
- runs: payload.runs,
148
- run_page: payload.run_page ?? { offset, limit, total: null, has_more: false },
149
- };
150
- }
151
-
152
- /** Complete contract for the incremental Run endpoint; it is not a summary projection. */
153
- export interface CostRunPage {
154
- page_only: true;
155
- runs: CostMonitorProjection["runs"];
156
- run_page: { offset: number; limit: number; total: number | null; has_more: boolean };
157
- }
158
-
159
- function costMonitorQuery({
160
- currency,
161
- filters,
162
- from,
163
- refresh,
164
- to,
165
- }: {
166
- currency: CostCurrency;
167
- filters?: CostFilterState;
168
- from?: string;
169
- refresh?: string | null;
170
- to?: string;
171
- }): URLSearchParams {
172
- const query = new URLSearchParams({ currency });
173
- if (from !== undefined) query.set("from", from);
174
- if (to !== undefined) query.set("to", to);
175
- if (filters) {
176
- const manifestFilters = [
177
- ["provider", filters.provider],
178
- ["phase", filters.phase],
179
- ["agent", filters.agent],
180
- ["model", filters.model],
181
- ["status", filters.status],
182
- ] as const;
183
- for (const [key, value] of manifestFilters) if (value) query.set(key, value);
184
- }
185
- if (refresh) query.set("refresh", refresh);
186
- return query;
187
- }
188
-
189
33
  export function useCostMonitorPeriod({
190
34
  currency,
191
35
  data,
@@ -219,7 +63,9 @@ export function useCostMonitorPeriod({
219
63
  loadPeriodRef.current = loadPeriod;
220
64
  const requestedRange =
221
65
  dateRange === undefined
222
- ? costPeriodDateRange(period)
66
+ ? snapshotBacked && period === defaultCostPeriod
67
+ ? undefined
68
+ : costPeriodDateRange(period)
223
69
  : { from: dateRange.start, to: dateRange.end };
224
70
  const requestedFrom = requestedRange?.from;
225
71
  const requestedTo = requestedRange?.to;
@@ -471,7 +317,7 @@ function Select({
471
317
  return (
472
318
  <label>
473
319
  <span>{label}</span>
474
- <select onChange={(event) => onChange(event.target.value)} value={value}>
320
+ <select aria-label={label} onChange={(event) => onChange(event.target.value)} value={value}>
475
321
  <option value="">{allLabel}</option>
476
322
  {options.map((option) => (
477
323
  <option key={option} value={option}>
@@ -102,16 +102,9 @@ export function CostGroupsTable({
102
102
  showAgentIdentity || showModelLifecycleDetails ? (value ?? 0) : value,
103
103
  locale,
104
104
  );
105
- const displayDuration = (value: DurationCoverage) =>
106
- (showAgentIdentity || showModelLifecycleDetails) && value.known_sum <= 0
107
- ? "0"
108
- : formatDurationCoverage(value, locale);
105
+ const displayDuration = (value: DurationCoverage) => formatDurationCoverage(value, locale);
109
106
  const displayCurrency = (value: number | null) =>
110
- formatAuditableCurrency(
111
- showAgentIdentity || showModelLifecycleDetails ? (value ?? 0) : value,
112
- currency,
113
- locale,
114
- );
107
+ formatAuditableCurrency(value, currency, locale);
115
108
  const conversationCount = (row: unknown): number | null =>
116
109
  (row as { conversation_count?: number | null }).conversation_count ?? null;
117
110
  const pageTotals = {
@@ -177,7 +177,7 @@ describe("cost monitor navigation", () => {
177
177
  period: defaultCostPeriod,
178
178
  runPageRange: monthRange,
179
179
  }),
180
- ).toEqual(monthRange);
180
+ ).toBeUndefined();
181
181
  });
182
182
 
183
183
  it("keeps compact SPEC and PRD pages and their export source on the all-time snapshot", () => {
@@ -282,7 +282,7 @@ describe("cost monitor navigation", () => {
282
282
  duration_ms: 619_958_763,
283
283
  });
284
284
  });
285
- it("fills token-backed compact duration without a visible missing-data count", () => {
285
+ it("renders factual compact duration without a visible missing-data count", () => {
286
286
  const table = readFileSync(new URL("./CompactLifecycleCostTable.tsx", import.meta.url), "utf8");
287
287
  const summary = readFileSync(new URL("./CostSummary.tsx", import.meta.url), "utf8");
288
288
  expect(table).toContain("compactLifecycleDurationMs(row)");
@@ -292,7 +292,7 @@ describe("cost monitor navigation", () => {
292
292
  expect(summary).not.toContain("formatPercent(");
293
293
  });
294
294
 
295
- it("estimates a paginated lifecycle row whenever it has tokens but no time", () => {
295
+ it("preserves unavailable timing and coverage when a paginated row has only tokens", () => {
296
296
  const metric = (known_sum: number, unknown: number) => ({
297
297
  known_sum,
298
298
  unknown,
@@ -306,12 +306,12 @@ describe("cost monitor navigation", () => {
306
306
  cost: metric(0, 1),
307
307
  },
308
308
  } as never;
309
- expect(compactLifecycleDurationMs(row)).toBe(3_600_000);
309
+ expect(compactLifecycleDurationMs(row)).toBeNull();
310
310
  expect(withTokenBackedCompactDuration(row).metrics.duration).toEqual({
311
- known_sum: 3_600_000,
312
- unknown: 0,
313
- complete: true,
314
- coverage_ratio: 1,
311
+ known_sum: 0,
312
+ unknown: 1,
313
+ complete: false,
314
+ coverage_ratio: 0,
315
315
  });
316
316
  });
317
317