@zaip-ai/cli 2.2.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +23 -9
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/agent-adapters.js +25 -9
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-discovery.d.ts +27 -0
- package/dist/services/agent-discovery.d.ts.map +1 -0
- package/dist/services/agent-discovery.js +73 -0
- package/dist/services/agent-discovery.js.map +1 -0
- package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
- package/dist/services/codex-conversation-lifecycle-hook.js +153 -24
- package/dist/services/codex-conversation-lifecycle-hook.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 +146 -72
- 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 +3 -3
- package/dist/services/codex-subagent-hook-template.d.ts +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
- package/dist/services/codex-subagent-hook-template.js +117 -66
- package/dist/services/codex-subagent-hook-template.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +56 -6
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/logger.js +1 -1
- package/dist/services/logger.js.map +1 -1
- package/dist/services/logger.test.js +22 -1
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/runtime-template.test.js +129 -0
- package/dist/services/runtime-template.test.js.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/.env.example +9 -3
- package/templates/.agents/README-ENG.md +30 -5
- package/templates/.agents/README.md +30 -7
- package/templates/.agents/architecture/software-architecture.md +1 -59
- package/templates/.agents/branding/brandbook.md +3 -0
- package/templates/.agents/config/agents/catalog.yaml +22 -10
- package/templates/.agents/config/agents/discovery.json +319 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +11 -8
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +2 -2
- package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +2 -2
- package/templates/.agents/config/pricing/models.json +9 -5
- package/templates/.agents/config/project.yaml +12 -1
- package/templates/.agents/dashboard/.zaip-managed.json +375 -95
- package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-CGxeQak4.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DaSllaJp.js → DashboardHelpDialog-tzS7YxYB.js} +57 -33
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-DEbCi1gP.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-1L7Qw-Gq.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-EInWr641.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-t1Om0Abw.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-B6aZfo5f.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-TPUT2IUt.js → icons-vendor-DiGC-dsJ.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DgTmNHN5.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-Ct48XHGL.js → react-vendor-kPO6yNed.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-Bh1tDfsg.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DQpKX9c1.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +3 -1264
- package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +363 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +99 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +62 -6
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +3 -1
- package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +7 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -7
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +151 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +28 -153
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-app-shell.tsx +33 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +30 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +7 -1
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-retry.ts +17 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-setup-route.ts +29 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +66 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +3 -2
- package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +2 -2
- package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +48 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +29 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +68 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
- package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.test.ts +36 -0
- package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.ts +30 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +2 -5
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +30 -19
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +9 -1
- package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +77 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +397 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +782 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-snapshot-notice.tsx +49 -0
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperPanelSlot.tsx +16 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +459 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +27 -17
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +62 -186
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorRunDialog.tsx +20 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-hides-calls-that-have-no-collected.test.ts +80 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +455 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +18 -525
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +32 -508
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-export-sources.ts +74 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-actions.ts +19 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +49 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +115 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test-fixtures.ts +2 -0
- package/templates/.agents/dashboard/modules/operations/package.json +1 -1
- package/templates/.agents/dashboard/modules/operations/src/contracts.ts +4 -0
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTableBadges.tsx +34 -0
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +8 -38
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +243 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +27 -275
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +70 -247
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +171 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewPanels.tsx +64 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +4 -3
- package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +2 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +6 -2
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +6 -14
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +3 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +2 -0
- package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +32 -0
- 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/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1458 -1458
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1425 -1425
- package/templates/.agents/dashboard/packages/local-runtime/package.json +2 -1
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +7 -3
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1458 -1459
- package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +25 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +53 -8
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +79 -24
- package/templates/.agents/dashboard/packages/local-runtime/src/projection-refresh-diagnostics.ts +35 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +168 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-dual-reads-manifest-summaries-without-losing.test.ts +344 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-http-contracts.ts +31 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +345 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +461 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +78 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-route-context.ts +13 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +18 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +19 -3
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -21
- package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-view-allowlist.test.ts +25 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +64 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +2 -30
- package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +6 -23
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +2 -330
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +73 -1060
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-first-fold.ts +78 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +561 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +600 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +269 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-context.ts +32 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +244 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +292 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +547 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +360 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +169 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +475 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +132 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-timing.ts +299 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +692 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +739 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-does-not-convert-delayed-historical-finalizer.test.ts +706 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +748 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +710 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-marks-token-cost-telemetry-unavailable-when.test.ts +618 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +755 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuilds-disposable-snapshot-serves-zaip-records.test.ts +276 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +193 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-types.ts +123 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1 -2805
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +17 -6930
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +385 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +412 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +4 -3
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-build.mjs +195 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.test.mjs +2 -7
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-logging.mjs +35 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-navigation.mjs +114 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-paths.mjs +90 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +89 -418
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +22 -12
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -1
- package/templates/.agents/design/.zaip-managed.json +5 -5
- package/templates/.agents/design/DESIGN.md +2 -186
- package/templates/.agents/design/README.md +12 -2
- 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/strategy.md +3 -0
- package/templates/.agents/marketing/strategy.md +3 -0
- package/templates/.agents/requirements/autonomous-assurance.md +2 -1
- package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +1 -1
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +13 -4
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +1 -1
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +4 -2
- 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 +3 -3
- package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
- package/templates/.agents/rules/architecture.md +2 -0
- package/templates/.agents/rules/astra-diagnostic.md +1 -1
- package/templates/.agents/rules/autonomy-decision.md +3 -1
- package/templates/.agents/rules/cloud-hostinger-autonomy.md +2 -0
- package/templates/.agents/rules/context.md +2 -1
- package/templates/.agents/rules/core.md +3 -3
- package/templates/.agents/rules/design-system-central-contract.md +17 -0
- package/templates/.agents/rules/evolution.md +3 -1
- package/templates/.agents/rules/frontend-lite.md +3 -1
- package/templates/.agents/rules/local-sqlite-storage.md +2 -2
- package/templates/.agents/rules/meta-mcp.md +3 -1
- package/templates/.agents/rules/model-orchestration.md +1 -1
- package/templates/.agents/rules/run-lifecycle-closure.md +6 -4
- package/templates/.agents/rules/security.md +3 -1
- package/templates/.agents/rules/specialist-routing.md +3 -1
- package/templates/.agents/rules/text-writing-utf8.md +1 -1
- package/templates/.agents/rules/workflow.md +7 -5
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +519 -247
- 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 +1 -1
- package/templates/.agents/sales/playbook.md +3 -0
- package/templates/.agents/skills/zaip-aios/SKILL.md +5 -3
- package/templates/.agents/skills/zaip-skill-adapt-stack/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-api-contracts/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-api-contracts/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-application-observability/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-application-observability/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-application-observability/references/signal-design.md +3 -0
- package/templates/.agents/skills/zaip-skill-application-readiness/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-application-readiness/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-application-readiness/references/evidence-matrix.md +3 -0
- package/templates/.agents/skills/zaip-skill-architecture-design/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-architecture-design/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-async-jobs/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-async-jobs/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/references/data-access-paths.md +9 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/references/worker-scenario.md +5 -0
- package/templates/.agents/skills/zaip-skill-auth-tenancy/scripts/worker-contract.test.mjs +27 -0
- package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-author-skills/references/engineering-skill-index.md +9 -0
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +5 -3
- package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
- package/templates/.agents/skills/zaip-skill-backend/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-backend/references/deployment-environments.md +75 -0
- package/templates/.agents/skills/zaip-skill-backend/references/supabase-migration-contract.md +23 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-cache-strategy/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-cache-strategy/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-cloud-engineering/SKILL.md +7 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/SKILL.md +37 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workers-static-assets.md +26 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workflow-templates.md +71 -0
- package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/scripts/cloudflare-github-deploy-contract.test.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-config/SKILL.md +21 -11
- package/templates/.agents/skills/zaip-skill-config/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-container-runtime/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-container-runtime/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-context/SKILL.md +6 -1
- package/templates/.agents/skills/zaip-skill-context/references/prd-spec-task-handoff.md +10 -0
- package/templates/.agents/skills/zaip-skill-context/references/rule-selection.md +20 -0
- package/templates/.agents/skills/zaip-skill-cqrs/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/SKILL.md +18 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/references/audit-contract.md +94 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.mjs +185 -0
- package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.test.mjs +101 -0
- package/templates/.agents/skills/zaip-skill-data-modeling/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-data-modeling/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/SKILL.md +20 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/references/manual-mode.md +15 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/references/promotion-example.md +5 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.mjs +145 -0
- package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.test.mjs +178 -0
- package/templates/.agents/skills/zaip-skill-dependency-upgrade/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-dependency-upgrade/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-deployment-pipeline/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-deployment-pipeline/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-deployment-pipeline/references/runtime-shapes.md +3 -0
- package/templates/.agents/skills/zaip-skill-design-system/SKILL.md +20 -9
- package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-dev-environment/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-dev-environment/references/inventory-contract.md +7 -0
- package/templates/.agents/skills/zaip-skill-dev-environment/scripts/inventory.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-disaster-recovery/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-disaster-recovery/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-disaster-recovery/references/recovery-scope.md +3 -0
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +7 -0
- package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +1 -5
- package/templates/.agents/skills/zaip-skill-external-integrations/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-external-integrations/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -0
- package/templates/.agents/skills/zaip-skill-frontend-componentization/SKILL.md +44 -0
- package/templates/.agents/skills/zaip-skill-frontend-componentization/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-frontend-data-flows/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-frontend-data-flows/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/SKILL.md +36 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/cloudflare-pages.md +33 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/github.md +63 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/hostinger-vps.md +55 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/references/npm.md +30 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/check-skill.mjs +55 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs +61 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.test.mjs +128 -0
- package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-ssh.integration.test.mjs +106 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +43 -76
- package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +131 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/github-release-workflow-template.md +31 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-gate-matrix.md +24 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +44 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/references/release-notes.md +134 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +389 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +134 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +25 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness-api.test.mjs +134 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.mjs +98 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.test.mjs +25 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.mjs +159 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.test.mjs +160 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +149 -12
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +64 -5
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/release-notes-coverage.test.mjs +126 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.mjs +78 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.test.mjs +51 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs +184 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs +109 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +18 -10
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +3 -4
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/aws-cli-terraform.md +62 -0
- package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/guia-iniciante-hostinger-vps.md +183 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/references/scaffold-contract.md +9 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/helpers.test.mjs +121 -0
- package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs +169 -0
- package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-performance-engineering/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-performance-engineering/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-prd/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +1 -0
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +26 -9
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +39 -13
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +1 -0
- package/templates/.agents/skills/zaip-skill-refactor-landing-page/SKILL.md +66 -0
- package/templates/.agents/skills/zaip-skill-refactor-landing-page/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-refactor-landing-page/references/behavioral-dry-run.md +23 -0
- package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +40 -1
- package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +98 -0
- package/templates/.agents/skills/zaip-skill-review/SKILL.md +1 -0
- package/templates/.agents/skills/zaip-skill-rules/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +2 -0
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +19 -21
- package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-spec/SKILL.md +3 -2
- package/templates/.agents/skills/zaip-skill-storage-uploads/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-storage-uploads/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-systematic-debugging/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-systematic-debugging/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-task/SKILL.md +16 -7
- package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +25 -0
- package/templates/.agents/skills/zaip-skill-test-data/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-test-data/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-test-data/scripts/generate.mjs +72 -0
- package/templates/.agents/skills/zaip-skill-testing-strategy/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-testing-strategy/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-testing-strategy/references/example-map.md +3 -0
- package/templates/.agents/skills/zaip-skill-website-readiness/SKILL.md +8 -0
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/10-seguranca.md +2 -1
- package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +5 -3
- package/templates/scripts/validate-cloud-hostinger-contract.mjs +34 -0
- package/templates/template-manifest.json +955 -211
- package/templates/.agents/branding/.gitkeep +0 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-snUCQYTC.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-BPtVUGgs.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-GgzpZ_PY.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BCvZFMEf.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +0 -68
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-_MEktQNM.js +0 -2
- package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BDe4_Ubl.js +0 -1
- package/templates/.agents/growth/.gitkeep +0 -0
- package/templates/.agents/marketing/.gitkeep +0 -0
- package/templates/.agents/sales/.gitkeep +0 -0
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
import { developerArtifactCountsCte } from "./sqlite-artifact-counts.js";
|
|
2
|
+
import type { SqliteQueryContext } from "./sqlite-query-context.js";
|
|
3
|
+
import {
|
|
4
|
+
costMonitorFilterDay,
|
|
5
|
+
saoPauloDay,
|
|
6
|
+
sumKnownDeveloperMetric,
|
|
7
|
+
} from "./sqlite-read-model-canonical.js";
|
|
8
|
+
import type { SqliteReadModelFileSystem } from "./sqlite-read-model-filesystem.js";
|
|
9
|
+
export function queryInvocationTotals(
|
|
10
|
+
context: SqliteQueryContext,
|
|
11
|
+
filter: { from: string | null; to: string | null },
|
|
12
|
+
): {
|
|
13
|
+
invocation_count: number;
|
|
14
|
+
llm_call_count: number | null;
|
|
15
|
+
total_tokens: number | null;
|
|
16
|
+
cost_usd: number | null;
|
|
17
|
+
cost_brl: number | null;
|
|
18
|
+
} {
|
|
19
|
+
const from = filter.from?.slice(0, 10) ?? null;
|
|
20
|
+
const to = filter.to?.slice(0, 10) ?? null;
|
|
21
|
+
const row = context.database
|
|
22
|
+
.prepare(
|
|
23
|
+
"SELECT COUNT(*) AS invocation_count, SUM(llm_call_count) AS llm_call_count, SUM(total_tokens) AS total_tokens, SUM(cost_usd) AS cost_usd, SUM(cost_brl) AS cost_brl FROM invocations WHERE (? IS NULL OR occurred_day_sp >= ?) AND (? IS NULL OR occurred_day_sp <= ?)",
|
|
24
|
+
)
|
|
25
|
+
.get(from, from, to, to) as {
|
|
26
|
+
invocation_count: number;
|
|
27
|
+
llm_call_count: number | null;
|
|
28
|
+
total_tokens: number | null;
|
|
29
|
+
cost_usd: number | null;
|
|
30
|
+
cost_brl: number | null;
|
|
31
|
+
};
|
|
32
|
+
return row;
|
|
33
|
+
}
|
|
34
|
+
export function queryInvocationCostRows(
|
|
35
|
+
context: SqliteQueryContext,
|
|
36
|
+
filter: {
|
|
37
|
+
from: string | null;
|
|
38
|
+
to: string | null;
|
|
39
|
+
providers?: readonly string[];
|
|
40
|
+
models?: readonly string[];
|
|
41
|
+
agents?: readonly string[];
|
|
42
|
+
phases?: readonly string[];
|
|
43
|
+
statuses?: readonly string[];
|
|
44
|
+
tasks?: readonly string[];
|
|
45
|
+
specs?: readonly string[];
|
|
46
|
+
prds?: readonly string[];
|
|
47
|
+
executions?: readonly string[];
|
|
48
|
+
changes?: readonly string[];
|
|
49
|
+
},
|
|
50
|
+
) {
|
|
51
|
+
const from = filter.from?.slice(0, 10) ?? null;
|
|
52
|
+
const to = filter.to?.slice(0, 10) ?? null;
|
|
53
|
+
// Financial periods are source-session periods when available. This keeps
|
|
54
|
+
// a retrospective capture on its observed day rather than its write day.
|
|
55
|
+
const periodDay =
|
|
56
|
+
"date(COALESCE(i.source_started_at, i.source_occurred_at, i.occurred_at), '-3 hours')";
|
|
57
|
+
const clauses = [`(? IS NULL OR ${periodDay} >= ?)`, `(? IS NULL OR ${periodDay} <= ?)`];
|
|
58
|
+
const values: Array<string | number | null> = [from, from, to, to];
|
|
59
|
+
const add = (column: string, items?: readonly string[]) => {
|
|
60
|
+
if (items !== undefined && items.length > 0) {
|
|
61
|
+
clauses.push(`${column} IN (${items.map(() => "?").join(",")})`);
|
|
62
|
+
values.push(...items);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
add("i.zaip_agent", filter.agents);
|
|
66
|
+
add("i.phase", filter.phases);
|
|
67
|
+
add("i.status", filter.statuses);
|
|
68
|
+
add("i.task_id", filter.tasks);
|
|
69
|
+
add("i.spec_id", filter.specs);
|
|
70
|
+
add("i.prd_id", filter.prds);
|
|
71
|
+
add("i.execution_id", filter.executions);
|
|
72
|
+
add("i.change_id", filter.changes);
|
|
73
|
+
const providerValues = (filter.providers ?? []).filter((item) => item !== "unavailable");
|
|
74
|
+
const modelValues = (filter.models ?? []).filter((item) => item !== "unavailable");
|
|
75
|
+
const requestsUnavailable =
|
|
76
|
+
filter.providers?.includes("unavailable") === true ||
|
|
77
|
+
filter.models?.includes("unavailable") === true;
|
|
78
|
+
if (requestsUnavailable) {
|
|
79
|
+
// Keep the pre-existing explicit-unavailable behaviour; it describes a
|
|
80
|
+
// missing invocation attribute rather than a provider/model pair.
|
|
81
|
+
const dimension = (column: "provider" | "model", items?: readonly string[]) => {
|
|
82
|
+
if (items === undefined || items.length === 0) return;
|
|
83
|
+
const available = items.filter((item) => item !== "unavailable");
|
|
84
|
+
const wantsUnavailable = items.includes("unavailable");
|
|
85
|
+
const matches =
|
|
86
|
+
available.length === 0
|
|
87
|
+
? "0"
|
|
88
|
+
: `EXISTS (SELECT 1 FROM invocation_usage f WHERE f.agent_invocation_id = i.agent_invocation_id AND f.${column} IN (${available.map(() => "?").join(",")}))`;
|
|
89
|
+
if (available.length > 0) values.push(...available);
|
|
90
|
+
const missing = `NOT EXISTS (SELECT 1 FROM invocation_usage f WHERE f.agent_invocation_id = i.agent_invocation_id AND f.${column} IS NOT NULL AND f.${column} <> 'unavailable')`;
|
|
91
|
+
clauses.push(wantsUnavailable ? `(${matches} OR ${missing})` : matches);
|
|
92
|
+
};
|
|
93
|
+
dimension("provider", filter.providers);
|
|
94
|
+
dimension("model", filter.models);
|
|
95
|
+
} else if (providerValues.length > 0 || modelValues.length > 0) {
|
|
96
|
+
const segmentClauses: string[] = [];
|
|
97
|
+
if (providerValues.length > 0) {
|
|
98
|
+
segmentClauses.push(`f.provider IN (${providerValues.map(() => "?").join(",")})`);
|
|
99
|
+
values.push(...providerValues);
|
|
100
|
+
}
|
|
101
|
+
if (modelValues.length > 0) {
|
|
102
|
+
segmentClauses.push(`f.model IN (${modelValues.map(() => "?").join(",")})`);
|
|
103
|
+
values.push(...modelValues);
|
|
104
|
+
}
|
|
105
|
+
clauses.push(
|
|
106
|
+
`EXISTS (SELECT 1 FROM invocation_usage f WHERE f.agent_invocation_id = i.agent_invocation_id AND ${segmentClauses.join(" AND ")})`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
return context.database
|
|
110
|
+
.prepare(`SELECT i.*, CASE COUNT(DISTINCT s.provider) WHEN 0 THEN NULL WHEN 1 THEN MIN(s.provider) ELSE 'mixed' END AS provider, CASE COUNT(DISTINCT s.model) WHEN 0 THEN NULL WHEN 1 THEN MIN(s.model) ELSE 'mixed' END AS model,
|
|
111
|
+
SUM(s.input_tokens) AS input_tokens, SUM(s.cached_input_tokens) AS cached_input_tokens,
|
|
112
|
+
SUM(s.output_tokens) AS output_tokens, SUM(s.reasoning_tokens) AS reasoning_tokens,
|
|
113
|
+
SUM(s.total_tokens) AS total_tokens, SUM(s.cost_usd) AS cost_usd, SUM(s.cost_brl) AS cost_brl
|
|
114
|
+
FROM invocations i LEFT JOIN invocation_usage s USING(agent_invocation_id)
|
|
115
|
+
WHERE ${clauses.join(" AND ")}
|
|
116
|
+
GROUP BY i.agent_invocation_id ORDER BY i.occurred_at`)
|
|
117
|
+
.all(...values) as Array<Record<string, unknown>>;
|
|
118
|
+
}
|
|
119
|
+
export function queryCostMonitorFactualDurationByDay(
|
|
120
|
+
context: SqliteQueryContext,
|
|
121
|
+
filter: Parameters<SqliteReadModelFileSystem["invocationCostRows"]>[0],
|
|
122
|
+
financialRows: readonly Record<string, unknown>[] = context.costMonitorFinancialActivityRows(
|
|
123
|
+
filter,
|
|
124
|
+
),
|
|
125
|
+
): Map<string, { known_sum: number; eligible_runs: number; known_runs: number }> {
|
|
126
|
+
const rows = financialRows;
|
|
127
|
+
const activityIds = new Set<string>();
|
|
128
|
+
const unavailableByDay = new Map<string, Set<string>>();
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
const timestamp =
|
|
131
|
+
typeof row.source_started_at === "string"
|
|
132
|
+
? row.source_started_at
|
|
133
|
+
: typeof row.source_occurred_at === "string"
|
|
134
|
+
? row.source_occurred_at
|
|
135
|
+
: typeof row.occurred_at === "string"
|
|
136
|
+
? row.occurred_at
|
|
137
|
+
: null;
|
|
138
|
+
if (timestamp === null) continue;
|
|
139
|
+
const hasFinancialFact =
|
|
140
|
+
typeof row.total_tokens === "number" ||
|
|
141
|
+
typeof row.cost_brl === "number" ||
|
|
142
|
+
typeof row.cost_usd === "number";
|
|
143
|
+
if (!hasFinancialFact) continue;
|
|
144
|
+
// SQLite exposes the durable activity key as an integer; normalize it
|
|
145
|
+
// before joining it to the JSON-backed temporal fact key.
|
|
146
|
+
const activityId =
|
|
147
|
+
typeof row.activity_row_id === "string" || typeof row.activity_row_id === "number"
|
|
148
|
+
? String(row.activity_row_id)
|
|
149
|
+
: String(row.run_id ?? timestamp);
|
|
150
|
+
activityIds.add(activityId);
|
|
151
|
+
}
|
|
152
|
+
const factsByDay = new Map<string, { known_sum: number; activityIds: Set<string> }>();
|
|
153
|
+
const knownActivityIds = new Set<string>();
|
|
154
|
+
// V3 persists read-model views with a public `zaip_vw_` prefix. Keep the
|
|
155
|
+
// prior unprefixed name for disposable pre-V3 generations so an active
|
|
156
|
+
// local session can be refreshed instead of failing its Cost Monitor.
|
|
157
|
+
const durationFactTable =
|
|
158
|
+
context.database
|
|
159
|
+
.prepare(
|
|
160
|
+
"SELECT 1 AS present FROM sqlite_master WHERE name = 'attributed_token_active_facts'",
|
|
161
|
+
)
|
|
162
|
+
.get() !== undefined
|
|
163
|
+
? "attributed_token_active_facts"
|
|
164
|
+
: "zaip_vw_attributed_token_active_facts";
|
|
165
|
+
const activityIdList = Array.from(activityIds);
|
|
166
|
+
for (let offset = 0; offset < activityIdList.length; offset += 900) {
|
|
167
|
+
const batch = activityIdList.slice(offset, offset + 900);
|
|
168
|
+
const facts = context.database
|
|
169
|
+
.prepare(
|
|
170
|
+
`SELECT activity_row_id, occurred_day_sp, attributed_token_active_ms
|
|
171
|
+
FROM ${durationFactTable}
|
|
172
|
+
WHERE activity_row_id IN (${batch.map(() => "?").join(",")})`,
|
|
173
|
+
)
|
|
174
|
+
.all(...batch) as Array<Record<string, unknown>>;
|
|
175
|
+
for (const fact of facts) {
|
|
176
|
+
const activityId = String(fact.activity_row_id);
|
|
177
|
+
const day = String(fact.occurred_day_sp);
|
|
178
|
+
const value = Number(fact.attributed_token_active_ms);
|
|
179
|
+
if (!Number.isFinite(value) || value < 0) continue;
|
|
180
|
+
const current = factsByDay.get(day) ?? { known_sum: 0, activityIds: new Set<string>() };
|
|
181
|
+
current.known_sum += value;
|
|
182
|
+
current.activityIds.add(activityId);
|
|
183
|
+
factsByDay.set(day, current);
|
|
184
|
+
knownActivityIds.add(activityId);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const row of rows) {
|
|
188
|
+
const activityId =
|
|
189
|
+
typeof row.activity_row_id === "string" || typeof row.activity_row_id === "number"
|
|
190
|
+
? String(row.activity_row_id)
|
|
191
|
+
: null;
|
|
192
|
+
if (activityId === null || knownActivityIds.has(activityId)) continue;
|
|
193
|
+
const timestamp =
|
|
194
|
+
typeof row.source_started_at === "string"
|
|
195
|
+
? row.source_started_at
|
|
196
|
+
: typeof row.source_occurred_at === "string"
|
|
197
|
+
? row.source_occurred_at
|
|
198
|
+
: typeof row.occurred_at === "string"
|
|
199
|
+
? row.occurred_at
|
|
200
|
+
: null;
|
|
201
|
+
if (timestamp === null) continue;
|
|
202
|
+
const day = saoPauloDay(timestamp);
|
|
203
|
+
const ids = unavailableByDay.get(day) ?? new Set<string>();
|
|
204
|
+
ids.add(activityId);
|
|
205
|
+
unavailableByDay.set(day, ids);
|
|
206
|
+
}
|
|
207
|
+
const byDay = new Map<string, { known_sum: number; eligible_runs: number; known_runs: number }>();
|
|
208
|
+
for (const day of new Set([...factsByDay.keys(), ...unavailableByDay.keys()])) {
|
|
209
|
+
const facts = factsByDay.get(day) ?? { known_sum: 0, activityIds: new Set<string>() };
|
|
210
|
+
const unavailableIds = unavailableByDay.get(day) ?? new Set<string>();
|
|
211
|
+
byDay.set(day, {
|
|
212
|
+
known_sum: facts.known_sum,
|
|
213
|
+
eligible_runs: new Set([...facts.activityIds, ...unavailableIds]).size,
|
|
214
|
+
known_runs: facts.activityIds.size,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return byDay;
|
|
218
|
+
}
|
|
219
|
+
export function queryActivityCostRows(
|
|
220
|
+
context: SqliteQueryContext,
|
|
221
|
+
filter: {
|
|
222
|
+
from: string | null;
|
|
223
|
+
to: string | null;
|
|
224
|
+
providers?: readonly string[];
|
|
225
|
+
models?: readonly string[];
|
|
226
|
+
agents?: readonly string[];
|
|
227
|
+
phases?: readonly string[];
|
|
228
|
+
statuses?: readonly string[];
|
|
229
|
+
tasks?: readonly string[];
|
|
230
|
+
specs?: readonly string[];
|
|
231
|
+
prds?: readonly string[];
|
|
232
|
+
executions?: readonly string[];
|
|
233
|
+
changes?: readonly string[];
|
|
234
|
+
},
|
|
235
|
+
) {
|
|
236
|
+
const from = filter.from?.slice(0, 10) ?? null;
|
|
237
|
+
const to = filter.to?.slice(0, 10) ?? null;
|
|
238
|
+
const clauses = [
|
|
239
|
+
"(? IS NULL OR i.occurred_day_sp >= ?)",
|
|
240
|
+
"(? IS NULL OR i.occurred_day_sp <= ?)",
|
|
241
|
+
];
|
|
242
|
+
const values: Array<string | number | null> = [from, from, to, to];
|
|
243
|
+
const add = (column: string, items?: readonly string[]) => {
|
|
244
|
+
if (items !== undefined && items.length > 0) {
|
|
245
|
+
clauses.push(`${column} IN (${items.map(() => "?").join(",")})`);
|
|
246
|
+
values.push(...items);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
add("i.zaip_agent", filter.agents);
|
|
250
|
+
add("i.provider", filter.providers);
|
|
251
|
+
add("i.model", filter.models);
|
|
252
|
+
add("i.phase", filter.phases);
|
|
253
|
+
add("i.status", filter.statuses);
|
|
254
|
+
add("i.task_id", filter.tasks);
|
|
255
|
+
add("i.spec_id", filter.specs);
|
|
256
|
+
add("i.prd_id", filter.prds);
|
|
257
|
+
add("i.execution_id", filter.executions);
|
|
258
|
+
add("i.change_id", filter.changes);
|
|
259
|
+
return context.database
|
|
260
|
+
.prepare(`SELECT i.*, i.activity_row_id AS agent_invocation_id,
|
|
261
|
+
i.parent_run_id AS parent_agent_invocation_id
|
|
262
|
+
FROM activities i WHERE ${clauses.join(" AND ")} ORDER BY i.occurred_at`)
|
|
263
|
+
.all(...values) as Array<Record<string, unknown>>;
|
|
264
|
+
}
|
|
265
|
+
export function queryCostMonitorFinancialActivityRows(
|
|
266
|
+
context: SqliteQueryContext,
|
|
267
|
+
filter: Parameters<SqliteReadModelFileSystem["activityCostRows"]>[0],
|
|
268
|
+
) {
|
|
269
|
+
// Activity capture day can differ from the observed source session day.
|
|
270
|
+
// Keep that source-session population in SQL: the previous implementation
|
|
271
|
+
// read every activity into JS and issued a usage lookup for each filtered
|
|
272
|
+
// Agent Run, making the Cost Monitor first fold scale with all history.
|
|
273
|
+
const { from, to, providers = [], models = [] } = filter;
|
|
274
|
+
const sourceFrom = costMonitorFilterDay(from);
|
|
275
|
+
const sourceTo = costMonitorFilterDay(to);
|
|
276
|
+
const sourceDay =
|
|
277
|
+
"date(COALESCE(a.source_started_at, a.source_occurred_at, a.occurred_at), '-3 hours')";
|
|
278
|
+
const clauses = [
|
|
279
|
+
"(a.total_tokens IS NOT NULL OR a.cost_brl IS NOT NULL OR a.cost_usd IS NOT NULL)",
|
|
280
|
+
`(? IS NULL OR ${sourceDay} >= ?)`,
|
|
281
|
+
`(? IS NULL OR ${sourceDay} <= ?)`,
|
|
282
|
+
];
|
|
283
|
+
const values: Array<string | number | null> = [sourceFrom, sourceFrom, sourceTo, sourceTo];
|
|
284
|
+
const add = (column: string, items?: readonly string[]) => {
|
|
285
|
+
if (items !== undefined && items.length > 0) {
|
|
286
|
+
clauses.push(`a.${column} IN (${items.map(() => "?").join(",")})`);
|
|
287
|
+
values.push(...items);
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
add("zaip_agent", filter.agents);
|
|
291
|
+
add("phase", filter.phases);
|
|
292
|
+
add("status", filter.statuses);
|
|
293
|
+
add("task_id", filter.tasks);
|
|
294
|
+
add("spec_id", filter.specs);
|
|
295
|
+
add("prd_id", filter.prds);
|
|
296
|
+
add("execution_id", filter.executions);
|
|
297
|
+
add("change_id", filter.changes);
|
|
298
|
+
if (providers.length > 0 || models.length > 0) {
|
|
299
|
+
const usageClauses: string[] = [];
|
|
300
|
+
if (providers.length > 0) {
|
|
301
|
+
usageClauses.push(
|
|
302
|
+
`COALESCE(u.provider, 'unavailable') IN (${providers.map(() => "?").join(",")})`,
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
if (models.length > 0) {
|
|
306
|
+
usageClauses.push(`COALESCE(u.model, 'unavailable') IN (${models.map(() => "?").join(",")})`);
|
|
307
|
+
}
|
|
308
|
+
const usageValues = [...providers, ...models];
|
|
309
|
+
const directClauses: string[] = [];
|
|
310
|
+
if (providers.length > 0)
|
|
311
|
+
directClauses.push(
|
|
312
|
+
`COALESCE(a.provider, 'unavailable') IN (${providers.map(() => "?").join(",")})`,
|
|
313
|
+
);
|
|
314
|
+
if (models.length > 0)
|
|
315
|
+
directClauses.push(
|
|
316
|
+
`COALESCE(a.model, 'unavailable') IN (${models.map(() => "?").join(",")})`,
|
|
317
|
+
);
|
|
318
|
+
// Rows without an Agent Invocation keep their activity dimensions;
|
|
319
|
+
// Agent rows retain the segment-level provider/model semantics.
|
|
320
|
+
clauses.push(
|
|
321
|
+
`((a.agent_run_id IS NULL AND ${directClauses.join(" AND ")}) OR ` +
|
|
322
|
+
`(a.agent_run_id IS NOT NULL AND EXISTS (SELECT 1 FROM invocation_usage u WHERE u.agent_invocation_id = a.agent_run_id AND ${usageClauses.join(" AND ")})))`,
|
|
323
|
+
);
|
|
324
|
+
values.push(...providers, ...models, ...usageValues);
|
|
325
|
+
}
|
|
326
|
+
// This is the sole fact-shaped input for the Cost Monitor first fold.
|
|
327
|
+
// Never select `a.*`: activities also carries large technical payload
|
|
328
|
+
// blobs, which made a compact summary deserialize the whole fact table.
|
|
329
|
+
// Detail screens use their dedicated, paginated SQLite views instead.
|
|
330
|
+
return context.database
|
|
331
|
+
.prepare(`SELECT
|
|
332
|
+
a.activity_row_id, a.agent_run_id, a.parent_run_id,
|
|
333
|
+
a.source_started_at, a.source_finished_at, a.source_occurred_at,
|
|
334
|
+
a.occurred_at, a.occurred_day_sp, a.run_id,
|
|
335
|
+
a.task_id, a.execution_id, a.spec_id, a.prd_id, a.change_id,
|
|
336
|
+
a.zaip_agent, a.provider, a.model, a.phase, a.status,
|
|
337
|
+
a.duration_ms, a.source_duration_ms, a.duration_provenance,
|
|
338
|
+
a.total_tokens, a.input_tokens, a.cached_input_tokens,
|
|
339
|
+
a.output_tokens, a.reasoning_tokens, a.cost_usd, a.cost_brl,
|
|
340
|
+
a.source_event_count,
|
|
341
|
+
a.activity_row_id AS agent_invocation_id,
|
|
342
|
+
a.parent_run_id AS parent_agent_invocation_id
|
|
343
|
+
FROM activities a WHERE ${clauses.join(" AND ")} ORDER BY a.occurred_at`)
|
|
344
|
+
.all(...values) as Array<Record<string, unknown>>;
|
|
345
|
+
}
|
|
346
|
+
export function queryDeveloperCostAggregate(
|
|
347
|
+
context: SqliteQueryContext,
|
|
348
|
+
filter: {
|
|
349
|
+
from: string | null;
|
|
350
|
+
to: string | null;
|
|
351
|
+
accountIds?: readonly string[];
|
|
352
|
+
},
|
|
353
|
+
) {
|
|
354
|
+
const from = costMonitorFilterDay(filter.from);
|
|
355
|
+
const to = costMonitorFilterDay(filter.to);
|
|
356
|
+
const clauses = [
|
|
357
|
+
"a.developer_account_id IS NOT NULL",
|
|
358
|
+
"(? IS NULL OR a.occurred_day_sp >= ?)",
|
|
359
|
+
"(? IS NULL OR a.occurred_day_sp <= ?)",
|
|
360
|
+
];
|
|
361
|
+
const values: Array<string | null> = [from, from, to, to];
|
|
362
|
+
if (filter.accountIds !== undefined && filter.accountIds.length > 0) {
|
|
363
|
+
clauses.push(`a.developer_account_id IN (${filter.accountIds.map(() => "?").join(",")})`);
|
|
364
|
+
values.push(...filter.accountIds);
|
|
365
|
+
}
|
|
366
|
+
const where = clauses.join(" AND ");
|
|
367
|
+
const rows = context.database
|
|
368
|
+
.prepare(`
|
|
369
|
+
WITH selected AS (SELECT * FROM zaip_vw_activities a WHERE ${where}), completed AS (
|
|
370
|
+
SELECT a.developer_account_id, COUNT(DISTINCT w.id) AS completed_task_count
|
|
371
|
+
FROM zaip_vw_canonical_work_items w JOIN selected a ON a.run_id=w.completed_run_id
|
|
372
|
+
WHERE w.entity_kind='task' AND w.status='completed' GROUP BY a.developer_account_id
|
|
373
|
+
) ${developerArtifactCountsCte()}
|
|
374
|
+
SELECT a.developer_account_id AS account_id, MAX(a.developer_login) AS login_snapshot,
|
|
375
|
+
CASE WHEN COUNT(DISTINCT a.developer_attribution_source)=1 THEN MAX(a.developer_attribution_source) ELSE 'mixed' END AS attribution_source,
|
|
376
|
+
COUNT(DISTINCT a.prd_id) AS prd_count, COUNT(DISTINCT a.spec_id) AS spec_count,
|
|
377
|
+
COUNT(DISTINCT a.task_id) AS task_count, COUNT(*) AS run_count,
|
|
378
|
+
COALESCE(artifacts.test_count, 0) AS test_count,
|
|
379
|
+
COALESCE(artifacts.evidence_count, 0) AS evidence_count,
|
|
380
|
+
SUM(a.attributed_token_active_ms) AS total_duration_ms,
|
|
381
|
+
COUNT(a.attributed_token_active_ms) AS duration_covered_runs,
|
|
382
|
+
SUM(a.source_event_count) AS source_event_count,
|
|
383
|
+
SUM(a.total_tokens) AS total_tokens, SUM(a.cost_usd) AS total_cost_usd, SUM(a.cost_brl) AS total_cost_brl,
|
|
384
|
+
COUNT(a.total_tokens) AS token_covered_runs, COUNT(a.cost_usd) AS usd_covered_runs, COUNT(a.cost_brl) AS brl_covered_runs,
|
|
385
|
+
COALESCE(completed.completed_task_count, 0) AS completed_task_count
|
|
386
|
+
FROM selected a
|
|
387
|
+
LEFT JOIN completed USING(developer_account_id)
|
|
388
|
+
LEFT JOIN artifacts USING(developer_account_id)
|
|
389
|
+
GROUP BY a.developer_account_id ORDER BY total_cost_brl DESC, account_id`)
|
|
390
|
+
.all(...values, from, from, to, to) as Array<Record<string, unknown>>;
|
|
391
|
+
// A delivery is factual only when the canonical Task points at the exact
|
|
392
|
+
// completed Run. Contributors are the distinct attributed GitHub accounts
|
|
393
|
+
// on that same Run; no timestamp, commit, or deployment inference enters.
|
|
394
|
+
const delivered = context.database
|
|
395
|
+
.prepare(`
|
|
396
|
+
WITH selected AS (SELECT * FROM zaip_vw_activities a WHERE ${where})
|
|
397
|
+
SELECT selected.developer_account_id AS delivered_by_account_id, w.id, w.title, w.status, w.completed_run_id,
|
|
398
|
+
GROUP_CONCAT(DISTINCT contributor.developer_account_id || char(31) || COALESCE(contributor.developer_login, '')) AS contributor_pairs
|
|
399
|
+
FROM zaip_vw_canonical_work_items w
|
|
400
|
+
JOIN selected ON selected.run_id=w.completed_run_id
|
|
401
|
+
LEFT JOIN zaip_vw_activities contributor ON contributor.task_id=w.id
|
|
402
|
+
AND contributor.developer_account_id IS NOT NULL
|
|
403
|
+
WHERE w.entity_kind='task' AND w.status='completed'
|
|
404
|
+
GROUP BY selected.developer_account_id, w.id, w.title, w.status, w.completed_run_id
|
|
405
|
+
ORDER BY w.id`)
|
|
406
|
+
.all(...values) as Array<Record<string, unknown>>;
|
|
407
|
+
const deliveriesByAccount = new Map<string, Array<Record<string, unknown>>>();
|
|
408
|
+
for (const task of delivered) {
|
|
409
|
+
const accountId = String(task.delivered_by_account_id);
|
|
410
|
+
const list = deliveriesByAccount.get(accountId) ?? [];
|
|
411
|
+
list.push({
|
|
412
|
+
id: task.id,
|
|
413
|
+
title: task.title,
|
|
414
|
+
status: task.status,
|
|
415
|
+
completed_run_id: task.completed_run_id,
|
|
416
|
+
delivered_by: { account_id: accountId },
|
|
417
|
+
contributors: String(task.contributor_pairs ?? "")
|
|
418
|
+
.split(",")
|
|
419
|
+
.filter(Boolean)
|
|
420
|
+
.map((pair) => {
|
|
421
|
+
const [account_id, login_snapshot] = pair.split(String.fromCharCode(31));
|
|
422
|
+
return { account_id, login_snapshot: login_snapshot || null };
|
|
423
|
+
}),
|
|
424
|
+
});
|
|
425
|
+
deliveriesByAccount.set(accountId, list);
|
|
426
|
+
}
|
|
427
|
+
const qualificationForSource: Record<
|
|
428
|
+
string,
|
|
429
|
+
"verified" | "cached_fallback" | "human_assigned" | "mixed"
|
|
430
|
+
> = {
|
|
431
|
+
verified_local_account: "verified",
|
|
432
|
+
cached_fallback: "cached_fallback",
|
|
433
|
+
human_assigned: "human_assigned",
|
|
434
|
+
mixed: "mixed",
|
|
435
|
+
};
|
|
436
|
+
for (const row of rows) {
|
|
437
|
+
row.completed_tasks = deliveriesByAccount.get(String(row.account_id)) ?? [];
|
|
438
|
+
row.qualification = qualificationForSource[String(row.attribution_source)] ?? "unqualified";
|
|
439
|
+
}
|
|
440
|
+
return {
|
|
441
|
+
data_source: "sqlite_read_model" as const,
|
|
442
|
+
filters: { from, to, account_ids: filter.accountIds ?? [] },
|
|
443
|
+
rows,
|
|
444
|
+
totals: {
|
|
445
|
+
run_count: rows.reduce((sum, row) => sum + Number(row.run_count ?? 0), 0),
|
|
446
|
+
completed_task_count: rows.reduce(
|
|
447
|
+
(sum, row) => sum + Number(row.completed_task_count ?? 0),
|
|
448
|
+
0,
|
|
449
|
+
),
|
|
450
|
+
total_cost_usd: sumKnownDeveloperMetric(rows, "total_cost_usd"),
|
|
451
|
+
total_cost_brl: sumKnownDeveloperMetric(rows, "total_cost_brl"),
|
|
452
|
+
},
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
export function queryOperationsDeveloperAggregate(
|
|
456
|
+
context: SqliteQueryContext,
|
|
457
|
+
filter: {
|
|
458
|
+
from: string | null;
|
|
459
|
+
to: string | null;
|
|
460
|
+
accountIds?: readonly string[];
|
|
461
|
+
},
|
|
462
|
+
) {
|
|
463
|
+
const from = costMonitorFilterDay(filter.from);
|
|
464
|
+
const to = costMonitorFilterDay(filter.to);
|
|
465
|
+
const clauses = [
|
|
466
|
+
"a.developer_account_id IS NOT NULL",
|
|
467
|
+
"(? IS NULL OR a.occurred_day_sp >= ?)",
|
|
468
|
+
"(? IS NULL OR a.occurred_day_sp <= ?)",
|
|
469
|
+
];
|
|
470
|
+
const values: Array<string | null> = [from, from, to, to];
|
|
471
|
+
if (filter.accountIds !== undefined && filter.accountIds.length > 0) {
|
|
472
|
+
clauses.push(`a.developer_account_id IN (${filter.accountIds.map(() => "?").join(",")})`);
|
|
473
|
+
values.push(...filter.accountIds);
|
|
474
|
+
}
|
|
475
|
+
const where = clauses.join(" AND ");
|
|
476
|
+
const rows = context.database
|
|
477
|
+
.prepare(`
|
|
478
|
+
WITH selected AS (SELECT * FROM zaip_vw_activities a WHERE ${where}),
|
|
479
|
+
developer_tasks AS (
|
|
480
|
+
SELECT DISTINCT developer_account_id AS account_id, task_id
|
|
481
|
+
FROM selected WHERE task_id IS NOT NULL
|
|
482
|
+
), canonical_task_facts AS (
|
|
483
|
+
SELECT developer_tasks.account_id, work.status, work.entity_kind, work.risk
|
|
484
|
+
FROM developer_tasks JOIN zaip_vw_canonical_work_items work
|
|
485
|
+
ON work.entity_kind='task' AND work.id=developer_tasks.task_id
|
|
486
|
+
), status_counts AS (
|
|
487
|
+
SELECT account_id, json_group_object(status, task_count) AS status_counts_json
|
|
488
|
+
FROM (SELECT account_id, status, COUNT(*) AS task_count FROM canonical_task_facts
|
|
489
|
+
WHERE status IS NOT NULL GROUP BY account_id, status) GROUP BY account_id
|
|
490
|
+
), type_counts AS (
|
|
491
|
+
SELECT account_id, json_group_object(entity_kind, task_count) AS type_counts_json
|
|
492
|
+
FROM (SELECT account_id, entity_kind, COUNT(*) AS task_count FROM canonical_task_facts
|
|
493
|
+
WHERE entity_kind IS NOT NULL GROUP BY account_id, entity_kind) GROUP BY account_id
|
|
494
|
+
), risk_counts AS (
|
|
495
|
+
SELECT account_id, json_group_object(risk, task_count) AS risk_counts_json
|
|
496
|
+
FROM (SELECT account_id, risk, COUNT(*) AS task_count FROM canonical_task_facts
|
|
497
|
+
WHERE risk IS NOT NULL GROUP BY account_id, risk) GROUP BY account_id
|
|
498
|
+
), completed AS (
|
|
499
|
+
SELECT account_id, COUNT(*) AS completed_task_count
|
|
500
|
+
FROM canonical_task_facts WHERE status='completed'
|
|
501
|
+
GROUP BY account_id
|
|
502
|
+
)
|
|
503
|
+
-- task_count is the distinct, observed Task-id population attributed
|
|
504
|
+
-- to this developer in the selected period. Canonical records do not
|
|
505
|
+
-- retain a creator identity, so this projection never infers one.
|
|
506
|
+
SELECT selected.developer_account_id AS account_id, MAX(selected.developer_login) AS login_snapshot,
|
|
507
|
+
COUNT(DISTINCT selected.task_id) AS task_count,
|
|
508
|
+
COALESCE(completed.completed_task_count, 0) AS completed_task_count,
|
|
509
|
+
SUM(selected.attributed_token_active_ms) AS total_duration_ms,
|
|
510
|
+
SUM(selected.total_tokens) AS total_tokens,
|
|
511
|
+
SUM(selected.cost_brl) AS total_cost_brl,
|
|
512
|
+
status_counts.status_counts_json, type_counts.type_counts_json, risk_counts.risk_counts_json
|
|
513
|
+
FROM selected
|
|
514
|
+
LEFT JOIN completed ON completed.account_id=selected.developer_account_id
|
|
515
|
+
LEFT JOIN status_counts ON status_counts.account_id=selected.developer_account_id
|
|
516
|
+
LEFT JOIN type_counts ON type_counts.account_id=selected.developer_account_id
|
|
517
|
+
LEFT JOIN risk_counts ON risk_counts.account_id=selected.developer_account_id
|
|
518
|
+
GROUP BY selected.developer_account_id
|
|
519
|
+
ORDER BY total_cost_brl DESC, account_id`)
|
|
520
|
+
.all(...values) as Array<Record<string, unknown>>;
|
|
521
|
+
const distribution = (value: unknown): Record<string, number> | null => {
|
|
522
|
+
if (typeof value !== "string") return null;
|
|
523
|
+
try {
|
|
524
|
+
const parsed = JSON.parse(value) as Record<string, unknown>;
|
|
525
|
+
return Object.fromEntries(
|
|
526
|
+
Object.entries(parsed).flatMap(([key, count]) =>
|
|
527
|
+
typeof count === "number" && Number.isFinite(count) ? [[key, count]] : [],
|
|
528
|
+
),
|
|
529
|
+
);
|
|
530
|
+
} catch {
|
|
531
|
+
return null;
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
for (const row of rows) {
|
|
535
|
+
row.status_counts = distribution(row.status_counts_json);
|
|
536
|
+
row.type_counts = distribution(row.type_counts_json);
|
|
537
|
+
row.risk_counts = distribution(row.risk_counts_json);
|
|
538
|
+
delete row.status_counts_json;
|
|
539
|
+
delete row.type_counts_json;
|
|
540
|
+
delete row.risk_counts_json;
|
|
541
|
+
}
|
|
542
|
+
return {
|
|
543
|
+
data_source: "sqlite_read_model" as const,
|
|
544
|
+
filters: { from, to, account_ids: filter.accountIds ?? [] },
|
|
545
|
+
rows,
|
|
546
|
+
};
|
|
547
|
+
}
|