@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.
Files changed (410) hide show
  1. package/README.md +6 -4
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.d.ts.map +1 -1
  4. package/dist/services/adapters.js +15 -5
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/adapters.test.js +1 -1
  7. package/dist/services/agent-adapters.d.ts +9 -0
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +38 -3
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +8 -1
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.d.ts +2 -1
  14. package/dist/services/codex-config-template.d.ts.map +1 -1
  15. package/dist/services/codex-config-template.js +13 -2
  16. package/dist/services/codex-config-template.js.map +1 -1
  17. package/dist/services/codex-rules.d.ts +1 -1
  18. package/dist/services/codex-rules.d.ts.map +1 -1
  19. package/dist/services/codex-rules.js +31 -7
  20. package/dist/services/codex-rules.js.map +1 -1
  21. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  22. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  23. package/dist/services/codex-subagent-hook-template.js +4 -1
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/doctor.d.ts.map +1 -1
  26. package/dist/services/doctor.js +3 -1
  27. package/dist/services/doctor.js.map +1 -1
  28. package/dist/services/global-codex-config.d.ts +6 -3
  29. package/dist/services/global-codex-config.d.ts.map +1 -1
  30. package/dist/services/global-codex-config.js +82 -13
  31. package/dist/services/global-codex-config.js.map +1 -1
  32. package/dist/services/global-codex-config.test.js +57 -10
  33. package/dist/services/global-codex-config.test.js.map +1 -1
  34. package/dist/services/install-agents-template.d.ts.map +1 -1
  35. package/dist/services/install-agents-template.js +15 -2
  36. package/dist/services/install-agents-template.js.map +1 -1
  37. package/dist/services/logger.js +1 -1
  38. package/dist/services/logger.js.map +1 -1
  39. package/dist/services/logger.test.js +3 -3
  40. package/dist/services/logger.test.js.map +1 -1
  41. package/dist/services/runtime-template.test.js +21 -5
  42. package/dist/services/runtime-template.test.js.map +1 -1
  43. package/dist/services/template-manifest.d.ts.map +1 -1
  44. package/dist/services/template-manifest.js +2 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/config/agents/catalog.yaml +310 -10
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  57. package/templates/.agents/config/project.yaml +1 -1
  58. package/templates/.agents/dashboard/.zaip-managed.json +659 -163
  59. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  60. package/templates/.agents/dashboard/README.md +48 -97
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-Z60df2r-.js +1 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-Cv-JcoxP.js → DashboardHelpDialog-Cs6dzDmW.js} +294 -109
  63. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-Coc6pA-1.js +1 -0
  64. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +1 -0
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +3 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +1 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +68 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-DFBuc_qp.js +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +2 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-CCQOHdVI.js +9 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-pC2_0J8x.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  79. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  80. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +952 -595
  81. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  82. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  89. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +257 -313
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +149 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +35 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +111 -12
  94. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +70 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +111 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +432 -13
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  102. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  111. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +24 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  114. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +471 -2
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  116. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +196 -39
  118. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  120. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  121. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  122. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +187 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +190 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +121 -0
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +398 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +37 -0
  130. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +55 -5
  131. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  132. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  133. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +64 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +275 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +100 -15
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +131 -40
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +303 -0
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +226 -6
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +479 -402
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +312 -72
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +373 -321
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +52 -14
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +32 -5
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +108 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +60 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +106 -0
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -137
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +956 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +775 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +95 -0
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  177. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  178. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +182 -0
  179. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  180. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  181. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  182. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  183. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +325 -18
  184. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  185. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  186. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  187. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  188. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  189. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +365 -14
  190. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +532 -131
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +314 -358
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +68 -0
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +51 -8
  195. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  196. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  197. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  198. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  199. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +99 -42
  200. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  201. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +255 -34
  202. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +163 -8
  203. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +101 -68
  204. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  205. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -16
  206. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  207. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +50 -1
  208. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +143 -9
  209. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +29 -4
  210. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  211. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  212. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  213. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  214. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  215. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +65 -5
  217. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +19 -0
  219. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  220. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  221. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +136 -0
  222. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  223. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +24 -7
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +165 -6
  232. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  233. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  234. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  235. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  238. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +5 -3
  239. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +4 -83
  240. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  241. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  242. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  243. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  244. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  245. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  246. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  247. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +27 -2
  248. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +22 -13
  249. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  250. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  251. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  252. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  253. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  255. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +324 -0
  256. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  257. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  258. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  259. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  260. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  261. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  262. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  263. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  264. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  265. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  266. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  267. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1756 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1608 -0
  269. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  270. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +12 -0
  271. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +83 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +28 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +262 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +41 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +105 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1643 -107
  277. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  278. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  279. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  281. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +335 -4
  282. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  283. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  284. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +71 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +179 -0
  286. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  288. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  290. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  291. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  292. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +163 -84
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +145 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +551 -266
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1145 -308
  302. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +708 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +2232 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +6151 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  307. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  308. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +437 -190
  310. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +299 -24
  311. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  312. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  313. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  314. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  315. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  316. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  317. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  318. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  319. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +214 -41
  320. package/templates/.agents/dashboard/work-priority.json +34 -0
  321. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  322. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  323. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  324. package/templates/.agents/design/.zaip-managed.json +3 -3
  325. package/templates/.agents/design/apps/catalog/package.json +1 -1
  326. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  327. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  328. package/templates/.agents/requirements/comparative-audit.md +1 -1
  329. package/templates/.agents/requirements/context-engine.md +1 -1
  330. package/templates/.agents/requirements/cost-observability.md +1 -1
  331. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  332. package/templates/.agents/requirements/data-export.md +1 -1
  333. package/templates/.agents/requirements/design-system.md +1 -1
  334. package/templates/.agents/requirements/execution-engine.md +1 -1
  335. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  336. package/templates/.agents/requirements/model-orchestration.md +1 -1
  337. package/templates/.agents/requirements/public-distribution.md +9 -6
  338. package/templates/.agents/requirements/software-architecture.md +1 -1
  339. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  340. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  341. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  342. package/templates/.agents/rules/autonomy-decision.md +15 -0
  343. package/templates/.agents/rules/core.md +1 -1
  344. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  345. package/templates/.agents/rules/specialist-routing.md +19 -0
  346. package/templates/.agents/rules/workflow.md +1 -1
  347. package/templates/.agents/runtime/VERSION +1 -1
  348. package/templates/.agents/runtime/bin/zaip.mjs +114 -64
  349. package/templates/.agents/runtime/checksums.sha256 +6 -4
  350. package/templates/.agents/runtime/manifest.json +3 -1
  351. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  352. package/templates/.agents/runtime/provenance.json +11 -0
  353. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  354. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  355. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +15 -0
  356. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  357. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  358. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  359. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  360. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  361. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  362. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  363. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  364. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  365. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  366. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  367. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  368. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  369. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  370. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  371. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  372. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  373. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +15 -0
  375. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  377. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  378. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +3 -3
  380. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +76 -27
  381. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +128 -24
  382. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +122 -4
  383. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +66 -19
  384. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +193 -7
  385. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +14 -0
  386. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  387. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  388. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  389. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  390. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +18 -0
  392. package/templates/.agents/zaip-aios/INDEX.md +1 -0
  393. package/templates/.agents/zaip-aios/README.md +37 -8
  394. package/templates/.agents/zaip-aios/VERSION +1 -1
  395. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  396. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  397. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  398. package/templates/template-manifest.json +945 -214
  399. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  400. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  401. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  402. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  403. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  404. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  405. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  406. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  407. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  408. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  409. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  410. 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("starts a new runtime instead of reusing a healthy session", async () => {
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).not.toContain("const reusable = await findReusableDashboardSession");
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
- expect(source).toContain(
54
- "const excludedPorts = new Set([...previousSessions.map((session) => session.port), launchPort]);",
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(launchPort);");
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).toBeGreaterThan(lock);
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 stopped = await stopOwnedDashboard(previous);");
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 an immediate dashboard skeleton while the runtime starts", async () => {
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 expect(page.text()).resolves.toContain("Pronto para Executar");
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("coalesces a click that observes a newly handed-off healthy session", async () => {
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 observed = source.indexOf("const observedRootPid = observedSession?.rootPid ?? null;");
613
+ const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(0);");
352
614
  const lock = source.indexOf("await withLauncherLock(async () => {");
353
- const coalesced = source.indexOf("Coalesced dashboard launcher request");
354
- const preparation = source.indexOf("launchPage = await startDashboardLaunchPage(launchPort);");
355
-
356
- expect(observed).toBeGreaterThan(-1);
357
- expect(observed).toBeLessThan(lock);
358
- expect(coalesced).toBeGreaterThan(lock);
359
- expect(preparation).toBeGreaterThan(coalesced);
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),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zaip-ai/dashboard-ui",
3
- "version": "1.0.0",
3
+ "version": "1.0.8",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {