@zaip-ai/cli 1.0.7 → 1.0.8
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/README.md +6 -4
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +15 -5
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/adapters.test.js +1 -1
- package/dist/services/agent-adapters.d.ts +9 -0
- package/dist/services/agent-adapters.d.ts.map +1 -1
- package/dist/services/agent-adapters.js +38 -3
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +8 -1
- package/dist/services/agent-adapters.test.js.map +1 -1
- package/dist/services/codex-config-template.d.ts +2 -1
- package/dist/services/codex-config-template.d.ts.map +1 -1
- package/dist/services/codex-config-template.js +13 -2
- package/dist/services/codex-config-template.js.map +1 -1
- package/dist/services/codex-rules.d.ts +1 -1
- package/dist/services/codex-rules.d.ts.map +1 -1
- package/dist/services/codex-rules.js +31 -7
- package/dist/services/codex-rules.js.map +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
- package/dist/services/codex-subagent-hook-template.js +4 -1
- package/dist/services/codex-subagent-hook-template.js.map +1 -1
- package/dist/services/doctor.d.ts.map +1 -1
- package/dist/services/doctor.js +3 -1
- package/dist/services/doctor.js.map +1 -1
- package/dist/services/global-codex-config.d.ts +6 -3
- package/dist/services/global-codex-config.d.ts.map +1 -1
- package/dist/services/global-codex-config.js +82 -13
- package/dist/services/global-codex-config.js.map +1 -1
- package/dist/services/global-codex-config.test.js +57 -10
- package/dist/services/global-codex-config.test.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +15 -2
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/logger.js +1 -1
- package/dist/services/logger.js.map +1 -1
- package/dist/services/logger.test.js +3 -3
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/runtime-template.test.js +21 -5
- package/dist/services/runtime-template.test.js.map +1 -1
- package/dist/services/template-manifest.d.ts.map +1 -1
- package/dist/services/template-manifest.js +2 -0
- package/dist/services/template-manifest.js.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/config/agents/catalog.yaml +310 -10
- package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
- package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
- package/templates/.agents/config/project.yaml +1 -1
- package/templates/.agents/dashboard/.zaip-managed.json +659 -163
- package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
- package/templates/.agents/dashboard/README.md +48 -97
- package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
- package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
- package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
- package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
- package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
- package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
- package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
- package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
- package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
- package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
- package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
- package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
- package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
- package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
- package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
- package/templates/.agents/dashboard/modules/operations/package.json +2 -1
- package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
- package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
- package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
- package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
- package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
- package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
- package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
- package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
- package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
- package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
- package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
- package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
- package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
- package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
- package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
- package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
- package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
- package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
- package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
- package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
- package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
- package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
- package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
- package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
- package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
- package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
- package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
- package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
- package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
- package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
- package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
- package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
- package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
- package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
- package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
- package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
- package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
- package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
- package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
- package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
- package/templates/.agents/dashboard/packages/branding/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
- package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
- package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
- package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
- package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
- package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
- package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
- package/templates/.agents/dashboard/read-model.dbml +2201 -0
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
- package/templates/.agents/dashboard/work-priority.json +34 -0
- package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
- package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
- package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
- package/templates/.agents/design/.zaip-managed.json +3 -3
- package/templates/.agents/design/apps/catalog/package.json +1 -1
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/requirements/autonomous-assurance.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 +24 -0
- 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 +4 -3
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +9 -6
- 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 +9 -3
- package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
- package/templates/.agents/rules/autonomy-decision.md +15 -0
- package/templates/.agents/rules/core.md +1 -1
- package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
- package/templates/.agents/rules/specialist-routing.md +19 -0
- package/templates/.agents/rules/workflow.md +1 -1
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +114 -64
- package/templates/.agents/runtime/checksums.sha256 +6 -4
- package/templates/.agents/runtime/manifest.json +3 -1
- package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
- package/templates/.agents/runtime/provenance.json +11 -0
- package/templates/.agents/runtime/sbom.cdx.json +1929 -39
- package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
- package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
- package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
- package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
- package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
- package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
- package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
- package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
- package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
- package/templates/.agents/zaip-aios/INDEX.md +1 -0
- package/templates/.agents/zaip-aios/README.md +37 -8
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
- package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
- package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
- package/templates/template-manifest.json +945 -214
- package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
- package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
- package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
- package/templates/.agents/dashboard/dashboard.config.json +0 -4
- package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
activeCostPeriodData,
|
|
6
6
|
costPeriodDateRange,
|
|
7
7
|
defaultCostPeriod,
|
|
8
|
+
emptyCostFilters,
|
|
8
9
|
loadCostMonitorPeriod,
|
|
9
10
|
shouldFetchCostPeriod,
|
|
10
11
|
} from "./CostFilters.js";
|
|
@@ -17,7 +18,9 @@ import {
|
|
|
17
18
|
costGroupsScrollLabel,
|
|
18
19
|
costPeriodTotalAriaLabel,
|
|
19
20
|
costRunsDurationTotal,
|
|
21
|
+
costRunsFooterLabel,
|
|
20
22
|
costRunsScrollLabel,
|
|
23
|
+
displayCostGroupLabel,
|
|
21
24
|
formatAuditableCompactNumber,
|
|
22
25
|
formatAuditableCurrency,
|
|
23
26
|
formatAuditableDuration,
|
|
@@ -30,6 +33,7 @@ import {
|
|
|
30
33
|
formatRate,
|
|
31
34
|
formatReasoningEffort,
|
|
32
35
|
formatServiceTier,
|
|
36
|
+
formatTokenBackedDuration,
|
|
33
37
|
formatUsd,
|
|
34
38
|
hasCollectedUsage,
|
|
35
39
|
isCompactRunColumnVisible,
|
|
@@ -49,7 +53,6 @@ describe("Agent Run model presentation", () => {
|
|
|
49
53
|
}),
|
|
50
54
|
).toEqual({ primary: "gpt-5.6-sol", detail: "openai" });
|
|
51
55
|
});
|
|
52
|
-
|
|
53
56
|
it("does not mention an unavailable planned configuration", () => {
|
|
54
57
|
expect(
|
|
55
58
|
agentRunModelPresentation({
|
|
@@ -63,7 +66,6 @@ describe("Agent Run model presentation", () => {
|
|
|
63
66
|
});
|
|
64
67
|
});
|
|
65
68
|
});
|
|
66
|
-
|
|
67
69
|
describe("period formatting", () => {
|
|
68
70
|
it("renders daily dates and keeps monthly periods numerically sortable", () => {
|
|
69
71
|
expect(formatCostPeriodLabel("2026-07-16", "daily", "pt-BR")).toBe("16/07/2026");
|
|
@@ -72,7 +74,6 @@ describe("period formatting", () => {
|
|
|
72
74
|
expect(formatCostPeriodLabel("2026", "annual", "pt-BR")).toBe("2026");
|
|
73
75
|
});
|
|
74
76
|
});
|
|
75
|
-
|
|
76
77
|
describe("period total accessibility", () => {
|
|
77
78
|
it("names the complete period total with the displayed time, tokens, and BRL values", () => {
|
|
78
79
|
expect(
|
|
@@ -86,7 +87,13 @@ describe("period total accessibility", () => {
|
|
|
86
87
|
).toBe("Total geral — Tempo: 2h 15min; Tokens: 1,2 mi; BRL: R$ 3,40");
|
|
87
88
|
});
|
|
88
89
|
});
|
|
89
|
-
|
|
90
|
+
describe("incremental Run table labels", () => {
|
|
91
|
+
it("does not present a paged subset as the complete Run total", () => {
|
|
92
|
+
expect(costRunsFooterLabel("pt-BR", true)).toBe("Subtotal da página");
|
|
93
|
+
expect(costRunsFooterLabel("en-US", true)).toBe("Page subtotal");
|
|
94
|
+
expect(costRunsFooterLabel("pt-BR", false)).toBe("Total");
|
|
95
|
+
});
|
|
96
|
+
});
|
|
90
97
|
describe("Run origin badges", () => {
|
|
91
98
|
it("uses one hierarchical origin per Run", () => {
|
|
92
99
|
expect(runOriginBadge({ prd_id: "PRD-1", spec_id: "SPEC-1", task_id: "TASK-1" })).toEqual({
|
|
@@ -103,25 +110,21 @@ describe("Run origin badges", () => {
|
|
|
103
110
|
});
|
|
104
111
|
});
|
|
105
112
|
});
|
|
106
|
-
|
|
107
113
|
describe("date time formatting", () => {
|
|
108
114
|
it("uses a placeholder for groups that do not yet have a Run", () => {
|
|
109
115
|
expect(formatDateTime("", "pt-BR")).toBe("—");
|
|
110
116
|
});
|
|
111
117
|
});
|
|
112
|
-
|
|
113
118
|
describe("formatAuditableNumber", () => {
|
|
114
|
-
it("
|
|
115
|
-
expect(formatAuditableNumber(null, "pt-BR")).toBe("
|
|
116
|
-
expect(formatAuditableNumber(null, "en-US")).toBe("
|
|
119
|
+
it("renders unavailable numeric metrics as presentation zero", () => {
|
|
120
|
+
expect(formatAuditableNumber(null, "pt-BR")).toBe("0");
|
|
121
|
+
expect(formatAuditableNumber(null, "en-US")).toBe("0");
|
|
117
122
|
expect(formatAuditableNumber(0, "pt-BR")).toBe("0");
|
|
118
123
|
});
|
|
119
|
-
|
|
120
124
|
it("keeps observed positive values", () => {
|
|
121
125
|
expect(formatAuditableNumber(1234, "pt-BR")).toBe("1.234");
|
|
122
126
|
});
|
|
123
127
|
});
|
|
124
|
-
|
|
125
128
|
describe("compact Sub-Run columns", () => {
|
|
126
129
|
it("keeps a column hidden until at least one Sub-Run has observed data", () => {
|
|
127
130
|
const rows = [{ duration_ms: null }, { duration_ms: null }] as never;
|
|
@@ -134,38 +137,38 @@ describe("compact Sub-Run columns", () => {
|
|
|
134
137
|
).toBe(true);
|
|
135
138
|
});
|
|
136
139
|
});
|
|
137
|
-
|
|
138
140
|
describe("monetary formatting", () => {
|
|
139
141
|
it("uses exactly two decimal places for rates and USD totals", () => {
|
|
140
142
|
expect(formatRate(5.450000053204, "pt-BR")).toBe("5,45");
|
|
141
143
|
expect(formatBrlRate(5.450000053204, "pt-BR")).toBe("R$ 5,45");
|
|
142
144
|
expect(formatUsd(19.583447, "pt-BR").replace(/\s/g, " ")).toBe("US$ 19,58");
|
|
143
145
|
});
|
|
144
|
-
|
|
145
146
|
it("calculates exchange as a direct BRL/USD ratio", () => {
|
|
146
147
|
expect(ratio(106.73, 19.583444)).toBeCloseTo(5.45, 2);
|
|
147
148
|
expect(ratio(100, 0)).toBeNull();
|
|
148
149
|
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
expect(
|
|
152
|
-
expect(
|
|
153
|
-
expect(formatAuditableCurrency(null, "BRL", "pt-BR")).toBe("Indisponível");
|
|
150
|
+
it("renders unavailable numeric metrics as zero", () => {
|
|
151
|
+
expect(formatRate(null, "pt-BR")).toBe("0,00");
|
|
152
|
+
expect(formatUsd(null, "en-US")).toContain("0.00");
|
|
153
|
+
expect(formatAuditableCurrency(null, "BRL", "pt-BR")).toContain("0,00");
|
|
154
154
|
expect(formatAuditableDuration(null, "pt-BR")).toBe("Indisponível");
|
|
155
|
-
expect(formatAuditableCompactNumber(null, "pt-BR")).toBe("
|
|
156
|
-
expect(formatMultiplierPair(null, null, "pt-BR")).toBe("Indisponível");
|
|
157
|
-
expect(formatMultiplierPair(2, null, "pt-BR")).toBe("Indisponível");
|
|
155
|
+
expect(formatAuditableCompactNumber(null, "pt-BR")).toBe("0");
|
|
158
156
|
});
|
|
159
157
|
});
|
|
160
|
-
|
|
161
158
|
describe("duration coverage", () => {
|
|
162
|
-
it("renders known
|
|
159
|
+
it("renders the factual known duration while preserving partial coverage", () => {
|
|
163
160
|
expect(
|
|
164
161
|
formatDurationCoverage(
|
|
165
162
|
{ known_sum: 60_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
|
|
166
163
|
"pt-BR",
|
|
167
164
|
),
|
|
168
165
|
).toBe("1 min");
|
|
166
|
+
expect(
|
|
167
|
+
formatDurationCoverage(
|
|
168
|
+
{ known_sum: 600_705_381, unknown: 14, complete: false, coverage_ratio: 34 / 48 },
|
|
169
|
+
"pt-BR",
|
|
170
|
+
),
|
|
171
|
+
).toBe("166,9 h");
|
|
169
172
|
expect(
|
|
170
173
|
formatDurationCoverage(
|
|
171
174
|
{ known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
|
|
@@ -173,15 +176,29 @@ describe("duration coverage", () => {
|
|
|
173
176
|
),
|
|
174
177
|
).toBe("Indisponível");
|
|
175
178
|
});
|
|
179
|
+
it("does not treat financial tokens as elapsed-time evidence", () => {
|
|
180
|
+
expect(
|
|
181
|
+
formatTokenBackedDuration(
|
|
182
|
+
{ known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
|
|
183
|
+
1_100,
|
|
184
|
+
"pt-BR",
|
|
185
|
+
),
|
|
186
|
+
).toBe(formatAuditableDuration(null, "pt-BR"));
|
|
187
|
+
expect(
|
|
188
|
+
formatTokenBackedDuration(
|
|
189
|
+
{ known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
|
|
190
|
+
null,
|
|
191
|
+
"pt-BR",
|
|
192
|
+
),
|
|
193
|
+
).toBe(formatAuditableDuration(null, "pt-BR"));
|
|
194
|
+
});
|
|
176
195
|
});
|
|
177
|
-
|
|
178
196
|
describe("runtime availability", () => {
|
|
179
197
|
it("uses requested effort only as a clearly labelled visual fallback", () => {
|
|
180
198
|
expect(formatReasoningEffort("high", "medium", "pt-BR")).toBe("Alto");
|
|
181
199
|
expect(formatReasoningEffort(null, "high", "pt-BR")).toBe("Alto (solicitado; efetivo -)");
|
|
182
200
|
expect(formatReasoningEffort(null, null, "en-US")).toBe("-");
|
|
183
201
|
});
|
|
184
|
-
|
|
185
202
|
it("uses the default speed label when the service tier is unavailable", () => {
|
|
186
203
|
expect(formatServiceTier(null, "pt-BR")).toBe("Padrão");
|
|
187
204
|
expect(formatServiceTier("unknown", "pt-BR")).toBe("Padrão");
|
|
@@ -189,7 +206,6 @@ describe("runtime availability", () => {
|
|
|
189
206
|
expect(formatServiceTier("priority", "pt-BR")).toBe("Rápido");
|
|
190
207
|
});
|
|
191
208
|
});
|
|
192
|
-
|
|
193
209
|
describe("grouped cost availability", () => {
|
|
194
210
|
it("uses deduplicated root and child invocation effort in the Run drilldown footer", () => {
|
|
195
211
|
const root = {
|
|
@@ -224,7 +240,35 @@ describe("grouped cost availability", () => {
|
|
|
224
240
|
duration: { known_sum: 0, unknown: 2, complete: false, coverage_ratio: 0 },
|
|
225
241
|
coverage: { events: 2, tokens: 0, usd: 0, brl: 0 },
|
|
226
242
|
} as const;
|
|
227
|
-
|
|
243
|
+
it.each([
|
|
244
|
+
"daily",
|
|
245
|
+
"monthly",
|
|
246
|
+
"annual",
|
|
247
|
+
] as const)("matches the Operations column order for %s summaries", (period) => {
|
|
248
|
+
const table = CostGroupsTable({
|
|
249
|
+
rows: [unavailableGroup],
|
|
250
|
+
currency: "BRL",
|
|
251
|
+
locale: "pt-BR",
|
|
252
|
+
period,
|
|
253
|
+
});
|
|
254
|
+
const columns = table.props.columns as Array<{ key: string; label: string }>;
|
|
255
|
+
expect(
|
|
256
|
+
columns
|
|
257
|
+
.filter((column) => column.key !== "latestStartedAt")
|
|
258
|
+
.map((column) => [column.key, column.label]),
|
|
259
|
+
).toEqual([
|
|
260
|
+
["label", period === "daily" ? "Dia" : period === "monthly" ? "Mês" : "Ano"],
|
|
261
|
+
["prds", "PRDs"],
|
|
262
|
+
["specs", "SPECs"],
|
|
263
|
+
["tasks", "Tarefas criadas"],
|
|
264
|
+
["runs", "Runs"],
|
|
265
|
+
["tests", "Testes"],
|
|
266
|
+
["evidences", "Evidências"],
|
|
267
|
+
["duration", "Tempo"],
|
|
268
|
+
["tokens", "Tokens"],
|
|
269
|
+
["cost", "Custos"],
|
|
270
|
+
]);
|
|
271
|
+
});
|
|
228
272
|
it("renders unavailable duration explicitly and keeps the accessible scroll region", () => {
|
|
229
273
|
const table = CostGroupsTable({
|
|
230
274
|
rows: [unavailableGroup],
|
|
@@ -238,16 +282,14 @@ describe("grouped cost availability", () => {
|
|
|
238
282
|
footer?: unknown;
|
|
239
283
|
}>;
|
|
240
284
|
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
241
|
-
|
|
242
285
|
expect(table.props.scrollLabel).toBe(costGroupsScrollLabel("pt-BR"));
|
|
243
286
|
expect(column("duration")?.render(unavailableGroup)).toBe("Indisponível");
|
|
244
|
-
expect(column("tokens")?.render(unavailableGroup)).toBe("
|
|
245
|
-
expect(column("cost")?.render(unavailableGroup)).
|
|
287
|
+
expect(column("tokens")?.render(unavailableGroup)).toBe("0");
|
|
288
|
+
expect(column("cost")?.render(unavailableGroup)).toContain("0,00");
|
|
246
289
|
expect(column("duration")?.sortValue?.(unavailableGroup)).toBeNull();
|
|
247
290
|
expect(column("tokens")?.sortValue?.(unavailableGroup)).toBeNull();
|
|
248
291
|
expect(column("cost")?.sortValue?.(unavailableGroup)).toBeNull();
|
|
249
|
-
const totalSummary =
|
|
250
|
-
"Total geral — Tempo: Indispon\u00edvel; Tokens: Indispon\u00edvel; BRL: Indispon\u00edvel";
|
|
292
|
+
const totalSummary = "Total geral — Tempo: Indisponível; Tokens: 0; BRL: R$ 0,00";
|
|
251
293
|
expect(
|
|
252
294
|
(column("latestStartedAt")!.footer as { props: { "aria-label": string } }).props[
|
|
253
295
|
"aria-label"
|
|
@@ -264,7 +306,73 @@ describe("grouped cost availability", () => {
|
|
|
264
306
|
).toBe(totalSummary);
|
|
265
307
|
expect(column("coverage")).toBeUndefined();
|
|
266
308
|
});
|
|
267
|
-
|
|
309
|
+
it("uses supplied pre-pagination totals for daily footer metrics", () => {
|
|
310
|
+
const table = CostGroupsTable({
|
|
311
|
+
rows: [{ ...unavailableGroup, total_tokens: 5, estimated_brl: 2, estimated_usd: 1 }],
|
|
312
|
+
currency: "BRL",
|
|
313
|
+
locale: "pt-BR",
|
|
314
|
+
period: "daily",
|
|
315
|
+
totals: {
|
|
316
|
+
...unavailableGroup,
|
|
317
|
+
total_tokens: 50,
|
|
318
|
+
estimated_brl: 20,
|
|
319
|
+
estimated_usd: 10,
|
|
320
|
+
duration: { known_sum: 600_000, unknown: 0, complete: true, coverage_ratio: 1 },
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
const columns = table.props.columns as Array<{ key: string; footer?: unknown }>;
|
|
324
|
+
expect((columns.find((column) => column.key === "tokens")?.footer as { props: { children: unknown } }).props.children).toBe("50");
|
|
325
|
+
expect((columns.find((column) => column.key === "cost")?.footer as { props: { children: unknown } }).props.children).toContain("20,00");
|
|
326
|
+
});
|
|
327
|
+
it("renders ZAIP agent identity without a synthetic date column", () => {
|
|
328
|
+
const table = CostGroupsTable({
|
|
329
|
+
rows: [{ ...unavailableGroup, key: "zaip-agent-builder", label: "zaip-agent-builder", persona: "Rafa", job: "Builder" }],
|
|
330
|
+
currency: "BRL",
|
|
331
|
+
locale: "pt-BR",
|
|
332
|
+
showDateTime: false,
|
|
333
|
+
showAgentIdentity: true,
|
|
334
|
+
});
|
|
335
|
+
const columns = table.props.columns as Array<{ key: string; label: string; hidden?: boolean; render?: (row: { persona?: string | null; job?: string | null }) => unknown }>;
|
|
336
|
+
expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
|
|
337
|
+
expect(columns.find((column) => column.key === "persona")?.render?.({ persona: "Rafa" })).toBe("Rafa");
|
|
338
|
+
expect(columns.find((column) => column.key === "job")?.render?.({ job: "Builder" })).toBe("Builder");
|
|
339
|
+
expect(columns.find((column) => column.key === "tasks")).toBeUndefined();
|
|
340
|
+
});
|
|
341
|
+
it("keeps legacy codex identity fields blank and uses the complete paged aggregate in its footer", () => {
|
|
342
|
+
const table = CostGroupsTable({
|
|
343
|
+
rows: [{ ...unavailableGroup, key: "codex", label: "codex", run_count: 1, total_tokens: 10, estimated_brl: 1, estimated_usd: 1 }],
|
|
344
|
+
currency: "BRL",
|
|
345
|
+
locale: "pt-BR",
|
|
346
|
+
showDateTime: false,
|
|
347
|
+
showAgentIdentity: true,
|
|
348
|
+
totals: {
|
|
349
|
+
...unavailableGroup,
|
|
350
|
+
run_count: 2,
|
|
351
|
+
task_count: 2,
|
|
352
|
+
total_tokens: 30,
|
|
353
|
+
estimated_brl: 3,
|
|
354
|
+
estimated_usd: 3,
|
|
355
|
+
duration: { known_sum: 0, unknown: 1, complete: false, coverage_ratio: 0 },
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
const columns = table.props.columns as Array<{ key: string; render?: (row: { persona?: string | null; job?: string | null }) => unknown; footer?: unknown }>;
|
|
359
|
+
expect(columns.find((column) => column.key === "persona")?.render?.({ persona: null })).toBe("");
|
|
360
|
+
expect(columns.find((column) => column.key === "job")?.render?.({ job: null })).toBe("");
|
|
361
|
+
expect(columns.find((column) => column.key === "runs")?.footer).toBe(2);
|
|
362
|
+
expect((columns.find((column) => column.key === "tokens")?.footer as { props: { children: unknown } }).props.children).toBe("30");
|
|
363
|
+
});
|
|
364
|
+
it("renders model groups without date and labels distinct invocation tasks", () => {
|
|
365
|
+
const table = CostGroupsTable({
|
|
366
|
+
rows: [{ ...unavailableGroup, key: "unavailable", label: "unavailable", task_count: 0 }],
|
|
367
|
+
currency: "BRL",
|
|
368
|
+
locale: "pt-BR",
|
|
369
|
+
showDateTime: false,
|
|
370
|
+
showInvocationTasks: true,
|
|
371
|
+
});
|
|
372
|
+
const columns = table.props.columns as Array<{ key: string; label: string; hidden?: boolean }>;
|
|
373
|
+
expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
|
|
374
|
+
expect(columns.find((column) => column.key === "tasks")?.label).toBe("Tarefas com invocação");
|
|
375
|
+
});
|
|
268
376
|
it("keeps a complete observed zero visible without a partial coverage label", () => {
|
|
269
377
|
const observedZeroGroup = {
|
|
270
378
|
...unavailableGroup,
|
|
@@ -279,11 +387,21 @@ describe("grouped cost availability", () => {
|
|
|
279
387
|
footer?: { props: { children: unknown } };
|
|
280
388
|
}>
|
|
281
389
|
).find((column) => column.key === "duration");
|
|
282
|
-
|
|
283
390
|
expect(duration?.render(observedZeroGroup)).toBe(formatAuditableDuration(0, "pt-BR"));
|
|
284
391
|
expect(duration?.footer?.props.children).toBe(formatAuditableDuration(0, "pt-BR"));
|
|
285
392
|
});
|
|
286
|
-
|
|
393
|
+
it("presents the factual known portion of a partial duration subtotal", () => {
|
|
394
|
+
const partial = {
|
|
395
|
+
...unavailableGroup,
|
|
396
|
+
total_tokens: 1_000,
|
|
397
|
+
duration_ms: null,
|
|
398
|
+
duration: { known_sum: 20_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
|
|
399
|
+
};
|
|
400
|
+
const table = CostGroupsTable({ rows: [partial], currency: "BRL", locale: "pt-BR" });
|
|
401
|
+
const duration = (table.props.columns as Array<{ key: string; footer?: { props: { children: unknown } } }>)
|
|
402
|
+
.find((column) => column.key === "duration");
|
|
403
|
+
expect(duration?.footer?.props.children).toBe("20 seg");
|
|
404
|
+
});
|
|
287
405
|
it("does not expose coverage as a detailed Run column", () => {
|
|
288
406
|
const table = CostRunsTable({
|
|
289
407
|
rows: [unavailableGroup] as never,
|
|
@@ -294,7 +412,6 @@ describe("grouped cost availability", () => {
|
|
|
294
412
|
const columns = table.props.columns as Array<{ key: string }>;
|
|
295
413
|
expect(columns.some((column) => column.key === "coverage")).toBe(false);
|
|
296
414
|
});
|
|
297
|
-
|
|
298
415
|
it("sorts unavailable Run numeric metrics as unavailable", () => {
|
|
299
416
|
const unavailableRun = { ...unavailableGroup, input_tokens: null, output_tokens: null };
|
|
300
417
|
const table = CostRunsTable({
|
|
@@ -308,28 +425,152 @@ describe("grouped cost availability", () => {
|
|
|
308
425
|
sortValue?: (row: typeof unavailableGroup) => unknown;
|
|
309
426
|
}>;
|
|
310
427
|
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
311
|
-
|
|
312
428
|
expect(column("duration")?.sortValue?.(unavailableRun)).toBeNull();
|
|
313
429
|
expect(column("totalTokens")?.sortValue?.(unavailableRun)).toBeNull();
|
|
314
430
|
expect(column("cost")?.sortValue?.(unavailableRun)).toBeNull();
|
|
315
431
|
});
|
|
316
|
-
|
|
432
|
+
it("keeps missing invocation facts unavailable instead of presenting observed zero", () => {
|
|
433
|
+
const unavailableRun = {
|
|
434
|
+
...unavailableGroup,
|
|
435
|
+
input_tokens: null,
|
|
436
|
+
cached_input_tokens: null,
|
|
437
|
+
uncached_input_tokens: null,
|
|
438
|
+
output_tokens: null,
|
|
439
|
+
reasoning_tokens: null,
|
|
440
|
+
visible_output_tokens: null,
|
|
441
|
+
input_rate_usd_per_million: null,
|
|
442
|
+
cached_input_rate_usd_per_million: null,
|
|
443
|
+
output_rate_usd_per_million: null,
|
|
444
|
+
reasoning_rate_usd_per_million: null,
|
|
445
|
+
context_input_multiplier: null,
|
|
446
|
+
context_output_multiplier: null,
|
|
447
|
+
input_cost_usd: null,
|
|
448
|
+
cached_input_cost_usd: null,
|
|
449
|
+
output_cost_usd: null,
|
|
450
|
+
reasoning_cost_usd: null,
|
|
451
|
+
standard_cost_usd: null,
|
|
452
|
+
speed_uplift_usd: null,
|
|
453
|
+
fx_rate: null,
|
|
454
|
+
recorded_fx_rate: null,
|
|
455
|
+
recorded_brl: null,
|
|
456
|
+
estimated_usd: null,
|
|
457
|
+
estimated_brl: null,
|
|
458
|
+
} as never;
|
|
459
|
+
const table = CostRunsTable({
|
|
460
|
+
rows: [unavailableRun],
|
|
461
|
+
onOpenRun: () => undefined,
|
|
462
|
+
currency: "BRL",
|
|
463
|
+
locale: "pt-BR",
|
|
464
|
+
});
|
|
465
|
+
const columns = table.props.columns as Array<{
|
|
466
|
+
key: string;
|
|
467
|
+
description?: string;
|
|
468
|
+
hidden?: boolean;
|
|
469
|
+
render?: (row: typeof unavailableRun) => unknown;
|
|
470
|
+
}>;
|
|
471
|
+
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
472
|
+
const numericKeys = [
|
|
473
|
+
"duration", "inputTokens", "cachedInputTokens", "outputTokens", "reasoningTokens",
|
|
474
|
+
"totalTokens", "inputRate", "cacheRate",
|
|
475
|
+
"outputRate", "reasoningRate", "contextMultiplier", "inputCost", "cacheCost",
|
|
476
|
+
"outputCost", "reasoningCost", "standardCost", "speedUplift", "finalUsd", "fxRate",
|
|
477
|
+
"recordedFxRate", "recordedBrl", "cost",
|
|
478
|
+
];
|
|
479
|
+
for (const key of numericKeys) {
|
|
480
|
+
expect(column(key)?.description).toContain("projeção SQLite/API");
|
|
481
|
+
expect(column(key)?.hidden).not.toBe(true);
|
|
482
|
+
}
|
|
483
|
+
expect(column("duration")?.render?.(unavailableRun)).toBe("Indisponível");
|
|
484
|
+
expect(column("inputTokens")?.render?.(unavailableRun)).toBe("0");
|
|
485
|
+
expect(column("inputRate")?.render?.(unavailableRun)).toBe("0,00");
|
|
486
|
+
expect(column("contextMultiplier")?.render?.(unavailableRun)).toBe("Indisponível");
|
|
487
|
+
expect(column("inputCost")?.render?.(unavailableRun)).toContain("0,00");
|
|
488
|
+
expect(column("fxRate")?.render?.(unavailableRun)).toBe("R$ 0,00");
|
|
489
|
+
expect(column("recordedBrl")?.render?.(unavailableRun)).toContain("0,00");
|
|
490
|
+
expect(column("cost")?.render?.(unavailableRun)).toContain("0,00");
|
|
491
|
+
});
|
|
317
492
|
it("provides a clear scroll label for the detailed Runs table", () => {
|
|
318
493
|
expect(costRunsScrollLabel("pt-BR")).toBe(
|
|
319
494
|
"Tabela de custos por invocação com rolagem horizontal",
|
|
320
495
|
);
|
|
321
496
|
});
|
|
322
|
-
|
|
497
|
+
it("presents inclusive input/output totals and only their cache/reasoning subsets", () => {
|
|
498
|
+
const run = {
|
|
499
|
+
...unavailableGroup,
|
|
500
|
+
input_tokens: 1_000,
|
|
501
|
+
cached_input_tokens: 200,
|
|
502
|
+
output_tokens: 500,
|
|
503
|
+
reasoning_tokens: 100,
|
|
504
|
+
total_tokens: 1_700,
|
|
505
|
+
} as never;
|
|
506
|
+
const table = CostRunsTable({
|
|
507
|
+
rows: [run],
|
|
508
|
+
onOpenRun: () => undefined,
|
|
509
|
+
currency: "BRL",
|
|
510
|
+
locale: "pt-BR",
|
|
511
|
+
});
|
|
512
|
+
const columns = table.props.columns as Array<{
|
|
513
|
+
key: string;
|
|
514
|
+
label?: string;
|
|
515
|
+
sortValue?: (row: typeof run) => unknown;
|
|
516
|
+
}>;
|
|
517
|
+
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
323
518
|
|
|
519
|
+
expect(column("inputTokens")?.label).toBe("Input total");
|
|
520
|
+
expect(column("outputTokens")?.label).toBe("Output total");
|
|
521
|
+
expect(column("uncachedInputTokens")).toBeUndefined();
|
|
522
|
+
expect(column("visibleOutputTokens")).toBeUndefined();
|
|
523
|
+
expect(column("totalTokens")?.sortValue?.(run)).toBe(1_500);
|
|
524
|
+
});
|
|
525
|
+
it("uses server pagination without re-applying the visual 100-row truncation", () => {
|
|
526
|
+
const table = CostRunsTable({
|
|
527
|
+
rows: [unavailableGroup] as never,
|
|
528
|
+
onOpenRun: () => undefined,
|
|
529
|
+
currency: "BRL",
|
|
530
|
+
locale: "pt-BR",
|
|
531
|
+
pagination: {
|
|
532
|
+
offset: 100,
|
|
533
|
+
limit: 100,
|
|
534
|
+
total: 250,
|
|
535
|
+
has_more: true,
|
|
536
|
+
loading: false,
|
|
537
|
+
error: null,
|
|
538
|
+
onChange: () => undefined,
|
|
539
|
+
onRetry: () => undefined,
|
|
540
|
+
},
|
|
541
|
+
});
|
|
542
|
+
expect(table.type).toBe(Symbol.for("react.fragment"));
|
|
543
|
+
expect(table.props.children[0].props.pageSize).toBeNull();
|
|
544
|
+
});
|
|
545
|
+
it("keeps an initial server-page error actionable before a page exists", () => {
|
|
546
|
+
const table = CostRunsTable({
|
|
547
|
+
rows: [unavailableGroup] as never,
|
|
548
|
+
onOpenRun: () => undefined,
|
|
549
|
+
currency: "BRL",
|
|
550
|
+
locale: "pt-BR",
|
|
551
|
+
pagination: {
|
|
552
|
+
offset: 0,
|
|
553
|
+
limit: 100,
|
|
554
|
+
total: 1,
|
|
555
|
+
has_more: false,
|
|
556
|
+
loading: false,
|
|
557
|
+
error: "network failed",
|
|
558
|
+
onChange: () => undefined,
|
|
559
|
+
onRetry: () => undefined,
|
|
560
|
+
},
|
|
561
|
+
});
|
|
562
|
+
const pager = table.props.children[1];
|
|
563
|
+
expect(pager.props.pagination.error).toBe("network failed");
|
|
564
|
+
expect(pager.props.pagination.onRetry).toEqual(expect.any(Function));
|
|
565
|
+
});
|
|
566
|
+
});
|
|
324
567
|
describe("period-driven Cost Monitor loading", () => {
|
|
325
568
|
it("drops a stale in-memory Cost period response when refresh replaces its base snapshot", () => {
|
|
326
569
|
const stale = { runs: [{ run_id: "RUN-OBSERVED", duration_ms: 31 * 3_600_000 }] } as never;
|
|
327
570
|
const refreshed = { runs: [{ run_id: "RUN-PROJECTED", duration_ms: 413_659_026 }] } as never;
|
|
328
|
-
|
|
329
571
|
expect(activeCostPeriodData(refreshed, stale, stale)).toBe(refreshed);
|
|
330
572
|
expect(activeCostPeriodData(refreshed, refreshed, refreshed)).toBe(refreshed);
|
|
331
573
|
});
|
|
332
|
-
|
|
333
574
|
it("does not issue a second Cost request after an embedded default atomic snapshot", () => {
|
|
334
575
|
const filters = {
|
|
335
576
|
query: "",
|
|
@@ -343,26 +584,25 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
343
584
|
priority: "",
|
|
344
585
|
risk: "",
|
|
345
586
|
};
|
|
346
|
-
expect(shouldFetchCostPeriod({ filters, period: "
|
|
587
|
+
expect(shouldFetchCostPeriod({ filters, period: "month", snapshotBacked: true })).toBe(false);
|
|
588
|
+
expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(true);
|
|
347
589
|
expect(shouldFetchCostPeriod({ filters, period: "7", snapshotBacked: true })).toBe(true);
|
|
348
590
|
expect(
|
|
349
591
|
shouldFetchCostPeriod({
|
|
350
592
|
filters: { ...filters, phase: "execution" },
|
|
351
|
-
period: "
|
|
593
|
+
period: "month",
|
|
352
594
|
snapshotBacked: true,
|
|
353
595
|
}),
|
|
354
596
|
).toBe(true);
|
|
355
597
|
});
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
expect(defaultCostPeriod).toBe("all");
|
|
598
|
+
it("uses the current month for the default period and keeps All Time explicit", async () => {
|
|
599
|
+
expect(defaultCostPeriod).toBe("month");
|
|
359
600
|
expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
|
|
360
601
|
expect(costPeriodDateRange("month", new Date("2026-08-01T03:30:00.000Z"))).toEqual({
|
|
361
602
|
from: "2026-08-01",
|
|
362
603
|
to: "2026-08-01",
|
|
363
604
|
});
|
|
364
|
-
//
|
|
365
|
-
// bounds instead of carrying them into the next request.
|
|
605
|
+
// Selecting standalone All Time still removes the prior month bounds.
|
|
366
606
|
expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
|
|
367
607
|
const calls: string[] = [];
|
|
368
608
|
await loadCostMonitorPeriod({
|
|
@@ -372,9 +612,8 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
372
612
|
return new Response(JSON.stringify({ runs: [] }), { status: 200 });
|
|
373
613
|
},
|
|
374
614
|
});
|
|
375
|
-
expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL"]);
|
|
615
|
+
expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL&scope=summary"]);
|
|
376
616
|
});
|
|
377
|
-
|
|
378
617
|
it("derives an inclusive current-month range without inspecting materialized Runs", () => {
|
|
379
618
|
expect(costPeriodDateRange("month", new Date("2026-07-26T15:00:00.000Z"))).toEqual({
|
|
380
619
|
from: "2026-07-01",
|
|
@@ -385,7 +624,6 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
385
624
|
to: "2026-07-26",
|
|
386
625
|
});
|
|
387
626
|
});
|
|
388
|
-
|
|
389
627
|
it("requests the selected range from the local runtime and forwards cancellation", async () => {
|
|
390
628
|
const calls: Array<{ url: string; signal: AbortSignal | null | undefined }> = [];
|
|
391
629
|
const controller = new AbortController();
|
|
@@ -415,20 +653,32 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
415
653
|
});
|
|
416
654
|
},
|
|
417
655
|
});
|
|
418
|
-
|
|
419
656
|
expect(loaded).toEqual(projection);
|
|
420
657
|
expect(calls).toEqual([
|
|
421
658
|
{
|
|
422
659
|
url:
|
|
423
|
-
"/api/v2/cost-monitor?currency=BRL&from=2026-07-01&to=2026-07-26" +
|
|
660
|
+
"/api/v2/cost-monitor?currency=BRL&scope=summary&from=2026-07-01&to=2026-07-26" +
|
|
424
661
|
"&provider=openai&phase=execution&agent=zaip-agent-builder" +
|
|
425
662
|
"&model=gpt-5.6-terra&status=completed",
|
|
426
663
|
signal: controller.signal,
|
|
427
664
|
},
|
|
428
665
|
]);
|
|
429
666
|
});
|
|
667
|
+
it("never leaves period/filter hydration scope-less or on detail", async () => {
|
|
668
|
+
const calls: string[] = [];
|
|
669
|
+
await loadCostMonitorPeriod({
|
|
670
|
+
currency: "USD",
|
|
671
|
+
filters: { ...emptyCostFilters, provider: "openai", model: "gpt-5.6-terra" },
|
|
672
|
+
fetcher: async (url) => {
|
|
673
|
+
calls.push(String(url));
|
|
674
|
+
return new Response(JSON.stringify({ runs: [] }), { status: 200 });
|
|
675
|
+
},
|
|
676
|
+
});
|
|
677
|
+
const request = new URL(calls[0]!, "http://dashboard.local");
|
|
678
|
+
expect(request.searchParams.get("scope")).toBe("summary");
|
|
679
|
+
expect(request.searchParams.get("scope")).not.toBe("detail");
|
|
680
|
+
});
|
|
430
681
|
});
|
|
431
|
-
|
|
432
682
|
describe("manifest-first invocation query", () => {
|
|
433
683
|
it("opens only intersecting monthly manifests and candidate chunks", async () => {
|
|
434
684
|
const inRange = signedSummary({
|
|
@@ -495,7 +745,6 @@ describe("manifest-first invocation query", () => {
|
|
|
495
745
|
filters: { providers: ["openai"] },
|
|
496
746
|
},
|
|
497
747
|
);
|
|
498
|
-
|
|
499
748
|
expect(result.summaries.map((summary) => summary.agent_invocation_id)).toEqual([
|
|
500
749
|
"RUN-JULY-OPENAI",
|
|
501
750
|
]);
|
|
@@ -509,11 +758,9 @@ describe("manifest-first invocation query", () => {
|
|
|
509
758
|
]);
|
|
510
759
|
});
|
|
511
760
|
});
|
|
512
|
-
|
|
513
761
|
function digest(value: string): string {
|
|
514
762
|
return createHash("sha256").update(value).digest("hex");
|
|
515
763
|
}
|
|
516
|
-
|
|
517
764
|
function dimensions(overrides: Partial<Record<string, readonly string[]>> = {}) {
|
|
518
765
|
return {
|
|
519
766
|
providers: [],
|
|
@@ -530,7 +777,6 @@ function dimensions(overrides: Partial<Record<string, readonly string[]>> = {})
|
|
|
530
777
|
...overrides,
|
|
531
778
|
};
|
|
532
779
|
}
|
|
533
|
-
|
|
534
780
|
function signedSummary(input: {
|
|
535
781
|
agent_invocation_id: string;
|
|
536
782
|
occurred_at: string;
|
|
@@ -545,7 +791,6 @@ function signedSummary(input: {
|
|
|
545
791
|
};
|
|
546
792
|
return { ...unsigned, summary_hash: digest(JSON.stringify(unsigned)) };
|
|
547
793
|
}
|
|
548
|
-
|
|
549
794
|
function signedManifest(input: {
|
|
550
795
|
period: { year: number; month: number };
|
|
551
796
|
from: string;
|
|
@@ -582,11 +827,9 @@ function signedManifest(input: {
|
|
|
582
827
|
};
|
|
583
828
|
return { ...unsigned, manifest_hash: digest(JSON.stringify(unsigned)) };
|
|
584
829
|
}
|
|
585
|
-
|
|
586
830
|
describe("cost sorting", () => {
|
|
587
831
|
it("orders the raw BRL values rather than their localized currency labels", () => {
|
|
588
832
|
const rows = [143.72, 127.78, 21457.76, 1370.63];
|
|
589
|
-
|
|
590
833
|
expect(
|
|
591
834
|
rows.sort(
|
|
592
835
|
(left, right) =>
|
|
@@ -595,7 +838,6 @@ describe("cost sorting", () => {
|
|
|
595
838
|
).toEqual([21457.76, 1370.63, 143.72, 127.78]);
|
|
596
839
|
});
|
|
597
840
|
});
|
|
598
|
-
|
|
599
841
|
describe("context uplift", () => {
|
|
600
842
|
const base = {
|
|
601
843
|
context_input_multiplier: 1,
|
|
@@ -605,11 +847,9 @@ describe("context uplift", () => {
|
|
|
605
847
|
output_cost_usd: 8,
|
|
606
848
|
reasoning_cost_usd: 2,
|
|
607
849
|
};
|
|
608
|
-
|
|
609
850
|
it("returns zero for a 1x / 1x call", () => {
|
|
610
851
|
expect(contextUpliftUsd(base as never)).toBe(0);
|
|
611
852
|
});
|
|
612
|
-
|
|
613
853
|
it("extracts the already included context portion from effective costs", () => {
|
|
614
854
|
expect(
|
|
615
855
|
contextUpliftUsd({
|
|
@@ -620,7 +860,6 @@ describe("context uplift", () => {
|
|
|
620
860
|
).toBeCloseTo(9.333333, 5);
|
|
621
861
|
});
|
|
622
862
|
});
|
|
623
|
-
|
|
624
863
|
describe("model aggregation visibility", () => {
|
|
625
864
|
it("hides the manual placeholder regardless of casing or whitespace", () => {
|
|
626
865
|
expect(isDisplayableModel("manual")).toBe(false);
|
|
@@ -632,7 +871,6 @@ describe("model aggregation visibility", () => {
|
|
|
632
871
|
expect(isDisplayableModel("gpt-5.4")).toBe(true);
|
|
633
872
|
expect(isDisplayableModel("gpt-5.6-sol")).toBe(true);
|
|
634
873
|
});
|
|
635
|
-
|
|
636
874
|
it("hides calls that have no collected usage", () => {
|
|
637
875
|
const empty = {
|
|
638
876
|
input_tokens: null,
|
|
@@ -648,7 +886,6 @@ describe("model aggregation visibility", () => {
|
|
|
648
886
|
expect(hasCollectedUsage({ ...empty, estimated_brl: 0.01 } as never)).toBe(true);
|
|
649
887
|
});
|
|
650
888
|
});
|
|
651
|
-
|
|
652
889
|
describe("model processing duration", () => {
|
|
653
890
|
it("sums root orchestration Runs without overlapping intake and Sub-Runs", () => {
|
|
654
891
|
expect(
|
|
@@ -666,15 +903,18 @@ describe("model processing duration", () => {
|
|
|
666
903
|
]),
|
|
667
904
|
).toBe(210_000);
|
|
668
905
|
});
|
|
669
|
-
|
|
670
|
-
it("groups Runs without an identifiable model as Undefined", () => {
|
|
906
|
+
it("groups Runs without an identifiable model as unavailable", () => {
|
|
671
907
|
expect(displayModelName("gpt-5.6-sol", "pt-BR")).toBe("gpt-5.6-sol");
|
|
672
|
-
expect(displayModelName("unknown", "pt-BR")).toBe("
|
|
673
|
-
expect(displayModelName(" ", "en-US")).toBe("
|
|
908
|
+
expect(displayModelName("unknown", "pt-BR")).toBe("Indisponível");
|
|
909
|
+
expect(displayModelName(" ", "en-US")).toBe("Unavailable");
|
|
674
910
|
expect(displayModelName("manual", "pt-BR")).toBeNull();
|
|
675
911
|
expect(displayModelName("gpt-5", "pt-BR")).toBeNull();
|
|
676
912
|
});
|
|
677
|
-
|
|
913
|
+
it("presents genuinely missing aggregate dimensions as unavailable", () => {
|
|
914
|
+
expect(displayCostGroupLabel("unknown", "pt-BR")).toBe("Sem modelo/provedor atribuído");
|
|
915
|
+
expect(displayCostGroupLabel(" ", "en-US")).toBe("No model/provider assigned");
|
|
916
|
+
expect(displayCostGroupLabel("gpt-5.6-sol", "pt-BR")).toBe("gpt-5.6-sol");
|
|
917
|
+
});
|
|
678
918
|
it("keeps duration-only root orchestration Runs in the model table", () => {
|
|
679
919
|
expect(
|
|
680
920
|
isModelAuditRow({
|