@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
|
@@ -32,8 +32,6 @@ type DocumentDetail = {
|
|
|
32
32
|
export function AppOverlays({
|
|
33
33
|
costLocale,
|
|
34
34
|
documentDetail,
|
|
35
|
-
error,
|
|
36
|
-
failedArea,
|
|
37
35
|
helpOpen,
|
|
38
36
|
loadingArea,
|
|
39
37
|
operations,
|
|
@@ -46,7 +44,6 @@ export function AppOverlays({
|
|
|
46
44
|
closeDocument,
|
|
47
45
|
onCloseHelp,
|
|
48
46
|
onCloseTrace,
|
|
49
|
-
onDismissError,
|
|
50
47
|
onDismissReconciliation,
|
|
51
48
|
onOpenDocument,
|
|
52
49
|
onOpenTrace,
|
|
@@ -54,13 +51,10 @@ export function AppOverlays({
|
|
|
54
51
|
onOpenTraceMacro,
|
|
55
52
|
onRefreshCancel,
|
|
56
53
|
onRefreshFromDialog,
|
|
57
|
-
onRetry,
|
|
58
54
|
setTraceLink,
|
|
59
55
|
}: {
|
|
60
56
|
costLocale: CostLocale;
|
|
61
57
|
documentDetail: DocumentDetail | null;
|
|
62
|
-
error: string | null;
|
|
63
|
-
failedArea: LoadingArea | null;
|
|
64
58
|
helpOpen: boolean;
|
|
65
59
|
loadingArea: LoadingArea | null;
|
|
66
60
|
operations: OperationsProjection;
|
|
@@ -76,7 +70,6 @@ export function AppOverlays({
|
|
|
76
70
|
closeDocument: () => void;
|
|
77
71
|
onCloseHelp: () => void;
|
|
78
72
|
onCloseTrace: () => void;
|
|
79
|
-
onDismissError: () => void;
|
|
80
73
|
onDismissReconciliation: () => void;
|
|
81
74
|
onOpenDocument: (kind: "prd" | "spec", id: string) => void;
|
|
82
75
|
onOpenTrace: (taskId: string) => void;
|
|
@@ -84,24 +77,10 @@ export function AppOverlays({
|
|
|
84
77
|
onOpenTraceMacro: (label: "PRD" | "SPEC", id: string) => void;
|
|
85
78
|
onRefreshCancel: () => void;
|
|
86
79
|
onRefreshFromDialog: (reconcileOpenWork: boolean) => void;
|
|
87
|
-
onRetry: () => void;
|
|
88
80
|
setTraceLink: (value: null) => void;
|
|
89
81
|
}) {
|
|
90
82
|
return (
|
|
91
83
|
<>
|
|
92
|
-
{error ? (
|
|
93
|
-
<div aria-live="assertive" className="app-warning" role="alert">
|
|
94
|
-
<span>{error}</span>
|
|
95
|
-
{failedArea ? (
|
|
96
|
-
<button onClick={onRetry} type="button">
|
|
97
|
-
{costLocale === "pt-BR" ? "Tentar novamente" : "Try again"}
|
|
98
|
-
</button>
|
|
99
|
-
) : null}
|
|
100
|
-
<button onClick={onDismissError} type="button">
|
|
101
|
-
×
|
|
102
|
-
</button>
|
|
103
|
-
</div>
|
|
104
|
-
) : null}
|
|
105
84
|
{showTrace ? null : traceLoadingTaskId ? (
|
|
106
85
|
<TaskTraceLoadingPanel locale={costLocale} taskId={traceLoadingTaskId} />
|
|
107
86
|
) : trace ? (
|
|
@@ -35,6 +35,7 @@ type DashboardAlternateContentProps = {
|
|
|
35
35
|
onLoadingChange: (loading: boolean) => void;
|
|
36
36
|
onLocaleChange: (locale: CostLocale) => void;
|
|
37
37
|
onOpenTrace: (taskId: string) => void;
|
|
38
|
+
onLoadMoreTraceTasks: (loadAll?: boolean) => Promise<unknown>;
|
|
38
39
|
onRefresh: () => void;
|
|
39
40
|
onRetry: () => void;
|
|
40
41
|
onSelectTraceTask: (taskId: string) => void;
|
|
@@ -44,6 +45,8 @@ type DashboardAlternateContentProps = {
|
|
|
44
45
|
selectedTraceTaskId: string;
|
|
45
46
|
trace: TaskTrace | null;
|
|
46
47
|
traceLoadingTaskId: string | null;
|
|
48
|
+
traceTasksHasMore: boolean;
|
|
49
|
+
traceTasksLoading: boolean;
|
|
47
50
|
traceTasks: OperationsProjection["tasks"];
|
|
48
51
|
};
|
|
49
52
|
|
|
@@ -64,6 +67,7 @@ export function renderDashboardAlternateContent({
|
|
|
64
67
|
onLoadingChange,
|
|
65
68
|
onLocaleChange,
|
|
66
69
|
onOpenTrace,
|
|
70
|
+
onLoadMoreTraceTasks,
|
|
67
71
|
onRefresh,
|
|
68
72
|
onRetry,
|
|
69
73
|
onSelectTraceTask,
|
|
@@ -73,6 +77,8 @@ export function renderDashboardAlternateContent({
|
|
|
73
77
|
selectedTraceTaskId,
|
|
74
78
|
trace,
|
|
75
79
|
traceLoadingTaskId,
|
|
80
|
+
traceTasksHasMore,
|
|
81
|
+
traceTasksLoading,
|
|
76
82
|
traceTasks,
|
|
77
83
|
}: DashboardAlternateContentProps) {
|
|
78
84
|
if (dashboardView === "cost-monitor") {
|
|
@@ -112,17 +118,20 @@ export function renderDashboardAlternateContent({
|
|
|
112
118
|
if (dashboardView === "traceability") {
|
|
113
119
|
return () => (
|
|
114
120
|
<Suspense fallback={<LoadingPanel area="operations" locale={costLocale} />}>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
<TraceabilityWorkspace
|
|
122
|
+
loadingTaskId={traceLoadingTaskId}
|
|
123
|
+
locale={costLocale}
|
|
124
|
+
onOpenChange={onOpenTraceChange}
|
|
125
|
+
onOpenPrd={(prdId) => onOpenTraceMacro("PRD", prdId)}
|
|
126
|
+
onOpenSpec={(specId) => onOpenTraceMacro("SPEC", specId)}
|
|
127
|
+
onLoadMoreTasks={onLoadMoreTraceTasks}
|
|
128
|
+
onSelectTask={onSelectTraceTask}
|
|
129
|
+
selectedTaskId={selectedTraceTaskId}
|
|
130
|
+
tasks={traceTasks.length > 0 ? traceTasks : operations.tasks}
|
|
131
|
+
hasMoreTasks={traceTasksHasMore}
|
|
132
|
+
isLoadingTasks={traceTasksLoading}
|
|
133
|
+
trace={trace}
|
|
134
|
+
/>
|
|
126
135
|
</Suspense>
|
|
127
136
|
);
|
|
128
137
|
}
|
|
@@ -4,16 +4,16 @@ import type {
|
|
|
4
4
|
ProjectConfigSettings,
|
|
5
5
|
ProjectOverview,
|
|
6
6
|
} from "./dashboard-api.js";
|
|
7
|
+
import { StackComponentEditor, StackVersions } from "./ProjectStackEditor.js";
|
|
7
8
|
import {
|
|
8
9
|
buildProjectSettingsPayload,
|
|
9
10
|
defaultAutonomousExecution,
|
|
10
11
|
lineList,
|
|
11
12
|
projectSettingsDraft,
|
|
12
|
-
shortFrameworkVersion,
|
|
13
13
|
type StackComponentsDraft,
|
|
14
|
+
shortFrameworkVersion,
|
|
14
15
|
withDetectedStackVersions,
|
|
15
16
|
} from "./project-settings-model.js";
|
|
16
|
-
import { StackComponentEditor, StackVersions } from "./ProjectStackEditor.js";
|
|
17
17
|
import "./project-settings-page.css";
|
|
18
18
|
|
|
19
19
|
type Locale = "pt-BR" | "en-US";
|
|
@@ -22,7 +22,7 @@ const copy = {
|
|
|
22
22
|
eyebrow: "Configurações",
|
|
23
23
|
title: "Configuração do projeto",
|
|
24
24
|
intro: "Edite o arquivo central do projeto com validação do schema antes da gravação.",
|
|
25
|
-
loading: "Carregando
|
|
25
|
+
loading: "Carregando…",
|
|
26
26
|
back: "Voltar ao dashboard",
|
|
27
27
|
save: "Salvar configurações",
|
|
28
28
|
saving: "Validando e salvando…",
|
|
@@ -190,10 +190,15 @@ export function ProjectSettingsPage({
|
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
if (config === null) {
|
|
193
|
+
const isLoading = error === null;
|
|
193
194
|
return (
|
|
194
|
-
<main className="project-settings-state">
|
|
195
|
-
<div
|
|
196
|
-
|
|
195
|
+
<main aria-busy={isLoading} className="project-settings-state">
|
|
196
|
+
<div
|
|
197
|
+
aria-live={isLoading ? "polite" : "assertive"}
|
|
198
|
+
className="project-settings-state-card"
|
|
199
|
+
role={isLoading ? "status" : "alert"}
|
|
200
|
+
>
|
|
201
|
+
{isLoading ? <span aria-hidden="true" className="project-settings-loader" /> : null}
|
|
197
202
|
<p>{text.eyebrow}</p>
|
|
198
203
|
<h1>{error ?? text.loading}</h1>
|
|
199
204
|
<button onClick={onClose} type="button">
|
|
@@ -229,7 +234,9 @@ export function ProjectSettingsPage({
|
|
|
229
234
|
<div>
|
|
230
235
|
<h2>
|
|
231
236
|
{text.framework}
|
|
232
|
-
{shortFrameworkVersion(overview?.framework_version)
|
|
237
|
+
{shortFrameworkVersion(overview?.framework_version)
|
|
238
|
+
? ` - ${shortFrameworkVersion(overview?.framework_version)}`
|
|
239
|
+
: ""}
|
|
233
240
|
</h2>
|
|
234
241
|
<p>{text.frameworkHint}</p>
|
|
235
242
|
</div>
|
|
@@ -131,8 +131,10 @@ export function StackVersions({
|
|
|
131
131
|
<div>
|
|
132
132
|
{components.map((component) => (
|
|
133
133
|
<article key={component.name}>
|
|
134
|
-
<
|
|
135
|
-
|
|
134
|
+
<div className="project-stack-version-identity">
|
|
135
|
+
<strong>{component.name}</strong>
|
|
136
|
+
<code>{component.version ?? text.versionUnavailable}</code>
|
|
137
|
+
</div>
|
|
136
138
|
<span className={`is-${component.verification}`}>
|
|
137
139
|
{component.verification === "exact"
|
|
138
140
|
? text.exact
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { expect, test } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
test("opens every task from a preselected traceability combobox and preserves search and keyboard selection", async ({
|
|
4
|
+
page,
|
|
5
|
+
}) => {
|
|
6
|
+
const operations = page.waitForResponse(
|
|
7
|
+
(response) =>
|
|
8
|
+
response.status() === 200 &&
|
|
9
|
+
response.url().includes("/api/v2/operations") &&
|
|
10
|
+
response.url().includes("scope=quick"),
|
|
11
|
+
);
|
|
12
|
+
await page.goto("/?token=e2e-token");
|
|
13
|
+
await operations;
|
|
14
|
+
|
|
15
|
+
const traceabilityButton = page
|
|
16
|
+
.getByRole("navigation", { name: "Áreas do dashboard" })
|
|
17
|
+
.getByRole("button", { name: /Rastreabilidade/ });
|
|
18
|
+
await traceabilityButton.click();
|
|
19
|
+
await expect(traceabilityButton).toHaveAttribute("aria-current", "page");
|
|
20
|
+
|
|
21
|
+
const taskSelector = page.getByRole("combobox", { name: "Buscar task por nome ou ID" });
|
|
22
|
+
const taskOptions = page
|
|
23
|
+
.getByRole("listbox", { name: "Buscar task por nome ou ID" })
|
|
24
|
+
.getByRole("option");
|
|
25
|
+
const taskList = page.getByRole("listbox", { name: "Buscar task por nome ou ID" });
|
|
26
|
+
await expect(taskSelector).toBeVisible();
|
|
27
|
+
await expect(taskSelector).toHaveAttribute("aria-expanded", "false");
|
|
28
|
+
|
|
29
|
+
const selectedTitle = await taskSelector.inputValue();
|
|
30
|
+
await taskSelector.focus();
|
|
31
|
+
await expect(taskSelector).toHaveAttribute("aria-expanded", "true");
|
|
32
|
+
const initialTaskCount = await taskOptions.count();
|
|
33
|
+
expect(initialTaskCount).toBe(12);
|
|
34
|
+
await taskList.evaluate((element) => {
|
|
35
|
+
element.scrollTop = element.scrollHeight;
|
|
36
|
+
element.dispatchEvent(new Event("scroll", { bubbles: true }));
|
|
37
|
+
});
|
|
38
|
+
await expect.poll(() => taskOptions.count()).toBeGreaterThan(initialTaskCount);
|
|
39
|
+
|
|
40
|
+
await taskSelector.fill(selectedTitle);
|
|
41
|
+
await expect(taskOptions).toHaveCount(1);
|
|
42
|
+
|
|
43
|
+
await taskSelector.click();
|
|
44
|
+
await expect(taskOptions).toHaveCount(initialTaskCount);
|
|
45
|
+
const thirdOptionId = await taskOptions.nth(2).getAttribute("id");
|
|
46
|
+
await taskSelector.press("ArrowDown");
|
|
47
|
+
await taskSelector.press("ArrowDown");
|
|
48
|
+
const activeOptionId = await taskSelector.getAttribute("aria-activedescendant");
|
|
49
|
+
expect(activeOptionId).toBe(thirdOptionId);
|
|
50
|
+
const activeOption = page.locator(`[id="${activeOptionId}"]`);
|
|
51
|
+
const activeTitle = await activeOption.locator("strong").innerText();
|
|
52
|
+
|
|
53
|
+
await taskSelector.press("Enter");
|
|
54
|
+
await expect(taskSelector).toHaveAttribute("aria-expanded", "false");
|
|
55
|
+
await expect(taskSelector).toHaveValue(activeTitle);
|
|
56
|
+
});
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
filterTraceabilityTasks,
|
|
5
|
+
traceabilityTaskOptionId,
|
|
6
|
+
visibleTraceabilityTasks,
|
|
7
|
+
} from "./TraceabilityWorkspace.js";
|
|
4
8
|
|
|
5
9
|
describe("TraceabilityWorkspace task search", () => {
|
|
6
10
|
const tasks = [
|
|
@@ -9,11 +13,22 @@ describe("TraceabilityWorkspace task search", () => {
|
|
|
9
13
|
] as never[];
|
|
10
14
|
|
|
11
15
|
it("filters tasks by either title or ID", () => {
|
|
12
|
-
expect(filterTraceabilityTasks(tasks, "lançamento").map((task) => task.id)).toEqual([
|
|
16
|
+
expect(filterTraceabilityTasks(tasks, "lançamento").map((task) => task.id)).toEqual([
|
|
17
|
+
"TASK-ALPHA",
|
|
18
|
+
]);
|
|
13
19
|
expect(filterTraceabilityTasks(tasks, "beta").map((task) => task.id)).toEqual(["TASK-BETA"]);
|
|
14
20
|
expect(filterTraceabilityTasks(tasks, "missing")).toEqual([]);
|
|
15
21
|
});
|
|
16
22
|
|
|
23
|
+
it("shows every task when the selected combobox is opened", () => {
|
|
24
|
+
expect(
|
|
25
|
+
visibleTraceabilityTasks(tasks, "Preparar lançamento", true).map((task) => task.id),
|
|
26
|
+
).toEqual(["TASK-ALPHA", "TASK-BETA"]);
|
|
27
|
+
expect(
|
|
28
|
+
visibleTraceabilityTasks(tasks, "Preparar lançamento", false).map((task) => task.id),
|
|
29
|
+
).toEqual(["TASK-ALPHA"]);
|
|
30
|
+
});
|
|
31
|
+
|
|
17
32
|
it("keeps selection and keyboard interaction accessible", () => {
|
|
18
33
|
const source = readFileSync(new URL("TraceabilityWorkspace.tsx", import.meta.url), "utf8");
|
|
19
34
|
|
|
@@ -24,6 +39,10 @@ describe("TraceabilityWorkspace task search", () => {
|
|
|
24
39
|
expect(source).toContain('event.key === "Enter"');
|
|
25
40
|
expect(source).toContain('event.key === "ArrowDown"');
|
|
26
41
|
expect(source).toContain("setActiveIndex");
|
|
42
|
+
expect(source).toContain("onClick={() => openAllTasks()}");
|
|
43
|
+
expect(source).toContain("onFocus={() => openAllTasks()}");
|
|
44
|
+
expect(source).toContain("openAllTasks(false)");
|
|
45
|
+
expect(source).toContain("setShowAllTasks(true)");
|
|
27
46
|
expect(source).toContain("aria-activedescendant");
|
|
28
47
|
expect(source).toContain("traceabilityTaskOptionId(activeTaskId)");
|
|
29
48
|
expect(source).toContain('role="status"');
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { useEffect, useMemo, useState } from "react";
|
|
2
1
|
import type { OperationsProjection } from "@zaip-ai/dashboard-operations/contracts";
|
|
3
2
|
import type { TaskTrace } from "@zaip-ai/dashboard-traceability/contracts";
|
|
4
3
|
import { TaskTracePanel } from "@zaip-ai/dashboard-traceability/react";
|
|
4
|
+
import { useEffect, useMemo, useState } from "react";
|
|
5
|
+
import { nextTraceabilityVisibleCount } from "./traceability-task-pagination.js";
|
|
5
6
|
import "./traceability-workspace.css";
|
|
6
7
|
|
|
7
8
|
type TraceabilityTask = OperationsProjection["tasks"][number];
|
|
9
|
+
export const traceabilityTaskInitialBatchSize = 12;
|
|
8
10
|
|
|
9
11
|
export function filterTraceabilityTasks(
|
|
10
12
|
tasks: readonly TraceabilityTask[],
|
|
@@ -17,6 +19,14 @@ export function filterTraceabilityTasks(
|
|
|
17
19
|
);
|
|
18
20
|
}
|
|
19
21
|
|
|
22
|
+
export function visibleTraceabilityTasks(
|
|
23
|
+
tasks: readonly TraceabilityTask[],
|
|
24
|
+
query: string,
|
|
25
|
+
showAllTasks: boolean,
|
|
26
|
+
): TraceabilityTask[] {
|
|
27
|
+
return showAllTasks ? [...tasks] : filterTraceabilityTasks(tasks, query);
|
|
28
|
+
}
|
|
29
|
+
|
|
20
30
|
export function traceabilityTaskOptionId(taskId: string): string {
|
|
21
31
|
return `traceability-task-option-${taskId}`;
|
|
22
32
|
}
|
|
@@ -24,6 +34,9 @@ export function traceabilityTaskOptionId(taskId: string): string {
|
|
|
24
34
|
export function TraceabilityWorkspace({
|
|
25
35
|
locale,
|
|
26
36
|
loadingTaskId,
|
|
37
|
+
hasMoreTasks,
|
|
38
|
+
isLoadingTasks,
|
|
39
|
+
onLoadMoreTasks,
|
|
27
40
|
onSelectTask,
|
|
28
41
|
onOpenChange,
|
|
29
42
|
onOpenPrd,
|
|
@@ -34,6 +47,9 @@ export function TraceabilityWorkspace({
|
|
|
34
47
|
}: {
|
|
35
48
|
locale: "pt-BR" | "en-US";
|
|
36
49
|
loadingTaskId: string | null;
|
|
50
|
+
hasMoreTasks: boolean;
|
|
51
|
+
isLoadingTasks: boolean;
|
|
52
|
+
onLoadMoreTasks: (loadAll?: boolean) => Promise<unknown>;
|
|
37
53
|
onSelectTask: (taskId: string) => void;
|
|
38
54
|
onOpenChange: (changeId: string) => void;
|
|
39
55
|
onOpenPrd: (prdId: string) => void;
|
|
@@ -48,11 +64,15 @@ export function TraceabilityWorkspace({
|
|
|
48
64
|
const selectedTask = sortedTasks.find((task) => task.id === selectedTaskId);
|
|
49
65
|
const [query, setQuery] = useState(() => selectedTask?.title ?? selectedTaskId);
|
|
50
66
|
const [isListOpen, setIsListOpen] = useState(false);
|
|
67
|
+
const [showAllTasks, setShowAllTasks] = useState(false);
|
|
51
68
|
const [activeIndex, setActiveIndex] = useState(0);
|
|
69
|
+
const [visibleCount, setVisibleCount] = useState(traceabilityTaskInitialBatchSize);
|
|
52
70
|
const filteredTasks = useMemo(
|
|
53
|
-
() =>
|
|
54
|
-
[query, sortedTasks],
|
|
71
|
+
() => visibleTraceabilityTasks(sortedTasks, query, showAllTasks),
|
|
72
|
+
[query, showAllTasks, sortedTasks],
|
|
55
73
|
);
|
|
74
|
+
const visibleTasks = filteredTasks.slice(0, visibleCount);
|
|
75
|
+
const hasMoreVisibleTasks = visibleTasks.length < filteredTasks.length;
|
|
56
76
|
const searchInputId = "traceability-task-search";
|
|
57
77
|
const resultsId = "traceability-task-results";
|
|
58
78
|
const taskLabel = locale === "pt-BR" ? "Task selecionada" : "Selected task";
|
|
@@ -62,26 +82,48 @@ export function TraceabilityWorkspace({
|
|
|
62
82
|
|
|
63
83
|
useEffect(() => {
|
|
64
84
|
setQuery(selectedTask?.title ?? selectedTaskId);
|
|
65
|
-
}, [selectedTask?.title, selectedTaskId]);
|
|
66
|
-
|
|
67
|
-
useEffect(() => {
|
|
68
85
|
setActiveIndex(0);
|
|
69
|
-
}, [
|
|
86
|
+
}, [selectedTask?.title, selectedTaskId]);
|
|
70
87
|
|
|
71
88
|
const selectTask = (task: TraceabilityTask) => {
|
|
72
89
|
setQuery(task.title);
|
|
73
90
|
setIsListOpen(false);
|
|
91
|
+
setShowAllTasks(false);
|
|
74
92
|
onSelectTask(task.id);
|
|
75
93
|
};
|
|
76
94
|
|
|
95
|
+
const openAllTasks = (resetList = true) => {
|
|
96
|
+
setIsListOpen(true);
|
|
97
|
+
setShowAllTasks(true);
|
|
98
|
+
if (resetList) {
|
|
99
|
+
setActiveIndex(0);
|
|
100
|
+
setVisibleCount(traceabilityTaskInitialBatchSize);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const loadMoreTasks = (event: React.UIEvent<HTMLDivElement>) => {
|
|
105
|
+
const { clientHeight, scrollHeight, scrollTop } = event.currentTarget;
|
|
106
|
+
if (scrollTop + clientHeight < scrollHeight - 32) return;
|
|
107
|
+
if (hasMoreTasks) void onLoadMoreTasks();
|
|
108
|
+
if (visibleTasks.length < filteredTasks.length) {
|
|
109
|
+
setVisibleCount((current) =>
|
|
110
|
+
nextTraceabilityVisibleCount(
|
|
111
|
+
current,
|
|
112
|
+
filteredTasks.length,
|
|
113
|
+
traceabilityTaskInitialBatchSize,
|
|
114
|
+
),
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
77
119
|
const onSearchKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
|
|
78
120
|
if (event.key === "ArrowDown") {
|
|
79
121
|
event.preventDefault();
|
|
80
|
-
|
|
81
|
-
setActiveIndex((index) => Math.min(index + 1, Math.max(0,
|
|
122
|
+
openAllTasks(false);
|
|
123
|
+
setActiveIndex((index) => Math.min(index + 1, Math.max(0, sortedTasks.length - 1)));
|
|
82
124
|
} else if (event.key === "ArrowUp") {
|
|
83
125
|
event.preventDefault();
|
|
84
|
-
|
|
126
|
+
openAllTasks(false);
|
|
85
127
|
setActiveIndex((index) => Math.max(0, index - 1));
|
|
86
128
|
} else if (event.key === "Enter" && isListOpen) {
|
|
87
129
|
const task = filteredTasks[activeIndex];
|
|
@@ -109,19 +151,33 @@ export function TraceabilityWorkspace({
|
|
|
109
151
|
id={searchInputId}
|
|
110
152
|
onChange={(event) => {
|
|
111
153
|
setQuery(event.target.value);
|
|
154
|
+
setActiveIndex(0);
|
|
155
|
+
setShowAllTasks(false);
|
|
156
|
+
setVisibleCount(traceabilityTaskInitialBatchSize);
|
|
112
157
|
setIsListOpen(true);
|
|
158
|
+
// Do not turn a keystroke into a full repository walk. More
|
|
159
|
+
// candidates are acquired only by explicit list scrolling; a
|
|
160
|
+
// server-side search can be wired here when its bounded query
|
|
161
|
+
// contract is available.
|
|
113
162
|
}}
|
|
114
|
-
|
|
163
|
+
onClick={() => openAllTasks()}
|
|
164
|
+
onFocus={() => openAllTasks()}
|
|
115
165
|
onKeyDown={onSearchKeyDown}
|
|
116
166
|
role="combobox"
|
|
117
167
|
type="search"
|
|
118
168
|
value={query}
|
|
119
169
|
/>
|
|
120
170
|
{isListOpen ? (
|
|
121
|
-
<
|
|
171
|
+
<div
|
|
172
|
+
aria-label={searchLabel}
|
|
173
|
+
className="traceability-task-results"
|
|
174
|
+
id={resultsId}
|
|
175
|
+
onScroll={loadMoreTasks}
|
|
176
|
+
role="listbox"
|
|
177
|
+
>
|
|
122
178
|
{filteredTasks.length > 0 ? (
|
|
123
|
-
|
|
124
|
-
<
|
|
179
|
+
visibleTasks.map((task, index) => (
|
|
180
|
+
<div key={task.id} role="presentation">
|
|
125
181
|
<button
|
|
126
182
|
aria-selected={task.id === selectedTaskId}
|
|
127
183
|
className={index === activeIndex ? "is-active" : undefined}
|
|
@@ -131,16 +187,30 @@ export function TraceabilityWorkspace({
|
|
|
131
187
|
type="button"
|
|
132
188
|
>
|
|
133
189
|
<strong>{task.title}</strong>
|
|
134
|
-
<small>{task.id}</small>
|
|
135
190
|
</button>
|
|
136
|
-
</
|
|
191
|
+
</div>
|
|
137
192
|
))
|
|
138
193
|
) : (
|
|
139
|
-
<
|
|
194
|
+
<div className="traceability-task-no-results" role="status">
|
|
140
195
|
{locale === "pt-BR" ? "Nenhuma task encontrada." : "No tasks found."}
|
|
141
|
-
</
|
|
196
|
+
</div>
|
|
142
197
|
)}
|
|
143
|
-
</
|
|
198
|
+
</div>
|
|
199
|
+
) : null}
|
|
200
|
+
{isListOpen && filteredTasks.length > 0 ? (
|
|
201
|
+
<p aria-live="polite" className="traceability-task-pagination-status" role="status">
|
|
202
|
+
{isLoadingTasks
|
|
203
|
+
? locale === "pt-BR"
|
|
204
|
+
? "Carregando mais tasks…"
|
|
205
|
+
: "Loading more tasks…"
|
|
206
|
+
: hasMoreVisibleTasks || hasMoreTasks
|
|
207
|
+
? locale === "pt-BR"
|
|
208
|
+
? `${visibleTasks.length} de ${filteredTasks.length} tasks exibidas. Role para carregar mais.`
|
|
209
|
+
: `${visibleTasks.length} of ${filteredTasks.length} tasks shown. Scroll to load more.`
|
|
210
|
+
: locale === "pt-BR"
|
|
211
|
+
? `${filteredTasks.length} tasks exibidas. Fim da lista.`
|
|
212
|
+
: `${filteredTasks.length} tasks shown. End of list.`}
|
|
213
|
+
</p>
|
|
144
214
|
) : null}
|
|
145
215
|
</div>
|
|
146
216
|
<small>
|
|
@@ -22,12 +22,17 @@ describe("Cost period refresh", () => {
|
|
|
22
22
|
app.indexOf("const refresh = useCallback"),
|
|
23
23
|
app.indexOf("const loadOperationsDetails"),
|
|
24
24
|
);
|
|
25
|
+
const compactRefresh = refresh.replace(/\s+/g, " ");
|
|
25
26
|
|
|
26
27
|
expect(refresh).not.toContain("dailyCostSeed(currency, period)");
|
|
27
28
|
expect(refresh).toContain("initialAggregateFreshRef.current");
|
|
28
29
|
expect(refresh).not.toContain("loadAtomicCostSnapshot(() => api.snapshot(currency, period))");
|
|
29
|
-
expect(refresh).toContain(
|
|
30
|
-
|
|
30
|
+
expect(refresh).toContain(
|
|
31
|
+
'api.operations(period, "quick", undefined, initialAggregateFreshRef.current)',
|
|
32
|
+
);
|
|
33
|
+
expect(compactRefresh).toContain(
|
|
34
|
+
'currency === "USD" ? api.costMonitor(currency, period, "summary") : Promise.resolve(null)',
|
|
35
|
+
);
|
|
31
36
|
expect(refresh).toContain("setDisplayedCosts(null);");
|
|
32
37
|
expect(refresh).toContain("const activeDashboardView = dashboardViewRef.current");
|
|
33
38
|
expect(refresh).toContain("[api, currency, operationsPeriod]");
|
|
@@ -54,14 +59,24 @@ describe("Cost period refresh", () => {
|
|
|
54
59
|
const loaders = readFileSync(new URL("./use-app-cost-loaders.ts", import.meta.url), "utf8");
|
|
55
60
|
expect(app).toContain("useAppCostLoaders(api)");
|
|
56
61
|
expect(loaders).toContain("const loadCostRunPage = useCallback<LoadCostRunPage>");
|
|
57
|
-
expect(loaders).
|
|
62
|
+
expect(loaders).toMatch(/api\.sqliteViewPage\(\s*"cost_monitor_agent_invocations"/);
|
|
58
63
|
expect(loaders).toContain("const loadCostGroupPage = useCallback<LoadCostGroupPage>");
|
|
59
64
|
expect(loaders).toContain("task_count: nullableSqlNumber(row.task_count)");
|
|
60
65
|
expect(loaders).toContain("prd_count: Number(row.prd_count ?? 0)");
|
|
61
66
|
expect(loaders).toContain("spec_count: Number(row.spec_count ?? 0)");
|
|
62
67
|
expect(loaders).toContain("evidence_count: Number(row.evidence_count ?? 0)");
|
|
63
68
|
expect(loaders).toContain("test_count: Number(row.validation_count ?? 0)");
|
|
64
|
-
for (const dimension of [
|
|
69
|
+
for (const dimension of [
|
|
70
|
+
"provider",
|
|
71
|
+
"model",
|
|
72
|
+
"agent",
|
|
73
|
+
"phase",
|
|
74
|
+
"status",
|
|
75
|
+
"origin",
|
|
76
|
+
"workType",
|
|
77
|
+
"priority",
|
|
78
|
+
"risk",
|
|
79
|
+
])
|
|
65
80
|
expect(loaders).toContain(`filters.${dimension}`);
|
|
66
81
|
expect(app).toContain("loadRunPage={loadCostRunPage}");
|
|
67
82
|
expect(app).toContain("loadReadModelPage={loadCostReadModelPage}");
|
|
@@ -21,7 +21,7 @@ describe("DashboardApiClient reconciliation", () => {
|
|
|
21
21
|
vi.stubGlobal("fetch", fetchMock);
|
|
22
22
|
|
|
23
23
|
const pending = new DashboardApiClient("session").reconcileOpenWork();
|
|
24
|
-
const rejection = expect(pending).rejects.toThrow("
|
|
24
|
+
const rejection = expect(pending).rejects.toThrow("180 segundos");
|
|
25
25
|
await vi.advanceTimersByTimeAsync(30_000);
|
|
26
26
|
expect(fetchMock.mock.calls[0]?.[1].signal?.aborted).toBe(false);
|
|
27
27
|
|
|
@@ -31,8 +31,14 @@ describe("DashboardApiClient reconciliation", () => {
|
|
|
31
31
|
|
|
32
32
|
it("posts to the exact canonical reconciliation path without a trailing slash", async () => {
|
|
33
33
|
vi.stubGlobal("window", globalThis);
|
|
34
|
-
const fetchMock = vi.fn(
|
|
35
|
-
|
|
34
|
+
const fetchMock = vi.fn(
|
|
35
|
+
async () =>
|
|
36
|
+
new Response(
|
|
37
|
+
JSON.stringify({
|
|
38
|
+
reconciliation: { reconciled_ids: [], blocked: [], not_reconciled: [] },
|
|
39
|
+
}),
|
|
40
|
+
{ status: 200 },
|
|
41
|
+
),
|
|
36
42
|
);
|
|
37
43
|
vi.stubGlobal("fetch", fetchMock);
|
|
38
44
|
|
|
@@ -46,6 +52,22 @@ describe("DashboardApiClient reconciliation", () => {
|
|
|
46
52
|
expect.objectContaining({ method: "POST", headers: { "x-zaip-session": "session" } }),
|
|
47
53
|
);
|
|
48
54
|
});
|
|
55
|
+
|
|
56
|
+
it("refreshes the disposable projection without calling the reconciliation route", async () => {
|
|
57
|
+
vi.stubGlobal("window", globalThis);
|
|
58
|
+
const fetchMock = vi.fn(async () => new Response(JSON.stringify({}), { status: 200 }));
|
|
59
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
60
|
+
|
|
61
|
+
await new DashboardApiClient("session").refreshProjection("BRL", {
|
|
62
|
+
from: "2026-08-12",
|
|
63
|
+
to: "2026-08-12",
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
expect(fetchMock).toHaveBeenCalledWith(
|
|
67
|
+
"/api/v2/refresh-projection?currency=BRL&from=2026-08-12&to=2026-08-12",
|
|
68
|
+
expect.objectContaining({ method: "POST", headers: { "x-zaip-session": "session" } }),
|
|
69
|
+
);
|
|
70
|
+
});
|
|
49
71
|
});
|
|
50
72
|
|
|
51
73
|
describe("DashboardApiClient cost monitor", () => {
|
|
@@ -94,6 +116,30 @@ describe("DashboardApiClient cost monitor", () => {
|
|
|
94
116
|
expect(requestPath).not.toContain("run_kind=");
|
|
95
117
|
});
|
|
96
118
|
|
|
119
|
+
it("sends the Work List stage through the canonical status query parameter", async () => {
|
|
120
|
+
vi.stubGlobal("window", globalThis);
|
|
121
|
+
const fetchMock = vi.fn((_path: string) =>
|
|
122
|
+
Promise.resolve(
|
|
123
|
+
new Response(JSON.stringify({ rows: [] }), {
|
|
124
|
+
headers: { "content-type": "application/json" },
|
|
125
|
+
status: 200,
|
|
126
|
+
}),
|
|
127
|
+
),
|
|
128
|
+
);
|
|
129
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
130
|
+
|
|
131
|
+
await new DashboardApiClient("session").sqliteViewPage("operations_work_list", undefined, {
|
|
132
|
+
limit: 10,
|
|
133
|
+
origin: "standalone",
|
|
134
|
+
status: "executing",
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const requestPath = String(fetchMock.mock.calls[0]?.[0]);
|
|
138
|
+
expect(requestPath).toContain("status=executing");
|
|
139
|
+
expect(requestPath).toContain("origin=standalone");
|
|
140
|
+
expect(requestPath).not.toContain("stage=executing");
|
|
141
|
+
});
|
|
142
|
+
|
|
97
143
|
it("adds fresh only to an explicit bootstrap aggregate read", async () => {
|
|
98
144
|
vi.stubGlobal("window", globalThis);
|
|
99
145
|
const fetchMock = vi.fn((_path: string | URL | Request) =>
|