@zaip-ai/cli 1.0.7 → 1.3.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/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 +39 -4
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +13 -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 +7 -0
- package/dist/services/template-manifest.js.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/architecture/software-architecture.md +131 -0
- package/templates/.agents/branding/brandbook.docx +0 -0
- package/templates/.agents/branding/brandbook.md +60 -0
- 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 +2 -2
- 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/.tmp-run-list.json +254 -0
- package/templates/.agents/dashboard/.zaip-managed.json +775 -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-DxR_pgSV.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CKcsqb-r.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.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-N5Csr0RP.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-C0fj2uU9.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.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-BEsJ-FYH.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-B6y6Gw12.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +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 +1129 -600
- 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 +266 -315
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +151 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +37 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +114 -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 +85 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +133 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +453 -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 +26 -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 +482 -3
- 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 +78 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +234 -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 +253 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +380 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +175 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +395 -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 +36 -0
- package/templates/.agents/dashboard/apps/frontend/vite.config.ts +58 -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 +134 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +290 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +133 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +134 -43
- 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 +328 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +302 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +627 -400
- 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 +370 -72
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +467 -326
- 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 +55 -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 +33 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +119 -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 +146 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +118 -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 -161
- 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 +757 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +784 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +100 -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/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -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 +185 -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 +345 -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 +367 -14
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +562 -131
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +353 -355
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +65 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +73 -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 +105 -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 +265 -36
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +171 -8
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +98 -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 -17
- 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 +431 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +574 -20
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +42 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
- 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 +67 -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 +22 -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 +176 -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 +21 -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 +241 -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 +7 -4
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +5 -84
- 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 +39 -2
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +25 -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 +330 -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 +2 -0
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1759 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1611 -0
- package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +20 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +114 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +31 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +589 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +53 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +203 -0
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1646 -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 +339 -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 +110 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +189 -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 +178 -84
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +149 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +675 -267
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1212 -309
- 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 +722 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +3743 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +7017 -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 +514 -190
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +324 -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 +216 -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/growth/estrategia-bootstrap-90-dias.md +169 -0
- package/templates/.agents/growth/strategy.md +27 -0
- package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
- package/templates/.agents/marketing/strategy.md +29 -0
- 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 +118 -67
- 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/sales/playbook.md +32 -0
- package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
- package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +22 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -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-enforce-architecture/SKILL.md +2 -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 +21 -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 +9 -3
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +99 -93
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +132 -23
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +149 -1
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +76 -19
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +217 -7
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +20 -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 +41 -0
- package/templates/.agents/zaip-aios/INDEX.md +11 -0
- package/templates/.agents/zaip-aios/README.md +38 -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/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
- package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
- package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
- package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
- package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -0
- package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
- package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
- package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +18 -0
- package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
- package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
- package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
- package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
- package/templates/template-manifest.json +1082 -215
- 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/DashboardHelpDialog-Cv-JcoxP.js +0 -1320
- 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,113 @@ 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
|
+
const tokenFooter = columns.find((column) => column.key === "tokens")?.footer;
|
|
325
|
+
const costFooter = columns.find((column) => column.key === "cost")?.footer;
|
|
326
|
+
expect(tokenFooter).toBeDefined();
|
|
327
|
+
expect(costFooter).toBeDefined();
|
|
328
|
+
expect((tokenFooter as { props: { children: unknown } }).props.children).toBe("50");
|
|
329
|
+
expect((costFooter as { props: { children: unknown } }).props.children).toContain("20,00");
|
|
330
|
+
});
|
|
331
|
+
it("renders ZAIP agent identity without a synthetic date column", () => {
|
|
332
|
+
const table = CostGroupsTable({
|
|
333
|
+
rows: [
|
|
334
|
+
{
|
|
335
|
+
...unavailableGroup,
|
|
336
|
+
key: "zaip-agent-builder",
|
|
337
|
+
label: "zaip-agent-builder",
|
|
338
|
+
persona: "Rafa",
|
|
339
|
+
job: "Builder",
|
|
340
|
+
},
|
|
341
|
+
],
|
|
342
|
+
currency: "BRL",
|
|
343
|
+
locale: "pt-BR",
|
|
344
|
+
showDateTime: false,
|
|
345
|
+
showAgentIdentity: true,
|
|
346
|
+
});
|
|
347
|
+
const columns = table.props.columns as Array<{
|
|
348
|
+
key: string;
|
|
349
|
+
label: string;
|
|
350
|
+
hidden?: boolean;
|
|
351
|
+
render?: (row: { persona?: string | null; job?: string | null }) => unknown;
|
|
352
|
+
}>;
|
|
353
|
+
expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
|
|
354
|
+
expect(columns.find((column) => column.key === "persona")?.render?.({ persona: "Rafa" })).toBe(
|
|
355
|
+
"Rafa",
|
|
356
|
+
);
|
|
357
|
+
expect(columns.find((column) => column.key === "job")?.render?.({ job: "Builder" })).toBe(
|
|
358
|
+
"Builder",
|
|
359
|
+
);
|
|
360
|
+
expect(columns.find((column) => column.key === "tasks")).toBeUndefined();
|
|
361
|
+
expect(table.props.defaultSort).toEqual({ key: "cost", direction: "desc" });
|
|
362
|
+
});
|
|
363
|
+
it("keeps legacy codex identity fields blank and uses the complete paged aggregate in its footer", () => {
|
|
364
|
+
const table = CostGroupsTable({
|
|
365
|
+
rows: [
|
|
366
|
+
{
|
|
367
|
+
...unavailableGroup,
|
|
368
|
+
key: "codex",
|
|
369
|
+
label: "codex",
|
|
370
|
+
run_count: 1,
|
|
371
|
+
total_tokens: 10,
|
|
372
|
+
estimated_brl: 1,
|
|
373
|
+
estimated_usd: 1,
|
|
374
|
+
},
|
|
375
|
+
],
|
|
376
|
+
currency: "BRL",
|
|
377
|
+
locale: "pt-BR",
|
|
378
|
+
showDateTime: false,
|
|
379
|
+
showAgentIdentity: true,
|
|
380
|
+
totals: {
|
|
381
|
+
...unavailableGroup,
|
|
382
|
+
run_count: 2,
|
|
383
|
+
task_count: 2,
|
|
384
|
+
total_tokens: 30,
|
|
385
|
+
estimated_brl: 3,
|
|
386
|
+
estimated_usd: 3,
|
|
387
|
+
duration: { known_sum: 0, unknown: 1, complete: false, coverage_ratio: 0 },
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
const columns = table.props.columns as Array<{
|
|
391
|
+
key: string;
|
|
392
|
+
render?: (row: { persona?: string | null; job?: string | null }) => unknown;
|
|
393
|
+
footer?: unknown;
|
|
394
|
+
}>;
|
|
395
|
+
expect(columns.find((column) => column.key === "persona")?.render?.({ persona: null })).toBe(
|
|
396
|
+
"",
|
|
397
|
+
);
|
|
398
|
+
expect(columns.find((column) => column.key === "job")?.render?.({ job: null })).toBe("");
|
|
399
|
+
expect(columns.find((column) => column.key === "runs")?.footer).toBe(2);
|
|
400
|
+
const tokenFooter = columns.find((column) => column.key === "tokens")?.footer;
|
|
401
|
+
expect(tokenFooter).toBeDefined();
|
|
402
|
+
expect((tokenFooter as { props: { children: unknown } }).props.children).toBe("30");
|
|
403
|
+
});
|
|
404
|
+
it("renders model groups without date and labels distinct invocation tasks", () => {
|
|
405
|
+
const table = CostGroupsTable({
|
|
406
|
+
rows: [{ ...unavailableGroup, key: "unavailable", label: "unavailable", task_count: 0 }],
|
|
407
|
+
currency: "BRL",
|
|
408
|
+
locale: "pt-BR",
|
|
409
|
+
showDateTime: false,
|
|
410
|
+
showInvocationTasks: true,
|
|
411
|
+
});
|
|
412
|
+
const columns = table.props.columns as Array<{ key: string; label: string; hidden?: boolean }>;
|
|
413
|
+
expect(columns.find((column) => column.key === "latestStartedAt")?.hidden).toBe(true);
|
|
414
|
+
expect(columns.find((column) => column.key === "tasks")?.label).toBe("Tarefas com invocação");
|
|
415
|
+
});
|
|
268
416
|
it("keeps a complete observed zero visible without a partial coverage label", () => {
|
|
269
417
|
const observedZeroGroup = {
|
|
270
418
|
...unavailableGroup,
|
|
@@ -279,11 +427,22 @@ describe("grouped cost availability", () => {
|
|
|
279
427
|
footer?: { props: { children: unknown } };
|
|
280
428
|
}>
|
|
281
429
|
).find((column) => column.key === "duration");
|
|
282
|
-
|
|
283
430
|
expect(duration?.render(observedZeroGroup)).toBe(formatAuditableDuration(0, "pt-BR"));
|
|
284
431
|
expect(duration?.footer?.props.children).toBe(formatAuditableDuration(0, "pt-BR"));
|
|
285
432
|
});
|
|
286
|
-
|
|
433
|
+
it("presents the factual known portion of a partial duration subtotal", () => {
|
|
434
|
+
const partial = {
|
|
435
|
+
...unavailableGroup,
|
|
436
|
+
total_tokens: 1_000,
|
|
437
|
+
duration_ms: null,
|
|
438
|
+
duration: { known_sum: 20_000, unknown: 1, complete: false, coverage_ratio: 0.5 },
|
|
439
|
+
};
|
|
440
|
+
const table = CostGroupsTable({ rows: [partial], currency: "BRL", locale: "pt-BR" });
|
|
441
|
+
const duration = (
|
|
442
|
+
table.props.columns as Array<{ key: string; footer?: { props: { children: unknown } } }>
|
|
443
|
+
).find((column) => column.key === "duration");
|
|
444
|
+
expect(duration?.footer?.props.children).toBe("20 seg");
|
|
445
|
+
});
|
|
287
446
|
it("does not expose coverage as a detailed Run column", () => {
|
|
288
447
|
const table = CostRunsTable({
|
|
289
448
|
rows: [unavailableGroup] as never,
|
|
@@ -294,7 +453,6 @@ describe("grouped cost availability", () => {
|
|
|
294
453
|
const columns = table.props.columns as Array<{ key: string }>;
|
|
295
454
|
expect(columns.some((column) => column.key === "coverage")).toBe(false);
|
|
296
455
|
});
|
|
297
|
-
|
|
298
456
|
it("sorts unavailable Run numeric metrics as unavailable", () => {
|
|
299
457
|
const unavailableRun = { ...unavailableGroup, input_tokens: null, output_tokens: null };
|
|
300
458
|
const table = CostRunsTable({
|
|
@@ -308,28 +466,169 @@ describe("grouped cost availability", () => {
|
|
|
308
466
|
sortValue?: (row: typeof unavailableGroup) => unknown;
|
|
309
467
|
}>;
|
|
310
468
|
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
311
|
-
|
|
312
469
|
expect(column("duration")?.sortValue?.(unavailableRun)).toBeNull();
|
|
313
470
|
expect(column("totalTokens")?.sortValue?.(unavailableRun)).toBeNull();
|
|
314
471
|
expect(column("cost")?.sortValue?.(unavailableRun)).toBeNull();
|
|
315
472
|
});
|
|
316
|
-
|
|
473
|
+
it("keeps missing invocation facts unavailable instead of presenting observed zero", () => {
|
|
474
|
+
const unavailableRun = {
|
|
475
|
+
...unavailableGroup,
|
|
476
|
+
input_tokens: null,
|
|
477
|
+
cached_input_tokens: null,
|
|
478
|
+
uncached_input_tokens: null,
|
|
479
|
+
output_tokens: null,
|
|
480
|
+
reasoning_tokens: null,
|
|
481
|
+
visible_output_tokens: null,
|
|
482
|
+
input_rate_usd_per_million: null,
|
|
483
|
+
cached_input_rate_usd_per_million: null,
|
|
484
|
+
output_rate_usd_per_million: null,
|
|
485
|
+
reasoning_rate_usd_per_million: null,
|
|
486
|
+
context_input_multiplier: null,
|
|
487
|
+
context_output_multiplier: null,
|
|
488
|
+
input_cost_usd: null,
|
|
489
|
+
cached_input_cost_usd: null,
|
|
490
|
+
output_cost_usd: null,
|
|
491
|
+
reasoning_cost_usd: null,
|
|
492
|
+
standard_cost_usd: null,
|
|
493
|
+
speed_uplift_usd: null,
|
|
494
|
+
fx_rate: null,
|
|
495
|
+
recorded_fx_rate: null,
|
|
496
|
+
recorded_brl: null,
|
|
497
|
+
estimated_usd: null,
|
|
498
|
+
estimated_brl: null,
|
|
499
|
+
} as never;
|
|
500
|
+
const table = CostRunsTable({
|
|
501
|
+
rows: [unavailableRun],
|
|
502
|
+
onOpenRun: () => undefined,
|
|
503
|
+
currency: "BRL",
|
|
504
|
+
locale: "pt-BR",
|
|
505
|
+
});
|
|
506
|
+
const columns = table.props.columns as Array<{
|
|
507
|
+
key: string;
|
|
508
|
+
description?: string;
|
|
509
|
+
hidden?: boolean;
|
|
510
|
+
render?: (row: typeof unavailableRun) => unknown;
|
|
511
|
+
}>;
|
|
512
|
+
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
513
|
+
const numericKeys = [
|
|
514
|
+
"duration",
|
|
515
|
+
"inputTokens",
|
|
516
|
+
"cachedInputTokens",
|
|
517
|
+
"outputTokens",
|
|
518
|
+
"reasoningTokens",
|
|
519
|
+
"totalTokens",
|
|
520
|
+
"inputRate",
|
|
521
|
+
"cacheRate",
|
|
522
|
+
"outputRate",
|
|
523
|
+
"reasoningRate",
|
|
524
|
+
"contextMultiplier",
|
|
525
|
+
"inputCost",
|
|
526
|
+
"cacheCost",
|
|
527
|
+
"outputCost",
|
|
528
|
+
"reasoningCost",
|
|
529
|
+
"standardCost",
|
|
530
|
+
"speedUplift",
|
|
531
|
+
"finalUsd",
|
|
532
|
+
"fxRate",
|
|
533
|
+
"recordedFxRate",
|
|
534
|
+
"recordedBrl",
|
|
535
|
+
"cost",
|
|
536
|
+
];
|
|
537
|
+
for (const key of numericKeys) {
|
|
538
|
+
expect(column(key)?.description).toContain("projeção SQLite/API");
|
|
539
|
+
expect(column(key)?.hidden).not.toBe(true);
|
|
540
|
+
}
|
|
541
|
+
expect(column("duration")?.render?.(unavailableRun)).toBe("Indisponível");
|
|
542
|
+
expect(column("inputTokens")?.render?.(unavailableRun)).toBe("0");
|
|
543
|
+
expect(column("inputRate")?.render?.(unavailableRun)).toBe("0,00");
|
|
544
|
+
expect(column("contextMultiplier")?.render?.(unavailableRun)).toBe("Indisponível");
|
|
545
|
+
expect(column("inputCost")?.render?.(unavailableRun)).toContain("0,00");
|
|
546
|
+
expect(column("fxRate")?.render?.(unavailableRun)).toBe("R$ 0,00");
|
|
547
|
+
expect(column("recordedBrl")?.render?.(unavailableRun)).toContain("0,00");
|
|
548
|
+
expect(column("cost")?.render?.(unavailableRun)).toContain("0,00");
|
|
549
|
+
});
|
|
317
550
|
it("provides a clear scroll label for the detailed Runs table", () => {
|
|
318
551
|
expect(costRunsScrollLabel("pt-BR")).toBe(
|
|
319
552
|
"Tabela de custos por invocação com rolagem horizontal",
|
|
320
553
|
);
|
|
321
554
|
});
|
|
322
|
-
|
|
555
|
+
it("presents inclusive input/output totals and only their cache/reasoning subsets", () => {
|
|
556
|
+
const run = {
|
|
557
|
+
...unavailableGroup,
|
|
558
|
+
input_tokens: 1_000,
|
|
559
|
+
cached_input_tokens: 200,
|
|
560
|
+
output_tokens: 500,
|
|
561
|
+
reasoning_tokens: 100,
|
|
562
|
+
total_tokens: 1_700,
|
|
563
|
+
} as never;
|
|
564
|
+
const table = CostRunsTable({
|
|
565
|
+
rows: [run],
|
|
566
|
+
onOpenRun: () => undefined,
|
|
567
|
+
currency: "BRL",
|
|
568
|
+
locale: "pt-BR",
|
|
569
|
+
});
|
|
570
|
+
const columns = table.props.columns as Array<{
|
|
571
|
+
key: string;
|
|
572
|
+
label?: string;
|
|
573
|
+
sortValue?: (row: typeof run) => unknown;
|
|
574
|
+
}>;
|
|
575
|
+
const column = (key: string) => columns.find((candidate) => candidate.key === key);
|
|
323
576
|
|
|
577
|
+
expect(column("inputTokens")?.label).toBe("Input total");
|
|
578
|
+
expect(column("outputTokens")?.label).toBe("Output total");
|
|
579
|
+
expect(column("uncachedInputTokens")).toBeUndefined();
|
|
580
|
+
expect(column("visibleOutputTokens")).toBeUndefined();
|
|
581
|
+
expect(column("totalTokens")?.sortValue?.(run)).toBe(1_500);
|
|
582
|
+
});
|
|
583
|
+
it("uses server pagination without re-applying the visual 100-row truncation", () => {
|
|
584
|
+
const table = CostRunsTable({
|
|
585
|
+
rows: [unavailableGroup] as never,
|
|
586
|
+
onOpenRun: () => undefined,
|
|
587
|
+
currency: "BRL",
|
|
588
|
+
locale: "pt-BR",
|
|
589
|
+
pagination: {
|
|
590
|
+
offset: 100,
|
|
591
|
+
limit: 100,
|
|
592
|
+
total: 250,
|
|
593
|
+
has_more: true,
|
|
594
|
+
loading: false,
|
|
595
|
+
error: null,
|
|
596
|
+
onChange: () => undefined,
|
|
597
|
+
onRetry: () => undefined,
|
|
598
|
+
},
|
|
599
|
+
});
|
|
600
|
+
expect(table.type).toBe(Symbol.for("react.fragment"));
|
|
601
|
+
expect(table.props.children[0].props.pageSize).toBeNull();
|
|
602
|
+
});
|
|
603
|
+
it("keeps an initial server-page error actionable before a page exists", () => {
|
|
604
|
+
const table = CostRunsTable({
|
|
605
|
+
rows: [unavailableGroup] as never,
|
|
606
|
+
onOpenRun: () => undefined,
|
|
607
|
+
currency: "BRL",
|
|
608
|
+
locale: "pt-BR",
|
|
609
|
+
pagination: {
|
|
610
|
+
offset: 0,
|
|
611
|
+
limit: 100,
|
|
612
|
+
total: 1,
|
|
613
|
+
has_more: false,
|
|
614
|
+
loading: false,
|
|
615
|
+
error: "network failed",
|
|
616
|
+
onChange: () => undefined,
|
|
617
|
+
onRetry: () => undefined,
|
|
618
|
+
},
|
|
619
|
+
});
|
|
620
|
+
const pager = table.props.children[1];
|
|
621
|
+
expect(pager.props.pagination.error).toBe("network failed");
|
|
622
|
+
expect(pager.props.pagination.onRetry).toEqual(expect.any(Function));
|
|
623
|
+
});
|
|
624
|
+
});
|
|
324
625
|
describe("period-driven Cost Monitor loading", () => {
|
|
325
626
|
it("drops a stale in-memory Cost period response when refresh replaces its base snapshot", () => {
|
|
326
627
|
const stale = { runs: [{ run_id: "RUN-OBSERVED", duration_ms: 31 * 3_600_000 }] } as never;
|
|
327
628
|
const refreshed = { runs: [{ run_id: "RUN-PROJECTED", duration_ms: 413_659_026 }] } as never;
|
|
328
|
-
|
|
329
629
|
expect(activeCostPeriodData(refreshed, stale, stale)).toBe(refreshed);
|
|
330
630
|
expect(activeCostPeriodData(refreshed, refreshed, refreshed)).toBe(refreshed);
|
|
331
631
|
});
|
|
332
|
-
|
|
333
632
|
it("does not issue a second Cost request after an embedded default atomic snapshot", () => {
|
|
334
633
|
const filters = {
|
|
335
634
|
query: "",
|
|
@@ -343,26 +642,25 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
343
642
|
priority: "",
|
|
344
643
|
risk: "",
|
|
345
644
|
};
|
|
346
|
-
expect(shouldFetchCostPeriod({ filters, period: "
|
|
645
|
+
expect(shouldFetchCostPeriod({ filters, period: "month", snapshotBacked: true })).toBe(false);
|
|
646
|
+
expect(shouldFetchCostPeriod({ filters, period: "all", snapshotBacked: true })).toBe(true);
|
|
347
647
|
expect(shouldFetchCostPeriod({ filters, period: "7", snapshotBacked: true })).toBe(true);
|
|
348
648
|
expect(
|
|
349
649
|
shouldFetchCostPeriod({
|
|
350
650
|
filters: { ...filters, phase: "execution" },
|
|
351
|
-
period: "
|
|
651
|
+
period: "month",
|
|
352
652
|
snapshotBacked: true,
|
|
353
653
|
}),
|
|
354
654
|
).toBe(true);
|
|
355
655
|
});
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
expect(defaultCostPeriod).toBe("all");
|
|
656
|
+
it("uses the current month for the default period and keeps All Time explicit", async () => {
|
|
657
|
+
expect(defaultCostPeriod).toBe("month");
|
|
359
658
|
expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
|
|
360
659
|
expect(costPeriodDateRange("month", new Date("2026-08-01T03:30:00.000Z"))).toEqual({
|
|
361
660
|
from: "2026-08-01",
|
|
362
661
|
to: "2026-08-01",
|
|
363
662
|
});
|
|
364
|
-
//
|
|
365
|
-
// bounds instead of carrying them into the next request.
|
|
663
|
+
// Selecting standalone All Time still removes the prior month bounds.
|
|
366
664
|
expect(costPeriodDateRange("all", new Date("2026-08-01T03:30:00.000Z"))).toBeUndefined();
|
|
367
665
|
const calls: string[] = [];
|
|
368
666
|
await loadCostMonitorPeriod({
|
|
@@ -372,9 +670,8 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
372
670
|
return new Response(JSON.stringify({ runs: [] }), { status: 200 });
|
|
373
671
|
},
|
|
374
672
|
});
|
|
375
|
-
expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL"]);
|
|
673
|
+
expect(calls).toEqual(["/api/v2/cost-monitor?currency=BRL&scope=summary"]);
|
|
376
674
|
});
|
|
377
|
-
|
|
378
675
|
it("derives an inclusive current-month range without inspecting materialized Runs", () => {
|
|
379
676
|
expect(costPeriodDateRange("month", new Date("2026-07-26T15:00:00.000Z"))).toEqual({
|
|
380
677
|
from: "2026-07-01",
|
|
@@ -385,7 +682,6 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
385
682
|
to: "2026-07-26",
|
|
386
683
|
});
|
|
387
684
|
});
|
|
388
|
-
|
|
389
685
|
it("requests the selected range from the local runtime and forwards cancellation", async () => {
|
|
390
686
|
const calls: Array<{ url: string; signal: AbortSignal | null | undefined }> = [];
|
|
391
687
|
const controller = new AbortController();
|
|
@@ -415,20 +711,32 @@ describe("period-driven Cost Monitor loading", () => {
|
|
|
415
711
|
});
|
|
416
712
|
},
|
|
417
713
|
});
|
|
418
|
-
|
|
419
714
|
expect(loaded).toEqual(projection);
|
|
420
715
|
expect(calls).toEqual([
|
|
421
716
|
{
|
|
422
717
|
url:
|
|
423
|
-
"/api/v2/cost-monitor?currency=BRL&from=2026-07-01&to=2026-07-26" +
|
|
718
|
+
"/api/v2/cost-monitor?currency=BRL&scope=summary&from=2026-07-01&to=2026-07-26" +
|
|
424
719
|
"&provider=openai&phase=execution&agent=zaip-agent-builder" +
|
|
425
720
|
"&model=gpt-5.6-terra&status=completed",
|
|
426
721
|
signal: controller.signal,
|
|
427
722
|
},
|
|
428
723
|
]);
|
|
429
724
|
});
|
|
725
|
+
it("never leaves period/filter hydration scope-less or on detail", async () => {
|
|
726
|
+
const calls: string[] = [];
|
|
727
|
+
await loadCostMonitorPeriod({
|
|
728
|
+
currency: "USD",
|
|
729
|
+
filters: { ...emptyCostFilters, provider: "openai", model: "gpt-5.6-terra" },
|
|
730
|
+
fetcher: async (url) => {
|
|
731
|
+
calls.push(String(url));
|
|
732
|
+
return new Response(JSON.stringify({ runs: [] }), { status: 200 });
|
|
733
|
+
},
|
|
734
|
+
});
|
|
735
|
+
const request = new URL(calls[0]!, "http://dashboard.local");
|
|
736
|
+
expect(request.searchParams.get("scope")).toBe("summary");
|
|
737
|
+
expect(request.searchParams.get("scope")).not.toBe("detail");
|
|
738
|
+
});
|
|
430
739
|
});
|
|
431
|
-
|
|
432
740
|
describe("manifest-first invocation query", () => {
|
|
433
741
|
it("opens only intersecting monthly manifests and candidate chunks", async () => {
|
|
434
742
|
const inRange = signedSummary({
|
|
@@ -495,7 +803,6 @@ describe("manifest-first invocation query", () => {
|
|
|
495
803
|
filters: { providers: ["openai"] },
|
|
496
804
|
},
|
|
497
805
|
);
|
|
498
|
-
|
|
499
806
|
expect(result.summaries.map((summary) => summary.agent_invocation_id)).toEqual([
|
|
500
807
|
"RUN-JULY-OPENAI",
|
|
501
808
|
]);
|
|
@@ -509,11 +816,9 @@ describe("manifest-first invocation query", () => {
|
|
|
509
816
|
]);
|
|
510
817
|
});
|
|
511
818
|
});
|
|
512
|
-
|
|
513
819
|
function digest(value: string): string {
|
|
514
820
|
return createHash("sha256").update(value).digest("hex");
|
|
515
821
|
}
|
|
516
|
-
|
|
517
822
|
function dimensions(overrides: Partial<Record<string, readonly string[]>> = {}) {
|
|
518
823
|
return {
|
|
519
824
|
providers: [],
|
|
@@ -530,7 +835,6 @@ function dimensions(overrides: Partial<Record<string, readonly string[]>> = {})
|
|
|
530
835
|
...overrides,
|
|
531
836
|
};
|
|
532
837
|
}
|
|
533
|
-
|
|
534
838
|
function signedSummary(input: {
|
|
535
839
|
agent_invocation_id: string;
|
|
536
840
|
occurred_at: string;
|
|
@@ -545,7 +849,6 @@ function signedSummary(input: {
|
|
|
545
849
|
};
|
|
546
850
|
return { ...unsigned, summary_hash: digest(JSON.stringify(unsigned)) };
|
|
547
851
|
}
|
|
548
|
-
|
|
549
852
|
function signedManifest(input: {
|
|
550
853
|
period: { year: number; month: number };
|
|
551
854
|
from: string;
|
|
@@ -582,11 +885,9 @@ function signedManifest(input: {
|
|
|
582
885
|
};
|
|
583
886
|
return { ...unsigned, manifest_hash: digest(JSON.stringify(unsigned)) };
|
|
584
887
|
}
|
|
585
|
-
|
|
586
888
|
describe("cost sorting", () => {
|
|
587
889
|
it("orders the raw BRL values rather than their localized currency labels", () => {
|
|
588
890
|
const rows = [143.72, 127.78, 21457.76, 1370.63];
|
|
589
|
-
|
|
590
891
|
expect(
|
|
591
892
|
rows.sort(
|
|
592
893
|
(left, right) =>
|
|
@@ -595,7 +896,6 @@ describe("cost sorting", () => {
|
|
|
595
896
|
).toEqual([21457.76, 1370.63, 143.72, 127.78]);
|
|
596
897
|
});
|
|
597
898
|
});
|
|
598
|
-
|
|
599
899
|
describe("context uplift", () => {
|
|
600
900
|
const base = {
|
|
601
901
|
context_input_multiplier: 1,
|
|
@@ -605,11 +905,9 @@ describe("context uplift", () => {
|
|
|
605
905
|
output_cost_usd: 8,
|
|
606
906
|
reasoning_cost_usd: 2,
|
|
607
907
|
};
|
|
608
|
-
|
|
609
908
|
it("returns zero for a 1x / 1x call", () => {
|
|
610
909
|
expect(contextUpliftUsd(base as never)).toBe(0);
|
|
611
910
|
});
|
|
612
|
-
|
|
613
911
|
it("extracts the already included context portion from effective costs", () => {
|
|
614
912
|
expect(
|
|
615
913
|
contextUpliftUsd({
|
|
@@ -620,7 +918,6 @@ describe("context uplift", () => {
|
|
|
620
918
|
).toBeCloseTo(9.333333, 5);
|
|
621
919
|
});
|
|
622
920
|
});
|
|
623
|
-
|
|
624
921
|
describe("model aggregation visibility", () => {
|
|
625
922
|
it("hides the manual placeholder regardless of casing or whitespace", () => {
|
|
626
923
|
expect(isDisplayableModel("manual")).toBe(false);
|
|
@@ -632,7 +929,6 @@ describe("model aggregation visibility", () => {
|
|
|
632
929
|
expect(isDisplayableModel("gpt-5.4")).toBe(true);
|
|
633
930
|
expect(isDisplayableModel("gpt-5.6-sol")).toBe(true);
|
|
634
931
|
});
|
|
635
|
-
|
|
636
932
|
it("hides calls that have no collected usage", () => {
|
|
637
933
|
const empty = {
|
|
638
934
|
input_tokens: null,
|
|
@@ -648,7 +944,6 @@ describe("model aggregation visibility", () => {
|
|
|
648
944
|
expect(hasCollectedUsage({ ...empty, estimated_brl: 0.01 } as never)).toBe(true);
|
|
649
945
|
});
|
|
650
946
|
});
|
|
651
|
-
|
|
652
947
|
describe("model processing duration", () => {
|
|
653
948
|
it("sums root orchestration Runs without overlapping intake and Sub-Runs", () => {
|
|
654
949
|
expect(
|
|
@@ -666,15 +961,18 @@ describe("model processing duration", () => {
|
|
|
666
961
|
]),
|
|
667
962
|
).toBe(210_000);
|
|
668
963
|
});
|
|
669
|
-
|
|
670
|
-
it("groups Runs without an identifiable model as Undefined", () => {
|
|
964
|
+
it("groups Runs without an identifiable model as unavailable", () => {
|
|
671
965
|
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("
|
|
966
|
+
expect(displayModelName("unknown", "pt-BR")).toBe("Indisponível");
|
|
967
|
+
expect(displayModelName(" ", "en-US")).toBe("Unavailable");
|
|
674
968
|
expect(displayModelName("manual", "pt-BR")).toBeNull();
|
|
675
969
|
expect(displayModelName("gpt-5", "pt-BR")).toBeNull();
|
|
676
970
|
});
|
|
677
|
-
|
|
971
|
+
it("presents genuinely missing aggregate dimensions as unavailable", () => {
|
|
972
|
+
expect(displayCostGroupLabel("unknown", "pt-BR")).toBe("Sem modelo/provedor atribuído");
|
|
973
|
+
expect(displayCostGroupLabel(" ", "en-US")).toBe("No model/provider assigned");
|
|
974
|
+
expect(displayCostGroupLabel("gpt-5.6-sol", "pt-BR")).toBe("gpt-5.6-sol");
|
|
975
|
+
});
|
|
678
976
|
it("keeps duration-only root orchestration Runs in the model table", () => {
|
|
679
977
|
expect(
|
|
680
978
|
isModelAuditRow({
|