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