@zaip-ai/cli 1.0.7 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +39 -4
- package/dist/services/agent-adapters.js.map +1 -1
- package/dist/services/agent-adapters.test.js +13 -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 +7 -0
- 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 +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 +2 -2
- 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/.tmp-run-list.json +254 -0
- package/templates/.agents/dashboard/.zaip-managed.json +775 -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-DxR_pgSV.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CKcsqb-r.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.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-N5Csr0RP.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-C0fj2uU9.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.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-BEsJ-FYH.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-B6y6Gw12.js +1 -0
- package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +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 +1129 -600
- 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 +266 -315
- package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +151 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +37 -0
- package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +114 -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 +85 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +133 -0
- package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +453 -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 +26 -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 +482 -3
- 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 +78 -0
- package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +234 -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 +253 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +380 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +175 -0
- package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +395 -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 +36 -0
- package/templates/.agents/dashboard/apps/frontend/vite.config.ts +58 -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 +134 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +290 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +133 -19
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +134 -43
- 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 +328 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +302 -6
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +627 -400
- 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 +370 -72
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +467 -326
- 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 +55 -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 +33 -5
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +119 -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 +146 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +118 -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 -161
- 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 +757 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +784 -0
- package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +100 -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/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/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 +185 -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 +345 -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 +367 -14
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +562 -131
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +353 -355
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +65 -0
- package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
- package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +73 -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 +105 -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 +265 -36
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +171 -8
- package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +98 -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 -17
- 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 +431 -1
- package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +574 -20
- package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +42 -4
- package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
- 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 +67 -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 +22 -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 +176 -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 +21 -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 +241 -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 +7 -4
- package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +5 -84
- 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 +39 -2
- package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +25 -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 +330 -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 +2 -0
- package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1759 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
- package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1611 -0
- package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +20 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +114 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +31 -0
- 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 +589 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +53 -0
- package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +203 -0
- package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1646 -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 +339 -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 +110 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +189 -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 +178 -84
- package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +149 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +675 -267
- package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1212 -309
- 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 +722 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +3743 -0
- package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +7017 -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 +514 -190
- package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +324 -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 +216 -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/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 +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 +118 -67
- 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/sales/playbook.md +32 -0
- package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
- package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
- package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +22 -0
- package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
- 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 +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-enforce-architecture/SKILL.md +2 -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 +21 -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 +9 -3
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +99 -93
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +132 -23
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +149 -1
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +76 -19
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +217 -7
- package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
- package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +20 -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 +41 -0
- package/templates/.agents/zaip-aios/INDEX.md +11 -0
- package/templates/.agents/zaip-aios/README.md +38 -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/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
- package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
- package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
- package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
- package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -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 +18 -0
- package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
- package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
- package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -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 +1082 -215
- 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/DashboardHelpDialog-Cv-JcoxP.js +0 -1320
- 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
|
+
assertDashboardPrerequisites,
|
|
8
9
|
browserLaunchCommands,
|
|
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,133 @@ 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).
|
|
52
|
-
expect(source).toContain(
|
|
79
|
+
expect(source).toContain("expectedBuildSignature: buildSignature,");
|
|
80
|
+
expect(source).toContain('expectedSnapshotState: "current",');
|
|
81
|
+
expect(source).toContain(
|
|
82
|
+
"Reused healthy compatible dashboard session on port ${reusable.port}",
|
|
83
|
+
);
|
|
53
84
|
expect(source).toContain(
|
|
54
|
-
"
|
|
85
|
+
"await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));",
|
|
86
|
+
);
|
|
87
|
+
expect(source).toContain("const previousSessions = await previousDashboardSessions();");
|
|
88
|
+
const excludedPorts = source.slice(
|
|
89
|
+
source.indexOf("const excludedPorts = new Set(["),
|
|
90
|
+
source.indexOf("const serverPath = await assertRuntimeReady();"),
|
|
55
91
|
);
|
|
92
|
+
expect(excludedPorts).toContain("...previousSessions.map((session) => session.port),");
|
|
93
|
+
expect(excludedPorts).toContain("launchPort,");
|
|
56
94
|
});
|
|
57
95
|
|
|
58
96
|
it("opens preparation before checking freshness and keeps it through server health", async () => {
|
|
59
97
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
60
98
|
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
61
|
-
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(
|
|
99
|
+
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
62
100
|
const freshness = source.indexOf("const buildSignature = await ensureFreshDashboardBuild();");
|
|
63
101
|
const server = source.indexOf(
|
|
64
|
-
"const { child, port } = await startDashboardServer(
|
|
65
|
-
);
|
|
66
|
-
const redirectAfterServer = source.indexOf(
|
|
67
|
-
"await redirectLaunchPage(launchPage, dashboardUrl(port, token));",
|
|
102
|
+
"const { child, port, dbPath, snapshotCache } = await startDashboardServer(",
|
|
68
103
|
);
|
|
104
|
+
const redirectAfterServer = source.indexOf("await redirectLaunchPage(", server);
|
|
69
105
|
|
|
70
106
|
expect(lock).toBeGreaterThan(-1);
|
|
71
|
-
expect(preparation).
|
|
107
|
+
expect(preparation).toBeLessThan(lock);
|
|
72
108
|
expect(preparation).toBeLessThan(freshness);
|
|
73
109
|
expect(server).toBeGreaterThan(freshness);
|
|
74
110
|
expect(redirectAfterServer).toBeGreaterThan(server);
|
|
75
111
|
});
|
|
76
112
|
|
|
113
|
+
it("reports readiness failures as actionable without retrying a build storm", async () => {
|
|
114
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
115
|
+
const wait = source.slice(
|
|
116
|
+
source.indexOf("async function waitForDashboard"),
|
|
117
|
+
source.indexOf("function exists"),
|
|
118
|
+
);
|
|
119
|
+
expect(wait).toContain("Dashboard data readiness returned ${readiness.status}");
|
|
120
|
+
expect(wait).toContain("unavailable.retryable = false;");
|
|
121
|
+
expect(wait).toContain("if (error?.retryable === false) throw error;");
|
|
122
|
+
expect(wait).toContain("await delay(100);");
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("streams complete structured rebuild progress records even when stderr chunks split a line", async () => {
|
|
126
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
127
|
+
|
|
128
|
+
expect(source).toContain('let startupTelemetryBuffer = "";');
|
|
129
|
+
expect(source).toContain(
|
|
130
|
+
"startupTelemetryBuffer = `${startupTelemetryBuffer}${String(chunk)}`;",
|
|
131
|
+
);
|
|
132
|
+
expect(source).toContain('event?.event === "dashboard_sqlite_rebuild_progress"');
|
|
133
|
+
expect(source).toContain('ZAIP_DASHBOARD_LAUNCH_PROGRESS: "1"');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("uses one durable cache and an append-only worker log for a stale snapshot refresh", async () => {
|
|
137
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
138
|
+
|
|
139
|
+
expect(source).toContain(
|
|
140
|
+
'const sqliteSnapshotCacheDirectory = join(sqliteReadModelDirectory, "cache");',
|
|
141
|
+
);
|
|
142
|
+
expect(source).toContain("ZAIP_SQLITE_CACHE_DIR: sqliteSnapshotCacheDirectory,");
|
|
143
|
+
expect(source).toContain(
|
|
144
|
+
'const refreshLogPath = join(sessionDirectory, "dashboard-sqlite-refresh.log");',
|
|
145
|
+
);
|
|
146
|
+
expect(source).toContain('stdio: ["ignore", refreshLogDescriptor, refreshLogDescriptor]');
|
|
147
|
+
expect(source).toContain("worker log ${refreshLogPath}");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("keeps a visible, actionable handoff watchdog instead of closing the preparation page before navigation", async () => {
|
|
151
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
152
|
+
|
|
153
|
+
expect(source).toContain('id="handoff-link"');
|
|
154
|
+
expect(source).toContain("function showHandoff(target)");
|
|
155
|
+
expect(source).toContain("setTimeout(()=>location.replace(next.target),0)");
|
|
156
|
+
expect(source).toContain("closeAfterHandoffGrace: (graceMs = 12_000)");
|
|
157
|
+
expect(source).toContain("launchPage.closeAfterHandoffGrace();");
|
|
158
|
+
expect(source).not.toContain("await launchPage.close();\n if (!redirected");
|
|
159
|
+
});
|
|
160
|
+
|
|
77
161
|
it("tears down prior owned sessions only after the new browser handoff", async () => {
|
|
78
162
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
79
|
-
const
|
|
80
|
-
"
|
|
163
|
+
const server = source.indexOf(
|
|
164
|
+
"const { child, port, dbPath, snapshotCache } = await startDashboardServer(",
|
|
81
165
|
);
|
|
166
|
+
const redirect = source.indexOf("await redirectLaunchPage(", server);
|
|
82
167
|
const teardown = source.indexOf("for (const previous of previousSessions)");
|
|
83
168
|
|
|
84
169
|
expect(redirect).toBeGreaterThan(-1);
|
|
85
170
|
expect(teardown).toBeGreaterThan(redirect);
|
|
86
|
-
expect(source).toContain("const
|
|
171
|
+
expect(source).toContain("const status = await stopOwnedDashboard(previous);");
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("does not mark an owned prior session closed while its registered listener remains", async () => {
|
|
175
|
+
const source = await readFile(
|
|
176
|
+
new URL("./start-dashboard-processes.mjs", import.meta.url),
|
|
177
|
+
"utf8",
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
expect(source).toContain("const listenerStillMatches = registeredListenerMatches(");
|
|
181
|
+
expect(source).toContain("!listenerStillMatches");
|
|
182
|
+
expect(source).toContain("await stopProcessTreeImpl(session.serverPid);");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("keeps a failed health probe with a foreign listener out of the closed registry state", async () => {
|
|
186
|
+
const stopCalls = [];
|
|
187
|
+
const status = await stopOwnedDashboardProcess(
|
|
188
|
+
{ port: 4317, rootPid: 1234, serverPid: 5678 },
|
|
189
|
+
{
|
|
190
|
+
probeDashboardPort: async () => false,
|
|
191
|
+
workspaceKey,
|
|
192
|
+
fetchImpl: fetch,
|
|
193
|
+
host,
|
|
194
|
+
packageRoot: "unused",
|
|
195
|
+
delay: async () => {},
|
|
196
|
+
listeningProcessIdImpl: async () => 9999,
|
|
197
|
+
isProcessAliveImpl: async () => true,
|
|
198
|
+
stopProcessTreeImpl: async (pid) => stopCalls.push(pid),
|
|
199
|
+
},
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
expect(status).toBe("skipped_unowned");
|
|
203
|
+
expect(stopCalls).toEqual([]);
|
|
87
204
|
});
|
|
88
205
|
|
|
89
206
|
it("does not force a rebuild from the Windows executable", async () => {
|
|
@@ -95,6 +212,60 @@ describe("dashboard executable session", () => {
|
|
|
95
212
|
expect(source).not.toContain("ZAIP_DASHBOARD_FORCE_REBUILD");
|
|
96
213
|
});
|
|
97
214
|
|
|
215
|
+
it("accepts a healthy new same-workspace port without scanning historical active ports", async () => {
|
|
216
|
+
const source = await readFile(
|
|
217
|
+
new URL("../windows-launcher/Program.cs", import.meta.url),
|
|
218
|
+
"utf8",
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
expect(source).toContain("The new same-workspace healthy port is definitive success.");
|
|
222
|
+
expect(source).not.toContain("dashboard-ports.json");
|
|
223
|
+
expect(source).not.toContain("porta anterior reconhecida");
|
|
224
|
+
expect(source).toContain("return true;");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("treats the Node-confirmed handoff as definitive instead of rediscovering mutable session state", async () => {
|
|
228
|
+
const source = await readFile(
|
|
229
|
+
new URL("../windows-launcher/Program.cs", import.meta.url),
|
|
230
|
+
"utf8",
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
const ok = source.indexOf('if (status.StartsWith("ok", StringComparison.OrdinalIgnoreCase))');
|
|
234
|
+
const warning = source.indexOf(
|
|
235
|
+
'if (status.StartsWith("warning", StringComparison.OrdinalIgnoreCase))',
|
|
236
|
+
);
|
|
237
|
+
const okBranch = source.slice(ok, warning);
|
|
238
|
+
|
|
239
|
+
expect(ok).toBeGreaterThan(-1);
|
|
240
|
+
expect(okBranch).toContain("return 0;");
|
|
241
|
+
expect(okBranch).not.toContain("VerifyDashboardLaunch");
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("publishes ok only after Node observed both health and readiness", async () => {
|
|
245
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
246
|
+
const wait = source.slice(
|
|
247
|
+
source.indexOf("async function waitForDashboard"),
|
|
248
|
+
source.indexOf("function exists"),
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
expect(wait).toContain("dashboardHealthUrl(port)");
|
|
252
|
+
expect(wait).toContain("/api/v2/ready");
|
|
253
|
+
expect(source.indexOf('await writeLauncherStatus("ok");')).toBeGreaterThan(
|
|
254
|
+
source.indexOf("await waitForDashboard(port, child);"),
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it("records prior-port cleanup warnings while still publishing an ok handoff", async () => {
|
|
259
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
260
|
+
const cleanup = source.indexOf("const status = await stopOwnedDashboard(previous);");
|
|
261
|
+
const warning = source.indexOf("Dashboard launched on port ${port}; prior-port cleanup:");
|
|
262
|
+
const success = source.indexOf('await writeLauncherStatus("ok");', cleanup);
|
|
263
|
+
|
|
264
|
+
expect(cleanup).toBeGreaterThan(-1);
|
|
265
|
+
expect(warning).toBeGreaterThan(cleanup);
|
|
266
|
+
expect(success).toBeGreaterThan(warning);
|
|
267
|
+
});
|
|
268
|
+
|
|
98
269
|
it("dispatches Windows URLs through the registered protocol handler", () => {
|
|
99
270
|
const target = "http://127.0.0.1:4317/?token=local-session-token";
|
|
100
271
|
const commands = browserLaunchCommands(target, "win32", {
|
|
@@ -122,14 +293,25 @@ describe("dashboard executable session", () => {
|
|
|
122
293
|
expect(calls).toBe(2);
|
|
123
294
|
});
|
|
124
295
|
|
|
125
|
-
it("serves
|
|
296
|
+
it("serves a viewport-covering centered progress overlay while the runtime starts", async () => {
|
|
126
297
|
const launchPage = await startDashboardLaunchPage(0);
|
|
127
298
|
try {
|
|
128
299
|
const page = await fetch(`http://${host}:${launchPage.port}/?token=temporary`);
|
|
129
300
|
const health = await fetch(`http://${host}:${launchPage.port}/api/v2/health`);
|
|
130
301
|
|
|
131
302
|
expect(page.status).toBe(200);
|
|
132
|
-
await
|
|
303
|
+
const html = await page.text();
|
|
304
|
+
expect(html).toContain('class="launch-overlay"');
|
|
305
|
+
expect(html).toContain("position:fixed;inset:0;width:100vw;height:100vh");
|
|
306
|
+
expect(html).toContain("display:grid;place-items:center");
|
|
307
|
+
expect(html).toContain('aria-live="polite" role="status"');
|
|
308
|
+
expect(html).toContain("abra o dashboard agora");
|
|
309
|
+
expect(html).toContain("function showHandoff(target)");
|
|
310
|
+
const progress = await fetch(`http://${host}:${launchPage.port}/api/v2/progress`);
|
|
311
|
+
await expect(progress.json()).resolves.toMatchObject({
|
|
312
|
+
phase: "Iniciando o launcher local",
|
|
313
|
+
percent: expect.any(Number),
|
|
314
|
+
});
|
|
133
315
|
expect(health.status).toBe(503);
|
|
134
316
|
await expect(health.json()).resolves.toEqual({
|
|
135
317
|
kind: "zaip-dashboard-launcher",
|
|
@@ -147,6 +329,22 @@ describe("dashboard executable session", () => {
|
|
|
147
329
|
}
|
|
148
330
|
});
|
|
149
331
|
|
|
332
|
+
it("bounds launch-page shutdown when a browser connection never finishes polling", async () => {
|
|
333
|
+
const launchPage = await startDashboardLaunchPage(0);
|
|
334
|
+
const connection = connect({ host, port: launchPage.port });
|
|
335
|
+
await new Promise((resolveConnected, rejectConnected) => {
|
|
336
|
+
connection.once("connect", resolveConnected);
|
|
337
|
+
connection.once("error", rejectConnected);
|
|
338
|
+
});
|
|
339
|
+
const closed = new Promise((resolveClosed) => connection.once("close", resolveClosed));
|
|
340
|
+
const startedAt = Date.now();
|
|
341
|
+
await launchPage.close({ forceAfterMs: 20 });
|
|
342
|
+
await closed;
|
|
343
|
+
|
|
344
|
+
expect(Date.now() - startedAt).toBeLessThan(500);
|
|
345
|
+
expect(connection.destroyed).toBe(true);
|
|
346
|
+
});
|
|
347
|
+
|
|
150
348
|
it("reuses a healthy session owned by the same workspace", async () => {
|
|
151
349
|
const directory = await temporaryDirectory();
|
|
152
350
|
const path = join(directory, "dashboard-session.json");
|
|
@@ -155,19 +353,24 @@ describe("dashboard executable session", () => {
|
|
|
155
353
|
workspace: workspaceRoot,
|
|
156
354
|
workspaceKey,
|
|
157
355
|
rootPid: 1234,
|
|
356
|
+
serverPid: 5678,
|
|
158
357
|
port: 4317,
|
|
159
358
|
token: "local-session-token",
|
|
359
|
+
buildSignature: "compatible-build",
|
|
360
|
+
snapshotState: "current",
|
|
160
361
|
createdAt: new Date().toISOString(),
|
|
161
362
|
};
|
|
162
363
|
await writeDashboardSession(session, path);
|
|
163
364
|
|
|
164
365
|
const reusable = await findReusableDashboardSession({
|
|
165
366
|
path,
|
|
367
|
+
expectedBuildSignature: "compatible-build",
|
|
166
368
|
fetchImpl: async () =>
|
|
167
369
|
new Response(JSON.stringify({ kind: runtimeKind, workspaceKey }), { status: 200 }),
|
|
168
370
|
});
|
|
169
371
|
|
|
170
372
|
expect(reusable).toEqual(session);
|
|
373
|
+
expect(reusable).toMatchObject({ port: 4317, serverPid: 5678 });
|
|
171
374
|
});
|
|
172
375
|
|
|
173
376
|
it("does not claim a health endpoint from another workspace", async () => {
|
|
@@ -222,6 +425,35 @@ describe("dashboard executable session", () => {
|
|
|
222
425
|
).resolves.toBeNull();
|
|
223
426
|
});
|
|
224
427
|
|
|
428
|
+
it("does not reuse an updating stale snapshot after its background refresh", async () => {
|
|
429
|
+
const directory = await temporaryDirectory();
|
|
430
|
+
const path = join(directory, "dashboard-session.json");
|
|
431
|
+
await writeDashboardSession(
|
|
432
|
+
{
|
|
433
|
+
kind: runtimeKind,
|
|
434
|
+
workspace: workspaceRoot,
|
|
435
|
+
workspaceKey,
|
|
436
|
+
rootPid: 1234,
|
|
437
|
+
serverPid: 5678,
|
|
438
|
+
port: 4317,
|
|
439
|
+
token: "stale-session-token",
|
|
440
|
+
buildSignature: "compatible-build",
|
|
441
|
+
snapshotState: "updating",
|
|
442
|
+
},
|
|
443
|
+
path,
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
await expect(
|
|
447
|
+
findReusableDashboardSession({
|
|
448
|
+
path,
|
|
449
|
+
expectedBuildSignature: "compatible-build",
|
|
450
|
+
expectedSnapshotState: "current",
|
|
451
|
+
fetchImpl: async () =>
|
|
452
|
+
new Response(JSON.stringify({ kind: runtimeKind, workspaceKey }), { status: 200 }),
|
|
453
|
+
}),
|
|
454
|
+
).resolves.toBeNull();
|
|
455
|
+
});
|
|
456
|
+
|
|
225
457
|
it("recognizes an unavailable runtime only for safe cleanup", async () => {
|
|
226
458
|
const fetchImpl = async () =>
|
|
227
459
|
new Response(JSON.stringify({ kind: runtimeKind, workspaceKey, status: "unavailable" }), {
|
|
@@ -254,6 +486,34 @@ describe("dashboard executable session", () => {
|
|
|
254
486
|
expect(selectedPort).not.toBe(previousPort);
|
|
255
487
|
});
|
|
256
488
|
|
|
489
|
+
it("does not report invalid or departed launcher PIDs as live", async () => {
|
|
490
|
+
await expect(isProcessAlive(0)).resolves.toBe(false);
|
|
491
|
+
await expect(isProcessAlive(-1)).resolves.toBe(false);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it("does not authorize teardown when a registry server PID was reused", () => {
|
|
495
|
+
const session = { rootPid: 1234, serverPid: 5678, port: 4317 };
|
|
496
|
+
expect(registeredListenerMatches(session, 9999)).toBe(false);
|
|
497
|
+
expect(registeredListenerMatches(session, null)).toBe(false);
|
|
498
|
+
expect(registeredListenerMatches(session, 5678)).toBe(true);
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
it("keeps skipped unowned listeners auditable without failing a healthy launch", () => {
|
|
502
|
+
expect(teardownWarning("skipped_unowned")).toBe(false);
|
|
503
|
+
expect(teardownWarning("close_failed")).toBe(true);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
it("requires the recorded launcher root to be an ancestor of the server", async () => {
|
|
507
|
+
const parentOf = async (pid) =>
|
|
508
|
+
new Map([
|
|
509
|
+
[30, 20],
|
|
510
|
+
[20, 10],
|
|
511
|
+
[10, null],
|
|
512
|
+
]).get(pid) ?? null;
|
|
513
|
+
await expect(isAncestorProcess(10, 30, parentOf)).resolves.toBe(true);
|
|
514
|
+
await expect(isAncestorProcess(99, 30, parentOf)).resolves.toBe(false);
|
|
515
|
+
});
|
|
516
|
+
|
|
257
517
|
it("persists active and closed dashboard ports per workspace", async () => {
|
|
258
518
|
const directory = await temporaryDirectory();
|
|
259
519
|
const path = join(directory, "dashboard-ports.json");
|
|
@@ -275,6 +535,27 @@ describe("dashboard executable session", () => {
|
|
|
275
535
|
]);
|
|
276
536
|
});
|
|
277
537
|
|
|
538
|
+
it("rechecks a closed registry entry that still has this workspace runtime listening", async () => {
|
|
539
|
+
const directory = await temporaryDirectory();
|
|
540
|
+
const path = join(directory, "dashboard-ports.json");
|
|
541
|
+
const session = {
|
|
542
|
+
rootPid: 1234,
|
|
543
|
+
serverPid: 5678,
|
|
544
|
+
port: 4317,
|
|
545
|
+
createdAt: "2026-07-15T00:00:00.000Z",
|
|
546
|
+
};
|
|
547
|
+
await recordPortStatus(session, "active", path);
|
|
548
|
+
await recordPortStatus(session, "closed", path);
|
|
549
|
+
|
|
550
|
+
await expect(
|
|
551
|
+
previousDashboardSessions({
|
|
552
|
+
sessionPath: join(directory, "missing-session.json"),
|
|
553
|
+
registryPath: path,
|
|
554
|
+
probe: async () => true,
|
|
555
|
+
}),
|
|
556
|
+
).resolves.toEqual([expect.objectContaining({ port: 4317, rootPid: 1234, status: "closed" })]);
|
|
557
|
+
});
|
|
558
|
+
|
|
278
559
|
it("recovers an abandoned launcher lock", async () => {
|
|
279
560
|
const directory = await temporaryDirectory();
|
|
280
561
|
const path = join(directory, "dashboard-launcher.lock");
|
|
@@ -346,20 +627,39 @@ describe("dashboard executable session", () => {
|
|
|
346
627
|
await expect(Promise.all([first, second])).resolves.toEqual(["first", "second"]);
|
|
347
628
|
});
|
|
348
629
|
|
|
349
|
-
it("
|
|
630
|
+
it("opens preparation before waiting and only reuses after checking the current build", async () => {
|
|
350
631
|
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
351
|
-
const
|
|
632
|
+
const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
352
633
|
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
353
|
-
const
|
|
354
|
-
|
|
634
|
+
const buildSignature = source.indexOf(
|
|
635
|
+
"const buildSignature = await ensureFreshDashboardBuild();",
|
|
636
|
+
);
|
|
637
|
+
const reusable = source.indexOf("const reusable = await findReusableDashboardSession({");
|
|
355
638
|
|
|
356
|
-
expect(
|
|
357
|
-
expect(
|
|
358
|
-
expect(
|
|
359
|
-
expect(
|
|
639
|
+
expect(preparation).toBeLessThan(lock);
|
|
640
|
+
expect(buildSignature).toBeGreaterThan(lock);
|
|
641
|
+
expect(reusable).toBeGreaterThan(buildSignature);
|
|
642
|
+
expect(source).toContain(
|
|
643
|
+
"await redirectLaunchPage(launchPage, dashboardUrl(reusable.port, reusable.token));",
|
|
644
|
+
);
|
|
645
|
+
expect(source).toContain(
|
|
646
|
+
'snapshotState: snapshotCache === "stale_seed" ? "updating" : "current",',
|
|
647
|
+
);
|
|
648
|
+
expect(source).toContain("if (launchPage !== null) await launchPage.close().catch(() => {});");
|
|
360
649
|
expect(source).toContain('await writeLauncherStatus("ok");');
|
|
361
650
|
});
|
|
362
651
|
|
|
652
|
+
it("binds preparation atomically instead of reserving a probe-selected port", async () => {
|
|
653
|
+
const source = await readFile(new URL("./start-dashboard.mjs", import.meta.url), "utf8");
|
|
654
|
+
const preparationStart = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
|
|
655
|
+
const lock = source.indexOf("await withLauncherLock(async () => {");
|
|
656
|
+
const beforeLock = source.slice(preparationStart, lock);
|
|
657
|
+
|
|
658
|
+
expect(preparationStart).toBeGreaterThan(-1);
|
|
659
|
+
expect(source).toContain("const launchPort = launchPage.port;");
|
|
660
|
+
expect(beforeLock).not.toContain("findAvailablePortWithFallback(");
|
|
661
|
+
});
|
|
662
|
+
|
|
363
663
|
it("gives the Windows wrapper margin beyond the bounded Node launcher wait", async () => {
|
|
364
664
|
const source = await readFile(
|
|
365
665
|
new URL("../windows-launcher/Program.cs", import.meta.url),
|