@zaip-ai/cli 2.6.0 → 3.1.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 (312) hide show
  1. package/README.md +36 -13
  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 +5 -2
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.js +12 -9
  7. package/dist/services/agent-adapters.js.map +1 -1
  8. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  9. package/dist/services/codex-conversation-lifecycle-hook.js +32 -21
  10. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  11. package/dist/services/install-agents-template.js +9 -1
  12. package/dist/services/install-agents-template.js.map +1 -1
  13. package/dist/services/runtime-template.test.js +25 -2
  14. package/dist/services/runtime-template.test.js.map +1 -1
  15. package/dist/services/transactional-files.d.ts.map +1 -1
  16. package/dist/services/transactional-files.js +59 -14
  17. package/dist/services/transactional-files.js.map +1 -1
  18. package/package.json +1 -1
  19. package/templates/.agents/README-ENG.md +75 -10
  20. package/templates/.agents/README.md +76 -10
  21. package/templates/.agents/config/agents/catalog.yaml +3 -0
  22. package/templates/.agents/config/agents/discovery.json +2 -2
  23. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -1
  24. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -1
  25. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +1 -1
  26. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -1
  27. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -1
  28. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +1 -1
  29. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -1
  30. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -1
  31. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  32. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +1 -1
  33. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -1
  34. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -1
  35. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -1
  36. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -1
  37. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -1
  38. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +13 -10
  39. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -1
  40. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -1
  41. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -1
  42. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -1
  43. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -1
  44. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +1 -1
  45. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -1
  46. package/templates/.agents/config/project.yaml +10 -1
  47. package/templates/.agents/dashboard/.zaip-managed.json +274 -138
  48. package/templates/.agents/dashboard/README.md +16 -0
  49. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-CGxeQak4.js → CostCalculationGuidePage-CEDZjl4V.js} +1 -1
  50. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-tzS7YxYB.js → DashboardHelpDialog-DIWDmvAS.js} +930 -550
  51. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-DEbCi1gP.js → PricingSettingsDialog-BBRBKaHa.js} +1 -1
  52. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-B9GWkEyN.css +1 -0
  53. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BAvLPAee.js +3 -0
  54. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-t1Om0Abw.js → TraceabilityWorkspace-C9dDhj34.js} +1 -1
  55. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-06__WZco.js +68 -0
  56. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CoAVMZN6.js +828 -0
  57. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DiGC-dsJ.js → icons-vendor-DEmo6Tn2.js} +1 -1
  58. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-BVzw_Wux.js +2 -0
  59. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-kPO6yNed.js → react-vendor-CadYsm83.js} +1 -1
  60. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BzKK8kK3.js +1 -0
  61. package/templates/.agents/dashboard/apps/frontend/dist/index.html +5 -5
  62. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  63. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +10 -5
  64. package/templates/.agents/dashboard/apps/frontend/src/AutonomySettings.tsx +82 -0
  65. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +38 -7
  66. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +164 -171
  67. package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +6 -1
  68. package/templates/.agents/dashboard/apps/frontend/src/cost-monitor-population.test.tsx +149 -0
  69. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +2 -1
  70. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +19 -0
  71. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +22 -1
  72. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.test.ts +54 -0
  73. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +20 -2
  74. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.test.ts +37 -43
  75. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +9 -251
  76. package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +34 -7
  77. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.test.ts +51 -0
  78. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +3 -1
  79. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +35 -0
  80. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +19 -4
  81. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +5 -3
  82. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +112 -23
  83. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +49 -12
  84. package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +181 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +11 -1
  86. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +34 -51
  87. package/templates/.agents/dashboard/apps/frontend/src/project-settings-state.css +55 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +12 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +1 -1
  90. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +1 -2
  91. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +6 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +2 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +3 -1
  94. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +4 -15
  95. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +2 -2
  96. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  97. package/templates/.agents/dashboard/modules/cost-monitor/src/complete-cost-average.test.ts +73 -0
  98. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +9 -0
  99. package/templates/.agents/dashboard/modules/cost-monitor/src/period-averages.ts +60 -0
  100. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +8 -22
  101. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +2 -3
  102. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.tsx +32 -8
  103. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +3 -2
  104. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +1 -42
  105. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +2 -1
  106. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +3 -2
  107. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +8 -2
  108. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  109. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  110. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +4 -3
  111. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +66 -3
  112. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +71 -1
  113. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +36 -30
  114. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +5 -14
  115. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
  116. package/templates/.agents/dashboard/modules/operations/src/react/OverviewCostKpi.tsx +46 -0
  117. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +28 -1
  118. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +11 -4
  119. package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
  120. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +2 -2
  121. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +28 -8
  122. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +19 -2
  123. package/templates/.agents/dashboard/modules/operations/src/react/overview-cost-card.test.tsx +89 -0
  124. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +3 -3
  125. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +2 -1
  126. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  127. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  128. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  129. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  130. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +279 -245
  131. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +247 -215
  132. package/templates/.agents/dashboard/packages/local-runtime/package.json +2 -2
  133. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +15 -25
  134. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +279 -245
  135. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +1 -1
  136. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.test.ts +142 -0
  137. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.ts +190 -0
  138. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +65 -0
  139. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +67 -66
  140. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.test.ts +91 -0
  141. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +24 -4
  142. package/templates/.agents/dashboard/packages/local-runtime/src/server-hono-security.test.ts +17 -0
  143. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +21 -2
  144. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +94 -2
  145. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +62 -12
  146. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +26 -0
  147. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +4 -1
  148. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.test.ts +97 -0
  149. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +10 -13
  150. package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +2 -10
  151. package/templates/.agents/dashboard/packages/local-runtime/src/server-traceability-index.test.ts +84 -0
  152. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +15 -1
  153. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-calendar.ts +17 -0
  154. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cold-parse.test.ts +78 -0
  155. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-dimension-facts.test.ts +12 -1
  156. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.test.ts +94 -0
  157. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +5 -5
  158. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-duration-lookup.test.ts +59 -0
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-entity-label-views.test.ts +72 -0
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-file-index.test.ts +69 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +3 -1
  162. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +3 -1
  163. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +2 -0
  164. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +9 -0
  165. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +4 -5
  166. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +46 -0
  167. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-provider-alias-parity.test.ts +50 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.test.ts +171 -0
  169. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +36 -16
  170. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +13 -2
  171. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +25 -7
  172. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +2 -0
  173. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical-parsing.ts +7 -0
  174. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +5 -15
  175. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +34 -10
  176. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +17 -3
  177. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +1 -1
  178. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +11 -0
  179. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +5 -4
  180. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +54 -1
  181. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +7 -3
  182. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +4 -1
  183. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-risk-population.test.ts +98 -0
  184. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +29 -16
  185. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +2 -1
  186. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +2 -0
  187. package/templates/.agents/dashboard/packages/local-runtime/src/verify-project-settings.mjs +57 -0
  188. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  189. package/templates/.agents/dashboard/scripts/qualify-observability.mjs +130 -0
  190. package/templates/.agents/dashboard/scripts/verify-autonomy-settings.mjs +175 -0
  191. package/templates/.agents/dashboard/scripts/verify-observability.mjs +254 -0
  192. package/templates/.agents/dashboard/scripts/verify-project-setup.mjs +64 -0
  193. package/templates/.agents/dashboard/tests/e2e/lease-global-setup.ts +37 -0
  194. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  195. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +5 -3
  196. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-period-transition.spec.ts +22 -1
  197. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +17 -8
  198. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +47 -6
  199. package/templates/.agents/dashboard/tests/e2e/specs/lease-lifetime.spec.ts +14 -0
  200. package/templates/.agents/dashboard/tests/observability-fixture.mjs +200 -0
  201. package/templates/.agents/design/.zaip-managed.json +84 -40
  202. package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +72 -0
  203. package/templates/.agents/design/apps/catalog/dist/assets/index-BOjCcUaU.js +72 -0
  204. package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +72 -0
  205. package/templates/.agents/design/apps/catalog/dist/assets/index-CqtYXZfV.js +72 -0
  206. package/templates/.agents/design/apps/catalog/dist/assets/index-D_lfqoyx.js +72 -0
  207. package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +9 -0
  208. package/templates/.agents/design/apps/catalog/dist/index.html +1 -1
  209. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +1 -0
  210. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-B-kAgAjB.js → Color-6AOWCN3U-Cm-yJJz_.js} +1 -1
  211. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +137 -0
  212. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +1 -0
  213. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-BVN7xHtv.js → DocsRenderer-JROSPFPF-Belk4jRr.js} +4 -4
  214. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-CDHtKYkz.js → WithTooltip-7X4HQR7L-DoPvjkS1.js} +1 -1
  215. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-D6AsDkMK.js → chunk-DRQKCCAG-B1itKXEN.js} +1 -1
  216. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-B4m5uloN.js → chunk-W22LQPXL-C-Eb5SPY.js} +1 -1
  217. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-CN8YyTUg.js → components-DnyKLwhj.js} +5 -5
  218. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +1 -0
  219. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-9yZfIsdT.js → iframe-DcXBsFPz.js} +3 -3
  220. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-BoCSnq6H.js → react-18-CRM89QRf.js} +1 -1
  221. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +1 -0
  222. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-Bnn_nMwJ.js → syntaxhighlighter-YFXUGROL-B03jQGTF.js} +1 -1
  223. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-DS_ue2sb.js → theming-4ZyufAga.js} +1 -1
  224. package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +1 -1
  225. package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
  226. package/templates/.agents/design/apps/catalog/package.json +2 -2
  227. package/templates/.agents/design/apps/catalog/src/components/AutonomySpecimen.tsx +15 -0
  228. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.test.tsx +19 -0
  229. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.tsx +45 -0
  230. package/templates/.agents/design/apps/catalog/src/components/EstimatedCostSpecimen.tsx +48 -0
  231. package/templates/.agents/design/apps/catalog/src/components/ProjectStatusSpecimen.tsx +169 -0
  232. package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +55 -0
  233. package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +60 -0
  234. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  235. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  236. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  237. package/templates/.agents/requirements/comparative-audit.md +1 -1
  238. package/templates/.agents/requirements/context-engine.md +1 -1
  239. package/templates/.agents/requirements/cost-observability.md +1 -1
  240. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  241. package/templates/.agents/requirements/data-export.md +1 -1
  242. package/templates/.agents/requirements/design-system.md +1 -1
  243. package/templates/.agents/requirements/execution-engine.md +1 -1
  244. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  245. package/templates/.agents/requirements/model-orchestration.md +1 -1
  246. package/templates/.agents/requirements/public-distribution.md +1 -1
  247. package/templates/.agents/requirements/software-architecture.md +1 -1
  248. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  249. package/templates/.agents/requirements/work-lifecycle.md +5 -5
  250. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  251. package/templates/.agents/rules/astra-diagnostic.md +3 -1
  252. package/templates/.agents/rules/autonomy-decision.md +10 -2
  253. package/templates/.agents/rules/core.md +12 -1
  254. package/templates/.agents/rules/run-lifecycle-closure.md +8 -6
  255. package/templates/.agents/rules/workflow.md +2 -2
  256. package/templates/.agents/runtime/VERSION +1 -1
  257. package/templates/.agents/runtime/bin/zaip.mjs +383 -350
  258. package/templates/.agents/runtime/checksums.sha256 +6 -6
  259. package/templates/.agents/runtime/manifest.json +1 -1
  260. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  261. package/templates/.agents/runtime/provenance.json +5 -5
  262. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  263. package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +2 -0
  264. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +28 -5
  265. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +17 -3
  266. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +8 -9
  267. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +10 -6
  268. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +17 -12
  269. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +2 -0
  270. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +2 -0
  271. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +21 -23
  272. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +37 -13
  273. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +2 -0
  274. package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +2 -0
  275. package/templates/.agents/zaip-aios/INDEX.md +9 -1
  276. package/templates/.agents/zaip-aios/README.md +24 -2
  277. package/templates/.agents/zaip-aios/VERSION +1 -1
  278. package/templates/.agents/zaip-aios/guides/01-primeiros-passos.md +5 -1
  279. package/templates/.agents/zaip-aios/guides/03-tasks.md +15 -2
  280. package/templates/.agents/zaip-aios/guides/04-specs.md +13 -0
  281. package/templates/.agents/zaip-aios/guides/05-prds.md +13 -0
  282. package/templates/.agents/zaip-aios/guides/06-execucao.md +19 -4
  283. package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +14 -0
  284. package/templates/.agents/zaip-aios/guides/08-contexto-e-tokens.md +4 -3
  285. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +17 -9
  286. package/templates/.agents/zaip-aios/guides/10-seguranca.md +9 -0
  287. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +69 -0
  288. package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +9 -4
  289. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +7 -1
  290. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +18 -0
  291. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +54 -3
  292. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +10 -2
  293. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +186 -5
  294. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +21 -15
  295. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +18 -2
  296. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +14 -2
  297. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +190 -489
  298. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +72 -13
  299. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +18 -0
  300. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +18 -1
  301. package/templates/template-manifest.json +454 -274
  302. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-1L7Qw-Gq.js +0 -3
  303. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-EInWr641.css +0 -1
  304. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-B6aZfo5f.js +0 -68
  305. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CLJ0lT9v.js +0 -231
  306. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DgTmNHN5.js +0 -2
  307. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DQpKX9c1.js +0 -1
  308. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BWY-80s4.js +0 -1
  309. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-Be2mDUQj.js +0 -27
  310. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DRx9blDs.js +0 -1
  311. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-EwuTh8Zk.js +0 -1
  312. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-DyL61NPT.js +0 -1
