@zaip-ai/cli 2.2.0 → 2.6.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 (420) hide show
  1. package/dist/services/adapters.d.ts +1 -1
  2. package/dist/services/adapters.d.ts.map +1 -1
  3. package/dist/services/adapters.js +23 -9
  4. package/dist/services/adapters.js.map +1 -1
  5. package/dist/services/agent-adapters.js +25 -9
  6. package/dist/services/agent-adapters.js.map +1 -1
  7. package/dist/services/agent-discovery.d.ts +27 -0
  8. package/dist/services/agent-discovery.d.ts.map +1 -0
  9. package/dist/services/agent-discovery.js +73 -0
  10. package/dist/services/agent-discovery.js.map +1 -0
  11. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  12. package/dist/services/codex-conversation-lifecycle-hook.js +153 -24
  13. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  14. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  15. package/dist/services/codex-pre-tool-hook-template.js +146 -72
  16. package/dist/services/codex-pre-tool-hook-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 +3 -3
  20. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  21. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  22. package/dist/services/codex-subagent-hook-template.js +117 -66
  23. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  24. package/dist/services/install-agents-template.d.ts.map +1 -1
  25. package/dist/services/install-agents-template.js +56 -6
  26. package/dist/services/install-agents-template.js.map +1 -1
  27. package/dist/services/logger.js +1 -1
  28. package/dist/services/logger.js.map +1 -1
  29. package/dist/services/logger.test.js +22 -1
  30. package/dist/services/logger.test.js.map +1 -1
  31. package/dist/services/runtime-template.test.js +129 -0
  32. package/dist/services/runtime-template.test.js.map +1 -1
  33. package/package.json +1 -1
  34. package/templates/.agents/.env.example +9 -3
  35. package/templates/.agents/README-ENG.md +30 -5
  36. package/templates/.agents/README.md +30 -7
  37. package/templates/.agents/architecture/software-architecture.md +1 -59
  38. package/templates/.agents/branding/brandbook.md +3 -0
  39. package/templates/.agents/config/agents/catalog.yaml +22 -10
  40. package/templates/.agents/config/agents/discovery.json +319 -0
  41. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +2 -2
  42. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +2 -2
  43. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +11 -8
  44. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +2 -2
  45. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +2 -2
  46. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +2 -2
  47. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +2 -2
  48. package/templates/.agents/config/pricing/models.json +9 -5
  49. package/templates/.agents/config/project.yaml +12 -1
  50. package/templates/.agents/dashboard/.zaip-managed.json +375 -95
  51. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-CGxeQak4.js +1 -0
  52. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DaSllaJp.js → DashboardHelpDialog-tzS7YxYB.js} +57 -33
  53. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-DEbCi1gP.js +1 -0
  54. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-1L7Qw-Gq.js +3 -0
  55. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-EInWr641.css +1 -0
  56. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-t1Om0Abw.js +1 -0
  57. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-B6aZfo5f.js +68 -0
  58. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-TPUT2IUt.js → icons-vendor-DiGC-dsJ.js} +1 -1
  59. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DgTmNHN5.js +2 -0
  60. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-Ct48XHGL.js → react-vendor-kPO6yNed.js} +1 -1
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-Bh1tDfsg.js +1 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DQpKX9c1.js +1 -0
  63. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  64. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  65. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +3 -1264
  66. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +363 -0
  67. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +99 -0
  68. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +62 -6
  69. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +3 -1
  70. package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +7 -0
  71. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -7
  72. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +151 -0
  73. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +28 -153
  74. package/templates/.agents/dashboard/apps/frontend/src/dashboard-app-shell.tsx +33 -0
  75. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +30 -0
  76. package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +7 -1
  77. package/templates/.agents/dashboard/apps/frontend/src/dashboard-retry.ts +17 -0
  78. package/templates/.agents/dashboard/apps/frontend/src/dashboard-setup-route.ts +29 -0
  79. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +66 -0
  80. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +3 -2
  81. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +2 -2
  82. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +48 -0
  83. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +29 -0
  84. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +68 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
  86. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.test.ts +36 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.ts +30 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +2 -5
  89. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +30 -19
  90. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +9 -1
  91. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +77 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +397 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +782 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/use-snapshot-notice.tsx +49 -0
  95. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  96. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperPanelSlot.tsx +16 -0
  97. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +459 -0
  98. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +27 -17
  99. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +62 -186
  100. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorRunDialog.tsx +20 -0
  101. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-hides-calls-that-have-no-collected.test.ts +80 -0
  102. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +455 -0
  103. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +18 -525
  104. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +32 -508
  105. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-export-sources.ts +74 -0
  106. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-actions.ts +19 -0
  107. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +49 -0
  108. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +115 -0
  109. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test-fixtures.ts +2 -0
  110. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  111. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +4 -0
  112. package/templates/.agents/dashboard/modules/operations/src/react/EntityTableBadges.tsx +34 -0
  113. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +8 -38
  114. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +243 -0
  115. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +27 -275
  116. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +70 -247
  117. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +171 -0
  118. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewPanels.tsx +64 -0
  119. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +4 -3
  120. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +2 -1
  121. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +2 -1
  122. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +6 -2
  123. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +6 -14
  124. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +3 -1
  125. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +2 -0
  126. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +32 -0
  127. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  128. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  129. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  130. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  131. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  132. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1458 -1458
  133. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1425 -1425
  134. package/templates/.agents/dashboard/packages/local-runtime/package.json +2 -1
  135. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +7 -3
  136. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1458 -1459
  137. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +25 -0
  138. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +1 -1
  139. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +53 -8
  140. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +79 -24
  141. package/templates/.agents/dashboard/packages/local-runtime/src/projection-refresh-diagnostics.ts +35 -0
  142. package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +168 -0
  143. package/templates/.agents/dashboard/packages/local-runtime/src/server-dual-reads-manifest-summaries-without-losing.test.ts +344 -0
  144. package/templates/.agents/dashboard/packages/local-runtime/src/server-http-contracts.ts +31 -0
  145. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +345 -0
  146. package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +461 -0
  147. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +78 -0
  148. package/templates/.agents/dashboard/packages/local-runtime/src/server-route-context.ts +13 -0
  149. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +18 -0
  150. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +19 -3
  151. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -21
  152. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-view-allowlist.test.ts +25 -0
  153. package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +64 -0
  154. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +2 -30
  155. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +6 -23
  156. package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +1 -1
  157. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +2 -330
  158. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +73 -1060
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-first-fold.ts +78 -0
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +561 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +600 -0
  162. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +1 -1
  163. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +269 -0
  164. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-context.ts +32 -0
  165. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +244 -0
  166. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +292 -0
  167. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +547 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +360 -0
  169. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +169 -0
  170. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +475 -0
  171. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +132 -0
  172. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-timing.ts +299 -0
  173. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +692 -0
  174. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +739 -0
  175. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-does-not-convert-delayed-historical-finalizer.test.ts +706 -0
  176. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +748 -0
  177. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +1 -1
  178. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +710 -0
  179. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-marks-token-cost-telemetry-unavailable-when.test.ts +618 -0
  180. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +755 -0
  181. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuilds-disposable-snapshot-serves-zaip-records.test.ts +276 -0
  182. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +193 -0
  183. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-types.ts +123 -0
  184. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1 -2805
  185. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +17 -6930
  186. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +385 -0
  187. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +412 -0
  188. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +4 -3
  189. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-build.mjs +195 -0
  190. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.test.mjs +2 -7
  191. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-logging.mjs +35 -0
  192. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-navigation.mjs +114 -0
  193. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-paths.mjs +90 -0
  194. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +89 -418
  195. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +22 -12
  196. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  197. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  198. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -1
  199. package/templates/.agents/design/.zaip-managed.json +5 -5
  200. package/templates/.agents/design/DESIGN.md +2 -186
  201. package/templates/.agents/design/README.md +12 -2
  202. package/templates/.agents/design/apps/catalog/package.json +1 -1
  203. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  204. package/templates/.agents/growth/strategy.md +3 -0
  205. package/templates/.agents/marketing/strategy.md +3 -0
  206. package/templates/.agents/requirements/autonomous-assurance.md +2 -1
  207. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  208. package/templates/.agents/requirements/comparative-audit.md +1 -1
  209. package/templates/.agents/requirements/context-engine.md +1 -1
  210. package/templates/.agents/requirements/cost-observability.md +1 -1
  211. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  212. package/templates/.agents/requirements/data-export.md +1 -1
  213. package/templates/.agents/requirements/design-system.md +13 -4
  214. package/templates/.agents/requirements/execution-engine.md +1 -1
  215. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  216. package/templates/.agents/requirements/model-orchestration.md +1 -1
  217. package/templates/.agents/requirements/public-distribution.md +4 -2
  218. package/templates/.agents/requirements/software-architecture.md +1 -1
  219. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  220. package/templates/.agents/requirements/work-lifecycle.md +3 -3
  221. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  222. package/templates/.agents/rules/architecture.md +2 -0
  223. package/templates/.agents/rules/astra-diagnostic.md +1 -1
  224. package/templates/.agents/rules/autonomy-decision.md +3 -1
  225. package/templates/.agents/rules/cloud-hostinger-autonomy.md +2 -0
  226. package/templates/.agents/rules/context.md +2 -1
  227. package/templates/.agents/rules/core.md +3 -3
  228. package/templates/.agents/rules/design-system-central-contract.md +17 -0
  229. package/templates/.agents/rules/evolution.md +3 -1
  230. package/templates/.agents/rules/frontend-lite.md +3 -1
  231. package/templates/.agents/rules/local-sqlite-storage.md +2 -2
  232. package/templates/.agents/rules/meta-mcp.md +3 -1
  233. package/templates/.agents/rules/model-orchestration.md +1 -1
  234. package/templates/.agents/rules/run-lifecycle-closure.md +6 -4
  235. package/templates/.agents/rules/security.md +3 -1
  236. package/templates/.agents/rules/specialist-routing.md +3 -1
  237. package/templates/.agents/rules/text-writing-utf8.md +1 -1
  238. package/templates/.agents/rules/workflow.md +7 -5
  239. package/templates/.agents/runtime/VERSION +1 -1
  240. package/templates/.agents/runtime/bin/zaip.mjs +519 -247
  241. package/templates/.agents/runtime/checksums.sha256 +6 -6
  242. package/templates/.agents/runtime/manifest.json +1 -1
  243. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  244. package/templates/.agents/runtime/provenance.json +5 -5
  245. package/templates/.agents/runtime/sbom.cdx.json +1 -1
  246. package/templates/.agents/sales/playbook.md +3 -0
  247. package/templates/.agents/skills/zaip-aios/SKILL.md +5 -3
  248. package/templates/.agents/skills/zaip-skill-adapt-stack/SKILL.md +1 -0
  249. package/templates/.agents/skills/zaip-skill-api-contracts/SKILL.md +14 -0
  250. package/templates/.agents/skills/zaip-skill-api-contracts/agents/openai.yaml +4 -0
  251. package/templates/.agents/skills/zaip-skill-application-observability/SKILL.md +15 -0
  252. package/templates/.agents/skills/zaip-skill-application-observability/agents/openai.yaml +4 -0
  253. package/templates/.agents/skills/zaip-skill-application-observability/references/signal-design.md +3 -0
  254. package/templates/.agents/skills/zaip-skill-application-readiness/SKILL.md +15 -0
  255. package/templates/.agents/skills/zaip-skill-application-readiness/agents/openai.yaml +4 -0
  256. package/templates/.agents/skills/zaip-skill-application-readiness/references/evidence-matrix.md +3 -0
  257. package/templates/.agents/skills/zaip-skill-architecture-design/SKILL.md +14 -0
  258. package/templates/.agents/skills/zaip-skill-architecture-design/agents/openai.yaml +4 -0
  259. package/templates/.agents/skills/zaip-skill-async-jobs/SKILL.md +14 -0
  260. package/templates/.agents/skills/zaip-skill-async-jobs/agents/openai.yaml +4 -0
  261. package/templates/.agents/skills/zaip-skill-auth-tenancy/SKILL.md +15 -0
  262. package/templates/.agents/skills/zaip-skill-auth-tenancy/agents/openai.yaml +4 -0
  263. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/data-access-paths.md +9 -0
  264. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/worker-scenario.md +5 -0
  265. package/templates/.agents/skills/zaip-skill-auth-tenancy/scripts/worker-contract.test.mjs +27 -0
  266. package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +2 -0
  267. package/templates/.agents/skills/zaip-skill-author-skills/references/engineering-skill-index.md +9 -0
  268. package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +5 -3
  269. package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
  270. package/templates/.agents/skills/zaip-skill-backend/SKILL.md +4 -0
  271. package/templates/.agents/skills/zaip-skill-backend/references/deployment-environments.md +75 -0
  272. package/templates/.agents/skills/zaip-skill-backend/references/supabase-migration-contract.md +23 -0
  273. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +2 -0
  274. package/templates/.agents/skills/zaip-skill-cache-strategy/SKILL.md +14 -0
  275. package/templates/.agents/skills/zaip-skill-cache-strategy/agents/openai.yaml +4 -0
  276. package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
  277. package/templates/.agents/skills/zaip-skill-cloud-engineering/SKILL.md +7 -0
  278. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/SKILL.md +37 -0
  279. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/agents/openai.yaml +6 -0
  280. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workers-static-assets.md +26 -0
  281. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workflow-templates.md +71 -0
  282. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/scripts/cloudflare-github-deploy-contract.test.mjs +77 -0
  283. package/templates/.agents/skills/zaip-skill-config/SKILL.md +21 -11
  284. package/templates/.agents/skills/zaip-skill-config/agents/openai.yaml +2 -2
  285. package/templates/.agents/skills/zaip-skill-container-runtime/SKILL.md +14 -0
  286. package/templates/.agents/skills/zaip-skill-container-runtime/agents/openai.yaml +4 -0
  287. package/templates/.agents/skills/zaip-skill-context/SKILL.md +6 -1
  288. package/templates/.agents/skills/zaip-skill-context/references/prd-spec-task-handoff.md +10 -0
  289. package/templates/.agents/skills/zaip-skill-context/references/rule-selection.md +20 -0
  290. package/templates/.agents/skills/zaip-skill-cqrs/SKILL.md +1 -0
  291. package/templates/.agents/skills/zaip-skill-cybersecurity/SKILL.md +18 -0
  292. package/templates/.agents/skills/zaip-skill-cybersecurity/agents/openai.yaml +4 -0
  293. package/templates/.agents/skills/zaip-skill-cybersecurity/references/audit-contract.md +94 -0
  294. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.mjs +185 -0
  295. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.test.mjs +101 -0
  296. package/templates/.agents/skills/zaip-skill-data-modeling/SKILL.md +14 -0
  297. package/templates/.agents/skills/zaip-skill-data-modeling/agents/openai.yaml +4 -0
  298. package/templates/.agents/skills/zaip-skill-database-migrations/SKILL.md +20 -0
  299. package/templates/.agents/skills/zaip-skill-database-migrations/agents/openai.yaml +4 -0
  300. package/templates/.agents/skills/zaip-skill-database-migrations/references/manual-mode.md +15 -0
  301. package/templates/.agents/skills/zaip-skill-database-migrations/references/promotion-example.md +5 -0
  302. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.mjs +145 -0
  303. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.test.mjs +178 -0
  304. package/templates/.agents/skills/zaip-skill-dependency-upgrade/SKILL.md +14 -0
  305. package/templates/.agents/skills/zaip-skill-dependency-upgrade/agents/openai.yaml +4 -0
  306. package/templates/.agents/skills/zaip-skill-deployment-pipeline/SKILL.md +15 -0
  307. package/templates/.agents/skills/zaip-skill-deployment-pipeline/agents/openai.yaml +4 -0
  308. package/templates/.agents/skills/zaip-skill-deployment-pipeline/references/runtime-shapes.md +3 -0
  309. package/templates/.agents/skills/zaip-skill-design-system/SKILL.md +20 -9
  310. package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +14 -0
  311. package/templates/.agents/skills/zaip-skill-dev-environment/agents/openai.yaml +4 -0
  312. package/templates/.agents/skills/zaip-skill-dev-environment/references/inventory-contract.md +7 -0
  313. package/templates/.agents/skills/zaip-skill-dev-environment/scripts/inventory.mjs +77 -0
  314. package/templates/.agents/skills/zaip-skill-disaster-recovery/SKILL.md +15 -0
  315. package/templates/.agents/skills/zaip-skill-disaster-recovery/agents/openai.yaml +4 -0
  316. package/templates/.agents/skills/zaip-skill-disaster-recovery/references/recovery-scope.md +3 -0
  317. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +3 -3
  318. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +7 -0
  319. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +1 -5
  320. package/templates/.agents/skills/zaip-skill-external-integrations/SKILL.md +14 -0
  321. package/templates/.agents/skills/zaip-skill-external-integrations/agents/openai.yaml +4 -0
  322. package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -0
  323. package/templates/.agents/skills/zaip-skill-frontend-componentization/SKILL.md +44 -0
  324. package/templates/.agents/skills/zaip-skill-frontend-componentization/agents/openai.yaml +4 -0
  325. package/templates/.agents/skills/zaip-skill-frontend-data-flows/SKILL.md +14 -0
  326. package/templates/.agents/skills/zaip-skill-frontend-data-flows/agents/openai.yaml +4 -0
  327. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +2 -0
  328. package/templates/.agents/skills/zaip-skill-github-actions-setup/SKILL.md +36 -0
  329. package/templates/.agents/skills/zaip-skill-github-actions-setup/agents/openai.yaml +4 -0
  330. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/cloudflare-pages.md +33 -0
  331. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/github.md +63 -0
  332. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/hostinger-vps.md +55 -0
  333. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/npm.md +30 -0
  334. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/check-skill.mjs +55 -0
  335. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs +61 -0
  336. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.test.mjs +128 -0
  337. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-ssh.integration.test.mjs +106 -0
  338. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +43 -76
  339. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +131 -0
  340. package/templates/.agents/skills/zaip-skill-github-deploy/references/github-release-workflow-template.md +31 -0
  341. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-gate-matrix.md +24 -0
  342. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +44 -0
  343. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-notes.md +134 -0
  344. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +389 -0
  345. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +134 -0
  346. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +25 -2
  347. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness-api.test.mjs +134 -0
  348. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.mjs +98 -0
  349. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.test.mjs +25 -0
  350. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.mjs +159 -0
  351. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.test.mjs +160 -0
  352. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +149 -12
  353. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +64 -5
  354. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/release-notes-coverage.test.mjs +126 -0
  355. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.mjs +78 -0
  356. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.test.mjs +51 -0
  357. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs +184 -0
  358. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs +109 -0
  359. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +2 -0
  360. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +18 -10
  361. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +3 -4
  362. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/aws-cli-terraform.md +62 -0
  363. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/guia-iniciante-hostinger-vps.md +183 -0
  364. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +2 -0
  365. package/templates/.agents/skills/zaip-skill-module-scaffold/SKILL.md +14 -0
  366. package/templates/.agents/skills/zaip-skill-module-scaffold/agents/openai.yaml +4 -0
  367. package/templates/.agents/skills/zaip-skill-module-scaffold/references/scaffold-contract.md +9 -0
  368. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/helpers.test.mjs +121 -0
  369. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs +169 -0
  370. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +1 -1
  371. package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +1 -1
  372. package/templates/.agents/skills/zaip-skill-performance-engineering/SKILL.md +14 -0
  373. package/templates/.agents/skills/zaip-skill-performance-engineering/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +1 -1
  375. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +1 -0
  376. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +26 -9
  377. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +39 -13
  378. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +1 -0
  379. package/templates/.agents/skills/zaip-skill-refactor-landing-page/SKILL.md +66 -0
  380. package/templates/.agents/skills/zaip-skill-refactor-landing-page/agents/openai.yaml +4 -0
  381. package/templates/.agents/skills/zaip-skill-refactor-landing-page/references/behavioral-dry-run.md +23 -0
  382. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +40 -1
  383. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +98 -0
  384. package/templates/.agents/skills/zaip-skill-review/SKILL.md +1 -0
  385. package/templates/.agents/skills/zaip-skill-rules/SKILL.md +3 -3
  386. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +2 -0
  387. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +19 -21
  388. package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +2 -2
  389. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +3 -2
  390. package/templates/.agents/skills/zaip-skill-storage-uploads/SKILL.md +14 -0
  391. package/templates/.agents/skills/zaip-skill-storage-uploads/agents/openai.yaml +4 -0
  392. package/templates/.agents/skills/zaip-skill-systematic-debugging/SKILL.md +14 -0
  393. package/templates/.agents/skills/zaip-skill-systematic-debugging/agents/openai.yaml +4 -0
  394. package/templates/.agents/skills/zaip-skill-task/SKILL.md +16 -7
  395. package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +25 -0
  396. package/templates/.agents/skills/zaip-skill-test-data/SKILL.md +14 -0
  397. package/templates/.agents/skills/zaip-skill-test-data/agents/openai.yaml +4 -0
  398. package/templates/.agents/skills/zaip-skill-test-data/scripts/generate.mjs +72 -0
  399. package/templates/.agents/skills/zaip-skill-testing-strategy/SKILL.md +15 -0
  400. package/templates/.agents/skills/zaip-skill-testing-strategy/agents/openai.yaml +4 -0
  401. package/templates/.agents/skills/zaip-skill-testing-strategy/references/example-map.md +3 -0
  402. package/templates/.agents/skills/zaip-skill-website-readiness/SKILL.md +8 -0
  403. package/templates/.agents/zaip-aios/VERSION +1 -1
  404. package/templates/.agents/zaip-aios/guides/10-seguranca.md +2 -1
  405. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +5 -3
  406. package/templates/scripts/validate-cloud-hostinger-contract.mjs +34 -0
  407. package/templates/template-manifest.json +955 -211
  408. package/templates/.agents/branding/.gitkeep +0 -0
  409. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-snUCQYTC.js +0 -1
  410. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-BPtVUGgs.js +0 -1
  411. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +0 -3
  412. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-GgzpZ_PY.css +0 -1
  413. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BCvZFMEf.js +0 -1
  414. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +0 -68
  415. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-_MEktQNM.js +0 -2
  416. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +0 -1
  417. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BDe4_Ubl.js +0 -1
  418. package/templates/.agents/growth/.gitkeep +0 -0
  419. package/templates/.agents/marketing/.gitkeep +0 -0
  420. package/templates/.agents/sales/.gitkeep +0 -0
