@zaip-ai/cli 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/services/adapters.d.ts +1 -1
- package/dist/services/adapters.d.ts.map +1 -1
- package/dist/services/adapters.js +15 -5
- package/dist/services/adapters.js.map +1 -1
- package/dist/services/adapters.test.js +1 -1
- package/dist/services/agent-adapters.d.ts +9 -0
- package/dist/services/agent-adapters.d.ts.map +1 -1
- package/dist/services/agent-adapters.js +38 -3
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +8 -1
- package/dist/services/agent-adapters.test.js.map +1 -1
- package/dist/services/codex-config-template.d.ts +2 -1
- package/dist/services/codex-config-template.d.ts.map +1 -1
- package/dist/services/codex-config-template.js +13 -2
- package/dist/services/codex-config-template.js.map +1 -1
- package/dist/services/codex-rules.d.ts +1 -1
- package/dist/services/codex-rules.d.ts.map +1 -1
- package/dist/services/codex-rules.js +31 -7
- package/dist/services/codex-rules.js.map +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts +1 -1
- package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
- package/dist/services/codex-subagent-hook-template.js +4 -1
- package/dist/services/codex-subagent-hook-template.js.map +1 -1
- package/dist/services/doctor.d.ts.map +1 -1
- package/dist/services/doctor.js +3 -1
- package/dist/services/doctor.js.map +1 -1
- package/dist/services/global-codex-config.d.ts +6 -3
- package/dist/services/global-codex-config.d.ts.map +1 -1
- package/dist/services/global-codex-config.js +82 -13
- package/dist/services/global-codex-config.js.map +1 -1
- package/dist/services/global-codex-config.test.js +57 -10
- package/dist/services/global-codex-config.test.js.map +1 -1
- package/dist/services/install-agents-template.d.ts.map +1 -1
- package/dist/services/install-agents-template.js +15 -2
- package/dist/services/install-agents-template.js.map +1 -1
- package/dist/services/logger.js +1 -1
- package/dist/services/logger.js.map +1 -1
- package/dist/services/logger.test.js +3 -3
- package/dist/services/logger.test.js.map +1 -1
- package/dist/services/runtime-template.test.js +21 -5
- package/dist/services/runtime-template.test.js.map +1 -1
- package/dist/services/template-manifest.d.ts.map +1 -1
- package/dist/services/template-manifest.js +2 -0
- package/dist/services/template-manifest.js.map +1 -1
- package/package.json +1 -1
- package/templates/.agents/config/agents/catalog.yaml +310 -10
- package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
- package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
- package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
- package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
- package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
- package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
- package/templates/.agents/config/project.yaml +1 -1
- package/templates/.agents/dashboard/.zaip-managed.json +659 -163
- package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
- package/templates/.agents/dashboard/README.md +48 -97
- package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
- package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
- package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
- package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
- package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
- package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
- package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
- package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
- package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
- package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
- package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
- package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
- package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
- package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
- package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
- package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
- package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
- package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
- package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
- package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
- package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
- package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
- package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
- package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
- package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
- package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
- package/templates/.agents/dashboard/modules/operations/package.json +2 -1
- package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
- package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
- package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
- package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
- package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
- package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
- package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
- package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
- package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
- package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
- package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
- package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
- package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
- package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
- package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
- package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
- package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
- package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
- package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
- package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
- package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
- package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
- package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
- package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
- package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
- package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
- package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
- package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
- package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
- package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
- package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
- package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
- package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
- package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
- package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
- package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
- package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
- package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
- package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
- package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
- package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
- package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
- package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
- package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
- package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
- package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
- package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
- package/templates/.agents/dashboard/packages/branding/package.json +1 -1
- package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
- package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
- package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
- package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
- package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
- package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
- package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
- package/templates/.agents/dashboard/packages/ui/package.json +1 -1
- package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
- package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
- package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
- package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
- package/templates/.agents/dashboard/read-model.dbml +2201 -0
- package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
- package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
- package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
- package/templates/.agents/dashboard/work-priority.json +34 -0
- package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
- package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
- package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
- package/templates/.agents/design/.zaip-managed.json +3 -3
- package/templates/.agents/design/apps/catalog/package.json +1 -1
- package/templates/.agents/design/packages/local-runtime/package.json +1 -1
- package/templates/.agents/requirements/autonomous-assurance.md +1 -1
- package/templates/.agents/requirements/comparative-audit.md +1 -1
- package/templates/.agents/requirements/context-engine.md +1 -1
- package/templates/.agents/requirements/cost-observability.md +1 -1
- package/templates/.agents/requirements/dashboard-launch.md +24 -0
- package/templates/.agents/requirements/data-export.md +1 -1
- package/templates/.agents/requirements/design-system.md +1 -1
- package/templates/.agents/requirements/execution-engine.md +1 -1
- package/templates/.agents/requirements/kanban-dashboard.md +4 -3
- package/templates/.agents/requirements/model-orchestration.md +1 -1
- package/templates/.agents/requirements/public-distribution.md +9 -6
- package/templates/.agents/requirements/software-architecture.md +1 -1
- package/templates/.agents/requirements/strategic-improvements.md +1 -1
- package/templates/.agents/requirements/work-lifecycle.md +9 -3
- package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
- package/templates/.agents/rules/autonomy-decision.md +15 -0
- package/templates/.agents/rules/core.md +1 -1
- package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
- package/templates/.agents/rules/specialist-routing.md +19 -0
- package/templates/.agents/rules/workflow.md +1 -1
- package/templates/.agents/runtime/VERSION +1 -1
- package/templates/.agents/runtime/bin/zaip.mjs +114 -64
- package/templates/.agents/runtime/checksums.sha256 +6 -4
- package/templates/.agents/runtime/manifest.json +3 -1
- package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
- package/templates/.agents/runtime/provenance.json +11 -0
- package/templates/.agents/runtime/sbom.cdx.json +1929 -39
- package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
- package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
- package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
- package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
- package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
- package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
- package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
- package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
- package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
- package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
- package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
- package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
- package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
- package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
- package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
- package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
- package/templates/.agents/zaip-aios/INDEX.md +1 -0
- package/templates/.agents/zaip-aios/README.md +37 -8
- package/templates/.agents/zaip-aios/VERSION +1 -1
- package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
- package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
- package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
- package/templates/template-manifest.json +945 -214
- package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
- package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
- package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
- package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
- package/templates/.agents/dashboard/dashboard.config.json +0 -4
- package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
|
@@ -1,23 +1,30 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
import { mkdir, mkdtemp, readFile, rm, utimes } from "node:fs/promises";
|
|
3
|
-
import { createServer } from "node:net";
|
|
3
|
+
import { connect, createServer } from "node:net";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { afterEach, describe, expect, it } from "vitest";
|
|
7
7
|
import {
|
|
8
8
|
browserLaunchCommands,
|
|
9
|
+
assertDashboardPrerequisites,
|
|
9
10
|
findAvailablePort,
|
|
10
11
|
findAvailablePortWithFallback,
|
|
11
12
|
findReusableDashboardSession,
|
|
12
13
|
formatLauncherError,
|
|
13
14
|
host,
|
|
15
|
+
isAncestorProcess,
|
|
16
|
+
isProcessAlive,
|
|
14
17
|
openBrowser,
|
|
18
|
+
previousDashboardSessions,
|
|
15
19
|
probeDashboardPort,
|
|
16
20
|
readPortRegistry,
|
|
17
21
|
recordPortStatus,
|
|
22
|
+
registeredListenerMatches,
|
|
18
23
|
runtimeKind,
|
|
19
24
|
startDashboardLaunchPage,
|
|
25
|
+
stopOwnedDashboardProcess,
|
|
20
26
|
stripTerminalControlCodes,
|
|
27
|
+
teardownWarning,
|
|
21
28
|
withLauncherLock,
|
|
22
29
|
workspaceKey,
|
|
23
30
|
workspaceRoot,
|
|
@@ -33,12 +40,33 @@ afterEach(async () => {
|
|
|
33
40
|
});
|
|
34
41
|
|
|
35
42
|
describe("dashboard executable session", () => {
|
|
43
|
+
it("imports teardown bindings for the launcher implementation", async () => {
|
|
44
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
45
|
+
|
|
46
|
+
expect(source).toContain("stopProcessTree,");
|
|
47
|
+
expect(source).toContain("teardownWarning,");
|
|
48
|
+
expect(source).toContain('from "./start-dashboard-processes.mjs";');
|
|
49
|
+
});
|
|
50
|
+
|
|
36
51
|
it("removes terminal control sequences from launcher diagnostics", () => {
|
|
37
52
|
const colored = "\u001B[31mMissing export\u001B[0m\r\n";
|
|
38
53
|
|
|
39
54
|
expect(stripTerminalControlCodes(colored)).toBe("Missing export");
|
|
40
55
|
});
|
|
41
56
|
|
|
57
|
+
it("shows preparation before validating a Node runtime that can import node:sqlite", async () => {
|
|
58
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
59
|
+
|
|
60
|
+
expect(source).toContain("export async function assertDashboardPrerequisites()");
|
|
61
|
+
expect(source).toContain('await import("node:sqlite")');
|
|
62
|
+
expect(source).not.toContain("builtinModules.includes(\"node:sqlite\")");
|
|
63
|
+
expect(source).toContain("Node.js 22 ou superior");
|
|
64
|
+
expect(source.indexOf("await openBrowser(dashboardUrl(launchPort, token))")).toBeLessThan(
|
|
65
|
+
source.indexOf("await assertDashboardPrerequisites();"),
|
|
66
|
+
);
|
|
67
|
+
await expect(assertDashboardPrerequisites()).resolves.toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
|
|
42
70
|
it("keeps the beginning and end of an oversized launcher error", () => {
|
|
43
71
|
const message = `imported-symbol${"x".repeat(100)}missing-export`;
|
|
44
72
|
|
|
@@ -46,44 +74,119 @@ describe("dashboard executable session", () => {
|
|
|
46
74
|
expect(formatLauncherError(message, 40)).toContain("missing-export");
|
|
47
75
|
});
|
|
48
76
|
|
|
49
|
-
it("
|
|
77
|
+
it("reuses a healthy runtime only when its build signature remains compatible", async () => {
|
|
50
78
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
51
|
-
expect(source).
|
|
79
|
+
expect(source).toContain("expectedBuildSignature: buildSignature,");
|
|
80
|
+
expect(source).toContain('expectedSnapshotState: "current",');
|
|
81
|
+
expect(source).toContain("Reused healthy compatible dashboard session on port ${reusable.port}");
|
|
82
|
+
expect(source).toContain("await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));");
|
|
52
83
|
expect(source).toContain("const previousSessions = await previousDashboardSessions();");
|
|
53
|
-
|
|
54
|
-
"const excludedPorts = new Set([
|
|
84
|
+
const excludedPorts = source.slice(
|
|
85
|
+
source.indexOf("const excludedPorts = new Set(["),
|
|
86
|
+
source.indexOf("const serverPath = await assertRuntimeReady();"),
|
|
55
87
|
);
|
|
88
|
+
expect(excludedPorts).toContain("...previousSessions.map((session) => session.port),");
|
|
89
|
+
expect(excludedPorts).toContain("launchPort,");
|
|
56
90
|
});
|
|
57
91
|
|
|
58
92
|
it("opens preparation before checking freshness and keeps it through server health", async () => {
|
|
59
93
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
60
94
|
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
61
|
-
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(
|
|
95
|
+
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
62
96
|
const freshness = source.indexOf("const buildSignature = await ensureFreshDashboardBuild();");
|
|
63
|
-
const server = source.indexOf(
|
|
64
|
-
"const { child, port } = await startDashboardServer(serverPath, token, excludedPorts);",
|
|
65
|
-
);
|
|
97
|
+
const server = source.indexOf("const { child, port, dbPath, snapshotCache } = await startDashboardServer(");
|
|
66
98
|
const redirectAfterServer = source.indexOf(
|
|
67
|
-
"await redirectLaunchPage(launchPage, dashboardUrl(port, token));",
|
|
99
|
+
"await redirectLaunchPage(launchPage, dashboardUrl(port, token, snapshotCache === \"stale_seed\"));",
|
|
68
100
|
);
|
|
69
101
|
|
|
70
102
|
expect(lock).toBeGreaterThan(-1);
|
|
71
|
-
expect(preparation).
|
|
103
|
+
expect(preparation).toBeLessThan(lock);
|
|
72
104
|
expect(preparation).toBeLessThan(freshness);
|
|
73
105
|
expect(server).toBeGreaterThan(freshness);
|
|
74
106
|
expect(redirectAfterServer).toBeGreaterThan(server);
|
|
75
107
|
});
|
|
76
108
|
|
|
109
|
+
it("reports readiness failures as actionable without retrying a build storm", async () => {
|
|
110
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
111
|
+
const wait = source.slice(source.indexOf("async function waitForDashboard"), source.indexOf("function exists"));
|
|
112
|
+
expect(wait).toContain("Dashboard data readiness returned ${readiness.status}");
|
|
113
|
+
expect(wait).toContain("unavailable.retryable = false;");
|
|
114
|
+
expect(wait).toContain("if (error?.retryable === false) throw error;");
|
|
115
|
+
expect(wait).toContain("await delay(100);");
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("streams complete structured rebuild progress records even when stderr chunks split a line", async () => {
|
|
119
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
120
|
+
|
|
121
|
+
expect(source).toContain("let startupTelemetryBuffer = \"\";");
|
|
122
|
+
expect(source).toContain("startupTelemetryBuffer = `${startupTelemetryBuffer}${String(chunk)}`;");
|
|
123
|
+
expect(source).toContain('event?.event === "dashboard_sqlite_rebuild_progress"');
|
|
124
|
+
expect(source).toContain('ZAIP_DASHBOARD_LAUNCH_PROGRESS: "1"');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("uses one durable cache and an append-only worker log for a stale snapshot refresh", async () => {
|
|
128
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
129
|
+
|
|
130
|
+
expect(source).toContain('const sqliteSnapshotCacheDirectory = join(sqliteReadModelDirectory, "cache");');
|
|
131
|
+
expect(source).toContain("ZAIP_SQLITE_CACHE_DIR: sqliteSnapshotCacheDirectory,");
|
|
132
|
+
expect(source).toContain('const refreshLogPath = join(sessionDirectory, "dashboard-sqlite-refresh.log");');
|
|
133
|
+
expect(source).toContain("stdio: [\"ignore\", refreshLogDescriptor, refreshLogDescriptor]");
|
|
134
|
+
expect(source).toContain("worker log ${refreshLogPath}");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("keeps a visible, actionable handoff watchdog instead of closing the preparation page before navigation", async () => {
|
|
138
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
139
|
+
|
|
140
|
+
expect(source).toContain('id="handoff-link"');
|
|
141
|
+
expect(source).toContain("function showHandoff(target)");
|
|
142
|
+
expect(source).toContain("setTimeout(()=>location.replace(next.target),0)");
|
|
143
|
+
expect(source).toContain("closeAfterHandoffGrace: (graceMs = 12_000)");
|
|
144
|
+
expect(source).toContain("launchPage.closeAfterHandoffGrace();");
|
|
145
|
+
expect(source).not.toContain("await launchPage.close();\n if (!redirected");
|
|
146
|
+
});
|
|
147
|
+
|
|
77
148
|
it("tears down prior owned sessions only after the new browser handoff", async () => {
|
|
78
149
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
79
150
|
const redirect = source.indexOf(
|
|
80
|
-
"await redirectLaunchPage(launchPage, dashboardUrl(port, token));",
|
|
151
|
+
"await redirectLaunchPage(launchPage, dashboardUrl(port, token, snapshotCache === \"stale_seed\"));",
|
|
81
152
|
);
|
|
82
153
|
const teardown = source.indexOf("for (const previous of previousSessions)");
|
|
83
154
|
|
|
84
155
|
expect(redirect).toBeGreaterThan(-1);
|
|
85
156
|
expect(teardown).toBeGreaterThan(redirect);
|
|
86
|
-
expect(source).toContain("const
|
|
157
|
+
expect(source).toContain("const status = await stopOwnedDashboard(previous);");
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("does not mark an owned prior session closed while its registered listener remains", async () => {
|
|
161
|
+
const source = await readFile(
|
|
162
|
+
new URL("./start-dashboard-processes.mjs", import.meta.url),
|
|
163
|
+
"utf8",
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
expect(source).toContain("const listenerStillMatches = registeredListenerMatches(");
|
|
167
|
+
expect(source).toContain("!listenerStillMatches");
|
|
168
|
+
expect(source).toContain("await stopProcessTreeImpl(session.serverPid);");
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it("keeps a failed health probe with a foreign listener out of the closed registry state", async () => {
|
|
172
|
+
const stopCalls = [];
|
|
173
|
+
const status = await stopOwnedDashboardProcess(
|
|
174
|
+
{ port: 4317, rootPid: 1234, serverPid: 5678 },
|
|
175
|
+
{
|
|
176
|
+
probeDashboardPort: async () => false,
|
|
177
|
+
workspaceKey,
|
|
178
|
+
fetchImpl: fetch,
|
|
179
|
+
host,
|
|
180
|
+
packageRoot: "unused",
|
|
181
|
+
delay: async () => {},
|
|
182
|
+
listeningProcessIdImpl: async () => 9999,
|
|
183
|
+
isProcessAliveImpl: async () => true,
|
|
184
|
+
stopProcessTreeImpl: async (pid) => stopCalls.push(pid),
|
|
185
|
+
},
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
expect(status).toBe("skipped_unowned");
|
|
189
|
+
expect(stopCalls).toEqual([]);
|
|
87
190
|
});
|
|
88
191
|
|
|
89
192
|
it("does not force a rebuild from the Windows executable", async () => {
|
|
@@ -95,6 +198,55 @@ describe("dashboard executable session", () => {
|
|
|
95
198
|
expect(source).not.toContain("ZAIP_DASHBOARD_FORCE_REBUILD");
|
|
96
199
|
});
|
|
97
200
|
|
|
201
|
+
it("accepts a healthy new same-workspace port without scanning historical active ports", async () => {
|
|
202
|
+
const source = await readFile(
|
|
203
|
+
new URL("../windows-launcher/Program.cs", import.meta.url),
|
|
204
|
+
"utf8",
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
expect(source).toContain("The new same-workspace healthy port is definitive success.");
|
|
208
|
+
expect(source).not.toContain("dashboard-ports.json");
|
|
209
|
+
expect(source).not.toContain("porta anterior reconhecida");
|
|
210
|
+
expect(source).toContain("return true;");
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it("treats the Node-confirmed handoff as definitive instead of rediscovering mutable session state", async () => {
|
|
214
|
+
const source = await readFile(
|
|
215
|
+
new URL("../windows-launcher/Program.cs", import.meta.url),
|
|
216
|
+
"utf8",
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
const ok = source.indexOf('if (status.StartsWith("ok", StringComparison.OrdinalIgnoreCase))');
|
|
220
|
+
const warning = source.indexOf('if (status.StartsWith("warning", StringComparison.OrdinalIgnoreCase))');
|
|
221
|
+
const okBranch = source.slice(ok, warning);
|
|
222
|
+
|
|
223
|
+
expect(ok).toBeGreaterThan(-1);
|
|
224
|
+
expect(okBranch).toContain("return 0;");
|
|
225
|
+
expect(okBranch).not.toContain("VerifyDashboardLaunch");
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it("publishes ok only after Node observed both health and readiness", async () => {
|
|
229
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
230
|
+
const wait = source.slice(source.indexOf("async function waitForDashboard"), source.indexOf("function exists"));
|
|
231
|
+
|
|
232
|
+
expect(wait).toContain("dashboardHealthUrl(port)");
|
|
233
|
+
expect(wait).toContain("/api/v2/ready");
|
|
234
|
+
expect(source.indexOf('await writeLauncherStatus("ok");')).toBeGreaterThan(
|
|
235
|
+
source.indexOf("await waitForDashboard(port, child);"),
|
|
236
|
+
);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("records prior-port cleanup warnings while still publishing an ok handoff", async () => {
|
|
240
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
241
|
+
const cleanup = source.indexOf("const status = await stopOwnedDashboard(previous);");
|
|
242
|
+
const warning = source.indexOf("Dashboard launched on port ${port}; prior-port cleanup:");
|
|
243
|
+
const success = source.indexOf('await writeLauncherStatus("ok");', cleanup);
|
|
244
|
+
|
|
245
|
+
expect(cleanup).toBeGreaterThan(-1);
|
|
246
|
+
expect(warning).toBeGreaterThan(cleanup);
|
|
247
|
+
expect(success).toBeGreaterThan(warning);
|
|
248
|
+
});
|
|
249
|
+
|
|
98
250
|
it("dispatches Windows URLs through the registered protocol handler", () => {
|
|
99
251
|
const target = "http://127.0.0.1:4317/?token=local-session-token";
|
|
100
252
|
const commands = browserLaunchCommands(target, "win32", {
|
|
@@ -122,14 +274,25 @@ describe("dashboard executable session", () => {
|
|
|
122
274
|
expect(calls).toBe(2);
|
|
123
275
|
});
|
|
124
276
|
|
|
125
|
-
it("serves
|
|
277
|
+
it("serves a viewport-covering centered progress overlay while the runtime starts", async () => {
|
|
126
278
|
const launchPage = await startDashboardLaunchPage(0);
|
|
127
279
|
try {
|
|
128
280
|
const page = await fetch(`http://${host}:${launchPage.port}/?token=temporary`);
|
|
129
281
|
const health = await fetch(`http://${host}:${launchPage.port}/api/v2/health`);
|
|
130
282
|
|
|
131
283
|
expect(page.status).toBe(200);
|
|
132
|
-
await
|
|
284
|
+
const html = await page.text();
|
|
285
|
+
expect(html).toContain('class="launch-overlay"');
|
|
286
|
+
expect(html).toContain("position:fixed;inset:0;width:100vw;height:100vh");
|
|
287
|
+
expect(html).toContain("display:grid;place-items:center");
|
|
288
|
+
expect(html).toContain('aria-live="polite" role="status"');
|
|
289
|
+
expect(html).toContain("abra o dashboard agora");
|
|
290
|
+
expect(html).toContain("function showHandoff(target)");
|
|
291
|
+
const progress = await fetch(`http://${host}:${launchPage.port}/api/v2/progress`);
|
|
292
|
+
await expect(progress.json()).resolves.toMatchObject({
|
|
293
|
+
phase: "Iniciando o launcher local",
|
|
294
|
+
percent: expect.any(Number),
|
|
295
|
+
});
|
|
133
296
|
expect(health.status).toBe(503);
|
|
134
297
|
await expect(health.json()).resolves.toEqual({
|
|
135
298
|
kind: "zaip-dashboard-launcher",
|
|
@@ -147,6 +310,22 @@ describe("dashboard executable session", () => {
|
|
|
147
310
|
}
|
|
148
311
|
});
|
|
149
312
|
|
|
313
|
+
it("bounds launch-page shutdown when a browser connection never finishes polling", async () => {
|
|
314
|
+
const launchPage = await startDashboardLaunchPage(0);
|
|
315
|
+
const connection = connect({ host, port: launchPage.port });
|
|
316
|
+
await new Promise((resolveConnected, rejectConnected) => {
|
|
317
|
+
connection.once("connect", resolveConnected);
|
|
318
|
+
connection.once("error", rejectConnected);
|
|
319
|
+
});
|
|
320
|
+
const closed = new Promise((resolveClosed) => connection.once("close", resolveClosed));
|
|
321
|
+
const startedAt = Date.now();
|
|
322
|
+
await launchPage.close({ forceAfterMs: 20 });
|
|
323
|
+
await closed;
|
|
324
|
+
|
|
325
|
+
expect(Date.now() - startedAt).toBeLessThan(500);
|
|
326
|
+
expect(connection.destroyed).toBe(true);
|
|
327
|
+
});
|
|
328
|
+
|
|
150
329
|
it("reuses a healthy session owned by the same workspace", async () => {
|
|
151
330
|
const directory = await temporaryDirectory();
|
|
152
331
|
const path = join(directory, "dashboard-session.json");
|
|
@@ -155,19 +334,24 @@ describe("dashboard executable session", () => {
|
|
|
155
334
|
workspace: workspaceRoot,
|
|
156
335
|
workspaceKey,
|
|
157
336
|
rootPid: 1234,
|
|
337
|
+
serverPid: 5678,
|
|
158
338
|
port: 4317,
|
|
159
339
|
token: "local-session-token",
|
|
340
|
+
buildSignature: "compatible-build",
|
|
341
|
+
snapshotState: "current",
|
|
160
342
|
createdAt: new Date().toISOString(),
|
|
161
343
|
};
|
|
162
344
|
await writeDashboardSession(session, path);
|
|
163
345
|
|
|
164
346
|
const reusable = await findReusableDashboardSession({
|
|
165
347
|
path,
|
|
348
|
+
expectedBuildSignature: "compatible-build",
|
|
166
349
|
fetchImpl: async () =>
|
|
167
350
|
new Response(JSON.stringify({ kind: runtimeKind, workspaceKey }), { status: 200 }),
|
|
168
351
|
});
|
|
169
352
|
|
|
170
353
|
expect(reusable).toEqual(session);
|
|
354
|
+
expect(reusable).toMatchObject({ port: 4317, serverPid: 5678 });
|
|
171
355
|
});
|
|
172
356
|
|
|
173
357
|
it("does not claim a health endpoint from another workspace", async () => {
|
|
@@ -222,6 +406,35 @@ describe("dashboard executable session", () => {
|
|
|
222
406
|
).resolves.toBeNull();
|
|
223
407
|
});
|
|
224
408
|
|
|
409
|
+
it("does not reuse an updating stale snapshot after its background refresh", async () => {
|
|
410
|
+
const directory = await temporaryDirectory();
|
|
411
|
+
const path = join(directory, "dashboard-session.json");
|
|
412
|
+
await writeDashboardSession(
|
|
413
|
+
{
|
|
414
|
+
kind: runtimeKind,
|
|
415
|
+
workspace: workspaceRoot,
|
|
416
|
+
workspaceKey,
|
|
417
|
+
rootPid: 1234,
|
|
418
|
+
serverPid: 5678,
|
|
419
|
+
port: 4317,
|
|
420
|
+
token: "stale-session-token",
|
|
421
|
+
buildSignature: "compatible-build",
|
|
422
|
+
snapshotState: "updating",
|
|
423
|
+
},
|
|
424
|
+
path,
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
await expect(
|
|
428
|
+
findReusableDashboardSession({
|
|
429
|
+
path,
|
|
430
|
+
expectedBuildSignature: "compatible-build",
|
|
431
|
+
expectedSnapshotState: "current",
|
|
432
|
+
fetchImpl: async () =>
|
|
433
|
+
new Response(JSON.stringify({ kind: runtimeKind, workspaceKey }), { status: 200 }),
|
|
434
|
+
}),
|
|
435
|
+
).resolves.toBeNull();
|
|
436
|
+
});
|
|
437
|
+
|
|
225
438
|
it("recognizes an unavailable runtime only for safe cleanup", async () => {
|
|
226
439
|
const fetchImpl = async () =>
|
|
227
440
|
new Response(JSON.stringify({ kind: runtimeKind, workspaceKey, status: "unavailable" }), {
|
|
@@ -254,6 +467,34 @@ describe("dashboard executable session", () => {
|
|
|
254
467
|
expect(selectedPort).not.toBe(previousPort);
|
|
255
468
|
});
|
|
256
469
|
|
|
470
|
+
it("does not report invalid or departed launcher PIDs as live", async () => {
|
|
471
|
+
await expect(isProcessAlive(0)).resolves.toBe(false);
|
|
472
|
+
await expect(isProcessAlive(-1)).resolves.toBe(false);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it("does not authorize teardown when a registry server PID was reused", () => {
|
|
476
|
+
const session = { rootPid: 1234, serverPid: 5678, port: 4317 };
|
|
477
|
+
expect(registeredListenerMatches(session, 9999)).toBe(false);
|
|
478
|
+
expect(registeredListenerMatches(session, null)).toBe(false);
|
|
479
|
+
expect(registeredListenerMatches(session, 5678)).toBe(true);
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it("keeps skipped unowned listeners auditable without failing a healthy launch", () => {
|
|
483
|
+
expect(teardownWarning("skipped_unowned")).toBe(false);
|
|
484
|
+
expect(teardownWarning("close_failed")).toBe(true);
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
it("requires the recorded launcher root to be an ancestor of the server", async () => {
|
|
488
|
+
const parentOf = async (pid) =>
|
|
489
|
+
new Map([
|
|
490
|
+
[30, 20],
|
|
491
|
+
[20, 10],
|
|
492
|
+
[10, null],
|
|
493
|
+
]).get(pid) ?? null;
|
|
494
|
+
await expect(isAncestorProcess(10, 30, parentOf)).resolves.toBe(true);
|
|
495
|
+
await expect(isAncestorProcess(99, 30, parentOf)).resolves.toBe(false);
|
|
496
|
+
});
|
|
497
|
+
|
|
257
498
|
it("persists active and closed dashboard ports per workspace", async () => {
|
|
258
499
|
const directory = await temporaryDirectory();
|
|
259
500
|
const path = join(directory, "dashboard-ports.json");
|
|
@@ -275,6 +516,27 @@ describe("dashboard executable session", () => {
|
|
|
275
516
|
]);
|
|
276
517
|
});
|
|
277
518
|
|
|
519
|
+
it("rechecks a closed registry entry that still has this workspace runtime listening", async () => {
|
|
520
|
+
const directory = await temporaryDirectory();
|
|
521
|
+
const path = join(directory, "dashboard-ports.json");
|
|
522
|
+
const session = {
|
|
523
|
+
rootPid: 1234,
|
|
524
|
+
serverPid: 5678,
|
|
525
|
+
port: 4317,
|
|
526
|
+
createdAt: "2026-07-15T00:00:00.000Z",
|
|
527
|
+
};
|
|
528
|
+
await recordPortStatus(session, "active", path);
|
|
529
|
+
await recordPortStatus(session, "closed", path);
|
|
530
|
+
|
|
531
|
+
await expect(
|
|
532
|
+
previousDashboardSessions({
|
|
533
|
+
sessionPath: join(directory, "missing-session.json"),
|
|
534
|
+
registryPath: path,
|
|
535
|
+
probe: async () => true,
|
|
536
|
+
}),
|
|
537
|
+
).resolves.toEqual([expect.objectContaining({ port: 4317, rootPid: 1234, status: "closed" })]);
|
|
538
|
+
});
|
|
539
|
+
|
|
278
540
|
it("recovers an abandoned launcher lock", async () => {
|
|
279
541
|
const directory = await temporaryDirectory();
|
|
280
542
|
const path = join(directory, "dashboard-launcher.lock");
|
|
@@ -346,20 +608,33 @@ describe("dashboard executable session", () => {
|
|
|
346
608
|
await expect(Promise.all([first, second])).resolves.toEqual(["first", "second"]);
|
|
347
609
|
});
|
|
348
610
|
|
|
349
|
-
it("
|
|
611
|
+
it("opens preparation before waiting and only reuses after checking the current build", async () => {
|
|
350
612
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
351
|
-
const
|
|
613
|
+
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
352
614
|
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
353
|
-
const
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
expect(
|
|
357
|
-
expect(
|
|
358
|
-
expect(
|
|
359
|
-
expect(
|
|
615
|
+
const buildSignature = source.indexOf("const buildSignature = await ensureFreshDashboardBuild();");
|
|
616
|
+
const reusable = source.indexOf("const reusable = await findReusableDashboardSession({");
|
|
617
|
+
|
|
618
|
+
expect(preparation).toBeLessThan(lock);
|
|
619
|
+
expect(buildSignature).toBeGreaterThan(lock);
|
|
620
|
+
expect(reusable).toBeGreaterThan(buildSignature);
|
|
621
|
+
expect(source).toContain("await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));");
|
|
622
|
+
expect(source).toContain('snapshotState: snapshotCache === "stale_seed" ? "updating" : "current",');
|
|
623
|
+
expect(source).toContain("if (launchPage !== null) await launchPage.close().catch(() => {});");
|
|
360
624
|
expect(source).toContain('await writeLauncherStatus("ok");');
|
|
361
625
|
});
|
|
362
626
|
|
|
627
|
+
it("binds preparation atomically instead of reserving a probe-selected port", async () => {
|
|
628
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
629
|
+
const preparationStart = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
630
|
+
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
631
|
+
const beforeLock = source.slice(preparationStart, lock);
|
|
632
|
+
|
|
633
|
+
expect(preparationStart).toBeGreaterThan(-1);
|
|
634
|
+
expect(source).toContain("const launchPort = launchPage.port;");
|
|
635
|
+
expect(beforeLock).not.toContain("findAvailablePortWithFallback(");
|
|
636
|
+
});
|
|
637
|
+
|
|
363
638
|
it("gives the Windows wrapper margin beyond the bounded Node launcher wait", async () => {
|
|
364
639
|
const source = await readFile(
|
|
365
640
|
new URL("../windows-launcher/Program.cs", import.meta.url),
|