@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,355 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { measureFirstFoldQuery } from "./sqlite-first-fold-timing.js";
|
|
3
|
+
import type {
|
|
4
|
+
SqliteFirstFoldAllTime,
|
|
5
|
+
SqliteFirstFoldAllTimeBoard,
|
|
6
|
+
SqliteFirstFoldMonthlyQuick,
|
|
7
|
+
SqliteFirstFoldViewport,
|
|
8
|
+
} from "./sqlite-read-model.js";
|
|
9
|
+
|
|
10
|
+
const number = (value: unknown, fallback = 0) => (typeof value === "number" ? value : fallback);
|
|
11
|
+
const nullableNumber = (value: unknown) => (typeof value === "number" ? value : null);
|
|
12
|
+
|
|
13
|
+
function persisted<T>(database: DatabaseSync, payloadType: string): T | null {
|
|
14
|
+
const row = database
|
|
15
|
+
.prepare(
|
|
16
|
+
"SELECT payload_json FROM zaip_aios_activities WHERE payload_type=? ORDER BY recorded_at DESC LIMIT 1",
|
|
17
|
+
)
|
|
18
|
+
.get(payloadType) as { payload_json?: string } | undefined;
|
|
19
|
+
if (typeof row?.payload_json !== "string") return null;
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(row.payload_json) as T;
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function readFirstFoldAllTime(
|
|
28
|
+
database: DatabaseSync,
|
|
29
|
+
dailyAggregateCount: () => number,
|
|
30
|
+
viewport?: SqliteFirstFoldViewport,
|
|
31
|
+
): SqliteFirstFoldAllTime {
|
|
32
|
+
const cached = persisted<SqliteFirstFoldAllTime>(database, "first_fold_all_time_cache");
|
|
33
|
+
if (cached !== null) return cached;
|
|
34
|
+
const timed = <T>(phase: string, action: () => T) => measureFirstFoldQuery(phase, action);
|
|
35
|
+
const row =
|
|
36
|
+
viewport === undefined
|
|
37
|
+
? (database.prepare("SELECT * FROM zaip_vw_first_fold_overview_all_time").get() as Record<
|
|
38
|
+
string,
|
|
39
|
+
unknown
|
|
40
|
+
>)
|
|
41
|
+
: null;
|
|
42
|
+
const statusRows =
|
|
43
|
+
viewport === undefined
|
|
44
|
+
? (database
|
|
45
|
+
.prepare("SELECT status, task_count FROM zaip_vw_first_fold_task_status_all_time")
|
|
46
|
+
.all() as Array<{ status: string; task_count: number }>)
|
|
47
|
+
: null;
|
|
48
|
+
const riskRows =
|
|
49
|
+
viewport === undefined
|
|
50
|
+
? (database
|
|
51
|
+
.prepare("SELECT risk, task_count FROM zaip_vw_first_fold_task_risk_all_time")
|
|
52
|
+
.all() as Array<{ risk: string; task_count: number }>)
|
|
53
|
+
: null;
|
|
54
|
+
const topTasks = timed(
|
|
55
|
+
"first_fold_all_time_top_tasks",
|
|
56
|
+
() =>
|
|
57
|
+
database
|
|
58
|
+
.prepare("SELECT * FROM zaip_vw_first_fold_top_tasks_all_time ORDER BY rank")
|
|
59
|
+
.all() as SqliteFirstFoldAllTime["top_tasks"],
|
|
60
|
+
);
|
|
61
|
+
const readMacroMetrics = (kind: "spec" | "prd") => {
|
|
62
|
+
const statuses = timed(
|
|
63
|
+
`first_fold_${kind}_status`,
|
|
64
|
+
() =>
|
|
65
|
+
database
|
|
66
|
+
.prepare(`SELECT stage, entity_count FROM zaip_vw_first_fold_${kind}_status_all_time`)
|
|
67
|
+
.all() as Array<{ stage: string; entity_count: number }>,
|
|
68
|
+
);
|
|
69
|
+
const classifications = timed(
|
|
70
|
+
`first_fold_${kind}_classification`,
|
|
71
|
+
() =>
|
|
72
|
+
database
|
|
73
|
+
.prepare(
|
|
74
|
+
`SELECT classification, entity_count FROM zaip_vw_first_fold_${kind}_classification_all_time`,
|
|
75
|
+
)
|
|
76
|
+
.all() as Array<{ classification: string; entity_count: number }>,
|
|
77
|
+
);
|
|
78
|
+
const macro = timed(
|
|
79
|
+
`first_fold_${kind}_metrics`,
|
|
80
|
+
() =>
|
|
81
|
+
database
|
|
82
|
+
.prepare(`SELECT * FROM zaip_vw_first_fold_${kind}_metrics_all_time`)
|
|
83
|
+
.get() as Record<string, unknown>,
|
|
84
|
+
);
|
|
85
|
+
const topEntities = timed(
|
|
86
|
+
`first_fold_${kind}_top_entities`,
|
|
87
|
+
() =>
|
|
88
|
+
database
|
|
89
|
+
.prepare(`SELECT * FROM zaip_vw_first_fold_top_${kind}s_all_time ORDER BY rank`)
|
|
90
|
+
.all() as SqliteFirstFoldAllTime["macro_metrics"]["specs"]["top_entities"],
|
|
91
|
+
);
|
|
92
|
+
return {
|
|
93
|
+
status_counts: Object.fromEntries(
|
|
94
|
+
statuses.map((status) => [status.stage, Number(status.entity_count)]),
|
|
95
|
+
),
|
|
96
|
+
classification_counts: Object.fromEntries(
|
|
97
|
+
classifications.map((item) => [item.classification, Number(item.entity_count)]),
|
|
98
|
+
),
|
|
99
|
+
entity_count: number(macro.entity_count),
|
|
100
|
+
total_run_count: number(macro.total_run_count),
|
|
101
|
+
total_duration_ms: nullableNumber(macro.total_duration_ms),
|
|
102
|
+
total_tokens: nullableNumber(macro.total_tokens),
|
|
103
|
+
total_cost_usd: nullableNumber(macro.total_cost_usd),
|
|
104
|
+
total_cost_brl: nullableNumber(macro.total_cost_brl),
|
|
105
|
+
average_duration_ms: nullableNumber(macro.average_duration_ms),
|
|
106
|
+
average_tokens: nullableNumber(macro.average_tokens),
|
|
107
|
+
average_cost_usd: nullableNumber(macro.average_cost_usd),
|
|
108
|
+
average_cost_brl: nullableNumber(macro.average_cost_brl),
|
|
109
|
+
latest_created_at:
|
|
110
|
+
typeof macro.latest_created_at === "string" ? macro.latest_created_at : null,
|
|
111
|
+
top_entities: topEntities,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
aggregate: viewport?.aggregate ?? {
|
|
116
|
+
days:
|
|
117
|
+
typeof row?.start_day === "string" && typeof row.end_day === "string"
|
|
118
|
+
? dailyAggregateCount()
|
|
119
|
+
: 0,
|
|
120
|
+
start_day: typeof row?.start_day === "string" ? row.start_day : null,
|
|
121
|
+
end_day: typeof row?.end_day === "string" ? row.end_day : null,
|
|
122
|
+
task_count: number(row?.task_count),
|
|
123
|
+
completed_task_count: number(row?.completed_task_count),
|
|
124
|
+
spec_count: number(row?.spec_count),
|
|
125
|
+
completed_spec_count: number(row?.completed_spec_count),
|
|
126
|
+
prd_count: number(row?.prd_count),
|
|
127
|
+
completed_prd_count: number(row?.completed_prd_count),
|
|
128
|
+
total_run_count: number(row?.total_run_count),
|
|
129
|
+
agent_invocation_count: number(row?.agent_invocation_count),
|
|
130
|
+
llm_call_count: nullableNumber(row?.llm_call_count),
|
|
131
|
+
duration_ms: nullableNumber(row?.total_duration_ms),
|
|
132
|
+
total_tokens: nullableNumber(row?.total_tokens),
|
|
133
|
+
total_cost_usd: nullableNumber(row?.total_cost_usd),
|
|
134
|
+
cost_brl: nullableNumber(row?.total_cost_brl),
|
|
135
|
+
execution_day_count: number(row?.execution_day_count),
|
|
136
|
+
latest_task_created_at:
|
|
137
|
+
typeof row?.latest_task_created_at === "string" ? row.latest_task_created_at : null,
|
|
138
|
+
},
|
|
139
|
+
task_status_counts:
|
|
140
|
+
viewport?.task_status_counts ??
|
|
141
|
+
Object.fromEntries(
|
|
142
|
+
statusRows?.map((status) => [status.status, Number(status.task_count)]) ?? [],
|
|
143
|
+
),
|
|
144
|
+
task_risk_counts:
|
|
145
|
+
viewport?.task_risk_counts ??
|
|
146
|
+
Object.fromEntries(riskRows?.map((risk) => [risk.risk, Number(risk.task_count)]) ?? []),
|
|
147
|
+
task_metrics: viewport
|
|
148
|
+
? {
|
|
149
|
+
average_duration_ms_per_task:
|
|
150
|
+
viewport.aggregate.task_count === 0 || viewport.aggregate.duration_ms === null
|
|
151
|
+
? null
|
|
152
|
+
: viewport.aggregate.duration_ms / viewport.aggregate.task_count,
|
|
153
|
+
average_tokens_per_task:
|
|
154
|
+
viewport.aggregate.task_count === 0 || viewport.aggregate.total_tokens === null
|
|
155
|
+
? null
|
|
156
|
+
: viewport.aggregate.total_tokens / viewport.aggregate.task_count,
|
|
157
|
+
average_cost_usd_per_task:
|
|
158
|
+
viewport.aggregate.task_count === 0 || viewport.aggregate.total_cost_usd === null
|
|
159
|
+
? null
|
|
160
|
+
: viewport.aggregate.total_cost_usd / viewport.aggregate.task_count,
|
|
161
|
+
average_cost_brl_per_task:
|
|
162
|
+
viewport.aggregate.task_count === 0 || viewport.aggregate.cost_brl === null
|
|
163
|
+
? null
|
|
164
|
+
: viewport.aggregate.cost_brl / viewport.aggregate.task_count,
|
|
165
|
+
latest_task_created_at: viewport.aggregate.latest_task_created_at,
|
|
166
|
+
}
|
|
167
|
+
: (() => {
|
|
168
|
+
const metrics = database
|
|
169
|
+
.prepare("SELECT * FROM zaip_vw_first_fold_task_metrics_all_time")
|
|
170
|
+
.get() as Record<string, unknown>;
|
|
171
|
+
return {
|
|
172
|
+
average_duration_ms_per_task: nullableNumber(metrics.average_duration_ms_per_task),
|
|
173
|
+
average_tokens_per_task: nullableNumber(metrics.average_tokens_per_task),
|
|
174
|
+
average_cost_usd_per_task: nullableNumber(metrics.average_cost_usd_per_task),
|
|
175
|
+
average_cost_brl_per_task: nullableNumber(metrics.average_cost_brl_per_task),
|
|
176
|
+
latest_task_created_at:
|
|
177
|
+
typeof metrics.latest_task_created_at === "string"
|
|
178
|
+
? metrics.latest_task_created_at
|
|
179
|
+
: null,
|
|
180
|
+
};
|
|
181
|
+
})(),
|
|
182
|
+
top_tasks: topTasks,
|
|
183
|
+
macro_metrics: { specs: readMacroMetrics("spec"), prds: readMacroMetrics("prd") },
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function readFirstFoldViewport(
|
|
188
|
+
database: DatabaseSync,
|
|
189
|
+
timings: Record<string, number>,
|
|
190
|
+
): SqliteFirstFoldViewport {
|
|
191
|
+
const cached = persisted<SqliteFirstFoldViewport>(database, "first_fold_viewport_cache");
|
|
192
|
+
if (cached !== null) return cached;
|
|
193
|
+
const startedAt = performance.now();
|
|
194
|
+
const row = database
|
|
195
|
+
.prepare(`WITH totals AS (
|
|
196
|
+
SELECT SUM(CASE WHEN activity_source_kind='agent_run' THEN 1 ELSE 0 END) AS agent_invocation_count,
|
|
197
|
+
SUM(llm_call_count) AS llm_call_count, SUM(total_tokens) AS total_tokens,
|
|
198
|
+
SUM(cost_usd) AS total_cost_usd, SUM(cost_brl) AS total_cost_brl FROM activities
|
|
199
|
+
), run_totals AS (SELECT COUNT(*) AS total_run_count FROM canonical_run_index),
|
|
200
|
+
duration_totals AS (
|
|
201
|
+
SELECT ROUND(SUM(attributed_token_active_ms)) AS total_duration_ms,
|
|
202
|
+
COUNT(DISTINCT occurred_day_sp) AS execution_day_count FROM attributed_token_active_facts
|
|
203
|
+
), bounds AS (
|
|
204
|
+
SELECT MIN(day) AS start_day, MAX(day) AS end_day, COUNT(*) AS day_count FROM (
|
|
205
|
+
SELECT occurred_day_sp AS day FROM activities UNION SELECT occurred_day_sp AS day FROM canonical_work_items
|
|
206
|
+
UNION SELECT occurred_day_sp AS day FROM canonical_artifacts)
|
|
207
|
+
), canonical_items AS MATERIALIZED (
|
|
208
|
+
SELECT json_extract(payload_json, '$.entity_kind') AS entity_kind,
|
|
209
|
+
json_extract(payload_json, '$.id') AS id, json_extract(payload_json, '$.status') AS status,
|
|
210
|
+
json_extract(payload_json, '$.risk') AS risk, json_extract(payload_json, '$.occurred_at') AS occurred_at
|
|
211
|
+
FROM zaip_aios_activities WHERE payload_type='work_item'
|
|
212
|
+
), items AS MATERIALIZED (
|
|
213
|
+
SELECT entity_kind, id, status, risk, occurred_at FROM canonical_items
|
|
214
|
+
UNION ALL SELECT 'task', a.task_id, MAX(a.work_item_status), MAX(a.risk), MIN(a.occurred_at)
|
|
215
|
+
FROM zaip_aios_activities a WHERE a.payload_type IS NULL AND a.task_id IS NOT NULL
|
|
216
|
+
AND NOT EXISTS (SELECT 1 FROM canonical_items c WHERE c.entity_kind='task' AND c.id=a.task_id) GROUP BY task_id
|
|
217
|
+
UNION ALL SELECT 'spec', a.spec_id, MAX(a.work_item_status), MAX(a.risk), MIN(a.occurred_at)
|
|
218
|
+
FROM zaip_aios_activities a WHERE a.payload_type IS NULL AND a.spec_id IS NOT NULL
|
|
219
|
+
AND NOT EXISTS (SELECT 1 FROM canonical_items c WHERE c.entity_kind='spec' AND c.id=a.spec_id) GROUP BY spec_id
|
|
220
|
+
UNION ALL SELECT 'prd', a.prd_id, MAX(a.work_item_status), MAX(a.risk), MIN(a.occurred_at)
|
|
221
|
+
FROM zaip_aios_activities a WHERE a.payload_type IS NULL AND a.prd_id IS NOT NULL
|
|
222
|
+
AND NOT EXISTS (SELECT 1 FROM canonical_items c WHERE c.entity_kind='prd' AND c.id=a.prd_id) GROUP BY prd_id
|
|
223
|
+
), item_totals AS (
|
|
224
|
+
SELECT SUM(entity_kind='task') AS task_count,
|
|
225
|
+
SUM(entity_kind='task' AND status='completed') AS completed_task_count,
|
|
226
|
+
MAX(CASE WHEN entity_kind='task' THEN occurred_at END) AS latest_task_created_at,
|
|
227
|
+
SUM(entity_kind='spec') AS spec_count, SUM(entity_kind='spec' AND status IN ('completed','delivered')) AS completed_spec_count,
|
|
228
|
+
SUM(entity_kind='prd') AS prd_count, SUM(entity_kind='prd' AND status IN ('completed','delivered')) AS completed_prd_count FROM items
|
|
229
|
+
), task_status AS (
|
|
230
|
+
SELECT json_group_object(status, task_count) AS task_status_json FROM (
|
|
231
|
+
SELECT COALESCE(status, 'draft') AS status, COUNT(*) AS task_count FROM items WHERE entity_kind='task' GROUP BY COALESCE(status, 'draft'))
|
|
232
|
+
), task_risk AS (
|
|
233
|
+
SELECT json_group_object(risk, task_count) AS task_risk_json FROM (
|
|
234
|
+
SELECT COALESCE(risk, 'standard') AS risk, COUNT(*) AS task_count FROM items WHERE entity_kind='task' GROUP BY COALESCE(risk, 'standard'))
|
|
235
|
+
)
|
|
236
|
+
SELECT totals.*, run_totals.*, duration_totals.*, bounds.*, item_totals.*, task_status.*, task_risk.*
|
|
237
|
+
FROM totals CROSS JOIN run_totals CROSS JOIN duration_totals CROSS JOIN bounds
|
|
238
|
+
CROSS JOIN item_totals CROSS JOIN task_status CROSS JOIN task_risk`)
|
|
239
|
+
.get() as Record<string, unknown>;
|
|
240
|
+
if (process.env.ZAIP_DASHBOARD_PROFILE_FIRST_FOLD === "1") {
|
|
241
|
+
timings.viewport_overview = Math.round((performance.now() - startedAt) * 10) / 10;
|
|
242
|
+
console.info(
|
|
243
|
+
JSON.stringify({
|
|
244
|
+
event: "dashboard_first_fold_select",
|
|
245
|
+
select: "viewport_overview",
|
|
246
|
+
elapsed_ms: timings.viewport_overview,
|
|
247
|
+
}),
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
aggregate: {
|
|
252
|
+
days: number(row.day_count),
|
|
253
|
+
start_day: typeof row.start_day === "string" ? row.start_day : null,
|
|
254
|
+
end_day: typeof row.end_day === "string" ? row.end_day : null,
|
|
255
|
+
task_count: number(row.task_count),
|
|
256
|
+
completed_task_count: number(row.completed_task_count),
|
|
257
|
+
spec_count: number(row.spec_count),
|
|
258
|
+
completed_spec_count: number(row.completed_spec_count),
|
|
259
|
+
prd_count: number(row.prd_count),
|
|
260
|
+
completed_prd_count: number(row.completed_prd_count),
|
|
261
|
+
total_run_count: number(row.total_run_count),
|
|
262
|
+
agent_invocation_count: number(row.agent_invocation_count),
|
|
263
|
+
llm_call_count: nullableNumber(row.llm_call_count),
|
|
264
|
+
duration_ms: nullableNumber(row.total_duration_ms),
|
|
265
|
+
total_tokens: nullableNumber(row.total_tokens),
|
|
266
|
+
total_cost_usd: nullableNumber(row.total_cost_usd),
|
|
267
|
+
cost_brl: nullableNumber(row.total_cost_brl),
|
|
268
|
+
execution_day_count: number(row.execution_day_count),
|
|
269
|
+
latest_task_created_at:
|
|
270
|
+
typeof row.latest_task_created_at === "string" ? row.latest_task_created_at : null,
|
|
271
|
+
},
|
|
272
|
+
task_status_counts:
|
|
273
|
+
typeof row.task_status_json === "string" ? JSON.parse(row.task_status_json) : {},
|
|
274
|
+
task_risk_counts: typeof row.task_risk_json === "string" ? JSON.parse(row.task_risk_json) : {},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export function readFirstFoldBoardAllTime(
|
|
279
|
+
database: DatabaseSync,
|
|
280
|
+
fallback: () => SqliteFirstFoldAllTimeBoard,
|
|
281
|
+
): SqliteFirstFoldAllTimeBoard {
|
|
282
|
+
return (
|
|
283
|
+
persisted<SqliteFirstFoldAllTimeBoard>(database, "first_fold_all_time_board_cache") ??
|
|
284
|
+
fallback()
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function readFirstFoldTopTasksAllTime(
|
|
289
|
+
database: DatabaseSync,
|
|
290
|
+
): SqliteFirstFoldAllTime["top_tasks"] {
|
|
291
|
+
return database
|
|
292
|
+
.prepare("SELECT * FROM zaip_vw_first_fold_top_tasks_all_time ORDER BY rank")
|
|
293
|
+
.all() as SqliteFirstFoldAllTime["top_tasks"];
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export function readFirstFoldMonthlyQuick(
|
|
297
|
+
database: DatabaseSync,
|
|
298
|
+
existing: SqliteFirstFoldMonthlyQuick | null | undefined,
|
|
299
|
+
filter: { from: string | null; to: string | null },
|
|
300
|
+
): { cache: SqliteFirstFoldMonthlyQuick | null; result: SqliteFirstFoldMonthlyQuick | null } {
|
|
301
|
+
let cache = existing;
|
|
302
|
+
if (cache === undefined) {
|
|
303
|
+
const candidate = persisted<Partial<SqliteFirstFoldMonthlyQuick>>(
|
|
304
|
+
database,
|
|
305
|
+
"first_fold_monthly_quick_cache",
|
|
306
|
+
);
|
|
307
|
+
cache =
|
|
308
|
+
candidate !== null &&
|
|
309
|
+
typeof candidate.from_day === "string" &&
|
|
310
|
+
typeof candidate.to_day === "string" &&
|
|
311
|
+
candidate.aggregate !== undefined &&
|
|
312
|
+
candidate.pages !== undefined &&
|
|
313
|
+
Array.isArray(candidate.top_tasks)
|
|
314
|
+
? (candidate as SqliteFirstFoldMonthlyQuick)
|
|
315
|
+
: null;
|
|
316
|
+
}
|
|
317
|
+
if (cache === null) return { cache, result: null };
|
|
318
|
+
const from = filter.from?.slice(0, 10) ?? null;
|
|
319
|
+
const to = filter.to?.slice(0, 10) ?? null;
|
|
320
|
+
const exactRange = from === cache.from_day && to === cache.to_day;
|
|
321
|
+
const sameMonthLaterDay =
|
|
322
|
+
from === cache.from_day &&
|
|
323
|
+
to !== null &&
|
|
324
|
+
to > cache.to_day &&
|
|
325
|
+
to.slice(0, 7) === cache.from_day.slice(0, 7);
|
|
326
|
+
const noUncoveredFacts =
|
|
327
|
+
cache.source_latest_day === null || cache.source_latest_day <= cache.to_day;
|
|
328
|
+
if (exactRange || (sameMonthLaterDay && noUncoveredFacts)) return { cache, result: cache };
|
|
329
|
+
const latestMonth =
|
|
330
|
+
cache.source_latest_day === null
|
|
331
|
+
? cache.from_day.slice(0, 7)
|
|
332
|
+
: cache.source_latest_day.slice(0, 7);
|
|
333
|
+
if (from === null || to === null || from.slice(0, 7) <= latestMonth)
|
|
334
|
+
return { cache, result: null };
|
|
335
|
+
return {
|
|
336
|
+
cache,
|
|
337
|
+
result: {
|
|
338
|
+
from_day: from,
|
|
339
|
+
to_day: to,
|
|
340
|
+
source_latest_day: cache.source_latest_day,
|
|
341
|
+
aggregate: {
|
|
342
|
+
days: 0,
|
|
343
|
+
total_run_count: 0,
|
|
344
|
+
agent_invocation_count: 0,
|
|
345
|
+
llm_call_count: null,
|
|
346
|
+
duration_ms: null,
|
|
347
|
+
total_tokens: null,
|
|
348
|
+
cost_brl: null,
|
|
349
|
+
execution_day_count: 0,
|
|
350
|
+
},
|
|
351
|
+
pages: { task: [], spec: [], prd: [] },
|
|
352
|
+
top_tasks: [],
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
}
|
package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { DatabaseSync } from "node:sqlite";
|
|
3
|
+
|
|
4
|
+
const technicalPayloads = [
|
|
5
|
+
["first_fold_viewport_cache", "first_fold_viewport_cache:all_time"],
|
|
6
|
+
["first_fold_all_time_cache", "first_fold_all_time_cache:all_time"],
|
|
7
|
+
["first_fold_all_time_board_cache", "first_fold_all_time_board_cache:all_time"],
|
|
8
|
+
["cost_monitor_summary_cache", "cost_monitor_summary_cache:all_time"],
|
|
9
|
+
["cost_monitor_summary_month_cache", "cost_monitor_summary_month_cache:current"],
|
|
10
|
+
["first_fold_monthly_quick_cache", "first_fold_monthly_quick_cache:default"],
|
|
11
|
+
] as const;
|
|
12
|
+
|
|
13
|
+
export type FirstFoldPayloads = Record<(typeof technicalPayloads)[number][0], string>;
|
|
14
|
+
|
|
15
|
+
type BoardPayload = { pages?: Record<string, unknown>; from_day?: unknown; to_day?: unknown };
|
|
16
|
+
|
|
17
|
+
function readPayload(database: DatabaseSync, payloadType: string): BoardPayload | null {
|
|
18
|
+
const row = database
|
|
19
|
+
.prepare(
|
|
20
|
+
"SELECT payload_json FROM zaip_aios_activities WHERE payload_type=? ORDER BY recorded_at DESC LIMIT 1",
|
|
21
|
+
)
|
|
22
|
+
.get(payloadType) as { payload_json?: string } | undefined;
|
|
23
|
+
if (typeof row?.payload_json !== "string") return null;
|
|
24
|
+
try {
|
|
25
|
+
const payload = JSON.parse(row.payload_json) as unknown;
|
|
26
|
+
return payload !== null && typeof payload === "object" ? (payload as BoardPayload) : null;
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function exactWorkPageCounts(database: DatabaseSync, from?: string, to?: string) {
|
|
33
|
+
// Technical payload rows are recorded when the snapshot is built, so the
|
|
34
|
+
// table-level occurred_day_sp describes the rebuild day. Monthly eligibility
|
|
35
|
+
// must use the canonical work item's own day persisted inside payload_json;
|
|
36
|
+
// otherwise every historical item appears to belong to the rebuild month and
|
|
37
|
+
// a complete immutable seed is rejected on every launcher start.
|
|
38
|
+
const canonicalDay = "json_extract(payload_json, '$.occurred_day_sp')";
|
|
39
|
+
const where = from && to ? ` AND ${canonicalDay} >= ? AND ${canonicalDay} <= ?` : "";
|
|
40
|
+
const rows = database
|
|
41
|
+
.prepare(
|
|
42
|
+
`SELECT json_extract(payload_json, '$.entity_kind') AS kind, COUNT(*) AS count
|
|
43
|
+
FROM zaip_aios_activities WHERE payload_type='work_item'${where} GROUP BY kind`,
|
|
44
|
+
)
|
|
45
|
+
.all(...(from && to ? [from, to] : [])) as Array<{ kind: string; count: number }>;
|
|
46
|
+
return Object.fromEntries(rows.map((row) => [row.kind, Number(row.count)]));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function matchesWorkPopulation(
|
|
50
|
+
database: DatabaseSync,
|
|
51
|
+
payload: BoardPayload,
|
|
52
|
+
monthly = false,
|
|
53
|
+
): boolean {
|
|
54
|
+
const from = typeof payload.from_day === "string" ? payload.from_day : undefined;
|
|
55
|
+
const to = typeof payload.to_day === "string" ? payload.to_day : undefined;
|
|
56
|
+
if (monthly && (!from || !to)) return false;
|
|
57
|
+
const expected = exactWorkPageCounts(
|
|
58
|
+
database,
|
|
59
|
+
monthly ? from : undefined,
|
|
60
|
+
monthly ? to : undefined,
|
|
61
|
+
);
|
|
62
|
+
return ["task", "spec", "prd"].every(
|
|
63
|
+
(kind) =>
|
|
64
|
+
Array.isArray(payload.pages?.[kind]) &&
|
|
65
|
+
payload.pages?.[kind].length === (expected[kind] ?? 0),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** A seed is eligible only after every first-fold payload has been committed. */
|
|
70
|
+
export function hasRequiredFirstFoldPayloads(database: DatabaseSync): boolean {
|
|
71
|
+
const count = Number(
|
|
72
|
+
(
|
|
73
|
+
database
|
|
74
|
+
.prepare(
|
|
75
|
+
`SELECT COUNT(DISTINCT payload_type) AS count FROM zaip_aios_activities
|
|
76
|
+
WHERE payload_type IN (${technicalPayloads.map(() => "?").join(", ")})`,
|
|
77
|
+
)
|
|
78
|
+
.get(...technicalPayloads.map(([payloadType]) => payloadType)) as { count?: number }
|
|
79
|
+
).count ?? 0,
|
|
80
|
+
);
|
|
81
|
+
if (count !== technicalPayloads.length) return false;
|
|
82
|
+
const allTime = readPayload(database, "first_fold_all_time_board_cache");
|
|
83
|
+
const monthly = readPayload(database, "first_fold_monthly_quick_cache");
|
|
84
|
+
return (
|
|
85
|
+
allTime !== null &&
|
|
86
|
+
monthly !== null &&
|
|
87
|
+
matchesWorkPopulation(database, allTime) &&
|
|
88
|
+
matchesWorkPopulation(database, monthly, true)
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function persistFirstFoldPayloads(
|
|
93
|
+
paths: readonly string[],
|
|
94
|
+
payloads: FirstFoldPayloads,
|
|
95
|
+
): void {
|
|
96
|
+
for (const path of paths) {
|
|
97
|
+
const database = new DatabaseSync(path);
|
|
98
|
+
try {
|
|
99
|
+
const insert = database.prepare(`INSERT INTO zaip_aios_activities(
|
|
100
|
+
activity_row_id, activity_source_kind, activity_key, source_path, source_hash,
|
|
101
|
+
recorded_at, run_role, root_run_id, payload_type, payload_json
|
|
102
|
+
) VALUES (?, 'technical_payload', ?, ?, '', datetime('now'), 'technical', 'technical', ?, ?)`);
|
|
103
|
+
database.exec("BEGIN;");
|
|
104
|
+
for (const [payloadType, key] of technicalPayloads) {
|
|
105
|
+
insert.run(
|
|
106
|
+
`TECH-${randomUUID().toLowerCase()}`,
|
|
107
|
+
key,
|
|
108
|
+
`sqlite://${payloadType}/${key.split(":")[1]}`,
|
|
109
|
+
payloadType,
|
|
110
|
+
payloads[payloadType],
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
database.exec("COMMIT;");
|
|
114
|
+
} catch (error) {
|
|
115
|
+
database.exec("ROLLBACK;");
|
|
116
|
+
throw error;
|
|
117
|
+
} finally {
|
|
118
|
+
database.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function measureFirstFold<T>(
|
|
2
|
+
enabled: boolean,
|
|
3
|
+
report: (phase: string, percent: number, detail: string) => void,
|
|
4
|
+
phase: string,
|
|
5
|
+
action: () => T,
|
|
6
|
+
): T {
|
|
7
|
+
const startedAt = performance.now();
|
|
8
|
+
const result = action();
|
|
9
|
+
if (enabled) {
|
|
10
|
+
const elapsedMs = Math.round(performance.now() - startedAt);
|
|
11
|
+
report(phase, 82, `${phase}: ${elapsedMs}ms.`);
|
|
12
|
+
process.stderr.write(
|
|
13
|
+
`${JSON.stringify({ event: "dashboard_sqlite_first_fold", phase, elapsed_ms: elapsedMs })}\n`,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function measureFirstFoldQuery<T>(phase: string, action: () => T): T {
|
|
20
|
+
const startedAt = performance.now();
|
|
21
|
+
const result = action();
|
|
22
|
+
if (process.env.ZAIP_DASHBOARD_LAUNCH_PROGRESS === "1")
|
|
23
|
+
process.stderr.write(
|
|
24
|
+
`${JSON.stringify({ event: "dashboard_sqlite_first_fold_query", phase, elapsed_ms: Math.round(performance.now() - startedAt) })}\n`,
|
|
25
|
+
);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
@@ -110,7 +110,14 @@ export const SQLITE_VIEW_CONTRACTS = [
|
|
|
110
110
|
],
|
|
111
111
|
["cost_monitor_zaip_agents", "cost-monitor", canonicalRunMetrics, "agent totals", "offset", xlsx],
|
|
112
112
|
["cost_monitor_models", "cost-monitor", canonicalRunMetrics, "model totals", "offset", xlsx],
|
|
113
|
-
[
|
|
113
|
+
[
|
|
114
|
+
"cost_monitor_providers",
|
|
115
|
+
"cost-monitor",
|
|
116
|
+
canonicalRunMetrics,
|
|
117
|
+
"provider totals",
|
|
118
|
+
"offset",
|
|
119
|
+
xlsx,
|
|
120
|
+
],
|
|
114
121
|
["cost_monitor_tasks", "cost-monitor", canonicalRunMetrics, "task totals", "offset", xlsx],
|
|
115
122
|
["cost_monitor_specs", "cost-monitor", canonicalRunMetrics, "SPEC totals", "offset", xlsx],
|
|
116
123
|
["cost_monitor_prds", "cost-monitor", canonicalRunMetrics, "PRD totals", "offset", xlsx],
|
|
@@ -171,7 +178,14 @@ export const SQLITE_VIEW_CONTRACTS = [
|
|
|
171
178
|
"offset",
|
|
172
179
|
xlsx,
|
|
173
180
|
],
|
|
174
|
-
[
|
|
181
|
+
[
|
|
182
|
+
"operations_daily",
|
|
183
|
+
"operations",
|
|
184
|
+
canonicalRunMetrics,
|
|
185
|
+
"daily operations totals",
|
|
186
|
+
"offset",
|
|
187
|
+
xlsx,
|
|
188
|
+
],
|
|
175
189
|
[
|
|
176
190
|
"operations_monthly",
|
|
177
191
|
"operations",
|
package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
|
|
3
|
+
/** Persists the exact canonical Board summary so runtime pages never re-expand its lineage CTE. */
|
|
4
|
+
export function materializeOperationsWorkProjection(database: DatabaseSync): void {
|
|
5
|
+
database.exec(`
|
|
6
|
+
CREATE TABLE operations_work_projection AS
|
|
7
|
+
SELECT summary.*, canonical.stage, canonical.spec_id,
|
|
8
|
+
COALESCE(canonical.change_id, (SELECT change.id FROM canonical_changes change, json_each(change.task_ids_json) task WHERE task.value=canonical.id ORDER BY change.created_at DESC, change.id DESC LIMIT 1)) AS change_id,
|
|
9
|
+
(SELECT change.source_type FROM canonical_changes change WHERE change.id=COALESCE(canonical.change_id, (SELECT fallback.id FROM canonical_changes fallback, json_each(fallback.task_ids_json) task WHERE task.value=canonical.id ORDER BY fallback.created_at DESC, fallback.id DESC LIMIT 1))) AS origin,
|
|
10
|
+
CASE WHEN canonical.entity_kind='task' THEN CASE WHEN canonical.spec_id IS NOT NULL OR COALESCE((SELECT change.source_type FROM canonical_changes change WHERE change.id=COALESCE(canonical.change_id, (SELECT fallback.id FROM canonical_changes fallback, json_each(fallback.task_ids_json) task WHERE task.value=canonical.id ORDER BY fallback.created_at DESC, fallback.id DESC LIMIT 1))) IN ('spec','prd'), 0) THEN 'task' ELSE 'standalone-task' END ELSE canonical.entity_kind END AS kind
|
|
11
|
+
FROM zaip_vw_operations_work_kanban summary
|
|
12
|
+
JOIN canonical_work_items canonical ON canonical.entity_kind=summary.entity_kind AND canonical.id=summary.id;
|
|
13
|
+
CREATE INDEX operations_work_projection_order ON operations_work_projection(occurred_at DESC, id DESC);
|
|
14
|
+
`);
|
|
15
|
+
}
|