@@ -0,0 +1,412 @@
1
+ export const dashboardViewSql = ` CREATE VIEW vw_operations_work_list AS SELECT * FROM vw_entities;
2
+ -- Full work summary retains historical activity coverage for internal
3
+ -- entity summaries. It is not the Kanban population.
4
+ CREATE VIEW vw_operations_work_summary AS
5
+ WITH task_lineage AS (
6
+ SELECT DISTINCT
7
+ CAST(task.value AS TEXT) AS task_id,
8
+ COALESCE(c.source_spec_id, CASE WHEN c.source_type='spec' THEN c.source_id END) AS spec_id,
9
+ COALESCE(c.source_prd_id, CASE WHEN c.source_type='prd' THEN c.source_id END) AS prd_id
10
+ FROM canonical_changes c, json_each(c.task_ids_json) AS task
11
+ ), lineage_cardinality AS (
12
+ -- Parent creation Runs are not observed Task Runs. They can be
13
+ -- displayed on a child only when exactly one canonical Task owns
14
+ -- that lineage, preventing a shared macro total from being copied
15
+ -- into sibling cards.
16
+ SELECT spec_id, prd_id, COUNT(*) AS task_count
17
+ FROM task_lineage
18
+ GROUP BY spec_id, prd_id
19
+ ), entity_activity AS (
20
+ SELECT 'task' AS entity_kind, task_id AS entity_id, * FROM activities WHERE task_id IS NOT NULL
21
+ UNION ALL SELECT 'spec', spec_id, * FROM macro_spec_activities
22
+ UNION ALL SELECT 'prd', prd_id, * FROM activities WHERE prd_id IS NOT NULL
23
+ UNION ALL
24
+ SELECT 'task', l.task_id, a.*
25
+ FROM task_lineage l
26
+ JOIN lineage_cardinality cardinality
27
+ ON cardinality.spec_id IS l.spec_id AND cardinality.prd_id IS l.prd_id
28
+ JOIN activities a
29
+ ON a.task_id IS NULL
30
+ AND (
31
+ (l.spec_id IS NOT NULL AND a.spec_id = l.spec_id)
32
+ OR (
33
+ l.spec_id IS NULL
34
+ AND l.prd_id IS NOT NULL
35
+ AND a.spec_id IS NULL
36
+ AND a.prd_id = l.prd_id
37
+ )
38
+ )
39
+ WHERE cardinality.task_count = 1
40
+ AND NOT EXISTS (SELECT 1 FROM activities direct WHERE direct.task_id = l.task_id)
41
+ ), financial AS (
42
+ SELECT entity_kind, entity_id,
43
+ COUNT(*) AS invocation_count,
44
+ SUM(llm_call_count) AS llm_call_count,
45
+ SUM(total_tokens) AS total_tokens,
46
+ SUM(cost_usd) AS total_cost_usd,
47
+ SUM(cost_brl) AS total_cost_brl
48
+ FROM entity_activity GROUP BY entity_kind, entity_id
49
+ ), durations AS (
50
+ SELECT entity_kind, entity_id, ROUND(SUM(duration_ms)) AS total_duration
51
+ FROM entity_activity GROUP BY entity_kind, entity_id
52
+ )
53
+ SELECT w.entity_kind, w.id, w.title, w.status, w.risk, w.occurred_at, w.occurred_day_sp,
54
+ f.invocation_count, f.llm_call_count, d.total_duration,
55
+ f.total_tokens, f.total_cost_usd, f.total_cost_brl
56
+ FROM work_items w
57
+ LEFT JOIN financial f ON f.entity_kind=w.entity_kind AND f.entity_id=w.id
58
+ LEFT JOIN durations d ON d.entity_kind=w.entity_kind AND d.entity_id=w.id;
59
+ -- Kanban is a lifecycle surface: it lists only canonical records.
60
+ -- Telemetry-only identifiers remain Cost Monitor facts but cannot
61
+ -- create a synthetic operational card.
62
+ CREATE VIEW vw_operations_work_kanban AS
63
+ SELECT summary.*
64
+ FROM canonical_work_items canonical
65
+ JOIN vw_operations_work_summary summary
66
+ ON summary.entity_kind=canonical.entity_kind AND summary.id=canonical.id;
67
+ CREATE VIEW vw_operations_executions AS
68
+ WITH metrics AS (
69
+ SELECT i.execution_id,
70
+ CASE COUNT(DISTINCT t.risk) WHEN 0 THEN NULL WHEN 1 THEN MIN(t.risk) ELSE 'mixed' END AS risk,
71
+ MIN(i.occurred_at) AS telemetry_started_at,
72
+ SUM(i.llm_call_count) AS llm_call_count,
73
+ SUM(i.duration_ms) AS duration_ms,
74
+ CASE WHEN COUNT(i.duration_ms) > 0 THEN 'observed' ELSE 'unavailable' END AS duration_provenance,
75
+ SUM(i.total_tokens) AS total_tokens,
76
+ SUM(i.cost_brl) AS total_cost_brl,
77
+ COUNT(*) AS invocation_count
78
+ FROM invocations i LEFT JOIN tasks t ON t.id=i.task_id
79
+ WHERE i.execution_id IS NOT NULL GROUP BY i.execution_id
80
+ )
81
+ SELECT c.id AS execution_id, c.status, m.risk,
82
+ c.created_at AS started_at, c.finished_at,
83
+ c.kind AS execution_kind, c.origin_type,
84
+ CASE WHEN c.origin_type='task' THEN c.origin_id END AS task_id,
85
+ CASE WHEN c.origin_type='interaction' THEN c.origin_id END AS conversation_id,
86
+ m.llm_call_count, m.duration_ms, COALESCE(m.duration_provenance, 'unavailable') AS duration_provenance,
87
+ CASE WHEN c.status IN ('completed', 'failed', 'cancelled') AND c.finished_at IS NOT NULL THEN MAX(0, CAST((julianday(c.finished_at) - julianday(c.created_at)) * 86400000 AS INTEGER)) ELSE NULL END AS lifecycle_elapsed_ms,
88
+ m.total_tokens, m.total_cost_brl,
89
+ COALESCE(m.invocation_count, 0) AS invocation_count,
90
+ c.source_path
91
+ FROM canonical_executions c LEFT JOIN metrics m ON m.execution_id=c.id
92
+ UNION ALL
93
+ SELECT i.execution_id, MAX(i.status),
94
+ CASE COUNT(DISTINCT t.risk) WHEN 0 THEN NULL WHEN 1 THEN MIN(t.risk) ELSE 'mixed' END,
95
+ MIN(i.occurred_at), MAX(i.occurred_at), NULL, NULL, MAX(i.task_id), MAX(i.conversation_id),
96
+ SUM(i.llm_call_count), SUM(i.duration_ms), CASE WHEN COUNT(i.duration_ms) > 0 THEN 'observed' ELSE 'unavailable' END, NULL, SUM(i.total_tokens), SUM(i.cost_brl), COUNT(*), NULL
97
+ FROM invocations i LEFT JOIN tasks t ON t.id=i.task_id
98
+ WHERE i.execution_id IS NOT NULL
99
+ AND NOT EXISTS (SELECT 1 FROM canonical_executions c WHERE c.id=i.execution_id)
100
+ GROUP BY i.execution_id;
101
+ CREATE VIEW vw_operations_agent_invocations AS
102
+ SELECT c.*,
103
+ date(COALESCE(c.source_started_at, c.source_occurred_at, c.occurred_at), '-3 hours') AS source_day_sp,
104
+ t.risk
105
+ FROM vw_cost_agent_invocations c LEFT JOIN tasks t ON t.id=c.task_id;
106
+ CREATE VIEW vw_operations_conversations AS
107
+ SELECT i.conversation_id, c.status,
108
+ CASE COUNT(DISTINCT t.risk) WHEN 0 THEN NULL WHEN 1 THEN MIN(t.risk) ELSE 'mixed' END AS risk,
109
+ MIN(i.occurred_at) AS started_at, MAX(i.occurred_at) AS finished_at,
110
+ SUM(i.llm_call_count) AS llm_call_count, SUM(i.duration_ms) AS total_duration,
111
+ CASE WHEN COUNT(i.duration_ms) > 0 THEN 'observed' ELSE 'unavailable' END AS duration_provenance,
112
+ SUM(i.total_tokens) AS total_tokens, SUM(i.cost_brl) AS total_cost_brl,
113
+ GROUP_CONCAT(DISTINCT CASE WHEN i.model IS NULL OR trim(i.model) = '' OR lower(i.model) = 'unknown' THEN NULL ELSE i.model END) AS model,
114
+ GROUP_CONCAT(DISTINCT CASE WHEN i.reasoning_effort IS NULL OR trim(i.reasoning_effort) = '' OR lower(i.reasoning_effort) = 'unknown' THEN NULL ELSE i.reasoning_effort END) AS reasoning_effort,
115
+ COUNT(*) AS invocation_count
116
+ FROM invocations i LEFT JOIN conversations c ON c.id=i.conversation_id LEFT JOIN tasks t ON t.id=i.task_id
117
+ WHERE i.conversation_id IS NOT NULL GROUP BY i.conversation_id, c.status
118
+ UNION ALL
119
+ SELECT c.id, c.status, NULL, c.occurred_at, NULL, NULL, NULL, 'unavailable', NULL, NULL, NULL, NULL, 0
120
+ FROM conversations c
121
+ WHERE NOT EXISTS (SELECT 1 FROM invocations i WHERE i.conversation_id=c.id);
122
+ CREATE VIEW vw_operations_decisions AS SELECT * FROM decisions;
123
+ CREATE VIEW vw_operations_changes AS SELECT * FROM changes;
124
+ CREATE VIEW vw_operations_daily AS SELECT period_key AS day, * FROM operations_overview WHERE period_kind = 'day';
125
+ CREATE VIEW vw_operations_monthly AS SELECT * FROM operations_overview WHERE period_kind = 'month';
126
+ CREATE VIEW vw_operations_annual AS SELECT * FROM operations_overview WHERE period_kind = 'year';
127
+ CREATE VIEW vw_first_fold_overview AS SELECT * FROM vw_overview_daily;
128
+ CREATE VIEW vw_first_fold_task_status AS SELECT * FROM vw_task_status_daily;
129
+ CREATE VIEW vw_first_fold_task_risk AS SELECT * FROM vw_task_risk_daily;
130
+ CREATE VIEW vw_first_fold_top_tasks AS SELECT t.*, c.total_duration, c.total_tokens, c.total_cost_usd, c.total_cost_brl FROM task_summary t LEFT JOIN (SELECT task_id, SUM(llm_call_count) AS llm_call_count, SUM(duration_ms) AS total_duration, SUM(total_tokens) AS total_tokens, SUM(cost_usd) AS total_cost_usd, SUM(cost_brl) AS total_cost_brl FROM invocations GROUP BY task_id) c ON c.task_id = t.id ORDER BY c.total_duration DESC;
131
+ CREATE VIEW vw_first_fold_overview_all_time AS
132
+ WITH totals AS (
133
+ SELECT MIN(day) AS start_day, MAX(day) AS end_day,
134
+ SUM(total_run_count) AS total_run_count,
135
+ SUM(invocation_count) AS agent_invocation_count,
136
+ SUM(llm_call_count) AS llm_call_count,
137
+ ROUND(SUM(total_duration)) AS total_duration_ms,
138
+ SUM(total_tokens) AS total_tokens,
139
+ SUM(total_cost_usd) AS total_cost_usd,
140
+ SUM(total_cost_brl) AS total_cost_brl,
141
+ SUM(CASE WHEN total_duration IS NOT NULL THEN 1 ELSE 0 END) AS execution_day_count
142
+ FROM daily_aggregates
143
+ ), task_totals AS (
144
+ SELECT COUNT(*) AS task_count,
145
+ SUM(CASE WHEN status='completed' THEN 1 ELSE 0 END) AS completed_task_count,
146
+ MAX(occurred_at) AS latest_task_created_at
147
+ FROM task_summary
148
+ ), spec_totals AS (
149
+ SELECT COUNT(*) AS spec_count,
150
+ SUM(CASE WHEN status IN ('completed','delivered') THEN 1 ELSE 0 END) AS completed_spec_count
151
+ FROM spec_summary
152
+ ), prd_totals AS (
153
+ SELECT COUNT(*) AS prd_count,
154
+ SUM(CASE WHEN status IN ('completed','delivered') THEN 1 ELSE 0 END) AS completed_prd_count
155
+ FROM prd_summary
156
+ )
157
+ SELECT 'all' AS period_key, totals.start_day, totals.end_day,
158
+ task_totals.task_count, task_totals.completed_task_count,
159
+ spec_totals.spec_count, spec_totals.completed_spec_count,
160
+ prd_totals.prd_count, prd_totals.completed_prd_count,
161
+ totals.total_run_count, totals.agent_invocation_count, totals.llm_call_count,
162
+ totals.total_duration_ms, totals.total_tokens,
163
+ totals.total_cost_usd, totals.total_cost_brl, totals.execution_day_count,
164
+ task_totals.latest_task_created_at
165
+ FROM totals CROSS JOIN task_totals CROSS JOIN spec_totals CROSS JOIN prd_totals;
166
+ CREATE VIEW vw_first_fold_task_status_all_time AS
167
+ WITH counts AS (
168
+ SELECT COALESCE(status, 'draft') AS status, COUNT(*) AS task_count
169
+ FROM task_summary GROUP BY COALESCE(status, 'draft')
170
+ ), total AS (SELECT SUM(task_count) AS task_count FROM counts)
171
+ SELECT counts.status, counts.task_count,
172
+ CASE WHEN total.task_count = 0 THEN 0.0 ELSE CAST(counts.task_count AS REAL) / total.task_count END AS task_percentage
173
+ FROM counts CROSS JOIN total;
174
+ CREATE VIEW vw_first_fold_task_risk_all_time AS
175
+ WITH counts AS (
176
+ SELECT COALESCE(risk, 'standard') AS risk, COUNT(*) AS task_count
177
+ FROM task_summary GROUP BY COALESCE(risk, 'standard')
178
+ ), total AS (SELECT SUM(task_count) AS task_count FROM counts)
179
+ SELECT counts.risk, counts.task_count,
180
+ CASE WHEN total.task_count = 0 THEN 0.0 ELSE CAST(counts.task_count AS REAL) / total.task_count END AS task_percentage
181
+ FROM counts CROSS JOIN total;
182
+ CREATE VIEW vw_first_fold_task_metrics_all_time AS
183
+ SELECT overview.task_count,
184
+ CASE WHEN overview.task_count = 0 OR overview.total_duration_ms IS NULL THEN NULL ELSE overview.total_duration_ms / overview.task_count END AS average_duration_ms_per_task,
185
+ CASE WHEN overview.task_count = 0 OR overview.total_tokens IS NULL THEN NULL ELSE overview.total_tokens / overview.task_count END AS average_tokens_per_task,
186
+ CASE WHEN overview.task_count = 0 OR overview.total_cost_usd IS NULL THEN NULL ELSE overview.total_cost_usd / overview.task_count END AS average_cost_usd_per_task,
187
+ CASE WHEN overview.task_count = 0 OR overview.total_cost_brl IS NULL THEN NULL ELSE overview.total_cost_brl / overview.task_count END AS average_cost_brl_per_task,
188
+ overview.latest_task_created_at
189
+ FROM vw_first_fold_overview_all_time overview;
190
+ CREATE VIEW vw_first_fold_spec_status_all_time AS
191
+ WITH counts AS (
192
+ SELECT CASE
193
+ WHEN status='cancelled' THEN 'cancelled'
194
+ WHEN status='failed' THEN 'failed'
195
+ WHEN status='blocked' THEN 'blocked'
196
+ WHEN status IN ('delivered','completed') THEN 'completed'
197
+ WHEN status='ready' THEN 'ready'
198
+ WHEN status='draft' THEN 'planning'
199
+ WHEN status='verifying' THEN 'verifying'
200
+ WHEN status IN ('active','executing') THEN 'executing'
201
+ ELSE 'planning'
202
+ END AS stage, COUNT(*) AS entity_count
203
+ FROM spec_summary GROUP BY stage
204
+ ), total AS (SELECT SUM(entity_count) AS entity_count FROM counts)
205
+ SELECT counts.stage, counts.entity_count,
206
+ CASE WHEN total.entity_count=0 THEN 0.0 ELSE CAST(counts.entity_count AS REAL)/total.entity_count END AS entity_percentage
207
+ FROM counts CROSS JOIN total;
208
+ CREATE VIEW vw_first_fold_prd_status_all_time AS
209
+ WITH counts AS (
210
+ SELECT CASE
211
+ WHEN status='cancelled' THEN 'cancelled'
212
+ WHEN status='failed' THEN 'failed'
213
+ WHEN status='blocked' THEN 'blocked'
214
+ WHEN status IN ('delivered','completed') THEN 'completed'
215
+ WHEN status='ready' THEN 'ready'
216
+ WHEN status='draft' THEN 'definition'
217
+ WHEN status='verifying' THEN 'verifying'
218
+ WHEN status IN ('active','executing') THEN 'executing'
219
+ ELSE 'definition'
220
+ END AS stage, COUNT(*) AS entity_count
221
+ FROM prd_summary GROUP BY stage
222
+ ), total AS (SELECT SUM(entity_count) AS entity_count FROM counts)
223
+ SELECT counts.stage, counts.entity_count,
224
+ CASE WHEN total.entity_count=0 THEN 0.0 ELSE CAST(counts.entity_count AS REAL)/total.entity_count END AS entity_percentage
225
+ FROM counts CROSS JOIN total;
226
+ CREATE VIEW vw_first_fold_spec_classification_all_time AS
227
+ WITH rollup AS (
228
+ SELECT s.id, COUNT(DISTINCT a.task_id) AS task_count,
229
+ SUM(CASE WHEN a.work_type='rework' AND a.run_role='root' THEN 1 ELSE 0 END) AS rework_run_count
230
+ FROM spec_summary s LEFT JOIN activities a ON a.spec_id=s.id GROUP BY s.id
231
+ ), counts AS (
232
+ SELECT CASE WHEN rework_run_count>0 THEN 'rework' WHEN task_count>0 THEN 'structured' ELSE 'empty' END AS classification,
233
+ COUNT(*) AS entity_count
234
+ FROM rollup GROUP BY classification
235
+ ), total AS (SELECT SUM(entity_count) AS entity_count FROM counts)
236
+ SELECT counts.classification, counts.entity_count,
237
+ CASE WHEN total.entity_count=0 THEN 0.0 ELSE CAST(counts.entity_count AS REAL)/total.entity_count END AS entity_percentage
238
+ FROM counts CROSS JOIN total;
239
+ CREATE VIEW vw_first_fold_prd_classification_all_time AS
240
+ WITH rollup AS (
241
+ SELECT p.id, COUNT(DISTINCT a.task_id) AS task_count,
242
+ SUM(CASE WHEN a.work_type='rework' AND a.run_role='root' THEN 1 ELSE 0 END) AS rework_run_count
243
+ FROM prd_summary p LEFT JOIN activities a ON a.prd_id=p.id GROUP BY p.id
244
+ ), counts AS (
245
+ SELECT CASE WHEN rework_run_count>0 THEN 'rework' WHEN task_count>0 THEN 'structured' ELSE 'empty' END AS classification,
246
+ COUNT(*) AS entity_count
247
+ FROM rollup GROUP BY classification
248
+ ), total AS (SELECT SUM(entity_count) AS entity_count FROM counts)
249
+ SELECT counts.classification, counts.entity_count,
250
+ CASE WHEN total.entity_count=0 THEN 0.0 ELSE CAST(counts.entity_count AS REAL)/total.entity_count END AS entity_percentage
251
+ FROM counts CROSS JOIN total;
252
+ CREATE VIEW vw_first_fold_spec_metrics_all_time AS
253
+ WITH usage AS (
254
+ SELECT spec_id,
255
+ COUNT(*) AS total_run_count,
256
+ ROUND(SUM(duration_ms)) AS total_duration_ms,
257
+ SUM(total_tokens) AS total_tokens,
258
+ SUM(cost_usd) AS total_cost_usd,
259
+ SUM(cost_brl) AS total_cost_brl
260
+ FROM macro_spec_activities GROUP BY spec_id
261
+ )
262
+ SELECT COUNT(*) AS entity_count,
263
+ SUM(usage.total_run_count) AS total_run_count,
264
+ SUM(usage.total_duration_ms) AS total_duration_ms,
265
+ SUM(usage.total_tokens) AS total_tokens,
266
+ SUM(usage.total_cost_usd) AS total_cost_usd,
267
+ SUM(usage.total_cost_brl) AS total_cost_brl,
268
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_duration_ms)/COUNT(*) END AS average_duration_ms,
269
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_tokens)/COUNT(*) END AS average_tokens,
270
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_cost_usd)/COUNT(*) END AS average_cost_usd,
271
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_cost_brl)/COUNT(*) END AS average_cost_brl,
272
+ MAX(s.occurred_at) AS latest_created_at
273
+ FROM spec_summary s LEFT JOIN usage ON usage.spec_id=s.id;
274
+ CREATE VIEW vw_first_fold_prd_metrics_all_time AS
275
+ WITH usage AS (
276
+ SELECT prd_id,
277
+ COUNT(*) AS total_run_count,
278
+ ROUND(SUM(duration_ms)) AS total_duration_ms,
279
+ SUM(total_tokens) AS total_tokens,
280
+ SUM(cost_usd) AS total_cost_usd,
281
+ SUM(cost_brl) AS total_cost_brl
282
+ FROM activities WHERE prd_id IS NOT NULL GROUP BY prd_id
283
+ )
284
+ SELECT COUNT(*) AS entity_count,
285
+ SUM(usage.total_run_count) AS total_run_count,
286
+ SUM(usage.total_duration_ms) AS total_duration_ms,
287
+ SUM(usage.total_tokens) AS total_tokens,
288
+ SUM(usage.total_cost_usd) AS total_cost_usd,
289
+ SUM(usage.total_cost_brl) AS total_cost_brl,
290
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_duration_ms)/COUNT(*) END AS average_duration_ms,
291
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_tokens)/COUNT(*) END AS average_tokens,
292
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_cost_usd)/COUNT(*) END AS average_cost_usd,
293
+ CASE WHEN COUNT(*)=0 THEN NULL ELSE SUM(usage.total_cost_brl)/COUNT(*) END AS average_cost_brl,
294
+ MAX(p.occurred_at) AS latest_created_at
295
+ FROM prd_summary p LEFT JOIN usage ON usage.prd_id=p.id;
296
+ CREATE VIEW vw_first_fold_top_specs_all_time AS
297
+ WITH usage AS (
298
+ SELECT spec_id,
299
+ COUNT(*) AS total_run_count,
300
+ SUM(llm_call_count) AS llm_call_count,
301
+ ROUND(SUM(duration_ms)) AS total_duration_ms,
302
+ SUM(total_tokens) AS total_tokens,
303
+ SUM(cost_usd) AS total_cost_usd,
304
+ SUM(cost_brl) AS total_cost_brl
305
+ FROM macro_spec_activities GROUP BY spec_id
306
+ ), ranked AS (
307
+ SELECT s.id AS entity_id, s.title, s.status, usage.total_run_count, usage.llm_call_count,
308
+ usage.total_duration_ms, usage.total_tokens, usage.total_cost_usd, usage.total_cost_brl,
309
+ ROW_NUMBER() OVER (ORDER BY usage.total_duration_ms IS NOT NULL DESC, usage.total_duration_ms DESC, usage.total_run_count DESC, s.id) AS rank
310
+ FROM spec_summary s LEFT JOIN usage ON usage.spec_id=s.id
311
+ ), total AS (SELECT SUM(total_duration_ms) AS total_duration_ms FROM ranked)
312
+ SELECT ranked.rank, ranked.entity_id, ranked.title, ranked.status,
313
+ COALESCE(ranked.total_run_count,0) AS total_run_count, ranked.llm_call_count,
314
+ ranked.total_duration_ms, ranked.total_tokens, ranked.total_cost_usd, ranked.total_cost_brl,
315
+ CASE WHEN total.total_duration_ms IS NULL OR total.total_duration_ms=0 OR ranked.total_duration_ms IS NULL THEN 0.0 ELSE ranked.total_duration_ms/total.total_duration_ms END AS duration_share
316
+ FROM ranked CROSS JOIN total WHERE ranked.rank<=5 ORDER BY ranked.rank;
317
+ CREATE VIEW vw_first_fold_top_prds_all_time AS
318
+ WITH usage AS (
319
+ SELECT prd_id,
320
+ COUNT(*) AS total_run_count,
321
+ SUM(llm_call_count) AS llm_call_count,
322
+ ROUND(SUM(duration_ms)) AS total_duration_ms,
323
+ SUM(total_tokens) AS total_tokens,
324
+ SUM(cost_usd) AS total_cost_usd,
325
+ SUM(cost_brl) AS total_cost_brl
326
+ FROM activities WHERE prd_id IS NOT NULL GROUP BY prd_id
327
+ ), ranked AS (
328
+ SELECT p.id AS entity_id, p.title, p.status, usage.total_run_count, usage.llm_call_count,
329
+ usage.total_duration_ms, usage.total_tokens, usage.total_cost_usd, usage.total_cost_brl,
330
+ ROW_NUMBER() OVER (ORDER BY usage.total_duration_ms IS NOT NULL DESC, usage.total_duration_ms DESC, usage.total_run_count DESC, p.id) AS rank
331
+ FROM prd_summary p LEFT JOIN usage ON usage.prd_id=p.id
332
+ ), total AS (SELECT SUM(total_duration_ms) AS total_duration_ms FROM ranked)
333
+ SELECT ranked.rank, ranked.entity_id, ranked.title, ranked.status,
334
+ COALESCE(ranked.total_run_count,0) AS total_run_count, ranked.llm_call_count,
335
+ ranked.total_duration_ms, ranked.total_tokens, ranked.total_cost_usd, ranked.total_cost_brl,
336
+ CASE WHEN total.total_duration_ms IS NULL OR total.total_duration_ms=0 OR ranked.total_duration_ms IS NULL THEN 0.0 ELSE ranked.total_duration_ms/total.total_duration_ms END AS duration_share
337
+ FROM ranked CROSS JOIN total WHERE ranked.rank<=5 ORDER BY ranked.rank;
338
+ CREATE VIEW vw_first_fold_top_tasks_all_time AS
339
+ WITH duration AS (
340
+ SELECT a.task_id, ROUND(SUM(f.attributed_token_active_ms)) AS total_duration_ms
341
+ FROM attributed_token_active_facts f JOIN zaip_aios_activities a USING(activity_row_id)
342
+ WHERE a.task_id IS NOT NULL AND a.phase='execution' GROUP BY a.task_id
343
+ ), usage AS (
344
+ SELECT task_id, COUNT(*) AS total_run_count, SUM(llm_call_count) AS llm_call_count,
345
+ SUM(total_tokens) AS total_tokens, SUM(cost_usd) AS total_cost_usd, SUM(cost_brl) AS total_cost_brl
346
+ FROM activities WHERE task_id IS NOT NULL AND phase='execution' GROUP BY task_id
347
+ ), ranked AS (
348
+ SELECT t.id AS task_id, t.title, t.status, t.risk,
349
+ usage.total_run_count, usage.llm_call_count, duration.total_duration_ms,
350
+ usage.total_tokens, usage.total_cost_usd, usage.total_cost_brl,
351
+ ROW_NUMBER() OVER (ORDER BY duration.total_duration_ms DESC, t.id) AS rank
352
+ FROM duration JOIN task_summary t ON t.id=duration.task_id
353
+ LEFT JOIN usage ON usage.task_id=duration.task_id
354
+ ), total AS (SELECT SUM(total_duration_ms) AS total_duration_ms FROM ranked)
355
+ SELECT ranked.rank, ranked.task_id, ranked.title, ranked.status, ranked.risk,
356
+ ranked.total_run_count, ranked.llm_call_count, ranked.total_duration_ms,
357
+ ranked.total_tokens, ranked.total_cost_usd, ranked.total_cost_brl,
358
+ CASE WHEN total.total_duration_ms IS NULL OR total.total_duration_ms = 0 THEN 0.0 ELSE ranked.total_duration_ms / total.total_duration_ms END AS duration_share
359
+ FROM ranked CROSS JOIN total WHERE ranked.rank <= 5 ORDER BY ranked.rank;
360
+ CREATE VIEW vw_first_fold_task_summary AS SELECT * FROM vw_task_summary;
361
+ CREATE VIEW vw_first_fold_spec_summary AS SELECT * FROM vw_spec_summary;
362
+ CREATE VIEW vw_first_fold_prd_summary AS SELECT * FROM vw_prd_summary;
363
+ CREATE VIEW cost_monitor_daily AS SELECT * FROM vw_cost_daily;
364
+ CREATE VIEW cost_monitor_monthly AS SELECT * FROM vw_cost_monthly;
365
+ CREATE VIEW cost_monitor_annual AS SELECT * FROM vw_cost_annual;
366
+ CREATE VIEW cost_monitor_overview_view AS SELECT * FROM vw_cost_overview;
367
+ CREATE VIEW cost_monitor_executions AS SELECT * FROM vw_cost_executions;
368
+ CREATE VIEW cost_monitor_agent_invocations AS SELECT * FROM vw_cost_agent_invocations;
369
+ CREATE VIEW cost_monitor_zaip_agents AS SELECT * FROM vw_cost_zaip_agents;
370
+ CREATE VIEW cost_monitor_models AS SELECT * FROM vw_cost_models;
371
+ CREATE VIEW cost_monitor_providers AS SELECT * FROM vw_cost_providers;
372
+ CREATE VIEW cost_monitor_tasks AS SELECT * FROM vw_cost_tasks;
373
+ CREATE VIEW cost_monitor_specs AS SELECT * FROM vw_cost_specs;
374
+ CREATE VIEW cost_monitor_prds AS SELECT * FROM vw_cost_prds;
375
+ CREATE VIEW cost_monitor_conversations AS SELECT * FROM vw_cost_conversations;
376
+ CREATE VIEW operations_work_list AS SELECT * FROM vw_operations_work_list;
377
+ CREATE VIEW operations_work_summary AS SELECT * FROM vw_operations_work_summary;
378
+ CREATE VIEW operations_work_kanban AS SELECT * FROM vw_operations_work_kanban;
379
+ CREATE VIEW operations_executions AS SELECT * FROM vw_operations_executions;
380
+ CREATE VIEW operations_agent_invocations AS SELECT * FROM vw_operations_agent_invocations;
381
+ CREATE VIEW operations_conversations AS SELECT * FROM vw_operations_conversations;
382
+ CREATE VIEW operations_decisions AS SELECT * FROM vw_operations_decisions;
383
+ CREATE VIEW operations_changes AS SELECT * FROM vw_operations_changes;
384
+ CREATE VIEW operations_daily AS SELECT * FROM vw_operations_daily;
385
+ CREATE VIEW operations_monthly AS SELECT * FROM vw_operations_monthly;
386
+ CREATE VIEW operations_annual AS SELECT * FROM vw_operations_annual;
387
+ CREATE VIEW first_fold_overview AS SELECT * FROM vw_first_fold_overview;
388
+ CREATE VIEW first_fold_task_status AS SELECT * FROM vw_first_fold_task_status;
389
+ CREATE VIEW first_fold_task_risk AS SELECT * FROM vw_first_fold_task_risk;
390
+ CREATE VIEW first_fold_top_tasks AS SELECT * FROM vw_first_fold_top_tasks;
391
+ CREATE VIEW first_fold_overview_all_time AS SELECT * FROM vw_first_fold_overview_all_time;
392
+ CREATE VIEW first_fold_task_status_all_time AS SELECT * FROM vw_first_fold_task_status_all_time;
393
+ CREATE VIEW first_fold_task_risk_all_time AS SELECT * FROM vw_first_fold_task_risk_all_time;
394
+ CREATE VIEW first_fold_task_metrics_all_time AS SELECT * FROM vw_first_fold_task_metrics_all_time;
395
+ CREATE VIEW first_fold_top_tasks_all_time AS SELECT * FROM vw_first_fold_top_tasks_all_time;
396
+ CREATE VIEW first_fold_spec_status_all_time AS SELECT * FROM vw_first_fold_spec_status_all_time;
397
+ CREATE VIEW first_fold_spec_classification_all_time AS SELECT * FROM vw_first_fold_spec_classification_all_time;
398
+ CREATE VIEW first_fold_spec_metrics_all_time AS SELECT * FROM vw_first_fold_spec_metrics_all_time;
399
+ CREATE VIEW first_fold_top_specs_all_time AS SELECT * FROM vw_first_fold_top_specs_all_time;
400
+ CREATE VIEW first_fold_prd_status_all_time AS SELECT * FROM vw_first_fold_prd_status_all_time;
401
+ CREATE VIEW first_fold_prd_classification_all_time AS SELECT * FROM vw_first_fold_prd_classification_all_time;
402
+ CREATE VIEW first_fold_prd_metrics_all_time AS SELECT * FROM vw_first_fold_prd_metrics_all_time;
403
+ CREATE VIEW first_fold_top_prds_all_time AS SELECT * FROM vw_first_fold_top_prds_all_time;
404
+ CREATE VIEW first_fold_task AS SELECT * FROM vw_first_fold_task_summary;
405
+ CREATE VIEW first_fold_spec AS SELECT * FROM vw_first_fold_spec_summary;
406
+ CREATE VIEW first_fold_prd AS SELECT * FROM vw_first_fold_prd_summary;
407
+ CREATE VIEW task_summary_daily AS SELECT * FROM vw_task_summary_daily;
408
+ CREATE VIEW spec_summary_daily AS SELECT * FROM vw_spec_summary_daily;
409
+ CREATE VIEW prd_summary_daily AS SELECT * FROM vw_prd_summary_daily;
410
+ CREATE VIEW task_status_daily AS SELECT * FROM vw_task_status_daily;
411
+ CREATE VIEW task_risk_daily AS SELECT * FROM vw_task_risk_daily;
412
+ `;
@@ -15,9 +15,10 @@ describe("work priority API contract", () => {
15
15
  });