@@ -1,4 +1,4 @@
1
- import { type FormEvent, type ReactNode, useEffect, useState } from "react";
1
+ import { type FormEvent, type ReactNode, useCallback, useEffect, useState } from "react";
2
2
  import type {
3
3
  DashboardApiClient,
4
4
  ProjectConfigSettings,
@@ -6,9 +6,14 @@ import type {
6
6
  } from "./dashboard-api.js";
7
7
  import { StackComponentEditor, StackVersions } from "./ProjectStackEditor.js";
8
8
  import {
9
+ type InstallationDimensionStatus,
9
10
  projectInstallationStatus,
10
11
  projectSettingsSummaryMetrics,
11
12
  } from "./project-installation-status.js";
13
+ import {
14
+ projectSettingsCopy as copy,
15
+ type ProjectSettingsLocale as Locale,
16
+ } from "./project-settings-copy.js";
12
17
  import {
13
18
  buildProjectSettingsPayload,
14
19
  defaultAutonomousExecution,
@@ -20,139 +25,7 @@ import {
20
25
  } from "./project-settings-model.js";
21
26
  import "./project-settings-page.css";
22
27
  import "./project-stack-versions.css";
23
-
24
- type Locale = "pt-BR" | "en-US";
25
- const copy = {
26
- "pt-BR": {
27
- eyebrow: "Configurações",
28
- title: "Configuração do projeto",
29
- intro: "Edite o arquivo central do projeto com validação do schema antes da gravação.",
30
- loading: "Carregando…",
31
- back: "Voltar ao dashboard",
32
- save: "Salvar configurações",
33
- saving: "Validando e salvando…",
34
- saved: "Configurações salvas e validadas.",
35
- framework: "Framework ZAIP-AIOS",
36
- frameworkHint: "Ativa ou desativa o framework para este projeto.",
37
- identity: "Identidade do projeto",
38
- stack: "Stack e linguagens",
39
- execution: "Execução",
40
- assurance: "Assurance",
41
- executionToggleHint:
42
- "Grava ou remove o bloco execution. Sem ele, o projeto usa execução manual.",
43
- runtimeHint:
44
- "Manual apenas materializa o trabalho; autonomous executa a DAG pelo provider configurado quando as precondições passam.",
45
- providerHint: "Provider que inicia os agentes da execução autônoma: Codex ou Claude.",
46
- executionModelHint:
47
- "Modelo-base do runtime autônomo. A política automática de PRD/SPEC ainda pode selecionar um modelo permitido por agente.",
48
- parallelismHint:
49
- "Teto de agentes simultâneos. O valor efetivo é o menor limite entre projeto, DAG, provider e squad.",
50
- leaseHint:
51
- "Valor persistido no projeto. O coordenador atual ainda usa internamente um lease fixo de 60 segundos.",
52
- assuranceToggleHint:
53
- "Ativa ou remove os gates de evidência, revisão e qualidade do projeto. Recomenda-se manter ativo.",
54
- assuranceVersionHint: "Versão do contrato de assurance. É fixa e somente leitura.",
55
- assuranceDepthHint:
56
- "Auto ajusta o rigor ao escopo; base exige o conjunto padrão; elevated amplia validações para mudanças mais abrangentes.",
57
- finalCommitHint:
58
- "Exige que as evidências comprovem o commit final integrado. Sinais de produção ou migração ainda podem exigir isso mesmo quando desativado.",
59
- context: "Contexto",
60
- overview: "Visão geral do projeto",
61
- available: "Criado",
62
- unavailable: "Ainda não criado",
63
- componentGuide:
64
- "Preencha cada responsabilidade separadamente. A versão fica sem prefixos (^, ~, >=) e a referência identifica o pacote, imagem ou serviço.",
65
- versionHint: "Versão exata: 22.16.0 ou 17.6. Deixe vazio para serviços sem versão fixada.",
66
- referenceHint:
67
- "Ex.: npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase ou provider:cloudflare-pages.",
68
- overrides: "Opções avançadas (JSON)",
69
- overridesHint:
70
- "Use apenas fatos técnicos transversais confirmados. Deixe vazio quando não houver exceções.",
71
- versions: "Versões detectadas no workspace",
72
- exact: "Verificada",
73
- constraint: "Requisito",
74
- versionUnavailable: "Não encontrada",
75
- runtime: "Runtime do Dashboard",
76
- installed: "Instalado no projeto",
77
- missing: "Ausente no projeto",
78
- bundled: "Empacotado no Dashboard",
79
- current: "Atual",
80
- configured: "Configurado",
81
- installation: "Instalação",
82
- incompleteInstallation:
83
- "Nem todas as dependências técnicas locais deste computador foram instaladas.",
84
- dismiss: "Fechar aviso",
85
- contextGuide:
86
- "O contexto começa pelas fontes canônicas e inclui somente arquivos relevantes para a tarefa. Saídas geradas são consultadas apenas em setup, release ou checagem de paridade.",
87
- contextDomains:
88
- "Branding, Marketing, Growth e Sales são usados sob demanda pelos respectivos especialistas, quando houver uma tarefa e artefatos desses domínios. Não os adicione aqui apenas por existirem como capacidades.",
89
- },
90
- "en-US": {
91
- eyebrow: "Settings",
92
- title: "Project settings",
93
- intro: "Edit the central project file with schema validation before writing.",
94
- loading: "Loading project settings…",
95
- back: "Back to dashboard",
96
- save: "Save settings",
97
- saving: "Validating and saving…",
98
- saved: "Settings saved and validated.",
99
- framework: "ZAIP-AIOS framework",
100
- frameworkHint: "Enable or disable the framework for this project.",
101
- identity: "Project identity",
102
- stack: "Stack and languages",
103
- execution: "Execution",
104
- assurance: "Assurance",
105
- executionToggleHint:
106
- "Writes or removes the execution block. Without it, the project uses manual execution.",
107
- runtimeHint:
108
- "Manual only materializes work; autonomous runs the DAG through the configured provider after preconditions pass.",
109
- providerHint: "Provider that starts autonomous execution agents: Codex or Claude.",
110
- executionModelHint:
111
- "Base model for the autonomous runtime. PRD/SPEC automatic policy may still select an allowed model per agent.",
112
- parallelismHint:
113
- "Maximum simultaneous agents. Effective parallelism is the smallest project, DAG, provider, and squad limit.",
114
- leaseHint:
115
- "Value persisted in the project. The current coordinator still uses a fixed internal 60-second lease.",
116
- assuranceToggleHint:
117
- "Enables or removes project evidence, review, and quality gates. Keeping it enabled is recommended.",
118
- assuranceVersionHint: "Assurance contract version. It is fixed and read-only.",
119
- assuranceDepthHint:
120
- "Auto adapts rigor to scope; base uses the standard set; elevated expands validation for broader changes.",
121
- finalCommitHint:
122
- "Requires evidence for the final integrated commit. Production or migration signals may still require it when disabled.",
123
- context: "Context",
124
- overview: "Project overview",
125
- available: "Created",
126
- unavailable: "Not created yet",
127
- componentGuide:
128
- "Fill each responsibility separately. Versions have no prefixes (^, ~, >=), and the reference identifies the package, image, or service.",
129
- versionHint:
130
- "Exact version: 22.16.0 or 17.6. Leave blank for services without a pinned version.",
131
- referenceHint:
132
- "E.g. npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase, or provider:cloudflare-pages.",
133
- overrides: "Advanced options (JSON)",
134
- overridesHint:
135
- "Use only confirmed cross-cutting technical facts. Leave empty when there are no exceptions.",
136
- versions: "Versions detected in the workspace",
137
- exact: "Verified",
138
- constraint: "Requirement",
139
- versionUnavailable: "Not found",
140
- runtime: "Dashboard runtime",
141
- installed: "Installed in project",
142
- missing: "Missing from project",
143
- bundled: "Bundled in Dashboard",
144
- current: "Current",
145
- configured: "Configured",
146
- installation: "Installation",
147
- incompleteInstallation:
148
- "Not all local technical dependencies have been installed on this computer.",
149
- dismiss: "Dismiss notification",
150
- contextGuide:
151
- "Context starts from canonical sources and includes only files relevant to the task. Generated outputs are consulted only for setup, release, or parity checks.",
152
- contextDomains:
153
- "Branding, Marketing, Growth, and Sales are used on demand by their respective specialists when there is a task and artifacts in those domains. Do not add them here merely because they exist as capabilities.",
154
- },
155
- } as const;
28
+ import { AutonomySettings } from "./AutonomySettings.js";
156
29
 
157
30
  export function ProjectSettingsPage({
158
31
  api,
@@ -169,28 +42,41 @@ export function ProjectSettingsPage({
169
42
  const [stackComponents, setStackComponents] = useState<StackComponentsDraft | null>(null);
170
43
  const [otherOverrides, setOtherOverrides] = useState("{}");
171
44
  const [saving, setSaving] = useState(false);
45
+ const [loading, setLoading] = useState(true);
172
46
  const [error, setError] = useState<string | null>(null);
173
47
  const [notice, setNotice] = useState<string | null>(null);
174
48
  const [installationToastVisible, setInstallationToastVisible] = useState(false);
175
49
  const installation = overview === null ? null : projectInstallationStatus(overview);
176
50
 
177
- useEffect(() => {
178
- void Promise.all([api.projectSettings(), api.projectOverview()])
179
- .then(([loaded, projectOverview]) => {
180
- const draft = projectSettingsDraft(loaded);
181
- setConfig(loaded);
182
- setOverview(projectOverview);
183
- setStackComponents(
184
- withDetectedStackVersions(draft.components, projectOverview.stack_components),
185
- );
186
- setOtherOverrides(draft.otherOverrides);
187
- })
188
- .catch((cause) => setError(cause instanceof Error ? cause.message : String(cause)));
51
+ const loadProjectSettings = useCallback(async () => {
52
+ setLoading(true);
53
+ setError(null);
54
+ try {
55
+ const [loaded, projectOverview] = await Promise.all([
56
+ api.projectSettings(),
57
+ api.projectOverview(),
58
+ ]);
59
+ const draft = projectSettingsDraft(loaded);
60
+ setConfig(loaded);
61
+ setOverview(projectOverview);
62
+ setStackComponents(
63
+ withDetectedStackVersions(draft.components, projectOverview.stack_components),
64
+ );
65
+ setOtherOverrides(draft.otherOverrides);
66
+ } catch (cause) {
67
+ setError(cause instanceof Error ? cause.message : String(cause));
68
+ } finally {
69
+ setLoading(false);
70
+ }
189
71
  }, [api]);
190
72
 
73
+ useEffect(() => {
74
+ void loadProjectSettings();
75
+ }, [loadProjectSettings]);
76
+
191
77
  useEffect(() => {
192
78
  setInstallationToastVisible(
193
- overview !== null && projectInstallationStatus(overview).complete === false,
79
+ overview !== null && projectInstallationStatus(overview).hasMissingDependencies,
194
80
  );
195
81
  }, [overview]);
196
82
 
@@ -223,7 +109,7 @@ export function ProjectSettingsPage({
223
109
  }
224
110
 
225
111
  if (config === null) {
226
- const isLoading = error === null;
112
+ const isLoading = loading && error === null;
227
113
  return (
228
114
  <main aria-busy={isLoading} className="project-settings-state">
229
115
  <div
@@ -233,7 +119,13 @@ export function ProjectSettingsPage({
233
119
  >
234
120
  {isLoading ? <span aria-hidden="true" className="project-settings-loader" /> : null}
235
121
  <p>{text.eyebrow}</p>
236
- <h1>{error ?? text.loading}</h1>
122
+ <h1>{error ? text.loadError : text.loading}</h1>
123
+ {error ? <p className="project-settings-state-error">{error}</p> : null}
124
+ {error ? (
125
+ <button onClick={() => void loadProjectSettings()} type="button">
126
+ {text.retry}
127
+ </button>
128
+ ) : null}
237
129
  <button onClick={onClose} type="button">
238
130
  ← {text.back}
239
131
  </button>
@@ -256,7 +148,11 @@ export function ProjectSettingsPage({
256
148
  </button>
257
149
  </header>
258
150
 
259
- {error ? <div className="project-settings-message is-error">{error}</div> : null}
151
+ {error ? (
152
+ <div className="project-settings-message is-error" role="alert">
153
+ {error}
154
+ </div>
155
+ ) : null}
260
156
  {notice ? (
261
157
  <div className="project-settings-message is-success" role="status">
262
158
  {notice}
@@ -285,20 +181,11 @@ export function ProjectSettingsPage({
285
181
  projectSettingsSummaryMetrics(overview.metrics).map((metric) => (
286
182
  <div className="project-settings-metric" key={metric.id}>
287
183
  <strong>{metric.value}</strong>
288
- <span>{metric.label}</span>
184
+ <span>{text.metricLabels[metric.id]}</span>
289
185
  </div>
290
186
  ))}
291
187
  {installation ? (
292
- <div
293
- className={`project-settings-metric installation-metric ${
294
- installation.complete ? "is-complete" : "is-incomplete"
295
- }`}
296
- >
297
- <strong>{formatInstallationPercentage(installation.percentage, locale)}</strong>
298
- <span>
299
- {text.installation} · {installation.completed}/{installation.total}
300
- </span>
301
- </div>
188
+ <InstallationMetrics installation={installation} locale={locale} />
302
189
  ) : null}
303
190
  </section>
304
191
 
@@ -307,11 +194,15 @@ export function ProjectSettingsPage({
307
194
  {overview?.areas.map((area) => (
308
195
  <div className="project-overview-item" key={area.id}>
309
196
  <div>
310
- <strong>{area.label}</strong>
197
+ <strong>{text.areaLabels[area.id]}</strong>
311
198
  <code>{area.artifact}</code>
312
199
  </div>
313
200
  <span className={area.available ? "is-available" : "is-unavailable"}>
314
- {area.available ? text.available : text.unavailable}
201
+ {area.available === true
202
+ ? text.available
203
+ : area.available === false
204
+ ? text.artifactUnavailable
205
+ : text.unavailable}
315
206
  </span>
316
207
  </div>
317
208
  ))}
@@ -407,7 +298,9 @@ export function ProjectSettingsPage({
407
298
  onChange={(checked) =>
408
299
  setConfig({
409
300
  ...config,
410
- execution: checked ? { runtime: "manual" } : undefined,
301
+ execution: checked
302
+ ? { ...defaultAutonomousExecution(), runtime: "managed" }
303
+ : undefined,
411
304
  })
412
305
  }
413
306
  />
@@ -416,27 +309,44 @@ export function ProjectSettingsPage({
416
309
  <Field hint={text.runtimeHint} label="Runtime">
417
310
  <select
418
311
  value={config.execution.runtime}
312
+ aria-label="Runtime"
419
313
  onChange={(event) =>
420
314
  setConfig({
421
315
  ...config,
422
316
  execution:
423
317
  event.target.value === "manual"
424
318
  ? { runtime: "manual" }
425
- : defaultAutonomousExecution(),
319
+ : {
320
+ ...defaultAutonomousExecution(),
321
+ runtime:
322
+ event.target.value === "managed" ? "managed" : "autonomous",
323
+ },
426
324
  })
427
325
  }
428
326
  >
429
327
  <option value="manual">manual</option>
328
+ <option value="managed">managed (PRD/SPEC)</option>
430
329
  <option value="autonomous">autonomous</option>
431
330
  </select>
432
331
  </Field>
433
- {config.execution.runtime === "autonomous" ? (
332
+ {config.execution.runtime !== "manual" ? (
434
333
  <AutonomousExecutionFields config={config} setConfig={setConfig} text={text} />
435
334
  ) : null}
436
335
  </>
437
336
  ) : null}
438
337
  </SettingsCard>
439
338
 
339
+ <SettingsCard
340
+ title={locale === "pt-BR" ? "Autonomia e recuperação" : "Autonomy and recovery"}
341
+ >
342
+ <AutonomySettings
343
+ value={config.autonomy}
344
+ disabled={saving}
345
+ locale={locale}
346
+ onChange={(autonomy) => setConfig({ ...config, autonomy })}
347
+ />
348
+ </SettingsCard>
349
+
440
350
  <SettingsCard title={text.assurance}>
441
351
  <OptionalSectionToggle
442
352
  checked={config.assurance !== undefined}
@@ -594,7 +504,7 @@ export function ProjectSettingsPage({
594
504
  </button>
595
505
  </footer>
596
506
  </form>
597
- {installationToastVisible && installation?.complete === false ? (
507
+ {installationToastVisible && installation?.hasMissingDependencies ? (
598
508
  <div aria-live="assertive" className="project-installation-toast" role="alert">
599
509
  <span>{text.incompleteInstallation}</span>
600
510
  <button
@@ -614,6 +524,81 @@ function formatInstallationPercentage(percentage: number, locale: Locale) {
614
524
  return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(percentage)}%`;
615
525
  }
616
526
 
527
+ function InstallationMetrics({
528
+ installation,
529
+ locale,
530
+ }: {
531
+ installation: ReturnType<typeof projectInstallationStatus>;
532
+ locale: Locale;
533
+ }) {
534
+ const text = copy[locale];
535
+ return (
536
+ <>
537
+ <p className="project-installation-health">
538
+ {text.health}:{" "}
539
+ {installation.health.state === "healthy"
540
+ ? locale === "pt-BR"
541
+ ? "Saudável"
542
+ : "Healthy"
543
+ : installation.health.state === "degraded"
544
+ ? locale === "pt-BR"
545
+ ? "Degradada"
546
+ : "Degraded"
547
+ : text.unknown}
548
+ </p>
549
+ <InstallationMetric
550
+ dimension={installation.dependencies}
551
+ label={text.dependencies}
552
+ locale={locale}
553
+ />
554
+ <InstallationMetric
555
+ dimension={installation.documentation}
556
+ label={text.documentation}
557
+ locale={locale}
558
+ />
559
+ </>
560
+ );
561
+ }
562
+
563
+ function InstallationMetric({
564
+ dimension,
565
+ label,
566
+ locale,
567
+ }: {
568
+ dimension: InstallationDimensionStatus;
569
+ label: string;
570
+ locale: Locale;
571
+ }) {
572
+ const text = copy[locale];
573
+ const detail =
574
+ dimension.state === "not_applicable"
575
+ ? text.notApplicable
576
+ : dimension.percentage === null
577
+ ? text.unknown
578
+ : formatInstallationPercentage(dimension.percentage, locale);
579
+ const stateLabel = installationStateLabel(dimension.state, locale);
580
+ return (
581
+ <div className={`project-settings-metric installation-metric is-${dimension.state}`}>
582
+ <strong>{detail}</strong>
583
+ <span>
584
+ {dimension.total === null || dimension.completed === null
585
+ ? label
586
+ : `${label} · ${dimension.completed}/${dimension.total}`}
587
+ </span>
588
+ <small>{stateLabel}</small>
589
+ </div>
590
+ );
591
+ }
592
+
593
+ function installationStateLabel(state: InstallationDimensionStatus["state"], locale: Locale) {
594
+ const text = copy[locale];
595
+ if (state === "complete") return text.complete;
596
+ if (state === "incomplete") return text.incomplete;
597
+ if (state === "not_applicable") return text.notApplicable;
598
+ if (state === "unavailable") return text.unavailable;
599
+ return text.unknown;
600
+ }
601
+
617
602
  function SettingsCard({
618
603
  children,
619
604
  className = "",
@@ -682,14 +667,20 @@ function AutonomousExecutionFields({
682
667
  text: (typeof copy)[Locale];
683
668
  }) {
684
669
  const execution =
685
- config.execution?.runtime === "autonomous" ? config.execution : defaultAutonomousExecution();
670
+ config.execution && config.execution.runtime !== "manual"
671
+ ? config.execution
672
+ : defaultAutonomousExecution();
686
673
  const update = (autonomous: typeof execution.autonomous) =>
687
- setConfig({ ...config, execution: { runtime: "autonomous", autonomous } });
674
+ setConfig({ ...config, execution: { runtime: execution.runtime, autonomous } });
688
675
  return (
689
676
  <>
690
- <Field hint={text.providerHint} label="Provider">
677
+ <Field
678
+ hint={config.autonomy?.version === 1 ? text.autonomyProviderHint : text.providerHint}
679
+ label="Provider"
680
+ >
691
681
  <select
692
682
  value={execution.autonomous.provider}
683
+ aria-label="Provider"
693
684
  onChange={(event) =>
694
685
  update({
695
686
  ...execution.autonomous,
@@ -698,7 +689,9 @@ function AutonomousExecutionFields({
698
689
  }
699
690
  >
700
691
  <option value="codex">codex</option>
701
- <option value="claude">claude</option>
692
+ <option value="claude" disabled={config.autonomy?.version === 1}>
693
+ claude
694
+ </option>
702
695
  </select>
703
696
  </Field>
704
697
  <Field hint={text.executionModelHint} label="Model">
@@ -1,7 +1,12 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  /** Explicit composition owners; moving a boundary must keep its contract checks. */
3
3
  export function readAppCompositionSource(): string {
4
- return ["use-dashboard-app-model.tsx", "AppDashboardContent.tsx", "use-app-work-board.ts"]
4
+ return [
5
+ "use-dashboard-app-model.tsx",
6
+ "AppDashboardContent.tsx",
7
+ "use-app-work-board.ts",
8
+ "dashboard-cost-facts.ts",
9
+ ]
5
10
  .map((path) => readFileSync(new URL(`../${path}`, import.meta.url), "utf8"))
6
11
  .join("\n");
7
12
  }
@@ -0,0 +1,149 @@
1
+ import type { ComponentProps } from "react";
2
+ import { renderToStaticMarkup } from "react-dom/server";
3
+ import { describe, expect, it } from "vitest";
4
+ import { CostMonitorContent } from "../../../modules/cost-monitor/src/react/CostMonitorContent.js";
5
+ import { CostPeriodAverageCards } from "../../../modules/cost-monitor/src/react/CostPeriodAverageCards.js";
6
+
7
+ const metric = {
8
+ events: 0,
9
+ tokens: { input: null, cached_input: null, output: null, reasoning: null, total: null },
10
+ cost: { usd: null, brl: null },
11
+ coverage: { events: 0, tokens: 0, usd: 0, brl: 0 },
12
+ };
13
+ const totals = {
14
+ run_count: 2,
15
+ task_count: 1,
16
+ prd_count: 0,
17
+ spec_count: 0,
18
+ evidence_count: 0,
19
+ test_count: 0,
20
+ event_count: 2,
21
+ total_tokens: 20,
22
+ estimated_usd: 10,
23
+ estimated_brl: 50,
24
+ duration_ms: 2000,
25
+ duration: { known_sum: 2000, unknown: 0, complete: true, coverage_ratio: 1 },
26
+ };
27
+ const row = {
28
+ ...totals,
29
+ key: "openai",
30
+ label: "openai",
31
+ latest_started_at: "2026-09-10T12:00:00Z",
32
+ coverage: { events: 2, tokens: 2, usd: 2, brl: 2 },
33
+ };
34
+ function props(): ComponentProps<typeof CostMonitorContent> {
35
+ return {
36
+ canonicalDurationTotal: 2000,
37
+ compactPage: null,
38
+ compactPageError: null,
39
+ compactPageLoading: false,
40
+ compactPageOffset: 0,
41
+ currency: "BRL",
42
+ detailError: null,
43
+ detailLoading: false,
44
+ developerPanel: null,
45
+ dimensionalDetailPending: false,
46
+ dimensionalRows: [],
47
+ groups: {
48
+ agents: [],
49
+ annual: [],
50
+ conversations: [],
51
+ daily: [],
52
+ models: [],
53
+ monthly: [],
54
+ providers: [row],
55
+ tasks: [],
56
+ },
57
+ groupPage: { offset: 0, limit: 10, total_count: 1, has_more: false, totals },
58
+ groupPageLoading: false,
59
+ groupPageOffset: 0,
60
+ locale: "pt-BR",
61
+ macroDetails: undefined,
62
+ onOpenRun: () => {},
63
+ onOpenTrace: () => {},
64
+ pagedRunRows: [],
65
+ retryCompactPage: () => {},
66
+ retryRunPage: () => {},
67
+ rows: [],
68
+ runPageData: null,
69
+ runPageError: null,
70
+ runPageLoading: false,
71
+ runPageOffset: 0,
72
+ serverPagingEligible: true,
73
+ setCompactPageOffset: () => {},
74
+ setGroupPageOffset: () => {},
75
+ setDetailAttempt: () => {},
76
+ setRunPageOffset: () => {},
77
+ summaryUsage: { conversation: metric, planning: metric, execution: metric, total: metric },
78
+ summaryTotals: { ...totals, estimated_brl: 999, estimated_usd: 199 },
79
+ useAggregateGroups: true,
80
+ usingCompactPage: false,
81
+ view: "providers",
82
+ visibleExecutions: [],
83
+ visiblePrds: [],
84
+ visibleSpecs: [],
85
+ };
86
+ }
87
+
88
+ describe("Cost monitor rendered populations", () => {
89
+ it("retains temporal query totals instead of overwriting them with unrelated cards", () => {
90
+ const base = props();
91
+ const html = renderToStaticMarkup(
92
+ <CostMonitorContent
93
+ {...base}
94
+ view="daily"
95
+ groups={{ ...base.groups, daily: [{ ...row, key: "2026-09-10", label: "2026-09-10" }] }}
96
+ />,
97
+ );
98
+ expect(html).toContain("50,00");
99
+ expect(html).not.toContain("999");
100
+ });
101
+ it("renders full-period averages independently of page rows and distinguishes missing metadata", () => {
102
+ const base = props();
103
+ const averages = { tasks: 1.5, specs: 0, prds: 0, durationMs: 1000, tokens: 500, cost: 75 };
104
+ if (base.groupPage === null) throw new Error("Expected fixture page");
105
+ const page = {
106
+ ...base.groupPage,
107
+ period_averages: { BRL: averages, USD: { ...averages, cost: 15 } },
108
+ };
109
+ const html = renderToStaticMarkup(
110
+ <CostMonitorContent {...base} view="daily" groupPage={page} />,
111
+ );
112
+ expect(html).toContain("75,00");
113
+ expect(html).toContain("1,5");
114
+ const absent = renderToStaticMarkup(<CostMonitorContent {...base} view="daily" />);
115
+ expect(absent).toContain("Indisponível");
116
+ expect(absent).not.toContain("75,00");
117
+ });
118
+ it.each([
119
+ "BRL",
120
+ "USD",
121
+ ] as const)("uses provider query totals, not unrelated global totals (%s)", (currency) => {
122
+ const html = renderToStaticMarkup(<CostMonitorContent {...props()} currency={currency} />);
123
+ expect(html).toContain("openai");
124
+ expect(html).not.toContain("999");
125
+ expect(html).not.toContain("199");
126
+ expect(html).toContain(currency === "BRL" ? "50,00" : "10,00");
127
+ });
128
+
129
+ it("shows a loading status rather than zero or stale averages on a pending period", () => {
130
+ const html = renderToStaticMarkup(
131
+ <CostMonitorContent {...props()} view="daily" groupPageLoading />,
132
+ );
133
+ expect(html).toContain("Carregando médias");
134
+ expect(html).not.toContain("Médio por dia");
135
+ });
136
+
137
+ it("distinguishes loaded zero from loading, including English", () => {
138
+ const loaded = renderToStaticMarkup(
139
+ <CostPeriodAverageCards currency="BRL" locale="pt-BR" period="daily" rows={[]} />,
140
+ );
141
+ expect(loaded).toContain("Médio por dia");
142
+ expect(loaded).not.toContain("Carregando");
143
+ const loading = renderToStaticMarkup(
144
+ <CostPeriodAverageCards currency="USD" locale="en-US" period="monthly" rows={[]} loading />,
145
+ );
146
+ expect(loading).toContain("Loading averages");
147
+ expect(loading).not.toContain("Monthly average");
148
+ });
149
+ });
@@ -76,6 +76,7 @@ export interface AgentCatalogSettings {
76
76
  }
77
77
 
78
78
  export interface ProjectConfigSettings {
79
+ autonomy?: { version: 1; preset: "essential" | "balanced" | "persistent" } | undefined;
79
80
  schema_version: 1;
80
81
  zaip?: { enabled: boolean };
81
82
  project: {
@@ -126,7 +127,7 @@ export interface ProjectConfigSettings {
126
127
  execution?:
127
128
  | { runtime: "manual" }
128
129
  | {
129
- runtime: "autonomous";
130
+ runtime: "autonomous" | "managed";
130
131
  autonomous: {
131
132
  provider: "codex" | "claude";
132
133
  model: string;
@@ -11,6 +11,25 @@ describe("DashboardApiClient reconciliation", () => {
11
11
  vi.unstubAllGlobals();
12
12
  });
13
13
 
14
+ it("loads the bounded all-status traceability index rather than Kanban stages", async () => {
15
+ vi.stubGlobal("window", globalThis);
16
+ const payload = {
17
+ tasks: [{ id: "TASK-DRAFT", status: "draft" }],
18
+ total: 11,
19
+ offset: 10,
20
+ limit: 10,
21
+ };
22
+ const fetchMock = vi.fn(async () => new Response(JSON.stringify(payload), { status: 200 }));
23
+ vi.stubGlobal("fetch", fetchMock);
24
+ await expect(new DashboardApiClient("session").traceabilityTasks(10, 10)).resolves.toEqual(
25
+ payload,
26
+ );
27
+ expect(fetchMock).toHaveBeenCalledWith(
28
+ "/api/v2/operations?scope=traceability&offset=10&limit=10",
29
+ expect.objectContaining({ headers: expect.anything() }),
30
+ );
31
+ });
32
+
14
33
  it("keeps the manual reconciliation request alive past the normal dashboard timeout", async () => {
15
34
  vi.useFakeTimers();
16
35
  vi.stubGlobal("window", globalThis);