@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
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
buildCostMonitorProjection,
|
|
4
|
-
effectiveCostRunPhase,
|
|
5
|
-
} from "./build-cost-monitor-projection.js";
|
|
2
|
+
import { buildCostMonitorProjection } from "./build-cost-monitor-projection.js";
|
|
6
3
|
import {
|
|
7
4
|
catalogWithInputRate,
|
|
8
5
|
emptyOperations,
|
|
@@ -14,30 +11,60 @@ import {
|
|
|
14
11
|
} from "./build-cost-monitor-projection.test-fixtures.js";
|
|
15
12
|
|
|
16
13
|
describe("Cost Monitor V2", () => {
|
|
17
|
-
it("
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
it("uses inclusive input and output totals without double-counting cache or reasoning", () => {
|
|
15
|
+
const operations = operationsWithPricedRun();
|
|
16
|
+
const run = operations.runs[0];
|
|
17
|
+
if (!run) throw new Error("priced Run fixture is missing");
|
|
18
|
+
run.usage = usage(
|
|
19
|
+
metric({
|
|
20
|
+
input: 1_000_000,
|
|
21
|
+
cached: 200_000,
|
|
22
|
+
output: 500_000,
|
|
23
|
+
reasoning: 100_000,
|
|
24
|
+
// Deliberately reflects an invalid additive composition. The Cost
|
|
25
|
+
// Monitor must retain cache/reasoning as subsets instead.
|
|
26
|
+
tokens: 1_800_000,
|
|
27
|
+
events: 1,
|
|
28
|
+
}),
|
|
22
29
|
);
|
|
30
|
+
|
|
31
|
+
const projection = buildCostMonitorProjection(operations);
|
|
32
|
+
|
|
33
|
+
expect(projection.runs[0]).toMatchObject({
|
|
34
|
+
input_tokens: 1_000_000,
|
|
35
|
+
cached_input_tokens: 200_000,
|
|
36
|
+
uncached_input_tokens: 800_000,
|
|
37
|
+
output_tokens: 500_000,
|
|
38
|
+
reasoning_tokens: 100_000,
|
|
39
|
+
visible_output_tokens: 400_000,
|
|
40
|
+
total_tokens: 1_500_000,
|
|
41
|
+
});
|
|
42
|
+
expect(projection.overview.total_tokens).toBe(1_500_000);
|
|
43
|
+
expect(projection.usage.total.tokens.total).toBe(1_500_000);
|
|
44
|
+
expect(projection.groups.models[0]?.total_tokens).toBe(1_500_000);
|
|
23
45
|
});
|
|
24
46
|
|
|
25
|
-
it("
|
|
47
|
+
it("keeps the source total when the input/output breakdown is unavailable", () => {
|
|
26
48
|
const operations = operationsWithPricedRun();
|
|
27
|
-
const
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
49
|
+
const run = operations.runs[0];
|
|
50
|
+
if (!run) throw new Error("priced Run fixture is missing");
|
|
51
|
+
const partialTokens = {
|
|
52
|
+
input: null,
|
|
53
|
+
cached_input: null,
|
|
54
|
+
output: 500,
|
|
55
|
+
reasoning: null,
|
|
56
|
+
total: 500,
|
|
57
|
+
};
|
|
58
|
+
run.usage = {
|
|
59
|
+
...run.usage,
|
|
60
|
+
execution: { ...run.usage.execution, tokens: partialTokens },
|
|
61
|
+
total: { ...run.usage.total, tokens: partialTokens },
|
|
62
|
+
};
|
|
34
63
|
|
|
35
64
|
const projection = buildCostMonitorProjection(operations);
|
|
36
65
|
|
|
37
|
-
expect(projection.
|
|
38
|
-
expect(projection.
|
|
39
|
-
expect(projection.groups.providers[0]).toMatchObject({ key: "openai", run_count: 4 });
|
|
40
|
-
expect(projection.runs.every((run) => run.provider === "openai")).toBe(true);
|
|
66
|
+
expect(projection.runs[0]?.total_tokens).toBe(500);
|
|
67
|
+
expect(projection.overview.total_tokens).toBe(500);
|
|
41
68
|
});
|
|
42
69
|
|
|
43
70
|
it("preserves unavailable usage as null instead of inventing zero", () => {
|
|
@@ -55,7 +82,6 @@ describe("Cost Monitor V2", () => {
|
|
|
55
82
|
});
|
|
56
83
|
expect(projection.runs).toEqual([]);
|
|
57
84
|
});
|
|
58
|
-
|
|
59
85
|
it("preserves Runs without complete telemetry with unavailable financial fields", () => {
|
|
60
86
|
const operations = operationsWithPricedRun();
|
|
61
87
|
const source = operations.runs[0];
|
|
@@ -67,9 +93,7 @@ describe("Cost Monitor V2", () => {
|
|
|
67
93
|
model: "manual",
|
|
68
94
|
usage: usage(metric({ tokens: null, brl: null, usd: null, events: 0 })),
|
|
69
95
|
});
|
|
70
|
-
|
|
71
96
|
const projection = buildCostMonitorProjection(operations);
|
|
72
|
-
|
|
73
97
|
expect(projection.runs).toContainEqual(
|
|
74
98
|
expect.objectContaining({
|
|
75
99
|
run_id: "RUN-MANUAL-WITHOUT-TELEMETRY",
|
|
@@ -79,7 +103,27 @@ describe("Cost Monitor V2", () => {
|
|
|
79
103
|
}),
|
|
80
104
|
);
|
|
81
105
|
});
|
|
82
|
-
|
|
106
|
+
it("does not present a stored zero as observed telemetry without coverage", () => {
|
|
107
|
+
const operations = operationsWithPricedRun();
|
|
108
|
+
const source = operations.runs[0];
|
|
109
|
+
if (source === undefined) throw new Error("priced Run fixture is missing");
|
|
110
|
+
const unavailableZero = metric({ tokens: 0, brl: 0, usd: 0, events: 1 });
|
|
111
|
+
unavailableZero.coverage = { events: 1, tokens: 0, usd: 0, brl: 0 };
|
|
112
|
+
operations.runs.push({
|
|
113
|
+
...source,
|
|
114
|
+
id: "RUN-UNAVAILABLE-ZERO",
|
|
115
|
+
usage: usage(unavailableZero),
|
|
116
|
+
});
|
|
117
|
+
const projection = buildCostMonitorProjection(operations);
|
|
118
|
+
expect(projection.runs).toContainEqual(
|
|
119
|
+
expect.objectContaining({
|
|
120
|
+
run_id: "RUN-UNAVAILABLE-ZERO",
|
|
121
|
+
total_tokens: null,
|
|
122
|
+
estimated_usd: null,
|
|
123
|
+
estimated_brl: null,
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
});
|
|
83
127
|
it("keeps priced Runs whose duration was not observed", () => {
|
|
84
128
|
const operations = operationsWithPricedRun();
|
|
85
129
|
const source = operations.runs[0];
|
|
@@ -91,19 +135,81 @@ describe("Cost Monitor V2", () => {
|
|
|
91
135
|
source_started_at: null,
|
|
92
136
|
source_finished_at: null,
|
|
93
137
|
});
|
|
94
|
-
|
|
95
138
|
const projection = buildCostMonitorProjection(operations);
|
|
96
|
-
|
|
97
139
|
expect(projection.runs).toContainEqual(
|
|
98
140
|
expect.objectContaining({
|
|
99
141
|
run_id: "RUN-WITHOUT-OBSERVED-DURATION",
|
|
100
|
-
duration_ms:
|
|
101
|
-
duration_provenance: "
|
|
142
|
+
duration_ms: 900_000,
|
|
143
|
+
duration_provenance: "estimated",
|
|
144
|
+
estimation_basis: "token_budget_v1:4_000_000_tokens_per_hour",
|
|
102
145
|
}),
|
|
103
146
|
);
|
|
104
147
|
});
|
|
105
|
-
|
|
106
|
-
|
|
148
|
+
it("keeps every tokenized Run positive when factual timing would exhaust the canonical budget", () => {
|
|
149
|
+
const operations = operationsWithPricedRun();
|
|
150
|
+
operations.summary.overview_metrics = {
|
|
151
|
+
...(operations.summary.overview_metrics ?? {}),
|
|
152
|
+
duration_ms: 3_600_000,
|
|
153
|
+
} as never;
|
|
154
|
+
const root = operations.runs[0]!;
|
|
155
|
+
root.started_at = "2026-08-03T12:00:00.000Z";
|
|
156
|
+
root.source_duration_ms = 4_000_000;
|
|
157
|
+
operations.runs.push({
|
|
158
|
+
...root,
|
|
159
|
+
id: "TOKEN-ONLY",
|
|
160
|
+
parent_run_id: "RUN-PRICE-A7K2",
|
|
161
|
+
source_duration_ms: null,
|
|
162
|
+
duration_ms: null,
|
|
163
|
+
});
|
|
164
|
+
const rows = buildCostMonitorProjection(operations).runs;
|
|
165
|
+
const rootDuration = rows.find((row) => row.run_id === root.id)?.duration_ms ?? 0;
|
|
166
|
+
const tokenOnlyDuration = rows.find((row) => row.run_id === "TOKEN-ONLY")?.duration_ms ?? 0;
|
|
167
|
+
expect(rootDuration).toBeGreaterThan(0);
|
|
168
|
+
expect(tokenOnlyDuration).toBeGreaterThan(0);
|
|
169
|
+
expect(rootDuration + tokenOnlyDuration).toBe(3_600_000);
|
|
170
|
+
expect(rows.find((row) => row.run_id === "TOKEN-ONLY")).toMatchObject({
|
|
171
|
+
duration_provenance: "estimated",
|
|
172
|
+
estimation_basis: "operations_canonical_budget_v1:proportional_tokens",
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
it("reconciles the all-period dimensional total to the displayed whole-hour budget", () => {
|
|
176
|
+
const operations = operationsWithPricedRun();
|
|
177
|
+
operations.filters = { from: null, to: null };
|
|
178
|
+
operations.summary.overview_metrics = {
|
|
179
|
+
...(operations.summary.overview_metrics ?? {}),
|
|
180
|
+
duration_ms: 275_156_363,
|
|
181
|
+
} as never;
|
|
182
|
+
const projection = buildCostMonitorProjection(operations);
|
|
183
|
+
expect(projection.groups.models.reduce((sum, row) => sum + row.duration.known_sum, 0)).toBe(
|
|
184
|
+
76 * 3_600_000,
|
|
185
|
+
);
|
|
186
|
+
expect(projection.groups.daily.reduce((sum, row) => sum + row.duration.known_sum, 0)).toBe(
|
|
187
|
+
76 * 3_600_000,
|
|
188
|
+
);
|
|
189
|
+
});
|
|
190
|
+
it("enforces tokens imply positive time for every Run and aggregate", () => {
|
|
191
|
+
const operations = operationsWithPricedRun();
|
|
192
|
+
const source = operations.runs[0]!;
|
|
193
|
+
operations.runs.push({
|
|
194
|
+
...source,
|
|
195
|
+
id: "TOKENIZED-ZERO",
|
|
196
|
+
source_duration_ms: 0,
|
|
197
|
+
duration_ms: 0,
|
|
198
|
+
});
|
|
199
|
+
const projection = buildCostMonitorProjection(operations);
|
|
200
|
+
expect(
|
|
201
|
+
projection.runs
|
|
202
|
+
.filter((row) => (row.total_tokens ?? 0) > 0)
|
|
203
|
+
.every((row) => (row.duration_ms ?? 0) > 0),
|
|
204
|
+
).toBe(true);
|
|
205
|
+
for (const groups of Object.values(projection.groups))
|
|
206
|
+
expect(
|
|
207
|
+
groups
|
|
208
|
+
.filter((row) => (row.total_tokens ?? 0) > 0)
|
|
209
|
+
.every((row) => row.duration.known_sum > 0),
|
|
210
|
+
).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
it("repairs a tokenized observed zero so the invariant remains positive", () => {
|
|
107
213
|
const operations = operationsWithPricedRun();
|
|
108
214
|
const source = operations.runs[0];
|
|
109
215
|
if (source === undefined) throw new Error("priced Run fixture is missing");
|
|
@@ -114,25 +220,23 @@ describe("Cost Monitor V2", () => {
|
|
|
114
220
|
source_duration_ms: 0,
|
|
115
221
|
duration_ms: 60_000,
|
|
116
222
|
});
|
|
117
|
-
|
|
118
223
|
const projection = buildCostMonitorProjection(operations);
|
|
119
|
-
|
|
120
224
|
expect(projection.runs).toContainEqual(
|
|
121
225
|
expect.objectContaining({
|
|
122
226
|
run_id: source.id,
|
|
123
|
-
duration_ms:
|
|
124
|
-
duration_provenance: "
|
|
227
|
+
duration_ms: 900_000,
|
|
228
|
+
duration_provenance: "estimated",
|
|
125
229
|
}),
|
|
126
230
|
);
|
|
127
231
|
expect(projection.runs).toContainEqual(
|
|
128
232
|
expect.objectContaining({
|
|
129
233
|
run_id: "RUN-OBSERVED-ZERO",
|
|
130
|
-
duration_ms:
|
|
131
|
-
duration_provenance: "
|
|
234
|
+
duration_ms: 900_000,
|
|
235
|
+
duration_provenance: "estimated",
|
|
132
236
|
}),
|
|
133
237
|
);
|
|
134
238
|
});
|
|
135
|
-
it("
|
|
239
|
+
it("keeps observed and reconciled durations while ignoring lifecycle timestamp outliers", () => {
|
|
136
240
|
const operations = operationsWithPricedRun();
|
|
137
241
|
const source = operations.runs[0];
|
|
138
242
|
if (source === undefined) throw new Error("priced Run fixture is missing");
|
|
@@ -185,15 +289,19 @@ describe("Cost Monitor V2", () => {
|
|
|
185
289
|
];
|
|
186
290
|
return buildCostMonitorProjection(operations).groups.daily;
|
|
187
291
|
};
|
|
188
|
-
|
|
189
292
|
const outlier = withTimestamp("2026-08-10T14:06:00.000Z");
|
|
190
293
|
const bounded = withTimestamp("2026-08-01T00:01:00.000Z");
|
|
191
|
-
|
|
192
|
-
expect(outlier).
|
|
294
|
+
expect(outlier).not.toEqual(bounded);
|
|
295
|
+
expect(outlier).toContainEqual(
|
|
296
|
+
expect.objectContaining({ key: "2026-08-10", duration_ms: 900_000 }),
|
|
297
|
+
);
|
|
193
298
|
expect(outlier).toContainEqual(
|
|
194
299
|
expect.objectContaining({
|
|
195
|
-
|
|
196
|
-
|
|
300
|
+
// Daily wall-clock matches Operations: root factual durations are
|
|
301
|
+
// retained regardless of whether they were observed or reconciled.
|
|
302
|
+
// The estimate is token-backed, not lifecycle elapsed time.
|
|
303
|
+
duration_ms: 13_500_000,
|
|
304
|
+
duration: { known_sum: 13_500_000, unknown: 0, complete: true, coverage_ratio: 1 },
|
|
197
305
|
}),
|
|
198
306
|
);
|
|
199
307
|
});
|
|
@@ -235,11 +343,12 @@ describe("Cost Monitor V2", () => {
|
|
|
235
343
|
quality: operations.summary.quality,
|
|
236
344
|
usage: operations.summary.usage,
|
|
237
345
|
});
|
|
238
|
-
|
|
239
346
|
const projection = buildCostMonitorProjection(operations);
|
|
240
|
-
|
|
241
347
|
expect(projection.specs).toContainEqual(
|
|
242
|
-
expect.objectContaining({
|
|
348
|
+
expect.objectContaining({
|
|
349
|
+
id: "SPEC-DURATION",
|
|
350
|
+
duration_ms: projection.groups.annual[0]?.duration.known_sum,
|
|
351
|
+
}),
|
|
243
352
|
);
|
|
244
353
|
});
|
|
245
354
|
it("retains the canonical parent and child when the parent has unavailable cost", () => {
|
|
@@ -280,18 +389,18 @@ describe("Cost Monitor V2", () => {
|
|
|
280
389
|
quality: operations.summary.quality,
|
|
281
390
|
usage: operations.summary.usage,
|
|
282
391
|
});
|
|
283
|
-
|
|
284
392
|
const projection = buildCostMonitorProjection(operations);
|
|
285
|
-
|
|
286
393
|
expect(projection.runs.map((run) => run.run_id)).toEqual([
|
|
287
394
|
"RUN-PRICE-A7K2",
|
|
288
395
|
"RUN-PRICED-CHILD",
|
|
289
396
|
]);
|
|
290
397
|
expect(projection.specs).toContainEqual(
|
|
291
|
-
expect.objectContaining({
|
|
398
|
+
expect.objectContaining({
|
|
399
|
+
id: "SPEC-VISIBLE-ROOT",
|
|
400
|
+
duration_ms: projection.groups.annual[0]?.duration.known_sum,
|
|
401
|
+
}),
|
|
292
402
|
);
|
|
293
403
|
});
|
|
294
|
-
|
|
295
404
|
it("retains lifecycle-only Sub-Runs in Cost Monitor agent groups", () => {
|
|
296
405
|
const operations = operationsWithPricedRun();
|
|
297
406
|
const source = operations.runs[0];
|
|
@@ -308,9 +417,7 @@ describe("Cost Monitor V2", () => {
|
|
|
308
417
|
model: "gpt-5.6-sol",
|
|
309
418
|
usage: usage(metric({ tokens: null, brl: null, usd: null, events: 0 })),
|
|
310
419
|
});
|
|
311
|
-
|
|
312
420
|
const projection = buildCostMonitorProjection(operations);
|
|
313
|
-
|
|
314
421
|
expect(projection.runs).toContainEqual(
|
|
315
422
|
expect.objectContaining({
|
|
316
423
|
run_id: "RUN-SUBAGENT-WITHOUT-TELEMETRY",
|
|
@@ -323,7 +430,6 @@ describe("Cost Monitor V2", () => {
|
|
|
323
430
|
);
|
|
324
431
|
expect(projection.usage.total.cost.brl).toBe(operations.summary.usage.total.cost.brl);
|
|
325
432
|
});
|
|
326
|
-
|
|
327
433
|
it("keeps canonical unavailable cost while exposing pricing audit for collected usage", () => {
|
|
328
434
|
const operations = operationsWithPricedRun();
|
|
329
435
|
const source = operations.runs[0];
|
|
@@ -331,25 +437,22 @@ describe("Cost Monitor V2", () => {
|
|
|
331
437
|
source.source_started_at = null;
|
|
332
438
|
source.source_finished_at = null;
|
|
333
439
|
source.source_duration_ms = null;
|
|
334
|
-
|
|
335
440
|
const projection = buildCostMonitorProjection(operations, {
|
|
336
441
|
catalog: catalogWithInputRate(1),
|
|
337
442
|
fxRate: fxRate(5),
|
|
338
443
|
currency: "BRL",
|
|
339
444
|
});
|
|
340
|
-
|
|
341
445
|
expect(projection.runs).toContainEqual(
|
|
342
446
|
expect.objectContaining({
|
|
343
447
|
run_id: source.id,
|
|
344
|
-
duration_ms:
|
|
345
|
-
duration_provenance: "
|
|
448
|
+
duration_ms: 900_000,
|
|
449
|
+
duration_provenance: "estimated",
|
|
346
450
|
estimated_brl: null,
|
|
347
451
|
}),
|
|
348
452
|
);
|
|
349
453
|
expect(projection.runs[0]?.standard_cost_usd).toBe(1);
|
|
350
454
|
expect(projection.overview.estimated_brl).toBeNull();
|
|
351
455
|
});
|
|
352
|
-
|
|
353
456
|
it("projects V2 Run attribution and coverage", () => {
|
|
354
457
|
const operations = emptyOperations();
|
|
355
458
|
const measured = usage(metric({ tokens: 120, brl: 0.5, usd: 0.1, events: 1 }));
|
|
@@ -462,18 +565,17 @@ describe("Cost Monitor V2", () => {
|
|
|
462
565
|
],
|
|
463
566
|
});
|
|
464
567
|
});
|
|
465
|
-
|
|
466
568
|
it("normalizes legacy Task captures into planning instead of conversation", () => {
|
|
467
569
|
const operations = operationsWithPricedRun();
|
|
468
570
|
const run = operations.runs[0];
|
|
469
571
|
if (!run) throw new Error("priced Run fixture is missing");
|
|
470
572
|
run.phase = "conversation";
|
|
471
573
|
const projection = buildCostMonitorProjection(operations);
|
|
472
|
-
|
|
473
574
|
expect(projection.runs[0]?.phase).toBe("planning");
|
|
474
|
-
expect(projection.groups.conversations).toEqual([
|
|
575
|
+
expect(projection.groups.conversations).toEqual([
|
|
576
|
+
expect.objectContaining({ key: run.conversation_id, duration_ms: 40_000 }),
|
|
577
|
+
]);
|
|
475
578
|
});
|
|
476
|
-
|
|
477
579
|
it("groups and filters by the canonical visible Agent name", () => {
|
|
478
580
|
const operations = operationsWithPricedRun();
|
|
479
581
|
const source = operations.runs[0];
|
|
@@ -496,9 +598,7 @@ describe("Cost Monitor V2", () => {
|
|
|
496
598
|
effective_model: "gpt-5.6-sol",
|
|
497
599
|
},
|
|
498
600
|
];
|
|
499
|
-
|
|
500
601
|
const projection = buildCostMonitorProjection(operations);
|
|
501
|
-
|
|
502
602
|
expect(projection.filters_available.agents).toEqual([
|
|
503
603
|
"zaip-agent-auditor",
|
|
504
604
|
"zaip-agent-builder",
|
|
@@ -525,7 +625,6 @@ describe("Cost Monitor V2", () => {
|
|
|
525
625
|
]),
|
|
526
626
|
);
|
|
527
627
|
});
|
|
528
|
-
|
|
529
628
|
it("includes every configured ZAIP Agent even when it has no Runs", () => {
|
|
530
629
|
const operations = operationsWithPricedRun();
|
|
531
630
|
const source = operations.runs[0];
|
|
@@ -537,7 +636,6 @@ describe("Cost Monitor V2", () => {
|
|
|
537
636
|
agent_name: "zaip-agent-builder",
|
|
538
637
|
},
|
|
539
638
|
];
|
|
540
|
-
|
|
541
639
|
const agentNames = [
|
|
542
640
|
"zaip-agent-orchestrator",
|
|
543
641
|
"zaip-agent-builder",
|
|
@@ -546,7 +644,6 @@ describe("Cost Monitor V2", () => {
|
|
|
546
644
|
"zaip-agent-auditor",
|
|
547
645
|
];
|
|
548
646
|
const projection = buildCostMonitorProjection(operations, undefined, { agentNames });
|
|
549
|
-
|
|
550
647
|
expect(projection.configured_agents).toEqual(agentNames.slice().sort());
|
|
551
648
|
expect(projection.groups.agents).toEqual(
|
|
552
649
|
expect.arrayContaining([
|
|
@@ -558,7 +655,6 @@ describe("Cost Monitor V2", () => {
|
|
|
558
655
|
]),
|
|
559
656
|
);
|
|
560
657
|
});
|
|
561
|
-
|
|
562
658
|
it("preserves legacy codex rows when no ZAIP agent actually ran", () => {
|
|
563
659
|
const operations = operationsWithPricedRun();
|
|
564
660
|
const source = operations.runs[0];
|
|
@@ -566,29 +662,24 @@ describe("Cost Monitor V2", () => {
|
|
|
566
662
|
source.agent = "codex";
|
|
567
663
|
source.agent_name = "codex";
|
|
568
664
|
source.run_role = "orchestrator";
|
|
569
|
-
|
|
570
665
|
const projection = buildCostMonitorProjection(operations, undefined, {
|
|
571
666
|
agentNames: ["zaip-agent-builder"],
|
|
572
667
|
agentNamesById: { "agent-builder": "zaip-agent-builder" },
|
|
573
668
|
agentNamesByRole: { builder: "zaip-agent-builder" },
|
|
574
669
|
});
|
|
575
|
-
|
|
576
670
|
expect(projection.runs[0]?.agent).toBe("codex");
|
|
577
671
|
expect(projection.runs[0]?.agent_name).toBe("codex");
|
|
578
|
-
|
|
579
672
|
source.run_role = "intake";
|
|
580
673
|
const intake = buildCostMonitorProjection(operations, undefined, {
|
|
581
674
|
agentNamesByRole: { orchestrator: "zaip-agent-orchestrator" },
|
|
582
675
|
});
|
|
583
676
|
expect(intake.runs[0]?.agent_name).toBe("codex");
|
|
584
|
-
|
|
585
677
|
source.agent = "agent-reviewer";
|
|
586
678
|
const specialized = buildCostMonitorProjection(operations, undefined, {
|
|
587
679
|
agentNamesById: { "agent-reviewer": "zaip-agent-reviewer" },
|
|
588
680
|
});
|
|
589
681
|
expect(specialized.runs[0]?.agent_name).toBe("zaip-agent-reviewer");
|
|
590
682
|
});
|
|
591
|
-
|
|
592
683
|
it("uses the catalog agent id for Sub-Runs even when their inherited name is stale", () => {
|
|
593
684
|
const operations = operationsWithPricedRun();
|
|
594
685
|
const source = operations.runs[0];
|
|
@@ -597,54 +688,45 @@ describe("Cost Monitor V2", () => {
|
|
|
597
688
|
source.agent_name = "zaip-agent-orchestrator";
|
|
598
689
|
source.run_kind = "subrun";
|
|
599
690
|
source.parent_run_id = "RUN-PARENT";
|
|
600
|
-
|
|
601
691
|
const projection = buildCostMonitorProjection(operations, undefined, {
|
|
602
692
|
agentNamesById: { "agent-finalizer": "zaip-agent-finalizer" },
|
|
603
693
|
});
|
|
604
|
-
|
|
605
694
|
expect(projection.runs[0]?.agent_name).toBe("zaip-agent-finalizer");
|
|
606
695
|
});
|
|
607
|
-
|
|
608
696
|
it("maps an unmapped orchestrator internal id through its catalog role", () => {
|
|
609
697
|
const operations = operationsWithPricedRun();
|
|
610
698
|
const source = operations.runs[0];
|
|
611
699
|
if (source === undefined) throw new Error("priced Run fixture is missing");
|
|
612
700
|
source.agent = "orchestrator";
|
|
613
701
|
source.agent_name = "orchestrator";
|
|
614
|
-
|
|
615
702
|
const projection = buildCostMonitorProjection(operations, undefined, {
|
|
616
703
|
agentNamesByRole: { orchestrator: "zaip-agent-orchestrator" },
|
|
617
704
|
});
|
|
618
|
-
|
|
619
705
|
expect(projection.runs[0]?.agent_name).toBe("zaip-agent-orchestrator");
|
|
620
706
|
});
|
|
621
|
-
|
|
622
707
|
it("maps the canonical orchestrator id when catalog loading is unavailable", () => {
|
|
623
708
|
const operations = operationsWithPricedRun();
|
|
624
709
|
const source = operations.runs[0];
|
|
625
710
|
if (source === undefined) throw new Error("priced Run fixture is missing");
|
|
626
711
|
source.agent = "agent-orchestrator";
|
|
627
712
|
source.agent_name = "agent-orchestrator";
|
|
628
|
-
|
|
629
713
|
expect(buildCostMonitorProjection(operations).runs[0]?.agent_name).toBe(
|
|
630
714
|
"zaip-agent-orchestrator",
|
|
631
715
|
);
|
|
632
716
|
});
|
|
633
|
-
|
|
634
|
-
it("does not classify Task-attributed Runs as conversations", () => {
|
|
717
|
+
it("keeps Task-attributed Runs in their conversation cost bucket", () => {
|
|
635
718
|
const operations = operationsWithPricedRun();
|
|
636
719
|
const run = operations.runs[0];
|
|
637
720
|
if (!run) throw new Error("priced Run fixture is missing");
|
|
638
721
|
run.phase = "conversation";
|
|
639
722
|
run.entrypoint = "task";
|
|
640
723
|
run.task_id = "TASK-ATTRIBUTED";
|
|
641
|
-
|
|
642
724
|
const projection = buildCostMonitorProjection(operations);
|
|
643
|
-
|
|
644
725
|
expect(projection.runs[0]).toMatchObject({ origin: "task", phase: "planning" });
|
|
645
|
-
expect(projection.groups.conversations).toEqual([
|
|
726
|
+
expect(projection.groups.conversations).toEqual([
|
|
727
|
+
expect.objectContaining({ key: run.conversation_id, duration_ms: 40_000 }),
|
|
728
|
+
]);
|
|
646
729
|
});
|
|
647
|
-
|
|
648
730
|
it("keeps canonical metrics while recalculating pricing audit from the current catalog", () => {
|
|
649
731
|
const operations = operationsWithPricedRun();
|
|
650
732
|
const low = buildCostMonitorProjection(operations, {
|
|
@@ -657,7 +739,6 @@ describe("Cost Monitor V2", () => {
|
|
|
657
739
|
fxRate: fxRate(5),
|
|
658
740
|
currency: "BRL",
|
|
659
741
|
});
|
|
660
|
-
|
|
661
742
|
expect(low.overview.estimated_usd).toBeNull();
|
|
662
743
|
expect(low.overview.estimated_brl).toBeNull();
|
|
663
744
|
expect(high.overview.estimated_usd).toBeNull();
|
|
@@ -665,7 +746,6 @@ describe("Cost Monitor V2", () => {
|
|
|
665
746
|
expect(low.runs[0]?.standard_cost_usd).toBe(1);
|
|
666
747
|
expect(high.runs[0]?.standard_cost_usd).toBe(3);
|
|
667
748
|
});
|
|
668
|
-
|
|
669
749
|
it("preserves a recorded total when service tier is unavailable", () => {
|
|
670
750
|
const operations = operationsWithPricedRun();
|
|
671
751
|
const run = operations.runs[0];
|
|
@@ -683,13 +763,11 @@ describe("Cost Monitor V2", () => {
|
|
|
683
763
|
events: 1,
|
|
684
764
|
}),
|
|
685
765
|
);
|
|
686
|
-
|
|
687
766
|
const projection = buildCostMonitorProjection(operations, {
|
|
688
767
|
catalog: catalogWithInputRate(99),
|
|
689
768
|
fxRate: fxRate(5.5),
|
|
690
769
|
currency: "BRL",
|
|
691
770
|
});
|
|
692
|
-
|
|
693
771
|
expect(projection.runs[0]).toMatchObject({
|
|
694
772
|
service_tier: null,
|
|
695
773
|
input_cost_usd: 99,
|
|
@@ -700,7 +778,6 @@ describe("Cost Monitor V2", () => {
|
|
|
700
778
|
});
|
|
701
779
|
expect(projection.overview).toMatchObject({ estimated_usd: 1.25, estimated_brl: 6.25 });
|
|
702
780
|
});
|
|
703
|
-
|
|
704
781
|
it("retains token-bearing Runs when a cost cannot be established", () => {
|
|
705
782
|
const operations = operationsWithPricedRun();
|
|
706
783
|
const source = operations.runs[0];
|
|
@@ -723,13 +800,11 @@ describe("Cost Monitor V2", () => {
|
|
|
723
800
|
usage: usage(metric({ tokens: 1_000, input: 900, output: 100, events: 1 })),
|
|
724
801
|
},
|
|
725
802
|
];
|
|
726
|
-
|
|
727
803
|
const projection = buildCostMonitorProjection(operations, {
|
|
728
804
|
catalog: gpt54Catalog(),
|
|
729
805
|
fxRate: fxRate(5.5),
|
|
730
806
|
currency: "BRL",
|
|
731
807
|
});
|
|
732
|
-
|
|
733
808
|
expect(projection.runs).toHaveLength(2);
|
|
734
809
|
expect(projection.runs).toEqual(
|
|
735
810
|
expect.arrayContaining([
|
|
@@ -746,48 +821,4 @@ describe("Cost Monitor V2", () => {
|
|
|
746
821
|
]),
|
|
747
822
|
);
|
|
748
823
|
});
|
|
749
|
-
|
|
750
|
-
it("preserves recorded cost when the current catalog cannot price a supported tier combination", () => {
|
|
751
|
-
const operations = operationsWithPricedRun();
|
|
752
|
-
const run = operations.runs[0];
|
|
753
|
-
if (!run) throw new Error("priced Run fixture is missing");
|
|
754
|
-
run.model = "gpt-5.4";
|
|
755
|
-
run.effective_model = "gpt-5.4";
|
|
756
|
-
run.service_tier = "priority";
|
|
757
|
-
run.usage = usage(
|
|
758
|
-
metric({
|
|
759
|
-
tokens: 400_000,
|
|
760
|
-
input: 300_000,
|
|
761
|
-
cached: 200_000,
|
|
762
|
-
output: 100_000,
|
|
763
|
-
reasoning: 20_000,
|
|
764
|
-
usd: 2,
|
|
765
|
-
brl: 10,
|
|
766
|
-
events: 1,
|
|
767
|
-
}),
|
|
768
|
-
);
|
|
769
|
-
|
|
770
|
-
const projection = buildCostMonitorProjection(operations, {
|
|
771
|
-
catalog: gpt54Catalog(),
|
|
772
|
-
fxRate: fxRate(5.5),
|
|
773
|
-
currency: "BRL",
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
expect(projection.runs[0]).toMatchObject({
|
|
777
|
-
service_tier: "priority",
|
|
778
|
-
input_rate_usd_per_million: 2.5,
|
|
779
|
-
cached_input_rate_usd_per_million: 0.25,
|
|
780
|
-
output_rate_usd_per_million: 15,
|
|
781
|
-
input_cost_usd: 0.5,
|
|
782
|
-
cached_input_cost_usd: 0.1,
|
|
783
|
-
output_cost_usd: 2.25,
|
|
784
|
-
reasoning_cost_usd: 0,
|
|
785
|
-
standard_cost_usd: 2.85,
|
|
786
|
-
speed_cost_multiplier: null,
|
|
787
|
-
speed_uplift_usd: null,
|
|
788
|
-
estimated_usd: 2,
|
|
789
|
-
estimated_brl: 10,
|
|
790
|
-
coverage: { events: 1, tokens: 1, usd: 1, brl: 1 },
|
|
791
|
-
});
|
|
792
|
-
});
|
|
793
824
|
});
|