16
16
 
17
17
  it("writes priority without building a projection, while reads discard stale IDs", () => {
18
- const route = source.slice(
19
- source.indexOf("app.put(`${API_PREFIX}/work-priority`"),
20
- source.indexOf('app.on(["GET", "HEAD"], `${API_PREFIX}/snapshot`'),
18
+ const routes = readFileSync(new URL("server-operations-routes.ts", import.meta.url), "utf8");
19
+ const route = routes.slice(
20
+ routes.indexOf("app.put(`${API_PREFIX}/work-priority`"),
21
+ routes.indexOf('app.on(["GET", "HEAD"], `${API_PREFIX}/board`'),
21
22
  );
22
23
  expect(route).not.toContain("buildCanonicalOperationsProjection");
23
24
  expect(route).not.toContain("knownWorkIds(");
@@ -0,0 +1,195 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { readdir, stat } from "node:fs/promises";
4
+ import { join, resolve } from "node:path";
5
+ import process from "node:process";
6
+ import { formatLauncherError } from "./start-dashboard-logging.mjs";
7
+ import {
8
+ dashboardBuildTargets,
9
+ frontendRoot,
10
+ installedServer,
11
+ packageRoot,
12
+ sourceServer,
13
+ workspaceRoot,
14
+ } from "./start-dashboard-paths.mjs";
15
+ import {
16
+ assertInstalledDashboardArtifacts,
17
+ isDashboardSourceWorkspace as hasDashboardSourceWorkspace,
18
+ dashboardServerPathForWorkspace as selectDashboardServerPath,
19
+ } from "./start-dashboard-runtime-selection.mjs";
20
+ export async function latestModifiedAt(paths, excludedSourcePaths = []) {
21
+ let latest = 0;
22
+ for (const path of paths) {
23
+ const details = await stat(path).catch(() => null);
24
+ if (details === null) continue;
25
+ if (!details.isDirectory()) {
26
+ if (isBuildInputPath(path, excludedSourcePaths)) latest = Math.max(latest, details.mtimeMs);
27
+ continue;
28
+ }
29
+ // Retain included directory mtimes so removing or renaming a source file
30
+ // after a build still invalidates its artifact. Excluded trees stay out.
31
+ if (isBuildInputPath(path, excludedSourcePaths)) latest = Math.max(latest, details.mtimeMs);
32
+ const entries = await readdir(path, { withFileTypes: true }).catch(() => []);
33
+ latest = Math.max(
34
+ latest,
35
+ await latestModifiedAt(
36
+ entries
37
+ .filter((entry) => isBuildInputPath(join(path, entry.name), excludedSourcePaths))
38
+ .map((entry) => join(path, entry.name)),
39
+ excludedSourcePaths,
40
+ ),
41
+ );
42
+ }
43
+ return latest;
44
+ }
45
+ export function isBuildInputPath(path, excludedSourcePaths) {
46
+ const normalized = path.replaceAll("\\", "/");
47
+ const name = normalized.slice(normalized.lastIndexOf("/") + 1);
48
+ if (new Set(["dist", "node_modules", ".turbo"]).has(name)) return false;
49
+ if (/\.(?:test|spec)\.[cm]?[jt]sx?$/.test(name)) return false;
50
+ return !excludedSourcePaths.some(
51
+ (excluded) => normalized.includes(excluded) || normalized.endsWith(excluded.slice(0, -1)),
52
+ );
53
+ }
54
+ export async function runSqliteBuild(target) {
55
+ const frontend = target === "frontend";
56
+ const command = process.execPath;
57
+ const args = frontend
58
+ ? [resolve(workspaceRoot, "node_modules/vite/bin/vite.js"), "build"]
59
+ : [
60
+ resolve(
61
+ workspaceRoot,
62
+ ".agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs",
63
+ ),
64
+ ];
65
+ const output = await new Promise((resolveBuild, rejectBuild) => {
66
+ const child = spawn(command, args, {
67
+ cwd: frontend ? resolve(workspaceRoot, ".agents/dashboard/apps/frontend") : packageRoot,
68
+ windowsHide: true,
69
+ stdio: "pipe",
70
+ });
71
+ let outputText = "";
72
+ const appendOutput = (chunk) => {
73
+ outputText = `${outputText}${chunk}`.slice(-8_000);
74
+ };
75
+ child.stdout?.setEncoding("utf8");
76
+ child.stdout?.on("data", appendOutput);
77
+ child.stderr?.setEncoding("utf8");
78
+ child.stderr?.on("data", appendOutput);
79
+ child.once("error", rejectBuild);
80
+ child.once("exit", (code) => {
81
+ if (code === 0) resolveBuild();
82
+ else
83
+ rejectBuild(
84
+ new Error(
85
+ `SQLite dashboard ${target} build failed (${code}): ${formatLauncherError(outputText)}`,
86
+ ),
87
+ );
88
+ });
89
+ });
90
+ return output;
91
+ }
92
+ export async function inspectDashboardBuildTarget(target) {
93
+ const artifactStats = await Promise.all(
94
+ target.artifacts.map(async (path) => ({ path, details: await stat(path).catch(() => null) })),
95
+ );
96
+ const missingArtifacts = artifactStats
97
+ .filter(({ details }) => details === null)
98
+ .map(({ path }) => path);
99
+ const artifactsModifiedAt = Math.min(
100
+ ...artifactStats.map(({ details }) => details?.mtimeMs ?? 0),
101
+ );
102
+ const sourcesModifiedAt = await latestModifiedAt(target.sourceRoots, target.excludedSourcePaths);
103
+ return { artifactsModifiedAt, missingArtifacts, sourcesModifiedAt };
104
+ }
105
+ export function buildProgress(onProgress, percent, phase, detail) {
106
+ onProgress({ percent, phase, detail });
107
+ }
108
+ export async function refreshDashboardBuildTargets({
109
+ targets = dashboardBuildTargets,
110
+ forceRebuild = process.env.ZAIP_DASHBOARD_FORCE_REBUILD === "1",
111
+ inspectTarget = inspectDashboardBuildTarget,
112
+ runBuild = runSqliteBuild,
113
+ onProgress = () => {},
114
+ } = {}) {
115
+ const builtTargets = [];
116
+ for (const [name, target] of Object.entries(targets)) {
117
+ buildProgress(
118
+ onProgress,
119
+ name === "frontend" ? 30 : 35,
120
+ `Verificando ${name === "frontend" ? "a interface" : "o runtime local"}`,
121
+ "Conferindo somente as dependências que geram este artefato.",
122
+ );
123
+ const state = await inspectTarget(target);
124
+ const needsBuild =
125
+ forceRebuild ||
126
+ state.missingArtifacts.length > 0 ||
127
+ state.artifactsModifiedAt < state.sourcesModifiedAt;
128
+ if (!needsBuild) {
129
+ buildProgress(
130
+ onProgress,
131
+ name === "frontend" ? 33 : 39,
132
+ `${name === "frontend" ? "Interface" : "Runtime local"} já está atualizado`,
133
+ "O artefato existente corresponde às dependências verificadas.",
134
+ );
135
+ continue;
136
+ }
137
+ const reason = forceRebuild
138
+ ? "A atualização foi solicitada explicitamente."
139
+ : state.missingArtifacts.length > 0
140
+ ? "Um artefato necessário está ausente."
141
+ : "Uma dependência deste artefato foi modificada.";
142
+ buildProgress(
143
+ onProgress,
144
+ name === "frontend" ? 33 : 39,
145
+ `Atualizando ${name === "frontend" ? "a interface" : "o runtime local"}`,
146
+ reason,
147
+ );
148
+ await runBuild(name);
149
+ builtTargets.push(name);
150
+ buildProgress(
151
+ onProgress,
152
+ name === "frontend" ? 35 : 42,
153
+ `${name === "frontend" ? "Interface" : "Runtime local"} atualizado`,
154
+ "O artefato foi gerado com as dependências atuais.",
155
+ );
156
+ }
157
+ return { artifacts: Object.values(targets).flatMap((target) => target.artifacts), builtTargets };
158
+ }
159
+ export async function ensureFreshDashboardBuild(onProgress = () => {}) {
160
+ if (!(await hasDashboardSourceWorkspace(workspaceRoot))) {
161
+ const packagedArtifacts = [installedServer, resolve(frontendRoot, "index.html")];
162
+ await assertInstalledDashboardArtifacts(packagedArtifacts);
163
+ buildProgress(
164
+ onProgress,
165
+ 39,
166
+ "Usando runtime empacotado",
167
+ "O pacote npm já inclui o dashboard pronto; nenhuma instalação de desenvolvimento é necessária.",
168
+ );
169
+ const signature = await Promise.all(
170
+ [...packagedArtifacts, resolve(packageRoot, "start-dashboard.mjs")].map(async (path) => {
171
+ const details = await stat(path);
172
+ return `${path}:${details.size}:${details.mtimeMs}`;
173
+ }),
174
+ );
175
+ return createHash("sha256").update(signature.join("|")).digest("hex");
176
+ }
177
+ const { artifacts } = await refreshDashboardBuildTargets({ onProgress });
178
+ const artifactFingerprint = await Promise.all(
179
+ [...artifacts, resolve(packageRoot, "start-dashboard.mjs")].map(async (path) => {
180
+ const details = await stat(path);
181
+ return `${path}:${details.size}:${details.mtimeMs}`;
182
+ }),
183
+ );
184
+ return createHash("sha256").update(artifactFingerprint.join("|")).digest("hex");
185
+ }
186
+ export async function isDashboardSourceWorkspace(root = workspaceRoot) {
187
+ return hasDashboardSourceWorkspace(root);
188
+ }
189
+ export async function dashboardServerPathForWorkspace({
190
+ root = workspaceRoot,
191
+ sourcePath = sourceServer,
192
+ installedPath = installedServer,
193
+ } = {}) {
194
+ return selectDashboardServerPath({ root, sourcePath, installedPath });
195
+ }
@@ -36,7 +36,7 @@ describe("dashboard launcher lifecycle", () => {
36
36
  expect(presentLaunchFailure(null, "unused", () => "unused")).toBeNull();
37
37
  });
38
38
 
39
- it("waits for the child exit before clearing the owned session", async () => {
39
+ it("waits for child exit and preserves the persistent SQLite snapshot", async () => {
40
40
  const child = new EventEmitter();
41
41
  const processRef = new EventEmitter();
42
42
  const calls = [];
@@ -55,12 +55,7 @@ describe("dashboard launcher lifecycle", () => {
55
55
  child.emit("exit", null);
56
56
 
57
57
  await expect(completion).resolves.toBe(0);
58
- expect(calls).toEqual([
59
- ["kill", "SIGINT"],
60
- ["clear"],
61
- ["status", "closed"],
62
- ["remove", "C:/tmp/dashboard.sqlite"],
63
- ]);
58
+ expect(calls).toEqual([["kill", "SIGINT"], ["clear"], ["status", "closed"]]);
64
59
  });
65
60
 
66
61
  it("records launcher phase timing with the same process identity", () => {