@zaip-ai/cli 1.0.8 → 1.3.1
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 +1 -1
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.js +1 -1
- package/dist/services/agent-adapters.js +3 -3
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +7 -1
- package/dist/services/agent-adapters.test.js.map +1 -1
- package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
- package/dist/services/codex-pre-tool-hook-template.js +89 -7
- package/dist/services/codex-pre-tool-hook-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 +7 -0
- package/dist/services/codex-rules.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +1 -0
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/logger.test.js +2 -2
- package/dist/services/runtime-template.test.js +31 -7
- 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 +12 -3
- 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 +7 -7
- package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +8 -8
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -1
- package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
- package/templates/.agents/dashboard/.zaip-managed.json +457 -173
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-Z60df2r-.js → CostCalculationGuidePage-ovxurkIk.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-BgVgrfhQ.js +2310 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-Coc6pA-1.js → PricingSettingsDialog-vSvvOHQp.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-zH758vfs.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-DLn-Mz2M.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-CaKwQP43.css → TraceabilityWorkspace-DvvavDLY.css} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DKwP1stV.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-PoJA2PI1.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DFBuc_qp.js → icons-vendor-B_lDDHn1.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-B31GMG5O.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-CZQlsLV9.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CCQOHdVI.js → react-vendor-B3TJrD4O.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-pC2_0J8x.js → traceability-7f1j5wx3.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +7 -7
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/playwright.dom.config.ts +32 -0
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +199 -140
- package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +0 -21
- package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +20 -11
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +14 -7
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +4 -2
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.dom.e2e.ts +56 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +21 -2
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +89 -19
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +19 -4
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +49 -3
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +29 -10
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +4 -4
- package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +4 -2
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +36 -26
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +47 -6
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +59 -9
- package/templates/.agents/dashboard/apps/frontend/src/sqlite-page-export.test.ts +32 -0
- package/templates/.agents/dashboard/apps/frontend/src/sqlite-page-export.ts +21 -0
- package/templates/.agents/dashboard/apps/frontend/src/styles.css +19 -0
- package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.test.ts +32 -0
- package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +36 -0
- package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +6 -2
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +137 -23
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +229 -35
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +61 -7
- package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +3 -6
- package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +7 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-list-page.test.ts +163 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-list-page.ts +136 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-operations-detail-export.ts +76 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-load-dedup.test.ts +23 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-load-dedup.ts +27 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +39 -15
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +3 -4
- package/templates/.agents/dashboard/apps/frontend/vite.config.ts +4 -1
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +89 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +31 -16
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +43 -14
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +5 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionPanel.tsx +60 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionTable.tsx +191 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.loading.test.ts +14 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.run-page.test.ts +18 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +18 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +75 -44
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorLoadErrors.tsx +35 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +162 -40
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +221 -79
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.test.ts +132 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableLoading.tsx +70 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +203 -155
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +164 -125
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +2 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +3 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +5 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-page-range.ts +35 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +2 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +32 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +37 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +131 -9
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +34 -17
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +0 -24
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +225 -424
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +24 -15
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +6 -1
- 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/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/src/contracts.ts +46 -26
- package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.test.ts +54 -0
- package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.tsx +247 -0
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +31 -11
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +39 -13
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +107 -2
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.macro-metrics.test.ts +55 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +23 -29
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +211 -184
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewTopPanel.tsx +127 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +60 -51
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +1 -4
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.test.tsx +43 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PagedWorkList.tsx +181 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +32 -10
- package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +9 -3
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +13 -5
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +16 -6
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +14 -4
- package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +1 -2
- package/templates/.agents/dashboard/modules/operations/src/react/developer-identities.test.ts +18 -0
- package/templates/.agents/dashboard/modules/operations/src/react/developer-identities.ts +30 -0
- package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +1 -0
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +393 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +484 -61
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +23 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
- package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +4 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +6 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +4 -3
- package/templates/.agents/dashboard/modules/operations/src/react/operations-date-filters.css +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +4 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +22 -12
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.css +4 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +53 -6
- package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +2 -4
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +82 -6
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +1 -0
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +19 -7
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +4 -1
- package/templates/.agents/dashboard/modules/operations/src/server/metric-coverage.ts +1 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +11 -5
- package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/package.json +1 -1
- package/templates/.agents/dashboard/packages/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 +533 -338
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +506 -311
- package/templates/.agents/dashboard/packages/local-runtime/gitignore.template +2 -0
- package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +15 -7
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +44 -13
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +8 -3
- 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 +472 -145
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +15 -3
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +141 -33
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +533 -338
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +6 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +3 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +89 -16
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +33 -16
- package/templates/.agents/dashboard/packages/local-runtime/src/server-classification-page.test.ts +87 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.test.ts +44 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-period-macro-metric.ts +125 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +66 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-request-authority.test.ts +61 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-request-authority.ts +18 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-run-projections.test.ts +42 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +97 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +91 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +7 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +36 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +230 -132
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +224 -182
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-artifact-counts.ts +28 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.test.ts +63 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.ts +109 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-aggregates.ts +497 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-fast-page-parity.test-support.ts +65 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-page.test.ts +176 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-page.ts +119 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +41 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.test.ts +16 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.ts +29 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +355 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts +121 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-timing.ts +27 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +16 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +15 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.test.ts +223 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-work-list.ts +304 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-cache.test-support.ts +23 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +89 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-fixture.ts +227 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +691 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +81 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1655 -567
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +2168 -1268
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-cache.ts +129 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-install.test.ts +26 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-install.ts +28 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +116 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +146 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +165 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-refresh.mjs +140 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +255 -289
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +94 -88
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +5 -2
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -1
- package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-loading.spec.ts +142 -0
- package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-pagination.spec.ts +232 -0
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +743 -0
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +189 -214
- 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 +6 -6
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +1 -1
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +3 -3
- package/templates/.agents/requirements/kanban-dashboard.md +10 -2
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +1 -1
- 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 +4 -4
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/dashboard-ui-consistency.md +14 -0
- package/templates/.agents/rules/frontend-lite.md +4 -4
- package/templates/.agents/rules/run-lifecycle-closure.md +4 -4
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +1142 -1041
- package/templates/.agents/runtime/checksums.sha256 +6 -6
- package/templates/.agents/runtime/manifest.json +1 -1
- package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
- package/templates/.agents/runtime/provenance.json +5 -5
- package/templates/.agents/runtime/sbom.cdx.json +3 -3
- package/templates/.agents/sales/playbook.md +32 -0
- package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
- package/templates/.agents/skills/criar-pasta-obsidian/scripts/generate-obsidian-vault.test.mjs +20 -16
- package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-agent-catalog/SKILL.md +22 -0
- package/templates/.agents/skills/zaip-skill-agent-catalog/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +3 -2
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +49 -0
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/run-skill-tests.mjs +37 -0
- package/templates/.agents/skills/zaip-skill-backend/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +9 -2
- 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 +1 -1
- package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-change/references/observable-evidence.md +83 -0
- package/templates/.agents/skills/zaip-skill-dashboard-diagnostics/SKILL.md +22 -0
- package/templates/.agents/skills/zaip-skill-dashboard-diagnostics/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -3
- package/templates/.agents/skills/zaip-skill-frontend/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +10 -10
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +6 -0
- package/templates/.agents/skills/zaip-skill-lifecycle-closure/SKILL.md +27 -0
- package/templates/.agents/skills/zaip-skill-lifecycle-closure/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +6 -0
- package/templates/.agents/skills/zaip-skill-prd/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +111 -104
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-explicit-recovery.mjs +223 -0
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +55 -9
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +145 -14
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +19 -9
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +82 -5
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +20 -0
- package/templates/.agents/skills/zaip-skill-release-qualification/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-review/SKILL.md +5 -0
- package/templates/.agents/skills/zaip-skill-rules/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +6 -0
- package/templates/.agents/skills/zaip-skill-spec/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +22 -90
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +28 -5
- package/templates/.agents/zaip-aios/INDEX.md +57 -22
- package/templates/.agents/zaip-aios/README.md +24 -13
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/02-requirements.md +5 -0
- package/templates/.agents/zaip-aios/guides/06-execucao.md +13 -4
- package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +7 -0
- package/templates/.agents/zaip-aios/guides/10-seguranca.md +23 -0
- package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +6 -6
- package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +3 -0
- package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +12 -3
- package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +5 -5
- package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
- package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +95 -0
- package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +366 -0
- package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +46 -0
- package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +74 -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 +19 -0
- package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +111 -0
- package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +172 -0
- package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +149 -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 +756 -235
- package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cs6dzDmW.js +0 -1505
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +0 -2
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +0 -45
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
3
|
+
import { type CostGroupKind, readCostGroupPage } from "./sqlite-cost-group-page.js";
|
|
4
|
+
import { materializeCostGroupDailyProjection } from "./sqlite-cost-group-projection.js";
|
|
5
|
+
|
|
6
|
+
const databases: DatabaseSync[] = [];
|
|
7
|
+
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
for (const database of databases.splice(0)) database.close();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
function fixture() {
|
|
13
|
+
const database = new DatabaseSync(":memory:");
|
|
14
|
+
databases.push(database);
|
|
15
|
+
database.exec(`
|
|
16
|
+
CREATE TABLE cost_group_daily_projection (
|
|
17
|
+
day TEXT, group_kind TEXT, group_value TEXT,
|
|
18
|
+
invocation_count INTEGER, llm_call_count INTEGER, total_duration REAL,
|
|
19
|
+
total_input_tokens REAL, total_cached_input_tokens REAL,
|
|
20
|
+
total_output_tokens REAL, total_reasoning_tokens REAL, total_tokens REAL,
|
|
21
|
+
total_cost_usd REAL, total_cost_brl REAL
|
|
22
|
+
);
|
|
23
|
+
CREATE TABLE cost_monitor_group_daily_cache AS
|
|
24
|
+
SELECT * FROM cost_group_daily_projection;
|
|
25
|
+
CREATE TABLE cost_group_entity_projection (
|
|
26
|
+
group_kind TEXT, group_value TEXT, title TEXT, status TEXT, risk TEXT,
|
|
27
|
+
PRIMARY KEY (group_kind, group_value)
|
|
28
|
+
);
|
|
29
|
+
CREATE TABLE tasks (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
|
|
30
|
+
CREATE TABLE specs (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
|
|
31
|
+
CREATE TABLE prds (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
|
|
32
|
+
CREATE TABLE executions (id TEXT PRIMARY KEY, status TEXT);
|
|
33
|
+
CREATE TABLE conversations (id TEXT PRIMARY KEY, status TEXT);
|
|
34
|
+
`);
|
|
35
|
+
return database;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function insertGroup(database: DatabaseSync, kind: CostGroupKind, id: string, day = "2026-08-10") {
|
|
39
|
+
const values = [day, kind, id, 2, 2, 40, 10, 2, 4, 1, 17, 1.5, 8.25];
|
|
40
|
+
for (const table of ["cost_group_daily_projection", "cost_monitor_group_daily_cache"]) {
|
|
41
|
+
database
|
|
42
|
+
.prepare(`INSERT INTO ${table} VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
43
|
+
.run(...values);
|
|
44
|
+
}
|
|
45
|
+
const metadata =
|
|
46
|
+
kind === "task" || kind === "spec" || kind === "prd"
|
|
47
|
+
? [id, `${kind} title`, "completed", "standard"]
|
|
48
|
+
: [id, "completed"];
|
|
49
|
+
database
|
|
50
|
+
.prepare(
|
|
51
|
+
kind === "task" || kind === "spec" || kind === "prd"
|
|
52
|
+
? `INSERT OR IGNORE INTO ${kind}s VALUES (?, ?, ?, ?)`
|
|
53
|
+
: `INSERT OR IGNORE INTO ${kind}s VALUES (?, ?)`,
|
|
54
|
+
)
|
|
55
|
+
.run(...metadata);
|
|
56
|
+
database
|
|
57
|
+
.prepare(
|
|
58
|
+
`INSERT OR IGNORE INTO cost_group_entity_projection
|
|
59
|
+
VALUES (?, ?, ?, ?, ?)`,
|
|
60
|
+
)
|
|
61
|
+
.run(
|
|
62
|
+
kind,
|
|
63
|
+
id,
|
|
64
|
+
kind === "task" || kind === "spec" || kind === "prd" ? `${kind} title` : null,
|
|
65
|
+
"completed",
|
|
66
|
+
kind === "task" || kind === "spec" || kind === "prd" ? "standard" : null,
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
describe("date-only grouped Cost pages", () => {
|
|
71
|
+
it("materializes entity metadata once instead of joining dynamic entity views per page", () => {
|
|
72
|
+
const database = new DatabaseSync(":memory:");
|
|
73
|
+
databases.push(database);
|
|
74
|
+
database.exec(`
|
|
75
|
+
CREATE TABLE zaip_vw_cost_monitor_group_daily_cache (
|
|
76
|
+
day TEXT, group_kind TEXT, group_value TEXT,
|
|
77
|
+
invocation_count INTEGER, llm_call_count INTEGER, total_duration REAL,
|
|
78
|
+
total_input_tokens REAL, total_cached_input_tokens REAL,
|
|
79
|
+
total_output_tokens REAL, total_reasoning_tokens REAL, total_tokens REAL,
|
|
80
|
+
total_cost_usd REAL, total_cost_brl REAL
|
|
81
|
+
);
|
|
82
|
+
INSERT INTO zaip_vw_cost_monitor_group_daily_cache VALUES
|
|
83
|
+
('2026-08-10', 'conversation', 'CONV-1', 1, 1, 1, 1, 0, 1, 0, 2, 0.1, 0.5),
|
|
84
|
+
('2026-08-10', 'task', 'TASK-1', 1, 1, 1, 1, 0, 1, 0, 2, 0.1, 0.5);
|
|
85
|
+
CREATE TABLE conversation_source (id TEXT PRIMARY KEY, status TEXT);
|
|
86
|
+
INSERT INTO conversation_source VALUES ('CONV-1', 'completed');
|
|
87
|
+
CREATE VIEW zaip_vw_conversations AS SELECT * FROM conversation_source;
|
|
88
|
+
CREATE TABLE task_source (id TEXT PRIMARY KEY, title TEXT, status TEXT, risk TEXT);
|
|
89
|
+
INSERT INTO task_source VALUES ('TASK-1', 'Task title', 'executing', 'high');
|
|
90
|
+
CREATE VIEW zaip_vw_tasks AS SELECT * FROM task_source;
|
|
91
|
+
CREATE VIEW zaip_vw_specs AS SELECT * FROM task_source WHERE 0;
|
|
92
|
+
CREATE VIEW zaip_vw_prds AS SELECT * FROM task_source WHERE 0;
|
|
93
|
+
CREATE VIEW zaip_vw_executions AS SELECT id, status FROM conversation_source WHERE 0;
|
|
94
|
+
`);
|
|
95
|
+
materializeCostGroupDailyProjection(database);
|
|
96
|
+
|
|
97
|
+
expect(
|
|
98
|
+
database
|
|
99
|
+
.prepare(
|
|
100
|
+
"SELECT group_kind, group_value, title, status, risk FROM cost_group_entity_projection ORDER BY group_kind",
|
|
101
|
+
)
|
|
102
|
+
.all(),
|
|
103
|
+
).toEqual([
|
|
104
|
+
{
|
|
105
|
+
group_kind: "conversation",
|
|
106
|
+
group_value: "CONV-1",
|
|
107
|
+
title: null,
|
|
108
|
+
status: "completed",
|
|
109
|
+
risk: null,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
group_kind: "task",
|
|
113
|
+
group_value: "TASK-1",
|
|
114
|
+
title: "Task title",
|
|
115
|
+
status: "executing",
|
|
116
|
+
risk: "high",
|
|
117
|
+
},
|
|
118
|
+
]);
|
|
119
|
+
expect(
|
|
120
|
+
database
|
|
121
|
+
.prepare(
|
|
122
|
+
"EXPLAIN QUERY PLAN SELECT status FROM cost_group_entity_projection WHERE group_kind='conversation' AND group_value='CONV-1'",
|
|
123
|
+
)
|
|
124
|
+
.all()
|
|
125
|
+
.map((row) => String((row as { detail: string }).detail)),
|
|
126
|
+
).toContain(
|
|
127
|
+
"SEARCH cost_group_entity_projection USING INDEX cost_group_entity_projection_lookup (group_kind=? AND group_value=?)",
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("matches the canonical grouped source for every persisted entity kind", () => {
|
|
132
|
+
const database = fixture();
|
|
133
|
+
const views: Array<[CostGroupKind, string]> = [
|
|
134
|
+
["execution", "cost_monitor_executions"],
|
|
135
|
+
["task", "cost_monitor_tasks"],
|
|
136
|
+
["conversation", "cost_monitor_conversations"],
|
|
137
|
+
["spec", "cost_monitor_specs"],
|
|
138
|
+
["prd", "cost_monitor_prds"],
|
|
139
|
+
];
|
|
140
|
+
for (const [kind, view] of views) {
|
|
141
|
+
const id = `${kind.toUpperCase()}-1`;
|
|
142
|
+
insertGroup(database, kind, id);
|
|
143
|
+
const physical = readCostGroupPage(database, view, kind, {
|
|
144
|
+
from: "2026-08-01",
|
|
145
|
+
to: "2026-08-26",
|
|
146
|
+
limit: 10,
|
|
147
|
+
});
|
|
148
|
+
const canonical = readCostGroupPage(database, view, kind, {
|
|
149
|
+
from: "2026-08-01",
|
|
150
|
+
to: "2026-08-26",
|
|
151
|
+
query: id,
|
|
152
|
+
limit: 10,
|
|
153
|
+
});
|
|
154
|
+
expect(physical.total_count).toBe(1);
|
|
155
|
+
expect(physical.rows).toEqual(canonical.rows);
|
|
156
|
+
expect(physical.totals).toEqual(canonical.totals);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("keeps complete totals and terminal export pages above 200 rows", () => {
|
|
161
|
+
const database = fixture();
|
|
162
|
+
for (let index = 0; index < 205; index += 1) {
|
|
163
|
+
insertGroup(database, "task", `TASK-${String(index).padStart(3, "0")}`);
|
|
164
|
+
}
|
|
165
|
+
const page = readCostGroupPage(database, "cost_monitor_tasks", "task", {
|
|
166
|
+
from: "2026-08-01",
|
|
167
|
+
to: "2026-08-26",
|
|
168
|
+
offset: 200,
|
|
169
|
+
limit: 200,
|
|
170
|
+
});
|
|
171
|
+
expect(page.total_count).toBe(205);
|
|
172
|
+
expect(page.rows).toHaveLength(5);
|
|
173
|
+
expect(page.has_more).toBe(false);
|
|
174
|
+
expect(page.totals).toMatchObject({ entity_count: 205, invocation_count: 410 });
|
|
175
|
+
});
|
|
176
|
+
});
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { type DateOnlyCostPageInput, isDateOnlyCostPage } from "./sqlite-cost-agent-page.js";
|
|
3
|
+
|
|
4
|
+
export type CostGroupKind = "task" | "spec" | "prd" | "execution" | "conversation";
|
|
5
|
+
|
|
6
|
+
type CostGroupPageInput = DateOnlyCostPageInput & {
|
|
7
|
+
offset?: number;
|
|
8
|
+
limit?: number;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const entityMetadata = {
|
|
12
|
+
task: { title: "entity.title", status: "entity.status", risk: "entity.risk" },
|
|
13
|
+
spec: { title: "entity.title", status: "entity.status", risk: "entity.risk" },
|
|
14
|
+
prd: { title: "entity.title", status: "entity.status", risk: "entity.risk" },
|
|
15
|
+
execution: {
|
|
16
|
+
title: "grouped.group_value",
|
|
17
|
+
status: "entity.status",
|
|
18
|
+
risk: "NULL",
|
|
19
|
+
},
|
|
20
|
+
conversation: {
|
|
21
|
+
title: "grouped.group_value",
|
|
22
|
+
status: "entity.status",
|
|
23
|
+
risk: "NULL",
|
|
24
|
+
},
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
/** Reads one exact grouped Cost page, preferring the immutable daily projection for date-only input. */
|
|
28
|
+
export function readCostGroupPage(
|
|
29
|
+
database: DatabaseSync,
|
|
30
|
+
view: string,
|
|
31
|
+
groupKind: CostGroupKind,
|
|
32
|
+
input: CostGroupPageInput,
|
|
33
|
+
) {
|
|
34
|
+
const metadata = entityMetadata[groupKind];
|
|
35
|
+
const clauses = ["group_kind = ?", "group_value IS NOT NULL"];
|
|
36
|
+
const values: Array<string | number> = [groupKind];
|
|
37
|
+
if (input.from) {
|
|
38
|
+
clauses.push("day >= ?");
|
|
39
|
+
values.push(input.from.slice(0, 10));
|
|
40
|
+
}
|
|
41
|
+
if (input.to) {
|
|
42
|
+
clauses.push("day <= ?");
|
|
43
|
+
values.push(input.to.slice(0, 10));
|
|
44
|
+
}
|
|
45
|
+
if (input.query) {
|
|
46
|
+
clauses.push("group_value LIKE ?");
|
|
47
|
+
values.push(`%${input.query}%`);
|
|
48
|
+
}
|
|
49
|
+
const where = clauses.join(" AND ");
|
|
50
|
+
const source = isDateOnlyCostPage(input)
|
|
51
|
+
? "cost_group_daily_projection"
|
|
52
|
+
: "cost_monitor_group_daily_cache";
|
|
53
|
+
const total_count = Number(
|
|
54
|
+
(
|
|
55
|
+
database
|
|
56
|
+
.prepare(`SELECT COUNT(DISTINCT group_value) AS count FROM ${source} WHERE ${where}`)
|
|
57
|
+
.get(...values) as { count: number }
|
|
58
|
+
).count,
|
|
59
|
+
);
|
|
60
|
+
// Totals precede LIMIT/OFFSET: a page is only a window into the selected population.
|
|
61
|
+
const totals = database
|
|
62
|
+
.prepare(
|
|
63
|
+
`SELECT COUNT(DISTINCT group_value) AS entity_count,
|
|
64
|
+
COALESCE(SUM(invocation_count), 0) AS invocation_count,
|
|
65
|
+
ROUND(SUM(total_duration)) AS total_duration,
|
|
66
|
+
SUM(total_tokens) AS total_tokens,
|
|
67
|
+
SUM(total_cost_usd) AS total_cost_usd,
|
|
68
|
+
SUM(total_cost_brl) AS total_cost_brl
|
|
69
|
+
FROM ${source}
|
|
70
|
+
WHERE ${where}`,
|
|
71
|
+
)
|
|
72
|
+
.get(...values) as Record<string, unknown>;
|
|
73
|
+
const limit = Math.min(200, Math.max(1, input.limit ?? 50));
|
|
74
|
+
const offset = Math.max(0, input.offset ?? 0);
|
|
75
|
+
const rows = database
|
|
76
|
+
.prepare(
|
|
77
|
+
`WITH grouped AS (
|
|
78
|
+
SELECT group_value, MIN(day) AS first_day, MAX(day) AS last_day,
|
|
79
|
+
SUM(invocation_count) AS invocation_count,
|
|
80
|
+
SUM(llm_call_count) AS llm_call_count,
|
|
81
|
+
SUM(total_duration) AS total_duration,
|
|
82
|
+
SUM(total_input_tokens) AS total_input_tokens,
|
|
83
|
+
SUM(total_cached_input_tokens) AS total_cached_input_tokens,
|
|
84
|
+
SUM(total_output_tokens) AS total_output_tokens,
|
|
85
|
+
SUM(total_reasoning_tokens) AS total_reasoning_tokens,
|
|
86
|
+
SUM(total_tokens) AS total_tokens,
|
|
87
|
+
SUM(total_cost_usd) AS total_cost_usd,
|
|
88
|
+
SUM(total_cost_brl) AS total_cost_brl
|
|
89
|
+
FROM ${source}
|
|
90
|
+
WHERE ${where}
|
|
91
|
+
GROUP BY group_value
|
|
92
|
+
)
|
|
93
|
+
SELECT grouped.group_value AS id, grouped.group_value AS key,
|
|
94
|
+
COALESCE(${metadata.title}, grouped.group_value) AS title,
|
|
95
|
+
${metadata.status} AS status, ${metadata.risk} AS risk,
|
|
96
|
+
grouped.first_day, grouped.last_day,
|
|
97
|
+
grouped.last_day || 'T12:00:00.000Z' AS occurred_at,
|
|
98
|
+
grouped.invocation_count, grouped.llm_call_count, grouped.total_duration,
|
|
99
|
+
grouped.total_input_tokens, grouped.total_cached_input_tokens,
|
|
100
|
+
grouped.total_output_tokens, grouped.total_reasoning_tokens,
|
|
101
|
+
grouped.total_tokens, grouped.total_cost_usd, grouped.total_cost_brl
|
|
102
|
+
FROM grouped
|
|
103
|
+
LEFT JOIN cost_group_entity_projection entity
|
|
104
|
+
ON entity.group_kind = ? AND entity.group_value = grouped.group_value
|
|
105
|
+
ORDER BY grouped.total_cost_brl DESC, grouped.group_value
|
|
106
|
+
LIMIT ? OFFSET ?`,
|
|
107
|
+
)
|
|
108
|
+
.all(...values, groupKind, limit, offset) as Array<Record<string, unknown>>;
|
|
109
|
+
return {
|
|
110
|
+
data_source: "sqlite_read_model" as const,
|
|
111
|
+
view,
|
|
112
|
+
offset,
|
|
113
|
+
limit,
|
|
114
|
+
total_count,
|
|
115
|
+
has_more: offset + rows.length < total_count,
|
|
116
|
+
totals,
|
|
117
|
+
rows,
|
|
118
|
+
};
|
|
119
|
+
}
|
package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
|
|
3
|
+
/** Freezes legacy Cost facts and their entity labels once for fast date-only pages. */
|
|
4
|
+
export function materializeCostGroupDailyProjection(database: DatabaseSync): void {
|
|
5
|
+
database.exec(`
|
|
6
|
+
CREATE TABLE cost_group_daily_projection AS SELECT * FROM zaip_vw_cost_monitor_group_daily_cache;
|
|
7
|
+
CREATE INDEX cost_group_daily_projection_lookup ON cost_group_daily_projection(group_kind, day, group_value);
|
|
8
|
+
|
|
9
|
+
-- The public entity views expand canonical records and activities. Reading
|
|
10
|
+
-- them for every grouped page was the remaining multi-second cost, most
|
|
11
|
+
-- visibly for conversations. Persist exactly the three presentation fields
|
|
12
|
+
-- the old LEFT JOIN supplied, keyed by the already-materialized population.
|
|
13
|
+
CREATE TABLE cost_group_entity_projection AS
|
|
14
|
+
SELECT 'task' AS group_kind, groups.group_value, entity.title, entity.status, entity.risk
|
|
15
|
+
FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
|
|
16
|
+
WHERE group_kind = 'task' AND group_value IS NOT NULL) groups
|
|
17
|
+
LEFT JOIN zaip_vw_tasks entity ON entity.id = groups.group_value
|
|
18
|
+
UNION ALL
|
|
19
|
+
SELECT 'spec', groups.group_value, entity.title, entity.status, entity.risk
|
|
20
|
+
FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
|
|
21
|
+
WHERE group_kind = 'spec' AND group_value IS NOT NULL) groups
|
|
22
|
+
LEFT JOIN zaip_vw_specs entity ON entity.id = groups.group_value
|
|
23
|
+
UNION ALL
|
|
24
|
+
SELECT 'prd', groups.group_value, entity.title, entity.status, entity.risk
|
|
25
|
+
FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
|
|
26
|
+
WHERE group_kind = 'prd' AND group_value IS NOT NULL) groups
|
|
27
|
+
LEFT JOIN zaip_vw_prds entity ON entity.id = groups.group_value
|
|
28
|
+
UNION ALL
|
|
29
|
+
SELECT 'execution', groups.group_value, NULL, entity.status, NULL
|
|
30
|
+
FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
|
|
31
|
+
WHERE group_kind = 'execution' AND group_value IS NOT NULL) groups
|
|
32
|
+
LEFT JOIN zaip_vw_executions entity ON entity.id = groups.group_value
|
|
33
|
+
UNION ALL
|
|
34
|
+
SELECT 'conversation', groups.group_value, NULL, entity.status, NULL
|
|
35
|
+
FROM (SELECT DISTINCT group_value FROM cost_group_daily_projection
|
|
36
|
+
WHERE group_kind = 'conversation' AND group_value IS NOT NULL) groups
|
|
37
|
+
LEFT JOIN zaip_vw_conversations entity ON entity.id = groups.group_value;
|
|
38
|
+
CREATE UNIQUE INDEX cost_group_entity_projection_lookup
|
|
39
|
+
ON cost_group_entity_projection(group_kind, group_value);
|
|
40
|
+
`);
|
|
41
|
+
}
|
package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-page.test.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { filterCostInvocationProjection } from "./sqlite-cost-invocation-page.js";
|
|
3
|
+
|
|
4
|
+
describe("cost invocation projection page", () => {
|
|
5
|
+
it("uses the Sao Paulo source day for the fast date-only page", () => {
|
|
6
|
+
const rows = [
|
|
7
|
+
{ agent_invocation_id: "before", source_started_at: "2026-08-01T02:30:00.000Z" },
|
|
8
|
+
{ agent_invocation_id: "inside", source_started_at: "2026-08-01T03:30:00.000Z" },
|
|
9
|
+
];
|
|
10
|
+
expect(
|
|
11
|
+
filterCostInvocationProjection(rows, { from: "2026-08-01", to: "2026-08-01" }).map(
|
|
12
|
+
(row) => row.agent_invocation_id,
|
|
13
|
+
),
|
|
14
|
+
).toEqual(["inside"]);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
type CostInvocationDateFilter = { from?: string | null; to?: string | null };
|
|
2
|
+
|
|
3
|
+
function costDay(value: string | null | undefined): string | null {
|
|
4
|
+
if (!value) return null;
|
|
5
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(value)) return value;
|
|
6
|
+
const date = new Date(value);
|
|
7
|
+
if (Number.isNaN(date.valueOf())) return null;
|
|
8
|
+
const values = new Intl.DateTimeFormat("en-CA", {
|
|
9
|
+
timeZone: "America/Sao_Paulo",
|
|
10
|
+
year: "numeric",
|
|
11
|
+
month: "2-digit",
|
|
12
|
+
day: "2-digit",
|
|
13
|
+
}).formatToParts(date);
|
|
14
|
+
return `${values.find((part) => part.type === "year")?.value}-${values.find((part) => part.type === "month")?.value}-${values.find((part) => part.type === "day")?.value}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Filters the rebuild-time invocation projection without expanding its costly view. */
|
|
18
|
+
export function filterCostInvocationProjection(
|
|
19
|
+
rows: Array<Record<string, unknown>>,
|
|
20
|
+
input: CostInvocationDateFilter,
|
|
21
|
+
) {
|
|
22
|
+
const from = costDay(input.from);
|
|
23
|
+
const to = costDay(input.to);
|
|
24
|
+
return rows.filter((row) => {
|
|
25
|
+
const timestamp = row.source_started_at ?? row.source_occurred_at ?? row.occurred_at;
|
|
26
|
+
const day = typeof timestamp === "string" ? costDay(timestamp) : null;
|
|
27
|
+
return day !== null && (from === null || day >= from) && (to === null || day <= to);
|
|
28
|
+
});
|
|
29
|
+
}
|