@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,739 @@
1
+ import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
2
+ import { join, resolve } from "node:path";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { createDashboardApp, projectAllTimeTopTasks } from "./server.js";
5
+ import { rebuildSqliteReadModel, SqliteReadModelFileSystem } from "./sqlite-read-model.js";
6
+ import { expectPersistedFirstFoldCaches } from "./sqlite-read-model-cache.test-support.js";
7
+
8
+ const roots: string[] = [];
9
+ const sqliteTestTempRoot = join(
10
+ resolve(import.meta.dirname, "../../../../../.."),
11
+ ".tmp",
12
+ "sqlite-read-model-tests",
13
+ );
14
+ async function createSqliteTestRoot(): Promise<string> {
15
+ await mkdir(sqliteTestTempRoot, { recursive: true });
16
+ return mkdtemp(join(sqliteTestTempRoot, "fixture-"));
17
+ }
18
+ afterEach(async () => {
19
+ vi.useRealTimers();
20
+ vi.restoreAllMocks();
21
+ await Promise.all(
22
+ roots
23
+ .splice(0)
24
+ .map((root) =>
25
+ import("node:fs/promises").then(({ rm }) => rm(root, { recursive: true, force: true })),
26
+ ),
27
+ );
28
+ });
29
+ describe("SQLite dashboard read model", () => {
30
+ it("counts every root execution day and returns task duration leaders", async () => {
31
+ const root = await createSqliteTestRoot();
32
+ roots.push(root);
33
+ await mkdir(join(root, ".agents", "records", "runs", "2026", "08"), { recursive: true });
34
+ for (const kind of ["tasks", "specs", "prds"])
35
+ await mkdir(join(root, ".agents", "records", kind, "2026", "08"), { recursive: true });
36
+ await mkdir(
37
+ join(root, ".agents", "records", "changes", "2026", "08", "CHG-ART", "artifacts", "evidence"),
38
+ { recursive: true },
39
+ );
40
+ await mkdir(
41
+ join(
42
+ root,
43
+ ".agents",
44
+ "records",
45
+ "changes",
46
+ "2026",
47
+ "08",
48
+ "CHG-ART",
49
+ "artifacts",
50
+ "validations",
51
+ ),
52
+ { recursive: true },
53
+ );
54
+ await mkdir(join(root, ".agents", "config"), { recursive: true });
55
+ await writeFile(
56
+ join(root, ".agents", "config", "project.yaml"),
57
+ "schema_version: 1\nzaip:\n enabled: true\nproject:\n id: sqlite-test\n name: sqlite-test\n timezone: UTC\nstack:\n id: zaip-aios-stack\n overrides: {}\nclients:\n codex: true\n claude: true\ntracking:\n enabled: true\n currency: BRL\n storage_mode: tracked_sanitized\n",
58
+ "utf8",
59
+ );
60
+ await writeFile(
61
+ join(root, ".agents", "config", "framework.lock.yaml"),
62
+ "lock_version: 1\nframework:\n version: 2.5.0\n distribution_sha256: null\nlayout:\n version: 3\nresolved_profile:\n id: null\n sha256: null\nmanaged_files: {}\n",
63
+ "utf8",
64
+ );
65
+ const run = (
66
+ id: string,
67
+ day: string,
68
+ task: string,
69
+ duration: number,
70
+ time = "12:00:00.000Z",
71
+ spec: string | null = null,
72
+ prd: string | null = null,
73
+ ) => [
74
+ {
75
+ schema_version: 2,
76
+ event_id: `${id}:1`,
77
+ run_id: id,
78
+ sequence: 1,
79
+ occurred_at: `${day}T${time}`,
80
+ type: "run.started",
81
+ attribution_status: "attributed",
82
+ phase: "execution",
83
+ run_role: "orchestrator",
84
+ run_purpose: "execution",
85
+ requires_finalizer: false,
86
+ execution_kind: "delivery",
87
+ execution_eligibility: ["delivery"],
88
+ entrypoint: "task",
89
+ work_type: "new",
90
+ storage_mode: "tracked_sanitized",
91
+ client: "codex",
92
+ agent: "agent",
93
+ agent_name: "agent",
94
+ provider: "openai",
95
+ model: "gpt-5",
96
+ reasoning_effort: null,
97
+ client_thread_id: id,
98
+ client_turn_id: id,
99
+ conversation_id: `CONV-${id}`,
100
+ execution_id: `EXEC-${id}`,
101
+ task_id: task,
102
+ spec_id: spec,
103
+ prd_id: prd,
104
+ change_id: null,
105
+ parent_run_id: null,
106
+ continuation_of_run_id: null,
107
+ retry_of_run_id: null,
108
+ agent_invocation_id: `AINV-${id}`,
109
+ root_agent_invocation_id: `AINV-${id}`,
110
+ parent_agent_invocation_id: null,
111
+ invocation_kind: "orchestrator",
112
+ delegation_depth: 0,
113
+ },
114
+ {
115
+ schema_version: 2,
116
+ event_id: `${id}:2`,
117
+ run_id: id,
118
+ sequence: 2,
119
+ occurred_at: `${day}T12:00:01.000Z`,
120
+ type: "usage.recorded",
121
+ phase: "execution",
122
+ activity_kind: "model_usage",
123
+ classification_source: "explicit",
124
+ tokens: {
125
+ input: 1,
126
+ cached_input: 0,
127
+ output: 1,
128
+ reasoning: 0,
129
+ total: 2,
130
+ source: "provider_reported",
131
+ },
132
+ cost: { usd: 1, brl: 5, fx_rate: 5 },
133
+ provider: "openai",
134
+ model: "gpt-5",
135
+ source_segment_key: id,
136
+ model_call_id: `MCALL-${id}`,
137
+ runtime: { reasoning_effort: null, service_tier: null },
138
+ supersedes_event_id: null,
139
+ duration_ms: null,
140
+ duration_provenance: null,
141
+ },
142
+ {
143
+ schema_version: 2,
144
+ event_id: `${id}:3`,
145
+ run_id: id,
146
+ sequence: 3,
147
+ occurred_at: `${day}T12:00:02.000Z`,
148
+ type: "run.finished",
149
+ phase: "execution",
150
+ status: "completed",
151
+ duration_ms: duration,
152
+ duration_provenance: "observed",
153
+ },
154
+ ];
155
+ for (const [id, records] of [
156
+ [
157
+ "RUN-R1",
158
+ run("RUN-R1", "2026-08-01", "TASK-A", 600_000, "12:00:00.000Z", "SPEC-A", "PRD-A"),
159
+ ],
160
+ [
161
+ "RUN-R2",
162
+ run("RUN-R2", "2026-08-02", "TASK-B", 1_200_000, "12:00:00.000Z", "SPEC-B", "PRD-A"),
163
+ ],
164
+ [
165
+ "RUN-R3",
166
+ run("RUN-R3", "2026-08-02", "TASK-B", 1_200_000, "12:10:00.000Z", "SPEC-B", "PRD-A"),
167
+ ],
168
+ ] as const) {
169
+ await writeFile(
170
+ join(root, ".agents", "records", "runs", "2026", "08", `${id}.jsonl`),
171
+ `${records.map((record) => JSON.stringify(record)).join("\n")}\n`,
172
+ "utf8",
173
+ );
174
+ }
175
+ await writeFile(
176
+ join(
177
+ root,
178
+ ".agents",
179
+ "records",
180
+ "changes",
181
+ "2026",
182
+ "08",
183
+ "CHG-ART",
184
+ "artifacts",
185
+ "evidence",
186
+ "EVD-1.md",
187
+ ),
188
+ "---\nid: EVD-1\nobserved_at: 2026-08-01T12:00:00.000Z\n---\n# Evidence\n",
189
+ "utf8",
190
+ );
191
+ await writeFile(
192
+ join(
193
+ root,
194
+ ".agents",
195
+ "records",
196
+ "changes",
197
+ "2026",
198
+ "08",
199
+ "CHG-ART",
200
+ "artifacts",
201
+ "validations",
202
+ "VAL-1.md",
203
+ ),
204
+ "---\nid: VAL-1\nexecuted_at: 2026-08-02T12:00:00.000Z\n---\n# Validation\n",
205
+ "utf8",
206
+ );
207
+ for (const [kind, id] of [
208
+ ["tasks", "TASK-NO-RUN"],
209
+ ["specs", "SPEC-NO-RUN"],
210
+ ["prds", "PRD-NO-RUN"],
211
+ ] as const)
212
+ await writeFile(
213
+ join(root, ".agents", "records", kind, "2026", "08", `${id}.md`),
214
+ `---\nid: ${id}\ntitle: ${id}\nstatus: draft\ncreated_at: 2026-08-03T12:00:00.000Z\n---\n# ${id}\n`,
215
+ "utf8",
216
+ );
217
+ await rebuildSqliteReadModel(root);
218
+ const filesystem = new SqliteReadModelFileSystem(root);
219
+ expect(filesystem.firstFoldAggregate({ from: null, to: null }).execution_day_count).toBe(2);
220
+ expect(filesystem.firstFoldAggregate({ from: null, to: null }).duration_ms).toBe(2_400_000);
221
+ expect(filesystem.topTasks({ from: null, to: null })).toMatchObject([
222
+ { task_id: "TASK-B", duration_ms: 1_800_000 },
223
+ { task_id: "TASK-A", duration_ms: 600_000 },
224
+ ]);
225
+ expect(filesystem.summaryPage("task", { from: null, to: null }, 0, 50).rows).toContainEqual(
226
+ expect.objectContaining({
227
+ id: "TASK-B",
228
+ invocation_count: 2,
229
+ total_duration: 1_800_000,
230
+ total_tokens: 4,
231
+ total_cost_brl: 10,
232
+ }),
233
+ );
234
+ expect(filesystem.summaryPage("spec", { from: null, to: null }, 0, 50).rows).toContainEqual(
235
+ expect.objectContaining({
236
+ id: "SPEC-B",
237
+ invocation_count: 2,
238
+ total_duration: 1_800_000,
239
+ total_tokens: 4,
240
+ total_cost_brl: 10,
241
+ }),
242
+ );
243
+ expect(filesystem.summaryPage("prd", { from: null, to: null }, 0, 50).rows).toContainEqual(
244
+ expect.objectContaining({
245
+ id: "PRD-A",
246
+ invocation_count: 3,
247
+ total_duration: 2_400_000,
248
+ total_tokens: 6,
249
+ total_cost_brl: 15,
250
+ }),
251
+ );
252
+ expect(filesystem.summaryPage("task", { from: null, to: null }, 0, 50).rows).toContainEqual(
253
+ expect.objectContaining({
254
+ id: "TASK-NO-RUN",
255
+ invocation_count: null,
256
+ total_duration: null,
257
+ total_tokens: null,
258
+ total_cost_brl: null,
259
+ }),
260
+ );
261
+ const allTime = filesystem.firstFoldAllTime();
262
+ expectPersistedFirstFoldCaches(root, allTime, filesystem.firstFoldBoardAllTime());
263
+ expect(allTime.aggregate).toMatchObject({
264
+ start_day: "2026-08-01",
265
+ end_day: "2026-08-03",
266
+ task_count: 3,
267
+ spec_count: 3,
268
+ prd_count: 2,
269
+ total_run_count: 3,
270
+ duration_ms: 2_400_000,
271
+ total_tokens: 6,
272
+ cost_brl: 15,
273
+ execution_day_count: 2,
274
+ });
275
+ expect(allTime.task_status_counts).toEqual({ draft: 3 });
276
+ // The served quick projection uses this deliberately lean subset. It must
277
+ // remain factually identical to the rich projection for the six cards and
278
+ // two first-fold charts, while leaving rankings and macro metrics lazy.
279
+ const viewport = filesystem.firstFoldViewportAllTime();
280
+ expect(viewport.aggregate).toEqual(allTime.aggregate);
281
+ expect(viewport.task_status_counts).toEqual(allTime.task_status_counts);
282
+ expect(viewport.task_risk_counts).toEqual(allTime.task_risk_counts);
283
+ expect(allTime.top_tasks).toMatchObject([
284
+ { rank: 1, task_id: "TASK-B", total_duration_ms: 1_800_000 },
285
+ { rank: 2, task_id: "TASK-A", total_duration_ms: 600_000 },
286
+ ]);
287
+ expect(filesystem.firstFoldTopTasksAllTime()).toEqual(allTime.top_tasks);
288
+ expect(
289
+ projectAllTimeTopTasks([
290
+ {
291
+ task_id: "TASK-NO-USAGE",
292
+ total_duration_ms: null,
293
+ total_tokens: null,
294
+ total_cost_usd: null,
295
+ total_cost_brl: null,
296
+ total_run_count: 1,
297
+ },
298
+ ]),
299
+ ).toEqual([
300
+ {
301
+ task_id: "TASK-NO-USAGE",
302
+ duration_ms: null,
303
+ total_tokens: null,
304
+ total_cost_usd: null,
305
+ cost_brl: null,
306
+ run_count: 1,
307
+ },
308
+ ]);
309
+ const app = createDashboardApp(root, "test-session", undefined, { filesystem });
310
+ const allTimeQuick = await app.request("/api/v2/operations?scope=quick", {
311
+ headers: { "x-zaip-session": "test-session" },
312
+ });
313
+ const boundedQuick = await app.request(
314
+ "/api/v2/operations?scope=quick&from=2026-08-02&to=2026-08-02",
315
+ { headers: { "x-zaip-session": "test-session" } },
316
+ );
317
+ const topTasks = (await allTimeQuick.json()) as {
318
+ summary: { overview_metrics?: { top_tasks?: unknown[] } };
319
+ };
320
+ const boundedTopTasks = (await boundedQuick.json()) as {
321
+ summary: { overview_metrics?: { top_tasks?: unknown[] } };
322
+ };
323
+ expect(topTasks.summary.overview_metrics?.top_tasks).toEqual(
324
+ expect.arrayContaining([
325
+ expect.objectContaining({
326
+ task_id: "TASK-B",
327
+ duration_ms: 1_800_000,
328
+ total_tokens: 4,
329
+ cost_brl: 10,
330
+ }),
331
+ ]),
332
+ );
333
+ expect(boundedTopTasks.summary.overview_metrics?.top_tasks).toEqual([
334
+ expect.objectContaining({
335
+ task_id: "TASK-B",
336
+ duration_ms: 1_800_000,
337
+ total_tokens: 4,
338
+ cost_brl: 10,
339
+ }),
340
+ ]);
341
+ // A new calendar month after this immutable snapshot has no factual rows.
342
+ // It must be a fast exact empty projection, not a slow scan caused by the
343
+ // default date range changing at midnight on the first day of the month.
344
+ const nextMonthQuick = await app.request(
345
+ "/api/v2/operations?scope=quick&from=2026-09-01&to=2026-09-01",
346
+ { headers: { "x-zaip-session": "test-session" } },
347
+ );
348
+ const nextMonth = (await nextMonthQuick.json()) as {
349
+ summary: {
350
+ run_count: number;
351
+ task_count: number;
352
+ overview_metrics: { tokens: number | null; duration_ms: number | null };
353
+ };
354
+ };
355
+ expect(nextMonth.summary).toMatchObject({
356
+ run_count: 0,
357
+ task_count: 0,
358
+ overview_metrics: { tokens: null, duration_ms: null },
359
+ });
360
+ expect(allTime.macro_metrics.specs).toMatchObject({
361
+ entity_count: 3,
362
+ status_counts: { planning: 3 },
363
+ classification_counts: { structured: 2 },
364
+ total_run_count: 3,
365
+ total_duration_ms: 2_400_000,
366
+ total_tokens: 6,
367
+ total_cost_brl: 15,
368
+ average_duration_ms: 800_000,
369
+ });
370
+ expect(allTime.macro_metrics.specs.top_entities.slice(0, 2)).toMatchObject([
371
+ { rank: 1, entity_id: "SPEC-B", total_duration_ms: 1_800_000 },
372
+ { rank: 2, entity_id: "SPEC-A", total_duration_ms: 600_000 },
373
+ ]);
374
+ expect(allTime.macro_metrics.prds).toMatchObject({
375
+ entity_count: 2,
376
+ status_counts: { definition: 2 },
377
+ classification_counts: { structured: 1 },
378
+ total_run_count: 3,
379
+ total_duration_ms: 2_400_000,
380
+ total_tokens: 6,
381
+ total_cost_brl: 15,
382
+ average_duration_ms: 1_200_000,
383
+ });
384
+ const operationDays = filesystem.dailyPeriods({ from: null, to: null });
385
+ expect(Object.keys(operationDays)).toEqual(["2026-08-01", "2026-08-02", "2026-08-03"]);
386
+ expect(operationDays["2026-08-02"]).toMatchObject({
387
+ runs: 2,
388
+ specs: 1,
389
+ tasks: 1,
390
+ validations: 1,
391
+ evidences: 0,
392
+ usage: {
393
+ total_tokens: { known_sum: 4, unknown: 0 },
394
+ cost: { known_sum: 10, unknown: 0 },
395
+ },
396
+ duration: { known_sum: 1_800_000, unknown: 0 },
397
+ });
398
+ expect(filesystem.viewPage("operations_daily", { limit: 50 }).rows).toContainEqual(
399
+ expect.objectContaining({
400
+ day: "2026-08-02",
401
+ task_count: 1,
402
+ spec_count: 1,
403
+ validation_count: 1,
404
+ evidence_count: 0,
405
+ total_run_count: 2,
406
+ operations_total_duration: 1_800_000,
407
+ total_tokens: 4,
408
+ total_cost_brl: 10,
409
+ }),
410
+ );
411
+ for (const [view, key] of [
412
+ ["operations_monthly", "2026-08"],
413
+ ["operations_annual", "2026"],
414
+ ] as const) {
415
+ expect(filesystem.viewPage(view, { limit: 50 }).rows).toContainEqual(
416
+ expect.objectContaining({
417
+ period_key: key,
418
+ prd_count: 2,
419
+ spec_count: 3,
420
+ task_count: 3,
421
+ validation_count: 1,
422
+ evidence_count: 1,
423
+ total_run_count: 3,
424
+ operations_total_duration: 2_400_000,
425
+ total_tokens: 6,
426
+ total_cost_brl: 15,
427
+ }),
428
+ );
429
+ }
430
+ for (const view of ["operations_monthly", "operations_annual"] as const) {
431
+ expect(
432
+ filesystem.viewPage(view, {
433
+ from: "2026-08-02T03:00:00.000Z",
434
+ to: "2026-08-02T23:59:59.999Z",
435
+ limit: 50,
436
+ }).rows,
437
+ ).toEqual([
438
+ expect.objectContaining({
439
+ start_day: "2026-08-02",
440
+ end_day: "2026-08-02",
441
+ total_run_count: 2,
442
+ invocation_count: 2,
443
+ operations_total_duration: 1_800_000,
444
+ total_tokens: 4,
445
+ total_cost_usd: 2,
446
+ total_cost_brl: 10,
447
+ }),
448
+ ]);
449
+ }
450
+ for (const [view, key, counts] of [
451
+ [
452
+ "cost_monitor_daily",
453
+ "2026-08-02",
454
+ { prd_count: 0, spec_count: 1, task_count: 1, validation_count: 1, evidence_count: 0 },
455
+ ],
456
+ [
457
+ "cost_monitor_monthly",
458
+ "2026-08",
459
+ { prd_count: 2, spec_count: 3, task_count: 3, validation_count: 1, evidence_count: 1 },
460
+ ],
461
+ [
462
+ "cost_monitor_annual",
463
+ "2026",
464
+ { prd_count: 2, spec_count: 3, task_count: 3, validation_count: 1, evidence_count: 1 },
465
+ ],
466
+ ] as const) {
467
+ expect(filesystem.viewPage(view, { limit: 50 }).rows).toContainEqual(
468
+ expect.objectContaining({ key, ...counts }),
469
+ );
470
+ }
471
+ expect(filesystem.viewPage("cost_monitor_daily", { limit: 50 }).rows).toContainEqual(
472
+ expect.objectContaining({ key: "2026-08-03", prd_count: 1, spec_count: 1, task_count: 1 }),
473
+ );
474
+ expect(filesystem.viewPage("cost_monitor_monthly", { limit: 50 }).rows).toContainEqual(
475
+ expect.objectContaining({ key: "2026-08", prd_count: 2, spec_count: 3, task_count: 3 }),
476
+ );
477
+ expect(filesystem.viewPage("cost_monitor_annual", { limit: 50 }).rows).toContainEqual(
478
+ expect.objectContaining({ key: "2026", prd_count: 2, spec_count: 3, task_count: 3 }),
479
+ );
480
+ const annualCostPage = filesystem.viewPage("cost_monitor_annual", { limit: 50 });
481
+ const dailyCostRows = filesystem.viewPage("cost_monitor_daily", { limit: 50 }).rows;
482
+ const pagedDailyCostPage = filesystem.viewPage("cost_monitor_daily", { limit: 1 });
483
+ expect(pagedDailyCostPage).toMatchObject({
484
+ total_count: dailyCostRows.length,
485
+ rows: [expect.any(Object)],
486
+ });
487
+ expect(pagedDailyCostPage.totals).toMatchObject({
488
+ total_tokens: dailyCostRows.reduce((sum, row) => sum + Number(row.total_tokens ?? 0), 0),
489
+ total_cost_brl: dailyCostRows.reduce((sum, row) => sum + Number(row.total_cost_brl ?? 0), 0),
490
+ total_duration: dailyCostRows.reduce((sum, row) => sum + Number(row.total_duration ?? 0), 0),
491
+ });
492
+ expect(annualCostPage).toMatchObject({
493
+ total_count: 1,
494
+ rows: [expect.objectContaining({ key: "2026" })],
495
+ });
496
+ const annualCostRow = annualCostPage.rows[0];
497
+ if (annualCostRow === undefined) throw new Error("Expected the consolidated 2026 Cost row");
498
+ for (const metric of [
499
+ "prd_count",
500
+ "spec_count",
501
+ "task_count",
502
+ "validation_count",
503
+ "evidence_count",
504
+ "total_run_count",
505
+ "total_duration",
506
+ "duration_known",
507
+ "total_tokens",
508
+ "total_cost_usd",
509
+ "total_cost_brl",
510
+ ] as const) {
511
+ const observed = dailyCostRows
512
+ .map((row) => row[metric])
513
+ .filter((value): value is number => typeof value === "number");
514
+ expect(annualCostRow[metric]).toBe(
515
+ observed.length === 0 ? null : observed.reduce((sum, value) => sum + value, 0),
516
+ );
517
+ }
518
+ expect(
519
+ filesystem.viewPage("cost_monitor_daily", { limit: 50, provider: "openai" }).rows,
520
+ ).toContainEqual(
521
+ expect.objectContaining({
522
+ key: "2026-08-02",
523
+ prd_count: 0,
524
+ spec_count: 1,
525
+ task_count: 1,
526
+ validation_count: 1,
527
+ evidence_count: 0,
528
+ }),
529
+ );
530
+ for (const [view, entityCount] of [
531
+ ["cost_monitor_tasks", 2],
532
+ ["cost_monitor_specs", 3],
533
+ ["cost_monitor_prds", 2],
534
+ ["cost_monitor_conversations", 3],
535
+ ] as const) {
536
+ const page = filesystem.viewPage(view, { limit: 1 });
537
+ // The subtotal is computed before pagination and reconciles the full
538
+ // filtered population, rather than the single visible row.
539
+ expect(page).toMatchObject({ total_count: entityCount, rows: [expect.any(Object)] });
540
+ expect(page.totals).toEqual({
541
+ entity_count: entityCount,
542
+ invocation_count: 3,
543
+ total_duration: 2_400_000,
544
+ total_tokens: 6,
545
+ total_cost_usd: 3,
546
+ total_cost_brl: 15,
547
+ });
548
+ }
549
+ expect(
550
+ filesystem.viewPage("cost_monitor_tasks", {
551
+ from: "2026-08-02",
552
+ to: "2026-08-02",
553
+ query: "TASK-B",
554
+ limit: 1,
555
+ }).totals,
556
+ ).toEqual({
557
+ entity_count: 1,
558
+ invocation_count: 2,
559
+ total_duration: 1_800_000,
560
+ total_tokens: 4,
561
+ total_cost_usd: 2,
562
+ total_cost_brl: 10,
563
+ });
564
+ // The compact Cost Monitor tables share the canonical macro population
565
+ // with their big numbers. A macro with no direct invocation must remain
566
+ // paginable and retain unavailable financial facts as null.
567
+ expect(
568
+ filesystem.viewPage("cost_monitor_specs", { query: "SPEC-NO-RUN", limit: 1 }),
569
+ ).toMatchObject({
570
+ total_count: 1,
571
+ totals: {
572
+ entity_count: 1,
573
+ invocation_count: 0,
574
+ total_duration: null,
575
+ total_tokens: null,
576
+ total_cost_brl: null,
577
+ },
578
+ rows: [
579
+ expect.objectContaining({
580
+ id: "SPEC-NO-RUN",
581
+ title: "SPEC-NO-RUN",
582
+ invocation_count: 0,
583
+ total_duration: null,
584
+ total_tokens: null,
585
+ total_cost_brl: null,
586
+ }),
587
+ ],
588
+ });
589
+ expect(
590
+ filesystem.viewPage("cost_monitor_prds", { query: "PRD-NO-RUN", limit: 1 }),
591
+ ).toMatchObject({
592
+ total_count: 1,
593
+ totals: {
594
+ entity_count: 1,
595
+ invocation_count: 0,
596
+ total_duration: null,
597
+ total_tokens: null,
598
+ total_cost_brl: null,
599
+ },
600
+ rows: [
601
+ expect.objectContaining({
602
+ id: "PRD-NO-RUN",
603
+ title: "PRD-NO-RUN",
604
+ invocation_count: 0,
605
+ total_duration: null,
606
+ total_tokens: null,
607
+ total_cost_brl: null,
608
+ }),
609
+ ],
610
+ });
611
+ for (const view of [
612
+ "cost_monitor_tasks",
613
+ "cost_monitor_specs",
614
+ "cost_monitor_prds",
615
+ "cost_monitor_conversations",
616
+ ] as const) {
617
+ const filtered = filesystem.viewPage(view, {
618
+ phase: "execution",
619
+ provider: "openai",
620
+ model: "gpt-5",
621
+ limit: 1,
622
+ });
623
+ // Dimensional membership and the subtotal share one pre-pagination
624
+ // invocation population for every compact lifecycle view.
625
+ expect(filtered.rows).toHaveLength(1);
626
+ expect(filtered.totals).toMatchObject({
627
+ invocation_count: 3,
628
+ total_tokens: 6,
629
+ total_cost_brl: 15,
630
+ });
631
+ }
632
+ expect(filesystem.viewPage("cost_monitor_tasks", { workType: "new", limit: 1 })).toMatchObject({
633
+ total_count: 0,
634
+ rows: [],
635
+ });
636
+ expect(filesystem.firstFoldAllTime()).toBe(allTime);
637
+ filesystem.close();
638
+
639
+ // Period membership follows the canonical macro day, not an invocation
640
+ // that happened on another day. Search accepts either the macro ID or
641
+ // title, and totals are still calculated before its one-row page.
642
+ await writeFile(
643
+ join(root, ".agents", "records", "specs", "2026", "08", "SPEC-CANONICAL-DAY.md"),
644
+ "---\nid: SPEC-CANONICAL-DAY\ntitle: Macro by canonical title\nstatus: draft\ncreated_at: 2026-08-03T12:00:00.000Z\n---\n# Macro\n",
645
+ "utf8",
646
+ );
647
+ await writeFile(
648
+ join(root, ".agents", "records", "runs", "2026", "08", "RUN-CANONICAL-DAY.jsonl"),
649
+ `${run(
650
+ "RUN-CANONICAL-DAY",
651
+ "2026-08-02",
652
+ "TASK-CANONICAL-DAY",
653
+ 1_000,
654
+ "12:30:00.000Z",
655
+ "SPEC-CANONICAL-DAY",
656
+ )
657
+ .map((record) => JSON.stringify(record))
658
+ .join("\n")}\n`,
659
+ "utf8",
660
+ );
661
+ await writeFile(
662
+ join(root, ".agents", "records", "runs", "2026", "08", "RUN-CANONICAL-DAY-LATE.jsonl"),
663
+ `${run(
664
+ "RUN-CANONICAL-DAY-LATE",
665
+ "2026-08-04",
666
+ "TASK-CANONICAL-DAY-LATE",
667
+ 1_000,
668
+ "12:30:00.000Z",
669
+ "SPEC-CANONICAL-DAY",
670
+ )
671
+ .map((record) => JSON.stringify(record))
672
+ .join("\n")}\n`,
673
+ "utf8",
674
+ );
675
+ await rebuildSqliteReadModel(root);
676
+ const canonicalDayFilesystem = new SqliteReadModelFileSystem(root);
677
+ expect(
678
+ canonicalDayFilesystem.viewPage("cost_monitor_specs", {
679
+ from: "2026-08-03",
680
+ to: "2026-08-03",
681
+ query: "canonical title",
682
+ limit: 1,
683
+ }),
684
+ ).toMatchObject({
685
+ total_count: 1,
686
+ totals: { entity_count: 1, invocation_count: 0, total_tokens: null, total_cost_brl: null },
687
+ rows: [
688
+ expect.objectContaining({
689
+ id: "SPEC-CANONICAL-DAY",
690
+ invocation_count: 0,
691
+ total_tokens: null,
692
+ total_cost_brl: null,
693
+ }),
694
+ ],
695
+ });
696
+ expect(
697
+ canonicalDayFilesystem.viewPage("cost_monitor_specs", {
698
+ from: "2026-08-02",
699
+ to: "2026-08-02",
700
+ query: "SPEC-CANONICAL-DAY",
701
+ limit: 1,
702
+ }),
703
+ ).toMatchObject({ total_count: 0, rows: [] });
704
+ canonicalDayFilesystem.close();
705
+
706
+ // A large result set keeps its subtotal for all 270 matching Tasks while
707
+ // the page transports only 50 records.
708
+ for (let index = 0; index < 270; index += 1) {
709
+ const id = `RUN-PAGE-${index}`;
710
+ await writeFile(
711
+ join(root, ".agents", "records", "runs", "2026", "08", `${id}.jsonl`),
712
+ `${run(id, "2026-08-04", `TASK-PAGE-${index}`, 1_000)
713
+ .map((record) => JSON.stringify(record))
714
+ .join("\n")}\n`,
715
+ "utf8",
716
+ );
717
+ }
718
+ await rebuildSqliteReadModel(root);
719
+ const pageFilesystem = new SqliteReadModelFileSystem(root);
720
+ const paged = pageFilesystem.viewPage("cost_monitor_tasks", {
721
+ from: "2026-08-04",
722
+ to: "2026-08-04",
723
+ query: "TASK-PAGE-",
724
+ offset: 50,
725
+ limit: 50,
726
+ });
727
+ expect(paged).toMatchObject({ total_count: 270, has_more: true });
728
+ expect(paged.rows).toHaveLength(50);
729
+ expect(paged.totals).toEqual({
730
+ entity_count: 270,
731
+ invocation_count: 270,
732
+ total_duration: 1_000,
733
+ total_tokens: 540,
734
+ total_cost_usd: 270,
735
+ total_cost_brl: 1_350,
736
+ });
737
+ pageFilesystem.close();
738
+ });
739
+ });