@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,269 @@
1
+ import type { SqliteQueryContext, SqliteViewInput } from "./sqlite-query-context.js";
2
+ import type { SqliteViewName } from "./sqlite-read-model-types.js";
3
+ export function readAgentDimension(
4
+ context: SqliteQueryContext,
5
+ view: SqliteViewName,
6
+ input: SqliteViewInput,
7
+ _filteredCostGroup: "agent",
8
+ ) {
9
+ const clauses = ["i.zaip_agent IS NOT NULL"];
10
+ const values: Array<string | number> = [];
11
+ if (input.from) {
12
+ clauses.push(
13
+ "date(COALESCE(i.source_started_at, i.source_occurred_at, i.occurred_at), '-3 hours') >= ?",
14
+ );
15
+ values.push(input.from.slice(0, 10));
16
+ }
17
+ if (input.to) {
18
+ clauses.push(
19
+ "date(COALESCE(i.source_started_at, i.source_occurred_at, i.occurred_at), '-3 hours') <= ?",
20
+ );
21
+ values.push(input.to.slice(0, 10));
22
+ }
23
+ if (input.agent) {
24
+ clauses.push("i.zaip_agent = ?");
25
+ values.push(input.agent);
26
+ }
27
+ if (input.phase) {
28
+ clauses.push("i.phase = ?");
29
+ values.push(input.phase);
30
+ }
31
+ if (input.status) {
32
+ clauses.push("i.status = ?");
33
+ values.push(input.status);
34
+ }
35
+ // This read model does not materialize canonical Task priority. Keep
36
+ // the filtered view safe and avoid substituting a different field.
37
+ if (input.priority) clauses.push("0");
38
+ if (input.risk) {
39
+ clauses.push("t.risk = ?");
40
+ values.push(input.risk);
41
+ }
42
+ if (input.origin) {
43
+ const origin =
44
+ input.origin === "prd"
45
+ ? "i.prd_id IS NOT NULL"
46
+ : input.origin === "spec"
47
+ ? "i.prd_id IS NULL AND i.spec_id IS NOT NULL"
48
+ : input.origin === "task"
49
+ ? "i.prd_id IS NULL AND i.spec_id IS NULL AND i.task_id IS NOT NULL"
50
+ : "i.prd_id IS NULL AND i.spec_id IS NULL AND i.task_id IS NULL";
51
+ clauses.push(origin);
52
+ }
53
+ // SQLite invocation facts do not contain canonical work_type. A work-type
54
+ // filter must therefore return no rows rather than inventing attribution.
55
+ if (input.workType) clauses.push("0");
56
+ const segment: string[] = [];
57
+ if (input.provider) {
58
+ if (input.provider === "unavailable")
59
+ clauses.push(
60
+ "NOT EXISTS (SELECT 1 FROM invocation_usage known_provider WHERE known_provider.agent_invocation_id=i.agent_invocation_id AND known_provider.provider IS NOT NULL AND known_provider.provider <> 'unavailable')",
61
+ );
62
+ else {
63
+ segment.push("f.provider = ?");
64
+ values.push(input.provider);
65
+ }
66
+ }
67
+ if (input.model) {
68
+ if (input.model === "unavailable")
69
+ clauses.push(
70
+ "NOT EXISTS (SELECT 1 FROM invocation_usage known_model WHERE known_model.agent_invocation_id=i.agent_invocation_id AND known_model.model IS NOT NULL AND known_model.model <> 'unavailable')",
71
+ );
72
+ else {
73
+ segment.push("f.model = ?");
74
+ values.push(input.model);
75
+ }
76
+ }
77
+ if (segment.length > 0)
78
+ clauses.push(
79
+ `EXISTS (SELECT 1 FROM invocation_usage f WHERE f.agent_invocation_id=i.agent_invocation_id AND ${segment.join(" AND ")})`,
80
+ );
81
+ if (input.query) {
82
+ const query = `%${input.query}%`;
83
+ clauses.push("(i.zaip_agent LIKE ? OR i.zaip_agent_persona LIKE ? OR i.zaip_agent_job LIKE ?)");
84
+ values.push(query, query, query);
85
+ }
86
+ // This is deliberately the same financial fact population as the Cost
87
+ // Monitor summary, grouped by the factual activity.zaip_agent. It is
88
+ // not an invocation-only approximation.
89
+ const sourceDay =
90
+ "date(COALESCE(a.source_started_at, a.source_occurred_at, a.occurred_at), '-3 hours')";
91
+ const activityClauses = [
92
+ "a.activity_source_kind <> 'agent_run'",
93
+ "a.zaip_agent IS NOT NULL",
94
+ "(a.total_tokens IS NOT NULL OR a.cost_brl IS NOT NULL OR a.cost_usd IS NOT NULL)",
95
+ ];
96
+ const activityValues: Array<string | number> = [];
97
+ if (input.from) {
98
+ activityClauses.push(`${sourceDay} >= ?`);
99
+ activityValues.push(input.from.slice(0, 10));
100
+ }
101
+ if (input.to) {
102
+ activityClauses.push(`${sourceDay} <= ?`);
103
+ activityValues.push(input.to.slice(0, 10));
104
+ }
105
+ if (input.agent) {
106
+ activityClauses.push("a.zaip_agent = ?");
107
+ activityValues.push(input.agent);
108
+ }
109
+ if (input.phase) {
110
+ activityClauses.push("a.phase = ?");
111
+ activityValues.push(input.phase);
112
+ }
113
+ if (input.status) {
114
+ activityClauses.push("a.status = ?");
115
+ activityValues.push(input.status);
116
+ }
117
+ if (input.priority || input.workType) activityClauses.push("0");
118
+ if (input.risk) {
119
+ activityClauses.push("activity_task.risk = ?");
120
+ activityValues.push(input.risk);
121
+ }
122
+ if (input.origin)
123
+ activityClauses.push(
124
+ input.origin === "prd"
125
+ ? "a.prd_id IS NOT NULL"
126
+ : input.origin === "spec"
127
+ ? "a.prd_id IS NULL AND a.spec_id IS NOT NULL"
128
+ : input.origin === "task"
129
+ ? "a.prd_id IS NULL AND a.spec_id IS NULL AND a.task_id IS NOT NULL"
130
+ : "a.prd_id IS NULL AND a.spec_id IS NULL AND a.task_id IS NULL",
131
+ );
132
+ if (input.provider || input.model) {
133
+ const direct: string[] = [];
134
+ const usage: string[] = [];
135
+ if (input.provider) {
136
+ direct.push("COALESCE(a.provider, 'unavailable') = ?");
137
+ usage.push("COALESCE(u.provider, 'unavailable') = ?");
138
+ activityValues.push(input.provider);
139
+ }
140
+ if (input.model) {
141
+ direct.push("COALESCE(a.model, 'unavailable') = ?");
142
+ usage.push("COALESCE(u.model, 'unavailable') = ?");
143
+ activityValues.push(input.model);
144
+ }
145
+ activityClauses.push(
146
+ `((a.agent_run_id IS NULL AND ${direct.join(" AND ")}) OR (a.agent_run_id IS NOT NULL AND EXISTS (SELECT 1 FROM invocation_usage u WHERE u.agent_invocation_id = a.agent_run_id AND ${usage.join(" AND ")})))`,
147
+ );
148
+ if (input.provider) activityValues.push(input.provider);
149
+ if (input.model) activityValues.push(input.model);
150
+ }
151
+ if (input.query) {
152
+ const query = `%${input.query}%`;
153
+ activityClauses.push(
154
+ "(a.zaip_agent LIKE ? OR a.zaip_agent_persona LIKE ? OR a.zaip_agent_job LIKE ?)",
155
+ );
156
+ activityValues.push(query, query, query);
157
+ }
158
+ const _where = clauses.join(" AND ");
159
+ const invocationClauses = ["i.zaip_agent IS NOT NULL"];
160
+ const invocationValues: Array<string | number> = [];
161
+ const invocationSourceDay =
162
+ "date(COALESCE(i.source_started_at, i.source_occurred_at, i.occurred_at), '-3 hours')";
163
+ if (input.from) {
164
+ invocationClauses.push(`${invocationSourceDay} >= ?`);
165
+ invocationValues.push(input.from.slice(0, 10));
166
+ // Keep the source-day predicate for historical correctness, while
167
+ // using the materialized day key to seek the immutable fact first.
168
+ invocationClauses.push("i.occurred_day_sp >= ?");
169
+ invocationValues.push(input.from.slice(0, 10));
170
+ }
171
+ if (input.to) {
172
+ invocationClauses.push(`${invocationSourceDay} <= ?`);
173
+ invocationValues.push(input.to.slice(0, 10));
174
+ invocationClauses.push("i.occurred_day_sp <= ?");
175
+ invocationValues.push(input.to.slice(0, 10));
176
+ }
177
+ if (input.agent) {
178
+ invocationClauses.push("i.zaip_agent = ?");
179
+ invocationValues.push(input.agent);
180
+ }
181
+ if (input.phase) {
182
+ invocationClauses.push("i.phase = ?");
183
+ invocationValues.push(input.phase);
184
+ }
185
+ if (input.status) {
186
+ invocationClauses.push("i.status = ?");
187
+ invocationValues.push(input.status);
188
+ }
189
+ if (input.priority || input.workType) invocationClauses.push("0");
190
+ if (input.risk) {
191
+ invocationClauses.push("invocation_task.risk = ?");
192
+ invocationValues.push(input.risk);
193
+ }
194
+ if (input.origin)
195
+ invocationClauses.push(
196
+ input.origin === "prd"
197
+ ? "i.prd_id IS NOT NULL"
198
+ : input.origin === "spec"
199
+ ? "i.prd_id IS NULL AND i.spec_id IS NOT NULL"
200
+ : input.origin === "task"
201
+ ? "i.prd_id IS NULL AND i.spec_id IS NULL AND i.task_id IS NOT NULL"
202
+ : "i.prd_id IS NULL AND i.spec_id IS NULL AND i.task_id IS NULL",
203
+ );
204
+ if (input.provider || input.model) {
205
+ const segment: string[] = [];
206
+ if (input.provider) {
207
+ segment.push("COALESCE(u.provider, 'unavailable') = ?");
208
+ invocationValues.push(input.provider);
209
+ }
210
+ if (input.model) {
211
+ segment.push("COALESCE(u.model, 'unavailable') = ?");
212
+ invocationValues.push(input.model);
213
+ }
214
+ invocationClauses.push(
215
+ `EXISTS (SELECT 1 FROM invocation_usage u WHERE u.agent_invocation_id=i.agent_invocation_id AND ${segment.join(" AND ")})`,
216
+ );
217
+ }
218
+ if (input.query) {
219
+ const query = `%${input.query}%`;
220
+ invocationClauses.push(
221
+ "(i.zaip_agent LIKE ? OR i.zaip_agent_persona LIKE ? OR i.zaip_agent_job LIKE ?)",
222
+ );
223
+ invocationValues.push(query, query, query);
224
+ }
225
+ const groupedFacts = `WITH agent_facts AS (
226
+ SELECT i.zaip_agent AS key, i.zaip_agent_persona AS persona, i.zaip_agent_job AS job, d.persona AS catalog_persona, d.job AS catalog_job,
227
+ i.occurred_at, i.task_id, i.duration_ms, i.source_event_count, i.total_tokens, i.cost_usd, i.cost_brl
228
+ FROM invocations i LEFT JOIN tasks invocation_task ON invocation_task.id=i.task_id LEFT JOIN zaip_dim_zaip_agent d ON d.zaip_agent = i.zaip_agent
229
+ WHERE ${invocationClauses.join(" AND ")}
230
+ UNION ALL
231
+ SELECT a.zaip_agent AS key, a.zaip_agent_persona AS persona, a.zaip_agent_job AS job, d.persona AS catalog_persona, d.job AS catalog_job,
232
+ a.occurred_at, a.task_id, a.attributed_token_active_ms AS duration_ms, a.source_event_count, a.total_tokens, a.cost_usd, a.cost_brl
233
+ FROM activities a LEFT JOIN tasks activity_task ON activity_task.id=a.task_id LEFT JOIN zaip_dim_zaip_agent d ON d.zaip_agent = a.zaip_agent
234
+ WHERE ${activityClauses.join(" AND ")}
235
+ )`;
236
+ const limit = Math.min(200, Math.max(1, input.limit ?? 50));
237
+ const offset = Math.max(0, input.offset ?? 0);
238
+ const total_count = Number(
239
+ (
240
+ context.database
241
+ .prepare(`${groupedFacts} SELECT COUNT(DISTINCT key) AS count FROM agent_facts`)
242
+ .get(...invocationValues, ...activityValues) as { count: number }
243
+ ).count,
244
+ );
245
+ // Activity facts retain the catalog snapshot used when they were
246
+ // materialized. The current dimension is a safe fallback for older
247
+ // snapshots that predate those fields: it supplies only catalog display
248
+ // metadata, never tokens, cost, duration, or attribution.
249
+ const totals = context.database
250
+ .prepare(
251
+ `${groupedFacts} SELECT COUNT(*) AS invocation_count, COUNT(DISTINCT task_id) AS task_count, SUM(duration_ms) AS total_duration, SUM(CASE WHEN duration_ms IS NULL THEN 1 ELSE 0 END) AS duration_unknown, SUM(CASE WHEN duration_ms IS NULL THEN 0 ELSE duration_ms END) AS duration_known, SUM(source_event_count) AS source_event_count, SUM(total_tokens) AS total_tokens, SUM(cost_usd) AS total_cost_usd, SUM(cost_brl) AS total_cost_brl FROM agent_facts`,
252
+ )
253
+ .get(...invocationValues, ...activityValues) as Record<string, unknown>;
254
+ const rows = context.database
255
+ .prepare(
256
+ `${groupedFacts} SELECT key, key AS label, COALESCE(MAX(persona), MAX(catalog_persona)) AS persona, COALESCE(MAX(job), MAX(catalog_job)) AS job, MAX(occurred_at) AS latest_started_at, COUNT(*) AS invocation_count, COUNT(DISTINCT task_id) AS task_count, SUM(duration_ms) AS total_duration, SUM(CASE WHEN duration_ms IS NULL THEN 1 ELSE 0 END) AS duration_unknown, SUM(CASE WHEN duration_ms IS NULL THEN 0 ELSE duration_ms END) AS duration_known, SUM(source_event_count) AS source_event_count, SUM(total_tokens) AS total_tokens, SUM(cost_usd) AS total_cost_usd, SUM(cost_brl) AS total_cost_brl FROM agent_facts GROUP BY key ORDER BY total_cost_brl DESC, key LIMIT ? OFFSET ?`,
257
+ )
258
+ .all(...invocationValues, ...activityValues, limit, offset) as Array<Record<string, unknown>>;
259
+ return {
260
+ data_source: "sqlite_read_model" as const,
261
+ view,
262
+ offset,
263
+ limit,
264
+ total_count,
265
+ has_more: offset + rows.length < total_count,
266
+ totals,
267
+ rows,
268
+ };
269
+ }
@@ -0,0 +1,32 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import type { CostSummarySource } from "@zaip-ai/dashboard-cost-monitor/server";
3
+ import type { SqliteReadModelFileSystem } from "./sqlite-read-model-filesystem.js";
4
+ import type { SqliteViewName } from "./sqlite-read-model-types.js";
5
+ export type SqliteViewInput = Parameters<SqliteReadModelFileSystem["viewPage"]>[1];
6
+ /** Query functions borrow a connection and caches owned by one immutable generation. */
7
+ export type SqliteQueryContext = Pick<
8
+ SqliteReadModelFileSystem,
9
+ | "executionDurationByDay"
10
+ | "costMonitorFinancialActivityRows"
11
+ | "costMonitorFactualDurationByDay"
12
+ | "costMonitorSummaryAggregate"
13
+ | "firstFoldMonthlyQuick"
14
+ > & {
15
+ database: DatabaseSync;
16
+ executionDurationCache: Map<string, Map<string, number>>;
17
+ costMonitorSummaryCache: Map<string, CostSummarySource>;
18
+ dailyAggregateRows(): Array<Record<string, number | string | null>>;
19
+ technicalPayloadRows(payloadType: string): Array<Record<string, unknown>>;
20
+ unfilteredViewRows(view: SqliteViewName): Array<Record<string, unknown>>;
21
+ };
22
+
23
+ export interface SqliteViewPage extends Record<string, unknown> {
24
+ data_source: "sqlite_read_model";
25
+ view: string;
26
+ offset: number;
27
+ limit: number;
28
+ total_count: number;
29
+ has_more: boolean;
30
+ totals?: Record<string, unknown>;
31
+ rows: Array<Record<string, unknown>>;
32
+ }
@@ -0,0 +1,244 @@
1
+ import { type CostGroupKind, readCostGroupPage } from "./sqlite-cost-group-page.js";
2
+ import type { SqliteQueryContext, SqliteViewInput } from "./sqlite-query-context.js";
3
+ import type { SqliteViewName } from "./sqlite-read-model-types.js";
4
+ export function readEntityGroup(
5
+ context: SqliteQueryContext,
6
+ view: SqliteViewName,
7
+ input: SqliteViewInput,
8
+ groupKind: string,
9
+ ) {
10
+ // SPEC/PRD cards are canonical macro populations, not an invocation
11
+ // dimension. Start from their records so a macro created in the
12
+ // selected period remains visible even when its invocation is absent
13
+ // or belongs to another period. Financial measures stay nullable.
14
+ const isCanonicalMacro = groupKind === "spec" || groupKind === "prd";
15
+ const hasInvocationOnlyFilter = Boolean(
16
+ input.provider ||
17
+ input.model ||
18
+ input.agent ||
19
+ input.phase ||
20
+ input.origin ||
21
+ input.workType ||
22
+ input.priority,
23
+ );
24
+ if (isCanonicalMacro && !hasInvocationOnlyFilter) {
25
+ const entityTable = groupKind === "spec" ? "specs" : "prds";
26
+ const invocationColumn = groupKind === "spec" ? "spec_id" : "prd_id";
27
+ const entityClauses: string[] = [];
28
+ const entityValues: Array<string | number> = [];
29
+ const invocationClauses: string[] = [];
30
+ const invocationValues: Array<string | number> = [];
31
+ if (input.from) {
32
+ entityClauses.push("entity.occurred_day_sp >= ?");
33
+ entityValues.push(input.from.slice(0, 10));
34
+ invocationClauses.push("i.occurred_day_sp >= ?");
35
+ invocationValues.push(input.from.slice(0, 10));
36
+ }
37
+ if (input.to) {
38
+ entityClauses.push("entity.occurred_day_sp <= ?");
39
+ entityValues.push(input.to.slice(0, 10));
40
+ invocationClauses.push("i.occurred_day_sp <= ?");
41
+ invocationValues.push(input.to.slice(0, 10));
42
+ }
43
+ if (input.status) {
44
+ entityClauses.push("entity.status = ?");
45
+ entityValues.push(input.status);
46
+ }
47
+ if (input.risk) {
48
+ entityClauses.push("entity.risk = ?");
49
+ entityValues.push(input.risk);
50
+ }
51
+ if (input.query) {
52
+ entityClauses.push("(entity.id LIKE ? OR COALESCE(entity.title, '') LIKE ?)");
53
+ entityValues.push(`%${input.query}%`, `%${input.query}%`);
54
+ }
55
+ const entityWhere = entityClauses.length === 0 ? "1" : entityClauses.join(" AND ");
56
+ const invocationJoin =
57
+ invocationClauses.length === 0 ? "" : ` AND ${invocationClauses.join(" AND ")}`;
58
+ const ctes = `WITH grouped AS (
59
+ SELECT entity.id AS group_value, entity.title, entity.status, entity.risk,
60
+ COALESCE(MIN(i.occurred_day_sp), entity.occurred_day_sp) AS first_day,
61
+ COALESCE(MAX(i.occurred_day_sp), entity.occurred_day_sp) AS last_day,
62
+ COALESCE(MAX(i.occurred_at), entity.occurred_at) AS occurred_at,
63
+ COUNT(i.agent_invocation_id) AS invocation_count,
64
+ SUM(i.llm_call_count) AS llm_call_count, SUM(i.duration_ms) AS total_duration,
65
+ SUM(i.input_tokens) AS total_input_tokens,
66
+ SUM(i.cached_input_tokens) AS total_cached_input_tokens,
67
+ SUM(i.output_tokens) AS total_output_tokens,
68
+ SUM(i.reasoning_tokens) AS total_reasoning_tokens,
69
+ SUM(i.total_tokens) AS total_tokens, SUM(i.cost_usd) AS total_cost_usd,
70
+ SUM(i.cost_brl) AS total_cost_brl
71
+ FROM ${entityTable} entity
72
+ LEFT JOIN invocations i ON i.${invocationColumn} = entity.id${invocationJoin}
73
+ WHERE ${entityWhere}
74
+ GROUP BY entity.id, entity.title, entity.status, entity.risk, entity.occurred_at, entity.occurred_day_sp
75
+ )`;
76
+ const limit = Math.min(200, Math.max(1, input.limit ?? 50));
77
+ const offset = Math.max(0, input.offset ?? 0);
78
+ const values = [...invocationValues, ...entityValues];
79
+ const total_count = Number(
80
+ (
81
+ context.database
82
+ .prepare(`${ctes} SELECT COUNT(*) AS count FROM grouped`)
83
+ .get(...values) as { count: number }
84
+ ).count,
85
+ );
86
+ const totals = context.database
87
+ .prepare(
88
+ `${ctes} SELECT COUNT(*) AS entity_count, COALESCE(SUM(invocation_count), 0) AS invocation_count, ROUND(SUM(total_duration)) AS total_duration, SUM(total_tokens) AS total_tokens, SUM(total_cost_usd) AS total_cost_usd, SUM(total_cost_brl) AS total_cost_brl FROM grouped`,
89
+ )
90
+ .get(...values) as Record<string, unknown>;
91
+ const rows = context.database
92
+ .prepare(
93
+ `${ctes} SELECT group_value AS id, group_value AS key, title, status, risk, first_day, last_day, occurred_at, invocation_count, llm_call_count, total_duration, total_input_tokens, total_cached_input_tokens, total_output_tokens, total_reasoning_tokens, total_tokens, total_cost_usd, total_cost_brl FROM grouped ORDER BY total_cost_brl DESC, group_value LIMIT ? OFFSET ?`,
94
+ )
95
+ .all(...values, limit, offset) as Array<Record<string, unknown>>;
96
+ return {
97
+ data_source: "sqlite_read_model" as const,
98
+ view,
99
+ offset,
100
+ limit,
101
+ total_count,
102
+ has_more: offset + rows.length < total_count,
103
+ totals,
104
+ rows,
105
+ };
106
+ }
107
+ const hasDimensionalFilter = Boolean(
108
+ input.provider ||
109
+ input.model ||
110
+ input.agent ||
111
+ input.phase ||
112
+ input.status ||
113
+ input.origin ||
114
+ input.workType ||
115
+ input.priority ||
116
+ input.risk,
117
+ );
118
+ if (hasDimensionalFilter) {
119
+ const column = {
120
+ task: "i.task_id",
121
+ spec: "i.spec_id",
122
+ prd: "i.prd_id",
123
+ execution: "i.execution_id",
124
+ conversation: "i.conversation_id",
125
+ }[groupKind];
126
+ const entity =
127
+ groupKind === "task"
128
+ ? "tasks"
129
+ : groupKind === "spec"
130
+ ? "specs"
131
+ : groupKind === "prd"
132
+ ? "prds"
133
+ : null;
134
+ const clauses = [`${column} IS NOT NULL`];
135
+ const values: Array<string | number> = [];
136
+ if (input.from) {
137
+ clauses.push("i.occurred_day_sp >= ?");
138
+ values.push(input.from.slice(0, 10));
139
+ }
140
+ if (input.to) {
141
+ clauses.push("i.occurred_day_sp <= ?");
142
+ values.push(input.to.slice(0, 10));
143
+ }
144
+ if (input.agent) {
145
+ clauses.push("i.zaip_agent = ?");
146
+ values.push(input.agent);
147
+ }
148
+ if (input.phase) {
149
+ clauses.push("i.phase = ?");
150
+ values.push(input.phase);
151
+ }
152
+ if (input.status) {
153
+ clauses.push("i.status = ?");
154
+ values.push(input.status);
155
+ }
156
+ if (input.risk) {
157
+ clauses.push("task_entity.risk = ?");
158
+ values.push(input.risk);
159
+ }
160
+ if (input.origin)
161
+ clauses.push(
162
+ input.origin === "prd"
163
+ ? "i.prd_id IS NOT NULL"
164
+ : input.origin === "spec"
165
+ ? "i.prd_id IS NULL AND i.spec_id IS NOT NULL"
166
+ : input.origin === "task"
167
+ ? "i.prd_id IS NULL AND i.spec_id IS NULL AND i.task_id IS NOT NULL"
168
+ : "i.prd_id IS NULL AND i.spec_id IS NULL AND i.task_id IS NULL",
169
+ );
170
+ // Compact lifecycle rows do not materialize canonical work type or Task priority.
171
+ // Return a safe empty result instead of substituting another attribution.
172
+ if (input.workType || input.priority) clauses.push("0");
173
+ const segment: string[] = [];
174
+ if (input.provider) {
175
+ if (input.provider === "unavailable")
176
+ clauses.push(
177
+ "NOT EXISTS (SELECT 1 FROM invocation_usage known_provider WHERE known_provider.agent_invocation_id=i.agent_invocation_id AND known_provider.provider IS NOT NULL AND known_provider.provider <> 'unavailable')",
178
+ );
179
+ else {
180
+ segment.push("u.provider = ?");
181
+ values.push(input.provider);
182
+ }
183
+ }
184
+ if (input.model) {
185
+ if (input.model === "unavailable")
186
+ clauses.push(
187
+ "NOT EXISTS (SELECT 1 FROM invocation_usage known_model WHERE known_model.agent_invocation_id=i.agent_invocation_id AND known_model.model IS NOT NULL AND known_model.model <> 'unavailable')",
188
+ );
189
+ else {
190
+ segment.push("u.model = ?");
191
+ values.push(input.model);
192
+ }
193
+ }
194
+ if (segment.length > 0)
195
+ clauses.push(
196
+ `EXISTS (SELECT 1 FROM invocation_usage u WHERE u.agent_invocation_id=i.agent_invocation_id AND ${segment.join(" AND ")})`,
197
+ );
198
+ if (input.query) {
199
+ clauses.push(
200
+ entity === null
201
+ ? `${column} LIKE ?`
202
+ : `(${column} LIKE ? OR COALESCE(entity.title, '') LIKE ?)`,
203
+ );
204
+ values.push(`%${input.query}%`, ...(entity === null ? [] : [`%${input.query}%`]));
205
+ }
206
+ const entityJoin = entity === null ? "" : `LEFT JOIN ${entity} entity ON entity.id=${column}`;
207
+ const taskJoin = "LEFT JOIN tasks task_entity ON task_entity.id=i.task_id";
208
+ const join = `${entityJoin} ${taskJoin}`;
209
+ const where = clauses.join(" AND ");
210
+ const title = entity === null ? column : `COALESCE(MAX(entity.title), ${column})`;
211
+ const status = entity === null ? "NULL" : "MAX(entity.status)";
212
+ const ctes = `WITH grouped AS (SELECT ${column} AS group_value, ${title} AS title, ${status} AS status, MAX(task_entity.risk) AS risk, MAX(i.occurred_at) AS occurred_at, COUNT(*) AS invocation_count, SUM(i.duration_ms) AS total_duration, SUM(i.total_tokens) AS total_tokens, SUM(i.cost_usd) AS total_cost_usd, SUM(i.cost_brl) AS total_cost_brl FROM invocations i ${join} WHERE ${where} GROUP BY ${column})`;
213
+ const limit = Math.min(200, Math.max(1, input.limit ?? 50));
214
+ const offset = Math.max(0, input.offset ?? 0);
215
+ const total_count = Number(
216
+ (
217
+ context.database
218
+ .prepare(`${ctes} SELECT COUNT(*) AS count FROM grouped`)
219
+ .get(...values) as { count: number }
220
+ ).count,
221
+ );
222
+ const totals = context.database
223
+ .prepare(
224
+ `${ctes} SELECT COUNT(*) AS entity_count, COALESCE(SUM(invocation_count), 0) AS invocation_count, ROUND(SUM(total_duration)) AS total_duration, SUM(total_tokens) AS total_tokens, SUM(total_cost_usd) AS total_cost_usd, SUM(total_cost_brl) AS total_cost_brl FROM grouped`,
225
+ )
226
+ .get(...values) as Record<string, unknown>;
227
+ const rows = context.database
228
+ .prepare(
229
+ `${ctes} SELECT group_value AS id, group_value AS key, title, status, risk, occurred_at, invocation_count, total_duration, total_tokens, total_cost_usd, total_cost_brl FROM grouped ORDER BY total_cost_brl DESC, group_value LIMIT ? OFFSET ?`,
230
+ )
231
+ .all(...values, limit, offset) as Array<Record<string, unknown>>;
232
+ return {
233
+ data_source: "sqlite_read_model" as const,
234
+ view,
235
+ offset,
236
+ limit,
237
+ total_count,
238
+ has_more: offset + rows.length < total_count,
239
+ totals,
240
+ rows,
241
+ };
242
+ }
243
+ return readCostGroupPage(context.database, view, groupKind as CostGroupKind, input);
244
+ }