@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.
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +4 -3
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/agent-catalog-upgrade.d.ts +3 -0
- package/dist/services/agent-catalog-upgrade.d.ts.map +1 -0
- package/dist/services/agent-catalog-upgrade.js +35 -0
- package/dist/services/agent-catalog-upgrade.js.map +1 -0
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +22 -22
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/install-template-policy.d.ts +3 -0
- package/dist/services/install-template-policy.d.ts.map +1 -0
- package/dist/services/install-template-policy.js +21 -0
- package/dist/services/install-template-policy.js.map +1 -0
- package/dist/services/logger.test.js +12 -2
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/sqlite-bootstrap.d.ts +1 -0
- package/dist/services/sqlite-bootstrap.d.ts.map +1 -1
- package/dist/services/sqlite-bootstrap.js +10 -1
- package/dist/services/sqlite-bootstrap.js.map +1 -1
- package/package.json +2 -2
- package/templates/.agents/config/agents/discovery.json +1 -1
- package/templates/.agents/dashboard/.zaip-managed.json +286 -126
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-BBFDrn64.js → CostCalculationGuidePage-C5NgEcVh.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cd-qo9w7.js → DashboardHelpDialog-CCMVnkkI.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-J7L5m8lk.js → PricingSettingsDialog-CGYcJ5EB.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{ProjectSettingsPage-B9GWkEyN.css → ProjectSettingsPage-CQMhvzvJ.css} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-D46WWIKr.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-BzVtGLWS.js → TraceabilityWorkspace-BKBpJyLh.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{cost-monitor-PoJA2PI1.css → cost-monitor-BsMfGfQi.css} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-j3aUYH5G.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-CWzf_RiP.js → icons-vendor-x8xxL9yW.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Bas2TVju.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-CxrG_wRI.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CtHdbZk3.js → react-vendor-CNOXIJHN.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-BKrDH2TR.js → traceability-CcpbpT1s.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +7 -7
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +12 -1
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsCard.tsx +5 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsField.tsx +21 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +12 -1
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +16 -28
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +25 -4
- package/templates/.agents/dashboard/apps/frontend/src/WorkspaceStatus.test.tsx +51 -0
- package/templates/.agents/dashboard/apps/frontend/src/WorkspaceStatus.tsx +39 -0
- package/templates/.agents/dashboard/apps/frontend/src/app-work-board-options.ts +41 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-runtime-status.ts +25 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +13 -4
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +25 -1
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-workspace.css +28 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +39 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +5 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.test.ts +140 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +28 -41
- package/templates/.agents/dashboard/apps/frontend/src/use-runtime-status.ts +38 -0
- package/templates/.agents/dashboard/apps/frontend/src/workspace-status.css +20 -0
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +25 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +17 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +13 -167
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +2 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +8 -8
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +29 -52
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.test.ts +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +4 -27
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +4 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/agent-model-presentation.test.ts +26 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-embedded.css +7 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-loaders.ts +173 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-props.ts +47 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +1 -7
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-page-range.ts +3 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +44 -83
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +11 -111
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +47 -181
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +63 -91
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/cost-monitor-unavailable.test.ts +55 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/cost-summary-duration.test.ts +189 -0
- package/templates/.agents/dashboard/modules/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsEntityFilters.tsx +82 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +22 -31
- package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.test.tsx +13 -1
- package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.tsx +16 -3
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +11 -27
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +44 -193
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportColumns.ts +186 -0
- package/templates/.agents/dashboard/modules/operations/src/react/export/excel-agent-participations.test.ts +28 -0
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-export-duration.ts +13 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-filter-panel.css +4 -0
- package/templates/.agents/dashboard/modules/operations/src/react/use-operation-filter-feedback.ts +18 -0
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +11 -0
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +10 -2
- package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +1 -1
- package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/package.json +1 -1
- package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +395 -341
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +346 -294
- package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +42 -8
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +395 -341
- package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.test.ts +95 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +102 -12
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +2 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +75 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +10 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-lifecycle-diagnostics.ts +50 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-macro-population.test.ts +165 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-page-filters.ts +65 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +111 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +53 -63
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +19 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.ts +11 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +16 -9
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +46 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +10 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +4 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +43 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +46 -11
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-filter-matrix.test.ts +188 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-summary-details.test.ts +85 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-summary-details.ts +147 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +64 -54
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-macro-classification.test.ts +172 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.test.ts +7 -7
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.ts +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +10 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-pricing-provenance.test.ts +39 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +18 -82
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-cached-cost-page.ts +169 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-developer.ts +205 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +13 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +22 -23
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +42 -209
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +18 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +9 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +76 -83
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +25 -161
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +20 -47
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +2 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +16 -16
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +47 -22
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +3 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +11 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-rebuild-result.ts +15 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +4 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +15 -56
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-macro-classification.ts +48 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-summary-cursor.ts +15 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-token-active-allocation.ts +46 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-work-stages.ts +60 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +5 -1
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-claims.test.mjs +7 -1
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +17 -2
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-ownership.mjs +65 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-ownership.test.mjs +72 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +32 -9
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +39 -45
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +5 -2
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +1 -18
- package/templates/.agents/dashboard/tests/e2e/specs/export-row-identity.spec.ts +20 -0
- package/templates/.agents/dashboard/tests/e2e/specs/export-row-identity.ts +20 -0
- package/templates/.agents/design/.zaip-managed.json +105 -69
- package/templates/.agents/design/apps/catalog/dist/assets/index-0W0Gj_Gs.css +1 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-32GZO95T.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/{index-D_lfqoyx.js → index-BP8IxOxt.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/assets/index-D1JaPXfV.css +1 -0
- package/templates/.agents/design/apps/catalog/dist/assets/index-D2miO4-O.js +72 -0
- package/templates/.agents/design/apps/catalog/dist/assets/{index-BOjCcUaU.js → index-QJsgr9Ht.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/assets/{index-CqtYXZfV.js → index-mvD5mwcC.js} +3 -3
- package/templates/.agents/design/apps/catalog/dist/index.html +2 -2
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BJ8b4xZr.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-Cm-yJJz_.js → Color-6AOWCN3U-CQLHzznn.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-kxWwSKin.js +146 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DashboardFilters.stories-Chm_dXV7.js +9 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DashboardFiltersSpecimen-9CaCbGIZ.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-ED52wFjY.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-Belk4jRr.js → DocsRenderer-JROSPFPF-BcLgM80v.js} +4 -4
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Primitives-DV6Bpudf.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-DoPvjkS1.js → WithTooltip-7X4HQR7L-BKNiAz_E.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/WorkspaceStatus.stories-BL19HGOo.js +17 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/WorkspaceStatusSpecimen-DQnSS6s9.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-B1itKXEN.js → chunk-DRQKCCAG-DZBcXL-p.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-C-Eb5SPY.js → chunk-W22LQPXL-CF3y2mfo.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-DnyKLwhj.js → components-BVjxMRGq.js} +5 -5
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-Do9sjqiW.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/iframe-0W0Gj_Gs.css +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-DcXBsFPz.js → iframe-CTWGZcEe.js} +4 -4
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-CRM89QRf.js → react-18-B9_a4mHb.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-NrUxok8K.js +1 -0
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-B03jQGTF.js → syntaxhighlighter-YFXUGROL-F_p8E2xc.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-4ZyufAga.js → theming-fbSD9ZLF.js} +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +2 -2
- package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/sb-addons/a11y-2/manager-bundle.js +3 -3
- package/templates/.agents/design/apps/catalog/dist/storybook/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +3 -3
- package/templates/.agents/design/apps/catalog/package.json +1 -1
- package/templates/.agents/design/apps/catalog/src/components/DashboardFiltersSpecimen.tsx +61 -0
- package/templates/.agents/design/apps/catalog/src/components/Primitives.tsx +24 -0
- package/templates/.agents/design/apps/catalog/src/components/StackVersionFieldSpecimen.tsx +70 -0
- package/templates/.agents/design/apps/catalog/src/components/WorkspaceStatusSpecimen.tsx +42 -0
- package/templates/.agents/design/apps/catalog/src/design-contract.test.ts +27 -13
- package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +52 -0
- package/templates/.agents/design/apps/catalog/src/pages/DesignSystemPage.tsx +15 -1
- package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +32 -0
- package/templates/.agents/design/apps/catalog/src/stories/DashboardFilters.stories.tsx +7 -0
- package/templates/.agents/design/apps/catalog/src/stories/WorkspaceStatus.stories.tsx +12 -0
- package/templates/.agents/design/apps/catalog/src/styles/components.css +84 -3
- package/templates/.agents/design/apps/catalog/src/styles/stack-version-field.css +17 -0
- package/templates/.agents/design/apps/catalog/src/styles.css +2 -0
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/design/tokens.json +32 -0
- package/templates/.agents/requirements/autonomous-assurance.md +1 -1
- package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +1 -1
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +9 -3
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/strategic-improvements.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +1 -1
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/autonomy-decision.md +1 -0
- package/templates/.agents/rules/workflow.md +2 -2
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +27 -26
- package/templates/.agents/runtime/checksums.sha256 +5 -5
- package/templates/.agents/runtime/manifest.json +1 -1
- package/templates/.agents/runtime/provenance.json +4 -4
- package/templates/.agents/runtime/sbom.cdx.json +1 -1
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +13 -0
- package/templates/.agents/skills/zaip-skill-execution/references/autonomous-continuation.md +17 -0
- package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -6
- package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +1 -1
- package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +11 -9
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +1 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +9 -1
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +23 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +2 -6
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +15 -1
- package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-prd/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +11 -8
- package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +13 -12
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +17 -2
- package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +1 -1
- package/templates/.agents/skills/zaip-skill-spec/SKILL.md +2 -2
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/template-manifest.json +445 -245
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BpsAFy0g.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor--iPcnZdx.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Cmlx8OYH.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DfdlGa7c.js +0 -2
- package/templates/.agents/design/apps/catalog/dist/assets/index-BEmIE7WE.css +0 -1
- package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +0 -72
- package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +0 -72
- package/templates/.agents/design/apps/catalog/dist/assets/index-CqqYWY2f.js +0 -9
- package/templates/.agents/design/apps/catalog/dist/assets/index-D9pj7Jlf.js +0 -9
- package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +0 -9
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +0 -137
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/iframe-BEmIE7WE.css +0 -1
- package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +0 -1
|
@@ -1,25 +1,19 @@
|
|
|
1
|
-
import
|
|
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 {
|
|
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 &&
|
|
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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
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
|
-
|
|
385
|
-
else window.clearTimeout(idle.id);
|
|
365
|
+
window.clearTimeout(timer);
|
|
386
366
|
};
|
|
387
|
-
}, [
|
|
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
|
+
}
|
package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts
CHANGED
|
@@ -44,7 +44,9 @@ describe("CompactLifecycleCostTable filtered subtotal", () => {
|
|
|
44
44
|
},
|
|
45
45
|
});
|
|
46
46
|
const [table] = view.props.children as readonly {
|
|
47
|
-
props: {
|
|
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("
|
|
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("
|
|
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", () => {
|
package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx
CHANGED
|
@@ -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
|
-
|
|
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
|
|
92
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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
|
-
?
|
|
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
|
-
).
|
|
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("
|
|
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("
|
|
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)).
|
|
309
|
+
expect(compactLifecycleDurationMs(row)).toBeNull();
|
|
310
310
|
expect(withTokenBackedCompactDuration(row).metrics.duration).toEqual({
|
|
311
|
-
known_sum:
|
|
312
|
-
unknown:
|
|
313
|
-
complete:
|
|
314
|
-
coverage_ratio:
|
|
311
|
+
known_sum: 0,
|
|
312
|
+
unknown: 1,
|
|
313
|
+
complete: false,
|
|
314
|
+
coverage_ratio: 0,
|
|
315
315
|
});
|
|
316
316
|
});
|
|
317
317
|
|