@zaip-ai/cli 1.3.8 → 1.4.1

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 (315) hide show
  1. package/README.md +58 -3
  2. package/dist/commands/init.d.ts +1 -0
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +17 -6
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/services/adapters.js +4 -4
  11. package/dist/services/adapters.js.map +1 -1
  12. package/dist/services/codex-config-template.d.ts +2 -2
  13. package/dist/services/codex-config-template.d.ts.map +1 -1
  14. package/dist/services/codex-config-template.js +3 -3
  15. package/dist/services/codex-config-template.js.map +1 -1
  16. package/dist/services/codex-rules.d.ts +1 -1
  17. package/dist/services/codex-rules.d.ts.map +1 -1
  18. package/dist/services/codex-rules.js +9 -24
  19. package/dist/services/codex-rules.js.map +1 -1
  20. package/dist/services/delivery-git-preflight.d.ts +23 -0
  21. package/dist/services/delivery-git-preflight.d.ts.map +1 -0
  22. package/dist/services/delivery-git-preflight.js +69 -0
  23. package/dist/services/delivery-git-preflight.js.map +1 -0
  24. package/dist/services/doctor.d.ts.map +1 -1
  25. package/dist/services/doctor.js +13 -1
  26. package/dist/services/doctor.js.map +1 -1
  27. package/dist/services/install-agents-template.d.ts.map +1 -1
  28. package/dist/services/install-agents-template.js +22 -28
  29. package/dist/services/install-agents-template.js.map +1 -1
  30. package/dist/services/install-profile.d.ts +8 -0
  31. package/dist/services/install-profile.d.ts.map +1 -0
  32. package/dist/services/install-profile.js +56 -0
  33. package/dist/services/install-profile.js.map +1 -0
  34. package/dist/services/logger.d.ts.map +1 -1
  35. package/dist/services/logger.js +6 -5
  36. package/dist/services/logger.js.map +1 -1
  37. package/dist/services/stack-git.d.ts +9 -0
  38. package/dist/services/stack-git.d.ts.map +1 -0
  39. package/dist/services/stack-git.js +188 -0
  40. package/dist/services/stack-git.js.map +1 -0
  41. package/dist/services/stack-plan.d.ts +3 -1
  42. package/dist/services/stack-plan.d.ts.map +1 -1
  43. package/dist/services/stack-plan.js +15 -1
  44. package/dist/services/stack-plan.js.map +1 -1
  45. package/dist/services/stack-terraform.d.ts +13 -0
  46. package/dist/services/stack-terraform.d.ts.map +1 -0
  47. package/dist/services/stack-terraform.js +274 -0
  48. package/dist/services/stack-terraform.js.map +1 -0
  49. package/dist/services/template-manifest.d.ts.map +1 -1
  50. package/dist/services/template-manifest.js +14 -1
  51. package/dist/services/template-manifest.js.map +1 -1
  52. package/dist/types.d.ts +1 -0
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/templates/.agents/.env.example +34 -0
  56. package/templates/{README.md → .agents/README.md} +124 -60
  57. package/templates/.agents/config/agents/catalog.yaml +23 -23
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -0
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -0
  60. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +5 -4
  61. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -0
  62. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -0
  63. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +10 -7
  64. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -0
  65. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -0
  66. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -0
  67. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +5 -4
  68. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -0
  69. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -0
  70. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -0
  71. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -0
  72. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +5 -4
  73. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -0
  74. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -0
  75. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -0
  76. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -0
  77. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -0
  78. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -0
  79. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +5 -4
  80. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -0
  81. package/templates/.agents/config/pricing/models.json +25 -1
  82. package/templates/.agents/config/project.yaml +2 -0
  83. package/templates/.agents/dashboard/.zaip-managed.json +200 -88
  84. package/templates/.agents/dashboard/DATA-DICTIONARY.md +1 -1
  85. package/templates/.agents/dashboard/README.md +58 -19
  86. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-DwVZOmMV.js → CostCalculationGuidePage-snUCQYTC.js} +1 -1
  87. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-VcLx9iOO.js → DashboardHelpDialog-oZVlf-l5.js} +72 -8
  88. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-CyjMXkm8.js → PricingSettingsDialog-BPtVUGgs.js} +1 -1
  89. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +3 -0
  90. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-DFZwIXSC.js → TraceabilityWorkspace-BYjVOHI_.js} +1 -1
  91. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +68 -0
  92. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DXBOtWNI.js → icons-vendor-TPUT2IUt.js} +1 -1
  93. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Cmlx8OYH.css +1 -0
  94. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-ZJFXmK7m.js +2 -0
  95. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-DaNXQPyk.js → react-vendor-Ct48XHGL.js} +1 -1
  96. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-I4AKqVDX.js → traceability-BDe4_Ubl.js} +1 -1
  97. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  98. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +73 -67
  99. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +35 -7
  100. package/templates/.agents/dashboard/apps/frontend/src/AppWorkBoard.ts +55 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +11 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/app-loading-boundary.css +98 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +5 -5
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-reconciliation.ts +33 -0
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +75 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +7 -8
  107. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +14 -2
  108. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +35 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +78 -2
  110. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +28 -0
  111. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +8 -5
  112. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +180 -1
  113. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +7 -4
  114. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +13 -7
  115. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +14 -0
  116. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableDisplay.ts +211 -0
  117. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +152 -157
  118. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +155 -142
  119. package/templates/.agents/dashboard/modules/cost-monitor/src/react/InvocationManifestQuery.test.ts +145 -0
  120. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +7 -5
  121. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +4 -1
  122. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +4 -1
  123. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +4 -1
  124. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +4 -4
  125. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +79 -1
  126. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +105 -11
  127. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +482 -332
  128. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +430 -285
  129. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +14 -2
  130. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +6 -26
  131. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +1 -1
  132. package/templates/.agents/dashboard/packages/local-runtime/scripts/verify-persistent-launch.mjs +268 -0
  133. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +482 -332
  134. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +90 -1
  135. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +112 -22
  136. package/templates/.agents/dashboard/packages/local-runtime/src/server-agent-assets.ts +39 -0
  137. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +33 -0
  138. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +148 -11
  139. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-result.test.ts +68 -0
  140. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +19 -0
  141. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +39 -43
  142. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-revision.test.ts +42 -0
  143. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-revision.ts +26 -0
  144. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +34 -0
  145. package/templates/.agents/dashboard/packages/local-runtime/src/server-startup.ts +30 -0
  146. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +89 -0
  147. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +88 -0
  148. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +68 -7
  149. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +11 -5
  150. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +129 -99
  151. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-agent-productivity.test.ts +111 -0
  152. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-agent-productivity.ts +140 -0
  153. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.test.ts +127 -4
  154. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-agent-page.ts +145 -5
  155. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-aggregates.ts +156 -23
  156. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +18 -9
  157. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-invocation-projection.ts +52 -0
  158. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-persistence.ts +35 -13
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +56 -0
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-cache.test.ts +29 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-cache.ts +136 -0
  162. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +251 -0
  163. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-operations-projection.ts +22 -7
  164. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-cache.test-support.ts +1 -1
  165. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical-parsing.ts +42 -0
  166. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +793 -0
  167. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-duration.test.ts +270 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider-fixture.ts +3 -2
  169. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-multi-provider.test.ts +18 -4
  170. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +87 -0
  171. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +105 -16
  172. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +131 -59
  173. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +1000 -1115
  174. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-cache.ts +13 -92
  175. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-claims.test.mjs +79 -0
  176. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +27 -0
  177. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.mjs +6 -6
  178. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-prerequisites.mjs +1 -1
  179. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-refresh.mjs +2 -10
  180. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-server.mjs +142 -0
  181. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +231 -239
  182. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +18 -29
  183. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +6 -0
  184. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  185. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  186. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +47 -0
  187. package/templates/.agents/requirements/comparative-audit.md +1 -1
  188. package/templates/.agents/requirements/context-engine.md +1 -1
  189. package/templates/.agents/requirements/cost-observability.md +1 -1
  190. package/templates/.agents/requirements/dashboard-launch.md +2 -2
  191. package/templates/.agents/requirements/data-export.md +1 -1
  192. package/templates/.agents/requirements/design-system.md +1 -1
  193. package/templates/.agents/requirements/execution-engine.md +1 -1
  194. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  195. package/templates/.agents/requirements/model-orchestration.md +1 -1
  196. package/templates/.agents/requirements/public-distribution.md +1 -1
  197. package/templates/.agents/requirements/software-architecture.md +1 -1
  198. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  199. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  200. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  201. package/templates/.agents/rules/autonomy-decision.md +1 -1
  202. package/templates/.agents/rules/cloud-hostinger-autonomy.md +21 -0
  203. package/templates/.agents/rules/core.md +5 -4
  204. package/templates/.agents/rules/local-sqlite-storage.md +18 -0
  205. package/templates/.agents/rules/meta-mcp.md +21 -0
  206. package/templates/.agents/rules/workflow.md +1 -0
  207. package/templates/.agents/runtime/bin/zaip.mjs +305 -137
  208. package/templates/.agents/runtime/checksums.sha256 +2 -2
  209. package/templates/.agents/runtime/provenance.json +2 -2
  210. package/templates/.agents/skills/zaip-skill-api-to-mcp/SKILL.md +4 -0
  211. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +25 -9
  212. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +2 -2
  213. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +2 -2
  214. package/templates/.agents/skills/zaip-skill-change/references/observable-evidence.md +15 -0
  215. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +13 -5
  216. package/templates/.agents/skills/zaip-skill-data-analyst/SKILL.md +10 -5
  217. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +5 -4
  218. package/templates/.agents/skills/zaip-skill-frontend-launcher/SKILL.md +4 -3
  219. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +5 -3
  220. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +5 -5
  221. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +78 -13
  222. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +59 -0
  223. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/yaml-parser.mjs +157 -0
  224. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +11 -6
  225. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +17 -0
  226. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +7 -0
  227. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/autonomous-cloud-inputs.example.json +41 -0
  228. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/autonomous-runner.md +84 -0
  229. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/operational-contract.md +19 -0
  230. package/templates/.agents/skills/zaip-skill-local-credentials/SKILL.md +43 -0
  231. package/templates/.agents/skills/zaip-skill-local-credentials/agents/openai.yaml +6 -0
  232. package/templates/.agents/skills/zaip-skill-local-credentials/references/dotenv-resolution.md +47 -0
  233. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +8 -3
  234. package/templates/.agents/skills/zaip-skill-meta-ads/SKILL.md +16 -0
  235. package/templates/.agents/skills/zaip-skill-meta-ads/agents/openai.yaml +4 -0
  236. package/templates/.agents/skills/zaip-skill-meta-ads/references/setup.md +3 -0
  237. package/templates/.agents/skills/zaip-skill-meta-ads-setup/SKILL.md +24 -0
  238. package/templates/.agents/skills/zaip-skill-meta-ads-setup/agents/openai.yaml +4 -0
  239. package/templates/.agents/skills/zaip-skill-meta-ads-setup/references/diagnostics.md +13 -0
  240. package/templates/.agents/skills/zaip-skill-meta-ads-setup/references/official-sources.md +10 -0
  241. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/SKILL.md +12 -0
  242. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/agents/openai.yaml +4 -0
  243. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/references/LICENSE +21 -0
  244. package/templates/.agents/skills/zaip-skill-meta-devtools-api-health/references/upstream.md +77 -0
  245. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/SKILL.md +12 -0
  246. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/agents/openai.yaml +4 -0
  247. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/references/LICENSE +21 -0
  248. package/templates/.agents/skills/zaip-skill-meta-devtools-api-integration/references/upstream.md +126 -0
  249. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/SKILL.md +12 -0
  250. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/agents/openai.yaml +4 -0
  251. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/references/LICENSE +21 -0
  252. package/templates/.agents/skills/zaip-skill-meta-devtools-app-health-check/references/upstream.md +67 -0
  253. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/SKILL.md +12 -0
  254. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/agents/openai.yaml +4 -0
  255. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/references/LICENSE +21 -0
  256. package/templates/.agents/skills/zaip-skill-meta-devtools-app-review-prep/references/upstream.md +69 -0
  257. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/SKILL.md +12 -0
  258. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/agents/openai.yaml +4 -0
  259. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/references/LICENSE +21 -0
  260. package/templates/.agents/skills/zaip-skill-meta-devtools-compliance-check/references/upstream.md +79 -0
  261. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/SKILL.md +14 -0
  262. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/agents/openai.yaml +4 -0
  263. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/references/LICENSE +21 -0
  264. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-access-token/references/upstream.md +144 -0
  265. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/SKILL.md +12 -0
  266. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/agents/openai.yaml +4 -0
  267. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/references/LICENSE +21 -0
  268. package/templates/.agents/skills/zaip-skill-meta-devtools-debug-webhooks/references/upstream.md +83 -0
  269. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/SKILL.md +10 -0
  270. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/agents/openai.yaml +4 -0
  271. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/LICENSE +21 -0
  272. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/setup.md +11 -0
  273. package/templates/.agents/skills/zaip-skill-meta-devtools-search-docs/references/upstream.md +55 -0
  274. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/SKILL.md +12 -0
  275. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/agents/openai.yaml +4 -0
  276. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/references/LICENSE +21 -0
  277. package/templates/.agents/skills/zaip-skill-meta-devtools-webhook-setup/references/upstream.md +56 -0
  278. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +12 -7
  279. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +11 -4
  280. package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +6 -4
  281. package/templates/.agents/skills/zaip-skill-tool-setup/references/codex-config.md +4 -2
  282. package/templates/.agents/skills/zaip-skill-tool-setup/references/secrets.md +1 -0
  283. package/templates/.agents/tools/catalog.yaml +6 -0
  284. package/templates/.agents/tools/cloud-runner-dns.mjs +28 -0
  285. package/templates/.agents/tools/cloud-runner-terraform.mjs +212 -0
  286. package/templates/.agents/tools/cloud-runner.integration.test.mjs +239 -0
  287. package/templates/.agents/tools/cloud-runner.mjs +786 -0
  288. package/templates/.agents/tools/cloud-runner.test.mjs +534 -0
  289. package/templates/.agents/tools/cloud-terraform-plan-policy.mjs +262 -0
  290. package/templates/.agents/tools/mcp/development/meta-devtools/README.md +14 -0
  291. package/templates/.agents/tools/mcp/development/meta-devtools/manifest.yaml +28 -0
  292. package/templates/.agents/tools/mcp/infra/cloudflare/manifest.yaml +2 -3
  293. package/templates/.agents/tools/mcp/infra/hostinger/manifest.yaml +1 -3
  294. package/templates/.agents/tools/mcp/marketing/meta-ads/README.md +15 -13
  295. package/templates/.agents/tools/mcp/marketing/meta-ads/manifest.yaml +15 -10
  296. package/templates/.agents/tools/profiles/development.yaml +3 -0
  297. package/templates/infra/terraform/.terraform.lock.hcl +42 -0
  298. package/templates/infra/terraform/README.md +31 -0
  299. package/templates/infra/terraform/backend.tf.json +13 -0
  300. package/templates/infra/terraform/deployment-inputs.example.yaml +22 -0
  301. package/templates/infra/terraform/fixtures/approved-targets.json +32 -0
  302. package/templates/infra/terraform/fixtures/plan-approved.json +67 -0
  303. package/templates/infra/terraform/main.tf +77 -0
  304. package/templates/infra/terraform/outputs.tf +20 -0
  305. package/templates/infra/terraform/terraform.tfvars.example +26 -0
  306. package/templates/infra/terraform/variables.tf +91 -0
  307. package/templates/infra/terraform/versions.tf +18 -0
  308. package/templates/scripts/validate-cloud-hostinger-contract.mjs +89 -0
  309. package/templates/scripts/validate-cloud-terraform-plan.mjs +1 -0
  310. package/templates/template-manifest.json +599 -167
  311. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BwnJpl02.js +0 -3
  312. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-C09KmlSw.js +0 -68
  313. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Dyo_wpL4.js +0 -2
  314. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-hPPfVGQv.css +0 -1
  315. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-stale-seed.ts +0 -50
@@ -16,7 +16,7 @@ Dimensão física das opções de `provider` do catálogo de preços atual, incl
16
16
 
17
17
  ## Propósito, escopo e convenções
18
18
 
19
- Schema v54 do read model SQLite descartável do dashboard. A definição está em `packages/local-runtime/src/sqlite-read-model.ts`; o banco local, quando presente, fica em `.local/dashboard-sqlite/read-model.sqlite`. A carga usa somente uma allowlist de Runs V2, entidades Markdown, artefatos canônicos e configuração. Telemetria agregada, `.agents/records/lifecycle`, projeções e outros agregados derivados não são fontes.
19
+ Schema v54 do read model SQLite persistente do dashboard. A definição está em `packages/local-runtime/src/sqlite-read-model.ts`; o banco do Dashboard fica em `.local/sqlite/zaip-aios-dashboard.sqlite`. A carga usa somente uma allowlist de Runs V2, entidades Markdown, artefatos canônicos e configuração. Telemetria agregada, `.agents/records/lifecycle`, projeções e outros agregados derivados não são fontes.
20
20
 
21
21
  `zaip_aios_activities` é a única tabela fato financeira. `canonical_run_index`, `canonical_work_items`, `canonical_executions`, `canonical_changes`, `canonical_decisions`, `files`, `read_model_source_state` e `read_model_metadata` são views técnicas reconstruídas das linhas `technical_payload` da fato. Toda view persistida tem o prefixo `zaip_vw_`; o runtime mantém aliases temporários somente para compatibilidade interna. Os tipos são as afinidades retornadas por `PRAGMA table_info`. Em views, a nulabilidade não é determinável de modo confiável pelo PRAGMA. Em tabelas, somente `NOT NULL` é afirmado; a chave primária é indicada sem inferir regras adicionais.
22
22
 
@@ -1,22 +1,52 @@
1
1
  # Dashboard ZAIP-AIOS SQLite
2
2
 
3
- Esta pasta é uma variante comparativa isolada de `.agents/dashboard`; ela não substitui o dashboard
4
- original. Os arquivos em `.agents/records` e `.agents/config` continuam sendo a fonte da verdade.
5
- O SQLite é somente um read model descartável e reconstruível em `.local/dashboard-sqlite/`.
3
+ `.local/sqlite/` centraliza os bancos SQLite locais do workspace. A pasta pode conter vários
4
+ arquivos, com um nome estável para cada finalidade, conforme a
5
+ [regra de armazenamento local](../rules/local-sqlite-storage.md).
6
+ O banco reservado ao dashboard é `.local/sqlite/zaip-aios-dashboard.sqlite`;
7
+ a unicidade desse banco se aplica à finalidade dashboard, e outras finalidades têm seus próprios arquivos.
8
+ Os arquivos em `.agents/records` e `.agents/config` continuam sendo a fonte da verdade.
9
+ O SQLite é um modelo de consulta reconstruível, não o local de gravação dos registros canônicos.
10
+
11
+ | Caminho | Responsabilidade |
12
+ | --- | --- |
13
+ | `.agents/records/` | Tasks, PRDs, SPECs, Changes, Executions, Runs e atribuições históricas. |
14
+ | `.agents/config/` | Configuração do projeto, catálogo de agentes e preços. |
15
+ | `.agents/dashboard/` | Código, frontend compilado, runtime e executável. |
16
+ | `.local/sqlite/` | Diretório compartilhado dos bancos SQLite locais, separados por finalidade. |
17
+ | `.local/sqlite/zaip-aios-dashboard.sqlite` | Único banco utilizado pelo dashboard normal. |
18
+ | `%TEMP%/zaip-aios/dashboard-sqlite-<workspace>/` | Sessão, locks, logs e cache de compilação Node. |
19
+
20
+ As antigas pastas `.local/dashboard-*` foram usadas para diagnósticos, benchmarks, exports,
21
+ previews e bancos de teste. O launcher não depende delas nem gera novos bancos nessas pastas.
6
22
 
7
23
  ## Como funciona
8
24
 
9
- - O rebuild copia apenas arquivos textuais necessários para a tabela `files`.
10
- - `daily_aggregates` materializa os períodos diários do read model lifecycle canônico, inclusive
11
- colunas para runs, tokens, custo, duração e cobertura.
12
- - O runtime lê manifests, índices, chunks e detalhes pelo adapter `SqliteReadModelFileSystem`.
25
+ - O rebuild lê apenas fontes canônicas necessárias e materializa fatos, views e caches de consulta.
26
+ - O runtime consulta o banco pelo adapter `SqliteReadModelFileSystem`.
13
27
  - As rotas `operations?scope=quick` e `cost-monitor?scope=summary` usam o SQLite para os fatos
14
28
  agregados de primeiro fold (runs, tokens, custo e cobertura); a política híbrida de duração e os
15
29
  detalhes de PRD/SPEC/Task continuam no código compartilhado e no adapter file-backed.
16
- - A API desta variante é somente leitura. PUT/POST retorna 405 para impedir divergência entre o
17
- snapshot e os arquivos canônicos.
18
- - Cada sessão usa um banco geracional próprio por porta. Depois do handoff saudável, o launcher
19
- encerra somente a sessão SQLite anterior do mesmo workspace e remove seu banco gerado.
30
+ - Comandos suportados pela API gravam nos canônicos e atualizam a projeção, sem usar o SQLite
31
+ como armazenamento exclusivo de dados de negócio.
32
+ - Havendo um banco íntegro e compatível, o servidor abre esse banco e informa `updating` enquanto
33
+ verifica os canônicos em outro processo. Sem mudanças, mantém o banco. Com mudanças, atualiza
34
+ o mesmo arquivo em uma transação, incluindo os dados das primeiras telas.
35
+ - Leitores continuam usando a última transação confirmada durante a atualização. Após o commit,
36
+ o servidor renova suas consultas e caches e informa `current`. Uma falha reverte a transação.
37
+ - O inventário mantém checkpoints por arquivo no próprio SQLite: caminho, tamanho, identidade,
38
+ datas de modificação e alteração, hash e última atualização processada. Arquivos intactos
39
+ reutilizam seu hash; arquivos novos ou alterados têm o conteúdo verificado novamente.
40
+ A sincronização aplica inclusões, atualizações e remoções, preservando os registros históricos
41
+ intactos. Os totais e caches são atualizados a partir dos fatos já armazenados.
42
+ - A abertura do executável inicia a verificação em segundo plano. Enquanto o servidor estiver ativo,
43
+ alterações nos canônicos disparam verificação; uma checagem a cada minuto cobre mudança de dia
44
+ e eventos de filesystem perdidos. Uma mudança durante a atualização agenda outra verificação.
45
+ Com o servidor encerrado não há sincronização; a próxima abertura recupera as alterações pendentes.
46
+ A virada do dia em São Paulo atualiza os caches de período, sem importar novamente o histórico.
47
+ - Mudar PID ou porta não muda o caminho do SQLite. Encerrar o dashboard preserva o banco.
48
+ Os arquivos `-wal`, `-shm` ou `-journal` são auxiliares de transação, não cópias históricas;
49
+ não os apague separadamente enquanto o banco estiver aberto.
20
50
 
21
51
  O health check identifica inequivocamente esta versão:
22
52
 
@@ -32,7 +62,10 @@ O health check identifica inequivocamente esta versão:
32
62
  Execute a partir da raiz do repositório:
33
63
 
34
64
  ```powershell
35
- # Recriar o banco canônico para inspeção manual
65
+ # Compilar o runtime após alterar seu código
66
+ node .agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs
67
+
68
+ # Sincronizar o banco oficial com os canônicos
36
69
  node .agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs
37
70
 
38
71
  # Recriar frontend e runtime independentes dos globs pnpm do dashboard original
@@ -41,20 +74,26 @@ node .agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs
41
74
  # Verificar a paridade SQL com o daily overview canônico (all-time, intervalos, zero e null)
42
75
  node .agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs
43
76
 
44
- # Abrir a variante pelo launcher Node
77
+ # Abrir pelo launcher Node
45
78
  node .agents/dashboard/packages/local-runtime/start-dashboard.mjs
46
79
  ```
47
80
 
48
81
  No Windows, dê duplo clique em
49
- `.agents/dashboard/zaip-dashboard-windows.exe`. A variante usa porta inicial `4417`, sessão,
50
- cookie, lock, registro de portas, banco e runtime kind distintos do dashboard original, portanto os
51
- dois podem permanecer abertos lado a lado.
82
+ `.agents/dashboard/zaip-dashboard-windows.exe`. A porta inicial é `4417`.
83
+ O clique mais recente controla a sessão conforme o contrato do launcher.
84
+ Prefira a sincronização do servidor enquanto ele estiver aberto, evitando writers manuais
85
+ concorrentes. Não copie um arquivo SQLite ativo sem considerar seu WAL.
52
86
 
53
- ## Limites desta comparação
87
+ ## Limites
54
88
 
55
89
  - O `node:sqlite` do Node 22.16 ainda emite `ExperimentalWarning`.
56
- - O rebuild é um snapshot de arquivos; alterações canônicas posteriores aparecem somente na próxima
57
- reconstrução/abertura.
90
+ - A primeira criação ou uma mudança incompatível de esquema exige preparação antes de servir.
91
+ Atualizações volumosas podem demorar; o banco válido existente permite abrir a interface durante
92
+ esse trabalho. `current` descreve a última sincronização concluída.
93
+ - Uma reconstrução solicitada explicitamente também importa todas as fontes. Mudanças de preços,
94
+ catálogo ou atribuição histórica podem exigir reavaliação de cálculos históricos a partir dos
95
+ registros já interpretados e salvos no próprio SQLite; uma atualização comum de Task ou Run
96
+ não repete a interpretação das execuções históricas intactas.
58
97
  - A agregação SQL não substitui a semântica híbrida legada de duração: ela permanece compartilhada
59
98
  para preservar a paridade histórica. As entidades e os detalhes continuam file-backed pelo adapter.
60
99
  - O banco pode ser excluído sem perda de informação e recriado pelo comando da skill
@@ -1 +1 @@
1
- import{S as e,b as t}from"./cost-monitor-C09KmlSw.js";var n=e(),r=t(),i={input:1e5,cache:4e4,output:2e4,reasoning:8e3},a=e=>Math.round(e*1e6)/1e6;function o(e,t,n,r,i){let o=a(Math.max(e.input-e.cache,0)/1e6*t.input*n),s=a(e.cache/1e6*(t.cache??0)*n),c=a(e.output/1e6*t.output*r),l=a(o+s+c);return{usage:e,rates:t,inputMultiplier:n,outputMultiplier:r,inputUsd:o,cacheUsd:s,outputUsd:c,reasoningUsd:0,totalUsd:l,totalBrl:i===null?null:a(l*i)}}function s(e,t){if(t===`standard`)return{input:e.input_per_million_usd,cache:e.cached_input_per_million_usd,output:e.output_per_million_usd};let n=e.priority_input_per_million_usd,r=e.priority_output_per_million_usd;return n==null||r==null?null:{input:n,cache:e.priority_cached_input_per_million_usd??null,output:r}}function c(e,t,n){let r=s(e,t);return r===null?null:o(i,r,1,1,n)}function l(e,t){return e.long_context_threshold_tokens===null?null:o({input:e.long_context_threshold_tokens+5e4,cache:i.cache,output:i.output,reasoning:i.reasoning},s(e,`standard`),e.long_context_input_multiplier,e.long_context_output_multiplier,t)}var u={"pt-BR":{eyebrow:`CONFIGURAÇÕES · TRANSPARÊNCIA`,title:`Como o custo é calculado`,intro:`Do menor grão — uma chamada LLM — até o total: veja quais tokens entram na conta e como modelo, esforço, contexto e velocidade mudam o resultado.`,back:`Voltar ao dashboard`,model:`Modelo usado nos exemplos`,currency:`Moeda`,unavailable:`Indisponível`,millionRate:`por 1 milhão de tokens`,rateTitle:`1. Comece pelas tarifas do modelo`,rateIntro:`O modelo escolhe a tabela de preços. Priority/Fast usa outra tabela quando o catálogo publica essas tarifas.`,standard:`Standard`,priority:`Priority / Fast`,input:`Input`,cache:`Cache`,output:`Output`,reasoning:`Reasoning`,ratio:`Priority ÷ Standard`,included:`Incluído no output (+0)`,noPublishedRate:`Sem tarifa publicada (custo adicional 0)`,conceptsTitle:`2. Entenda cada parte da chamada`,concepts:[[`Chamada LLM`,`É o menor grão do cálculo: uma requisição ao provedor, com um modelo e um tier de serviço.`],[`Input tokens`,`Tudo que entra no modelo: instruções, histórico, contexto, ferramentas e a mensagem atual.`],[`Cache tokens`,`São parte do input, não tokens extras. Primeiro subtraímos o cache do input e depois aplicamos sua tarifa própria.`],[`Output tokens`,`É o total produzido pelo modelo. O custo usa o output total informado pela telemetria.`],[`Reasoning tokens`,`São parte do output. O cálculo atual cobra o output uma vez e mantém reasoningUsd = 0, evitando cobrança dupla.`],[`Modelo e esforço`,`O modelo muda as tarifas. O esforço não tem multiplicador próprio, mas pode gerar mais reasoning, output ou ciclos e aumentar o custo indiretamente.`],[`Multiplicador de contexto`,`Acima do limite do modelo, o multiplicador de input vale também para cache; o multiplicador de output vale para todo o output.`],[`Multiplicador de velocidade`,`É a razão derivada entre o total Priority/Fast e o Standard. Serve para comparar; nunca é multiplicado de novo no total.`]],exampleTitle:`3. Exemplo simples, parcela por parcela`,exampleIntro:`Uma chamada com 100 mil tokens de input, dos quais 40 mil vieram do cache, e 20 mil tokens de output, dos quais 8 mil são reasoning.`,billableInput:`Input faturável`,operation:`Operação`,cost:`Custo`,total:`Total da chamada`,speedMultiplier:`Multiplicador de velocidade derivado`,longTitle:`4. Exemplo com contexto longo`,longIntro:`Para realmente ultrapassar o limite, o exemplo usa o threshold do modelo + 50 mil tokens de input. A conta abaixo continua no tier Standard.`,threshold:`Limite do modelo`,longInput:`Input do exemplo longo`,priorityLong:`Priority/Fast + contexto longo`,priorityLongNote:`Indisponível: sem uma combinação publicada no catálogo, o dashboard não inventa uma tarifa.`,finalNote:`Regra prática: escolha o modelo e o tier, separe input de cache, cobre o output total uma única vez e só então aplique câmbio. Mais esforço só aumenta o custo quando aumenta o uso registrado.`},"en-US":{eyebrow:`SETTINGS · TRANSPARENCY`,title:`How cost is calculated`,intro:`From the smallest grain — one LLM call — to the total: see which tokens enter the calculation and how model, effort, context, and speed affect it.`,back:`Back to dashboard`,model:`Model used in the examples`,currency:`Currency`,unavailable:`Unavailable`,millionRate:`per 1 million tokens`,rateTitle:`1. Start with the model rates`,rateIntro:`The model selects the price table. Priority/Fast uses a different table when the catalog publishes those rates.`,standard:`Standard`,priority:`Priority / Fast`,input:`Input`,cache:`Cache`,output:`Output`,reasoning:`Reasoning`,ratio:`Priority ÷ Standard`,included:`Included in output (+0)`,noPublishedRate:`No published rate (additional cost 0)`,conceptsTitle:`2. Understand each part of the call`,concepts:[[`LLM call`,`The smallest calculation grain: one provider request with one model and one service tier.`],[`Input tokens`,`Everything sent to the model: instructions, history, context, tools, and the current message.`],[`Cache tokens`,`They are part of input, not extra tokens. Cache is subtracted from input first, then its own rate is applied.`],[`Output tokens`,`Everything produced by the model. Cost uses the total output reported by telemetry.`],[`Reasoning tokens`,`They are part of output. Current math charges output once and keeps reasoningUsd = 0, preventing double billing.`],[`Model and effort`,`The model changes rates. Effort has no direct multiplier, but it can produce more reasoning, output, or cycles and indirectly raise cost.`],[`Context multiplier`,`Above the model threshold, the input multiplier also applies to cache; the output multiplier applies to all output.`],[`Speed multiplier`,`It is the derived ratio between Priority/Fast and Standard totals. It is only a comparison and is never multiplied into the total again.`]],exampleTitle:`3. A simple example, component by component`,exampleIntro:`One call with 100 thousand input tokens, including 40 thousand cache tokens, and 20 thousand output tokens, including 8 thousand reasoning tokens.`,billableInput:`Billable input`,operation:`Operation`,cost:`Cost`,total:`Call total`,speedMultiplier:`Derived speed multiplier`,longTitle:`4. Long-context example`,longIntro:`To actually exceed the limit, this example uses the model threshold + 50 thousand input tokens. The calculation remains on Standard tier.`,threshold:`Model threshold`,longInput:`Long-example input`,priorityLong:`Priority/Fast + long context`,priorityLongNote:`Unavailable: without a published combination in the catalog, the dashboard does not invent a rate.`,finalNote:`Rule of thumb: choose model and tier, separate input from cache, charge total output once, then apply FX. Higher effort only raises cost when it raises recorded usage.`}};function d(e,t,n,r){if(t===`BRL`&&n===null)return r;let i=t===`BRL`?e*n:e;return new Intl.NumberFormat(t===`BRL`?`pt-BR`:`en-US`,{style:`currency`,currency:t,minimumFractionDigits:2,maximumFractionDigits:6}).format(i)}function f(e,t,n,r,i){return e==null?i:d(e,t,n,r)}function p(e,t){return new Intl.NumberFormat(t).format(e)}function m({example:e,currency:t,fxRate:n,locale:i,labels:a}){let o=a.unavailable,s=Math.max(e.usage.input-e.usage.cache,0),c=e.inputMultiplier===1?``:` × ${e.inputMultiplier}`,l=e.outputMultiplier===1?``:` × ${e.outputMultiplier}`,u=e.rates.cache??0,m=[{label:a.billableInput,operation:`${p(e.usage.input,i)} − ${p(e.usage.cache,i)} = ${p(s,i)} tokens`,cost:null},{label:a.input,operation:`${p(s,i)} ÷ 1M × ${f(e.rates.input,t,n,o,a.noPublishedRate)}${c}`,cost:e.inputUsd},{label:a.cache,operation:`${p(e.usage.cache,i)} ÷ 1M × ${f(u,t,n,o,a.noPublishedRate)}${c}`,cost:e.cacheUsd},{label:a.output,operation:`${p(e.usage.output,i)} ÷ 1M × ${f(e.rates.output,t,n,o,a.noPublishedRate)}${l}`,cost:e.outputUsd},{label:a.reasoning,operation:`${p(e.usage.reasoning,i)} tokens ⊂ ${a.output} → +0`,cost:e.reasoningUsd}];return(0,r.jsxs)(`div`,{className:`cost-guide-calculation`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-calculation-head`,"aria-hidden":`true`,children:[(0,r.jsx)(`span`,{}),(0,r.jsx)(`span`,{children:a.operation}),(0,r.jsx)(`span`,{children:a.cost})]}),m.map(e=>(0,r.jsxs)(`div`,{className:`cost-guide-calculation-line`,children:[(0,r.jsx)(`strong`,{children:e.label}),(0,r.jsx)(`code`,{children:e.operation}),(0,r.jsx)(`span`,{children:e.cost===null?`—`:d(e.cost,t,n,o)})]},e.label)),(0,r.jsxs)(`div`,{className:`cost-guide-calculation-total`,children:[(0,r.jsx)(`strong`,{children:a.total}),(0,r.jsx)(`span`,{children:d(e.totalUsd,t,n,o)})]})]})}function h({catalog:e,fxRate:t,locale:i,onClose:a}){let o=u[i],[s,d]=(0,n.useState)(e.models[0]?.id??``),[h,g]=(0,n.useState)(`USD`),_=(0,n.useMemo)(()=>e.models.find(e=>e.id===s)??e.models[0]??null,[e.models,s]);if(_===null)return(0,r.jsxs)(`main`,{className:`cost-guide`,children:[(0,r.jsxs)(`button`,{onClick:a,type:`button`,children:[`← `,o.back]}),(0,r.jsx)(`h1`,{children:o.title}),(0,r.jsx)(`p`,{children:o.unavailable})]});let v=t?.rate??null,y=c(_,`standard`,v),b=c(_,`priority`,v),x=l(_,v),S=b!==null&&y.totalUsd>0?b.totalUsd/y.totalUsd:null,C=[{label:o.input,standard:_.input_per_million_usd,priority:_.priority_input_per_million_usd},{label:o.cache,standard:_.cached_input_per_million_usd,priority:_.priority_cached_input_per_million_usd},{label:o.output,standard:_.output_per_million_usd,priority:_.priority_output_per_million_usd}];return(0,r.jsxs)(`main`,{className:`cost-guide`,children:[(0,r.jsxs)(`header`,{children:[(0,r.jsxs)(`div`,{children:[(0,r.jsx)(`small`,{children:o.eyebrow}),(0,r.jsx)(`h1`,{children:o.title}),(0,r.jsx)(`p`,{children:o.intro})]}),(0,r.jsxs)(`button`,{onClick:a,type:`button`,children:[`← `,o.back]})]}),(0,r.jsxs)(`section`,{className:`cost-guide-controls`,"aria-label":o.model,children:[(0,r.jsxs)(`label`,{children:[o.model,(0,r.jsx)(`select`,{value:_.id,onChange:e=>d(e.target.value),children:e.models.map(e=>(0,r.jsx)(`option`,{value:e.id,children:e.id},e.id))})]}),(0,r.jsxs)(`label`,{children:[o.currency,(0,r.jsxs)(`select`,{value:h,onChange:e=>g(e.target.value),children:[(0,r.jsx)(`option`,{value:`USD`,children:`USD`}),(0,r.jsxs)(`option`,{value:`BRL`,children:[`BRL `,v===null?`(${o.unavailable})`:`(1 USD = ${v.toFixed(4)} BRL)`]})]})]})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-section-heading`,children:[(0,r.jsx)(`h2`,{children:o.rateTitle}),(0,r.jsx)(`p`,{children:o.rateIntro})]}),(0,r.jsx)(`div`,{className:`cost-guide-table-wrap`,children:(0,r.jsxs)(`table`,{children:[(0,r.jsxs)(`caption`,{children:[_.id,` · `,o.millionRate]}),(0,r.jsx)(`thead`,{children:(0,r.jsxs)(`tr`,{children:[(0,r.jsx)(`th`,{scope:`col`}),(0,r.jsx)(`th`,{scope:`col`,children:o.standard}),(0,r.jsx)(`th`,{scope:`col`,children:o.priority}),(0,r.jsx)(`th`,{scope:`col`,children:o.ratio})]})}),(0,r.jsxs)(`tbody`,{children:[C.map(e=>(0,r.jsxs)(`tr`,{children:[(0,r.jsx)(`th`,{scope:`row`,children:e.label}),(0,r.jsx)(`td`,{children:f(e.standard,h,v,o.unavailable,o.noPublishedRate)}),(0,r.jsx)(`td`,{children:f(e.priority,h,v,o.unavailable,o.noPublishedRate)}),(0,r.jsx)(`td`,{children:e.standard!==null&&e.standard>0&&e.priority!==null&&e.priority!==void 0?`${(e.priority/e.standard).toFixed(2)}×`:o.unavailable})]},e.label)),(0,r.jsxs)(`tr`,{children:[(0,r.jsx)(`th`,{scope:`row`,children:o.reasoning}),(0,r.jsx)(`td`,{colSpan:3,children:o.included})]})]})]})})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsx)(`div`,{className:`cost-guide-section-heading`,children:(0,r.jsx)(`h2`,{children:o.conceptsTitle})}),(0,r.jsx)(`div`,{className:`cost-guide-blocks`,children:o.concepts.map(([e,t])=>(0,r.jsxs)(`article`,{children:[(0,r.jsx)(`strong`,{children:e}),(0,r.jsx)(`p`,{children:t})]},e))})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-section-heading`,children:[(0,r.jsx)(`h2`,{children:o.exampleTitle}),(0,r.jsx)(`p`,{children:o.exampleIntro})]}),(0,r.jsxs)(`div`,{className:`cost-guide-example-grid`,children:[(0,r.jsxs)(`article`,{className:`cost-guide-example-card`,children:[(0,r.jsx)(`h3`,{children:o.standard}),(0,r.jsx)(m,{example:y,currency:h,fxRate:v,locale:i,labels:o})]}),(0,r.jsxs)(`article`,{className:`cost-guide-example-card`,children:[(0,r.jsx)(`h3`,{children:o.priority}),b===null?(0,r.jsx)(`p`,{className:`cost-guide-unavailable`,children:o.unavailable}):(0,r.jsx)(m,{example:b,currency:h,fxRate:v,locale:i,labels:o})]})]}),(0,r.jsxs)(`div`,{className:`cost-guide-speed`,children:[(0,r.jsx)(`span`,{children:o.speedMultiplier}),(0,r.jsx)(`strong`,{children:S===null?o.unavailable:`${S.toFixed(2)}×`}),(0,r.jsxs)(`code`,{children:[o.priority,` `,o.total,` ÷ `,o.standard,` `,o.total]})]})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-section-heading`,children:[(0,r.jsx)(`h2`,{children:o.longTitle}),(0,r.jsx)(`p`,{children:o.longIntro})]}),(0,r.jsxs)(`div`,{className:`cost-guide-context-summary`,children:[(0,r.jsxs)(`span`,{children:[o.threshold,`:`,` `,(0,r.jsx)(`strong`,{children:_.long_context_threshold_tokens===null?o.unavailable:p(_.long_context_threshold_tokens,i)})]}),(0,r.jsxs)(`span`,{children:[o.longInput,`:`,` `,(0,r.jsx)(`strong`,{children:x===null?o.unavailable:p(x.usage.input,i)})]}),(0,r.jsxs)(`span`,{children:[`Input/cache: `,(0,r.jsxs)(`strong`,{children:[_.long_context_input_multiplier,`×`]})]}),(0,r.jsxs)(`span`,{children:[`Output: `,(0,r.jsxs)(`strong`,{children:[_.long_context_output_multiplier,`×`]})]})]}),x===null?(0,r.jsx)(`p`,{className:`cost-guide-unavailable`,children:o.unavailable}):(0,r.jsx)(m,{example:x,currency:h,fxRate:v,locale:i,labels:o}),(0,r.jsxs)(`div`,{className:`cost-guide-unavailable-combination`,children:[(0,r.jsxs)(`strong`,{children:[o.priorityLong,`: `,o.unavailable]}),(0,r.jsx)(`p`,{children:o.priorityLongNote})]})]}),(0,r.jsx)(`aside`,{className:`cost-guide-final-note`,children:o.finalNote})]})}export{h as CostCalculationGuidePage};
1
+ import{S as e,b as t}from"./cost-monitor-DbaLbU2q.js";var n=e(),r=t(),i={input:1e5,cache:4e4,output:2e4,reasoning:8e3},a=e=>Math.round(e*1e6)/1e6;function o(e,t,n,r,i){let o=a(Math.max(e.input-e.cache,0)/1e6*t.input*n),s=a(e.cache/1e6*(t.cache??0)*n),c=a(e.output/1e6*t.output*r),l=a(o+s+c);return{usage:e,rates:t,inputMultiplier:n,outputMultiplier:r,inputUsd:o,cacheUsd:s,outputUsd:c,reasoningUsd:0,totalUsd:l,totalBrl:i===null?null:a(l*i)}}function s(e,t){if(t===`standard`)return{input:e.input_per_million_usd,cache:e.cached_input_per_million_usd,output:e.output_per_million_usd};let n=e.priority_input_per_million_usd,r=e.priority_output_per_million_usd;return n==null||r==null?null:{input:n,cache:e.priority_cached_input_per_million_usd??null,output:r}}function c(e,t,n){let r=s(e,t);return r===null?null:o(i,r,1,1,n)}function l(e,t){return e.long_context_threshold_tokens===null?null:o({input:e.long_context_threshold_tokens+5e4,cache:i.cache,output:i.output,reasoning:i.reasoning},s(e,`standard`),e.long_context_input_multiplier,e.long_context_output_multiplier,t)}var u={"pt-BR":{eyebrow:`CONFIGURAÇÕES · TRANSPARÊNCIA`,title:`Como o custo é calculado`,intro:`Do menor grão — uma chamada LLM — até o total: veja quais tokens entram na conta e como modelo, esforço, contexto e velocidade mudam o resultado.`,back:`Voltar ao dashboard`,model:`Modelo usado nos exemplos`,currency:`Moeda`,unavailable:`Indisponível`,millionRate:`por 1 milhão de tokens`,rateTitle:`1. Comece pelas tarifas do modelo`,rateIntro:`O modelo escolhe a tabela de preços. Priority/Fast usa outra tabela quando o catálogo publica essas tarifas.`,standard:`Standard`,priority:`Priority / Fast`,input:`Input`,cache:`Cache`,output:`Output`,reasoning:`Reasoning`,ratio:`Priority ÷ Standard`,included:`Incluído no output (+0)`,noPublishedRate:`Sem tarifa publicada (custo adicional 0)`,conceptsTitle:`2. Entenda cada parte da chamada`,concepts:[[`Chamada LLM`,`É o menor grão do cálculo: uma requisição ao provedor, com um modelo e um tier de serviço.`],[`Input tokens`,`Tudo que entra no modelo: instruções, histórico, contexto, ferramentas e a mensagem atual.`],[`Cache tokens`,`São parte do input, não tokens extras. Primeiro subtraímos o cache do input e depois aplicamos sua tarifa própria.`],[`Output tokens`,`É o total produzido pelo modelo. O custo usa o output total informado pela telemetria.`],[`Reasoning tokens`,`São parte do output. O cálculo atual cobra o output uma vez e mantém reasoningUsd = 0, evitando cobrança dupla.`],[`Modelo e esforço`,`O modelo muda as tarifas. O esforço não tem multiplicador próprio, mas pode gerar mais reasoning, output ou ciclos e aumentar o custo indiretamente.`],[`Multiplicador de contexto`,`Acima do limite do modelo, o multiplicador de input vale também para cache; o multiplicador de output vale para todo o output.`],[`Multiplicador de velocidade`,`É a razão derivada entre o total Priority/Fast e o Standard. Serve para comparar; nunca é multiplicado de novo no total.`]],exampleTitle:`3. Exemplo simples, parcela por parcela`,exampleIntro:`Uma chamada com 100 mil tokens de input, dos quais 40 mil vieram do cache, e 20 mil tokens de output, dos quais 8 mil são reasoning.`,billableInput:`Input faturável`,operation:`Operação`,cost:`Custo`,total:`Total da chamada`,speedMultiplier:`Multiplicador de velocidade derivado`,longTitle:`4. Exemplo com contexto longo`,longIntro:`Para realmente ultrapassar o limite, o exemplo usa o threshold do modelo + 50 mil tokens de input. A conta abaixo continua no tier Standard.`,threshold:`Limite do modelo`,longInput:`Input do exemplo longo`,priorityLong:`Priority/Fast + contexto longo`,priorityLongNote:`Indisponível: sem uma combinação publicada no catálogo, o dashboard não inventa uma tarifa.`,finalNote:`Regra prática: escolha o modelo e o tier, separe input de cache, cobre o output total uma única vez e só então aplique câmbio. Mais esforço só aumenta o custo quando aumenta o uso registrado.`},"en-US":{eyebrow:`SETTINGS · TRANSPARENCY`,title:`How cost is calculated`,intro:`From the smallest grain — one LLM call — to the total: see which tokens enter the calculation and how model, effort, context, and speed affect it.`,back:`Back to dashboard`,model:`Model used in the examples`,currency:`Currency`,unavailable:`Unavailable`,millionRate:`per 1 million tokens`,rateTitle:`1. Start with the model rates`,rateIntro:`The model selects the price table. Priority/Fast uses a different table when the catalog publishes those rates.`,standard:`Standard`,priority:`Priority / Fast`,input:`Input`,cache:`Cache`,output:`Output`,reasoning:`Reasoning`,ratio:`Priority ÷ Standard`,included:`Included in output (+0)`,noPublishedRate:`No published rate (additional cost 0)`,conceptsTitle:`2. Understand each part of the call`,concepts:[[`LLM call`,`The smallest calculation grain: one provider request with one model and one service tier.`],[`Input tokens`,`Everything sent to the model: instructions, history, context, tools, and the current message.`],[`Cache tokens`,`They are part of input, not extra tokens. Cache is subtracted from input first, then its own rate is applied.`],[`Output tokens`,`Everything produced by the model. Cost uses the total output reported by telemetry.`],[`Reasoning tokens`,`They are part of output. Current math charges output once and keeps reasoningUsd = 0, preventing double billing.`],[`Model and effort`,`The model changes rates. Effort has no direct multiplier, but it can produce more reasoning, output, or cycles and indirectly raise cost.`],[`Context multiplier`,`Above the model threshold, the input multiplier also applies to cache; the output multiplier applies to all output.`],[`Speed multiplier`,`It is the derived ratio between Priority/Fast and Standard totals. It is only a comparison and is never multiplied into the total again.`]],exampleTitle:`3. A simple example, component by component`,exampleIntro:`One call with 100 thousand input tokens, including 40 thousand cache tokens, and 20 thousand output tokens, including 8 thousand reasoning tokens.`,billableInput:`Billable input`,operation:`Operation`,cost:`Cost`,total:`Call total`,speedMultiplier:`Derived speed multiplier`,longTitle:`4. Long-context example`,longIntro:`To actually exceed the limit, this example uses the model threshold + 50 thousand input tokens. The calculation remains on Standard tier.`,threshold:`Model threshold`,longInput:`Long-example input`,priorityLong:`Priority/Fast + long context`,priorityLongNote:`Unavailable: without a published combination in the catalog, the dashboard does not invent a rate.`,finalNote:`Rule of thumb: choose model and tier, separate input from cache, charge total output once, then apply FX. Higher effort only raises cost when it raises recorded usage.`}};function d(e,t,n,r){if(t===`BRL`&&n===null)return r;let i=t===`BRL`?e*n:e;return new Intl.NumberFormat(t===`BRL`?`pt-BR`:`en-US`,{style:`currency`,currency:t,minimumFractionDigits:2,maximumFractionDigits:6}).format(i)}function f(e,t,n,r,i){return e==null?i:d(e,t,n,r)}function p(e,t){return new Intl.NumberFormat(t).format(e)}function m({example:e,currency:t,fxRate:n,locale:i,labels:a}){let o=a.unavailable,s=Math.max(e.usage.input-e.usage.cache,0),c=e.inputMultiplier===1?``:` × ${e.inputMultiplier}`,l=e.outputMultiplier===1?``:` × ${e.outputMultiplier}`,u=e.rates.cache??0,m=[{label:a.billableInput,operation:`${p(e.usage.input,i)} − ${p(e.usage.cache,i)} = ${p(s,i)} tokens`,cost:null},{label:a.input,operation:`${p(s,i)} ÷ 1M × ${f(e.rates.input,t,n,o,a.noPublishedRate)}${c}`,cost:e.inputUsd},{label:a.cache,operation:`${p(e.usage.cache,i)} ÷ 1M × ${f(u,t,n,o,a.noPublishedRate)}${c}`,cost:e.cacheUsd},{label:a.output,operation:`${p(e.usage.output,i)} ÷ 1M × ${f(e.rates.output,t,n,o,a.noPublishedRate)}${l}`,cost:e.outputUsd},{label:a.reasoning,operation:`${p(e.usage.reasoning,i)} tokens ⊂ ${a.output} → +0`,cost:e.reasoningUsd}];return(0,r.jsxs)(`div`,{className:`cost-guide-calculation`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-calculation-head`,"aria-hidden":`true`,children:[(0,r.jsx)(`span`,{}),(0,r.jsx)(`span`,{children:a.operation}),(0,r.jsx)(`span`,{children:a.cost})]}),m.map(e=>(0,r.jsxs)(`div`,{className:`cost-guide-calculation-line`,children:[(0,r.jsx)(`strong`,{children:e.label}),(0,r.jsx)(`code`,{children:e.operation}),(0,r.jsx)(`span`,{children:e.cost===null?`—`:d(e.cost,t,n,o)})]},e.label)),(0,r.jsxs)(`div`,{className:`cost-guide-calculation-total`,children:[(0,r.jsx)(`strong`,{children:a.total}),(0,r.jsx)(`span`,{children:d(e.totalUsd,t,n,o)})]})]})}function h({catalog:e,fxRate:t,locale:i,onClose:a}){let o=u[i],[s,d]=(0,n.useState)(e.models[0]?.id??``),[h,g]=(0,n.useState)(`USD`),_=(0,n.useMemo)(()=>e.models.find(e=>e.id===s)??e.models[0]??null,[e.models,s]);if(_===null)return(0,r.jsxs)(`main`,{className:`cost-guide`,children:[(0,r.jsxs)(`button`,{onClick:a,type:`button`,children:[`← `,o.back]}),(0,r.jsx)(`h1`,{children:o.title}),(0,r.jsx)(`p`,{children:o.unavailable})]});let v=t?.rate??null,y=c(_,`standard`,v),b=c(_,`priority`,v),x=l(_,v),S=b!==null&&y.totalUsd>0?b.totalUsd/y.totalUsd:null,C=[{label:o.input,standard:_.input_per_million_usd,priority:_.priority_input_per_million_usd},{label:o.cache,standard:_.cached_input_per_million_usd,priority:_.priority_cached_input_per_million_usd},{label:o.output,standard:_.output_per_million_usd,priority:_.priority_output_per_million_usd}];return(0,r.jsxs)(`main`,{className:`cost-guide`,children:[(0,r.jsxs)(`header`,{children:[(0,r.jsxs)(`div`,{children:[(0,r.jsx)(`small`,{children:o.eyebrow}),(0,r.jsx)(`h1`,{children:o.title}),(0,r.jsx)(`p`,{children:o.intro})]}),(0,r.jsxs)(`button`,{onClick:a,type:`button`,children:[`← `,o.back]})]}),(0,r.jsxs)(`section`,{className:`cost-guide-controls`,"aria-label":o.model,children:[(0,r.jsxs)(`label`,{children:[o.model,(0,r.jsx)(`select`,{value:_.id,onChange:e=>d(e.target.value),children:e.models.map(e=>(0,r.jsx)(`option`,{value:e.id,children:e.id},e.id))})]}),(0,r.jsxs)(`label`,{children:[o.currency,(0,r.jsxs)(`select`,{value:h,onChange:e=>g(e.target.value),children:[(0,r.jsx)(`option`,{value:`USD`,children:`USD`}),(0,r.jsxs)(`option`,{value:`BRL`,children:[`BRL `,v===null?`(${o.unavailable})`:`(1 USD = ${v.toFixed(4)} BRL)`]})]})]})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-section-heading`,children:[(0,r.jsx)(`h2`,{children:o.rateTitle}),(0,r.jsx)(`p`,{children:o.rateIntro})]}),(0,r.jsx)(`div`,{className:`cost-guide-table-wrap`,children:(0,r.jsxs)(`table`,{children:[(0,r.jsxs)(`caption`,{children:[_.id,` · `,o.millionRate]}),(0,r.jsx)(`thead`,{children:(0,r.jsxs)(`tr`,{children:[(0,r.jsx)(`th`,{scope:`col`}),(0,r.jsx)(`th`,{scope:`col`,children:o.standard}),(0,r.jsx)(`th`,{scope:`col`,children:o.priority}),(0,r.jsx)(`th`,{scope:`col`,children:o.ratio})]})}),(0,r.jsxs)(`tbody`,{children:[C.map(e=>(0,r.jsxs)(`tr`,{children:[(0,r.jsx)(`th`,{scope:`row`,children:e.label}),(0,r.jsx)(`td`,{children:f(e.standard,h,v,o.unavailable,o.noPublishedRate)}),(0,r.jsx)(`td`,{children:f(e.priority,h,v,o.unavailable,o.noPublishedRate)}),(0,r.jsx)(`td`,{children:e.standard!==null&&e.standard>0&&e.priority!==null&&e.priority!==void 0?`${(e.priority/e.standard).toFixed(2)}×`:o.unavailable})]},e.label)),(0,r.jsxs)(`tr`,{children:[(0,r.jsx)(`th`,{scope:`row`,children:o.reasoning}),(0,r.jsx)(`td`,{colSpan:3,children:o.included})]})]})]})})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsx)(`div`,{className:`cost-guide-section-heading`,children:(0,r.jsx)(`h2`,{children:o.conceptsTitle})}),(0,r.jsx)(`div`,{className:`cost-guide-blocks`,children:o.concepts.map(([e,t])=>(0,r.jsxs)(`article`,{children:[(0,r.jsx)(`strong`,{children:e}),(0,r.jsx)(`p`,{children:t})]},e))})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-section-heading`,children:[(0,r.jsx)(`h2`,{children:o.exampleTitle}),(0,r.jsx)(`p`,{children:o.exampleIntro})]}),(0,r.jsxs)(`div`,{className:`cost-guide-example-grid`,children:[(0,r.jsxs)(`article`,{className:`cost-guide-example-card`,children:[(0,r.jsx)(`h3`,{children:o.standard}),(0,r.jsx)(m,{example:y,currency:h,fxRate:v,locale:i,labels:o})]}),(0,r.jsxs)(`article`,{className:`cost-guide-example-card`,children:[(0,r.jsx)(`h3`,{children:o.priority}),b===null?(0,r.jsx)(`p`,{className:`cost-guide-unavailable`,children:o.unavailable}):(0,r.jsx)(m,{example:b,currency:h,fxRate:v,locale:i,labels:o})]})]}),(0,r.jsxs)(`div`,{className:`cost-guide-speed`,children:[(0,r.jsx)(`span`,{children:o.speedMultiplier}),(0,r.jsx)(`strong`,{children:S===null?o.unavailable:`${S.toFixed(2)}×`}),(0,r.jsxs)(`code`,{children:[o.priority,` `,o.total,` ÷ `,o.standard,` `,o.total]})]})]}),(0,r.jsxs)(`section`,{className:`cost-guide-section`,children:[(0,r.jsxs)(`div`,{className:`cost-guide-section-heading`,children:[(0,r.jsx)(`h2`,{children:o.longTitle}),(0,r.jsx)(`p`,{children:o.longIntro})]}),(0,r.jsxs)(`div`,{className:`cost-guide-context-summary`,children:[(0,r.jsxs)(`span`,{children:[o.threshold,`:`,` `,(0,r.jsx)(`strong`,{children:_.long_context_threshold_tokens===null?o.unavailable:p(_.long_context_threshold_tokens,i)})]}),(0,r.jsxs)(`span`,{children:[o.longInput,`:`,` `,(0,r.jsx)(`strong`,{children:x===null?o.unavailable:p(x.usage.input,i)})]}),(0,r.jsxs)(`span`,{children:[`Input/cache: `,(0,r.jsxs)(`strong`,{children:[_.long_context_input_multiplier,`×`]})]}),(0,r.jsxs)(`span`,{children:[`Output: `,(0,r.jsxs)(`strong`,{children:[_.long_context_output_multiplier,`×`]})]})]}),x===null?(0,r.jsx)(`p`,{className:`cost-guide-unavailable`,children:o.unavailable}):(0,r.jsx)(m,{example:x,currency:h,fxRate:v,locale:i,labels:o}),(0,r.jsxs)(`div`,{className:`cost-guide-unavailable-combination`,children:[(0,r.jsxs)(`strong`,{children:[o.priorityLong,`: `,o.unavailable]}),(0,r.jsx)(`p`,{children:o.priorityLongNote})]})]}),(0,r.jsx)(`aside`,{className:`cost-guide-final-note`,children:o.finalNote})]})}export{h as CostCalculationGuidePage};
@@ -1,4 +1,4 @@
1
- import{S as e,b as t}from"./cost-monitor-C09KmlSw.js";import{t as n}from"./dashboard-localization-CLJ0lT9v.js";var r=`# Primeiros passos
1
+ import{S as e,b as t}from"./cost-monitor-DbaLbU2q.js";import{t as n}from"./dashboard-localization-CLJ0lT9v.js";var r=`# Primeiros passos
2
2
 
3
3
  1. Leia \`.agents/config/project.yaml\` e \`.agents/rules/core.md\`.
4
4
  2. Consulte \`.agents/records/lifecycle/\` para descobrir o estado atual pelos manifests canônicos.
@@ -1639,6 +1639,10 @@ Os comandos acima são gates de desenvolvimento. A confirmação operacional con
1639
1639
  combinação de hashes válidos, cobertura explícita e leitura do período real no Dashboard.
1640
1640
  `,A='# Lifecycle de Conversations, Tasks, SPECs e PRDs\n\nEste documento é a referência pública do lifecycle implementado pelo ZAIP-AIOS. Status persistido, Run, coluna do Kanban e reconciliação possuem responsabilidades distintas e não devem ser inferidos uns dos outros.\n\n## Classificação de entrada\n\nAliases são resolvidos com alvo e status persistido, nunca por palavra isolada. `pronto`, `deixe/coloque em Pronto para Executar` e `ready-to-execute` resolvem para `ready`. `finalizar|concluir|finalize|conclude` em PRD/SPEC `draft|ready` lapidam e resolvem para `ready`; em trabalho ativo, “conclua a execução/finalize a implementação” continua Tasks e gates. Somente `entregar|deliver` após gates solicita entrega terminal.\n\n`implemente` sem alvo abre somente uma Conversation de planejamento; em `draft` finaliza o plano sem executar, em `ready` executa e em `active|blocked|failed` continua, retoma ou cria rework. `desenvolva|melhore|aprimore` sempre planeja/refina/rework. PRD cancelado é imutável e recebe sucessor `draft` com tag `rework` e `rework_of_prd_id`.\n\n## Criação completa de PRD e SPEC\n\n“Me ajude a pensar” é Conversation. “Crie um PRD” revisa o prompt, faz até cinco perguntas críticas por turno durante no máximo três turnos e então persiste PRD `draft`, SPECs técnicas `draft` e PreparedPlan com blueprints de Tasks. Decisões delegáveis restantes são registradas como IA; autoridade externa/destrutiva, credenciais e riscos não delegáveis continuam bloqueantes.\n\nUse uma SPEC por padrão. Outra só existe quando pode ser implementada e verificada em paralelo contra contrato estável, sem depender de outra SPEC ou disputar write scopes. Dependências e ordem ficam entre Tasks da mesma SPEC.\n\nAntes de `ready`, blueprints aparecem apenas como lista compacta no PRD/SPEC; `prd create --plan` e `spec create --plan` validam o pacote antes da escrita, usam criação exclusiva por arquivo e rollback compensatório se uma etapa falhar, mas não prometem uma transação atômica multiarquivo contra interrupção abrupta. Não existem registros Task, Change ou Execution `delivery` nessa etapa. `prd create|rework|prepare` exige uma Run delegada da Bia (`zaip-agent-analyst`) e `spec create|rework|prepare` exige uma Run delegada do Rafa (`zaip-agent-builder`), sempre ativas e vinculadas ao turno raiz atual, com propósito `execution`. Em criação composta, `prd create --plan --run <bia-run> --spec-run <rafa-run>` exige duas Runs distintas sob o mesmo orquestrador: o PRD recebe a autoria da Bia e as SPECs recebem a autoria do Rafa. Replays históricos e identidades trocadas falham antes de escrever artefatos. Duração, tokens e custo são agregados quando observados ou reconciliados e permanecem `null` quando indisponíveis. `ready` materializa Tasks/Changes/Execution como `planned` em operação idempotente; `execute` inicia o menor grão nomeado.\n\n| Entrada | Quando usar | Cria Task? | Estado inicial visível |\n| --- | --- | --- | --- |\n| Conversation | Pergunta, feedback, status ou análise pontual read-only; cria Execution `interaction` | Não | Sem card |\n| Task avulsa executável | Pedido direto de alteração ou resultado independente | Sim | Execução antes da primeira mutação |\n| Task avulsa preparada | Pedido explícito de planejamento sem autorização de executar | Sim | Pronto para Executar |\n| SPEC | Entrega técnica com múltiplos blueprints ou DAG | Tasks em `ready|execute` | Planejamento enquanto `draft` |\n| PRD | Definição de produto organizada em SPECs independentes | Tasks em `ready|execute` | Definição enquanto `draft` |\n\nConversa de análise nunca altera código, documentação ou configuração. A criação ou o refinamento explícito de PRD/SPEC `draft` é a única exceção de definição: a Execution `interaction` pode persistir o macro e seu PreparedPlan sem Task, Change ou Execution `delivery`. Fora dessa exceção, qualquer mutação persistente intencional exige Task materializada e Run raiz de orquestração ativa antes da escrita.\n\nSão isentos apenas deploy/publicação Git sem mudança de produto, manifests e telemetria ZAIP gerados pelo lifecycle, metadados `.git`, caches, builds, testes e arquivos temporários descartáveis. Editar fontes ou documentação do ZAIP não é isento.\n\n## Colunas do Kanban\n\n| Coluna | Regra |\n| --- | --- |\n| Definição | Exclusiva de PRD `draft` |\n| Planejamento | Exclusiva de SPEC `draft` |\n| Pronto para Executar | PRD/SPEC `ready` e toda Task `planned` nunca iniciada ou tentada, avulsa ou vinculada a SPEC |\n| Execução | Task `executing`; SPEC/PRD `active` |\n| Verificação | Task `verifying` ou macro executando gates parentais |\n| Concluído | Task `completed` ou macro `delivered` |\n| Bloqueado | Resultado retomável com condição objetiva |\n| Falhado | Erro técnico impeditivo; exige rework |\n| Cancelado | Cancelamento humano explícito e imutável |\n\nActivity local nunca prevalece sobre um status final persistido. Uma invocação obsoleta não pode reviver Task concluída, bloqueada, falhada ou cancelada.\n\n## Trabalho, Execution, Run, Sub-Run e Call\n\nAs cinco camadas possuem responsabilidades diferentes:\n\n| Camada | Responsabilidade |\n| --- | --- |\n| Trabalho | Task, SPEC ou PRD que descreve o resultado e seu lifecycle |\n| Execution | `interaction` registra uma conversa; `delivery` coordena Task, Change e DAG quando aplicável |\n| Run | Chamada raiz do `zaip-agent-orchestrator`; possui `parent_run_id: null` |\n| Sub-Run | Chamada de subagente feita dentro da Run; possui `parent_run_id` |\n| Call | Invocação interna de modelo LLM; herda a configuração da Run/Sub-Run |\n\nRun e Sub-Run compartilham o mesmo ledger canônico `RUN-*`; a distinção é derivada de `parent_run_id`, sem entidade duplicada. `run_role` usa somente `intake`, `orchestrator` ou `subagent`; valores históricos `owner` e `contributor` são aceitos apenas na leitura e normalizados imediatamente. `run_purpose` informa se a chamada executa `orchestration`, `execution`, `review`, `audit` ou `finalization`.\n\nCada Run/Sub-Run fixa agente, modelo e effort até terminar. Mudança deliberada de agente, modelo, effort ou fase material abre outra chamada de agente; retry técnico preserva a configuração corrente. Calls podem ser várias dentro da mesma chamada de agente e não possuem lifecycle nem tela própria.\n\nQuando o host expõe Calls, a Run/Sub-Run agrega quantidade conhecida, terminais, falhas, cancelamentos, configuração efetiva, tokens e custo. Ausência de telemetria permanece `null`; nunca se presume zero e nunca se cria `CallProjection`.\n\n### Barreira do finalizador\n\nCada Execution usa uma Run raiz do `zaip-agent-orchestrator`. Um executor é escolhido pelas capacidades e pela elegibilidade declarada no catálogo: `zaip-agent-builder` e `zaip-agent-task-executor` podem executar delivery, e `zaip-agent-analyst` pode executar interaction. Revisão, auditoria e integração podem participar. Depois que todos os demais descendentes terminarem, o orquestrador deve chamar `zaip-agent-finalizer` como último Sub-Run, com propósito `finalization`.\n\nO finalizador é read-only: avalia resultados, gates e Evidence e retorna somente o status terminal proposto, motivo e referências. A CLI aplica deterministicamente a transição. O início do finalizador cria uma barreira: ele não pode começar com descendentes ativos e nenhum filho novo pode iniciar depois dele. Finalizador ausente, incompleto ou falho resulta em `blocked`, nunca em Task presa em `executing` ou `verifying`.\n\nNo modo nativo do Codex, a orquestração materializa essa etapa como um envelope de delegação com `purpose: finalization`, `agent_id: agent-finalizer`, escopo de escrita vazio e chave de idempotência própria. Uma Execution em `verifying` só recebe esse envelope; o host deve iniciar a Sub-Run real correspondente e registrar a telemetria dela. O framework não cria Run, Call, custo ou resultado sintético quando o host não a executa.\n\nO status técnico da Run/Sub-Run (`completed`, `failed`, `cancelled`) é diferente do resultado da Task (`completed`, `blocked`, `failed`, `cancelled`). Uma Run tecnicamente concluída pode bloquear a Task porque um gate ou Evidence não passou.\n\nUma observação por AC não altera esse lifecycle nem substitui os gates. Ela é\numa declaração versionada cujo vínculo só pode complementar Evidence quando\n`confirmed` e coerente; os demais estados preservam pendência ou falha. Veja o\n[contrato de prova observável](../../skills/zaip-skill-change/references/observable-evidence.md).\n\nExemplo:\n\n```bash\nzaip run finish RUN-ID \\\n --status completed \\\n --task-outcome blocked \\\n --summary "Gate de integração pendente"\nzaip run closure RUN-ID\n```\n\n## Fechamento e retomada de Tasks\n\nAntes de uma Run raiz terminar, sua Task deve estar em um destes estados:\n\n- `completed`: resultado e gates aprovados;\n- `blocked`: inconclusão retomável, dependência externa ou gate insuficiente;\n- `failed`: erro técnico/integridade que impediu a execução válida;\n- `cancelled`: pedido humano explícito.\n\n`executing` e `verifying` nunca são estados válidos no fim da tentativa. Use `task resume` para `blocked` e `task rework` para `failed`; ambas preservam a Task, e cada nova entrada em execução incrementa a tentativa. `completed` e `cancelled` não reabrem.\n\nInterromper a geração é uma interrupção retomável e resulta em `blocked`. “Cancelar a Task” é uma decisão explícita e resulta em `cancelled`.\n\n## Agregação de SPEC e PRD\n\nQuando a primeira Task filha inicia, SPEC e PRD relacionados passam para `active` e permanecem em Execução enquanto restar trabalho macro, inclusive entre Runs. O resultado isolado de uma Task não terminaliza o pai.\n\n- Task bloqueada/falhada mantém o macro em Execução para que outras Tasks e decisões parentais continuem.\n- SPEC/PRD aguardam todas as Tasks e Runs filhas.\n- Depois que todas as Tasks concluem, o macro entra em Verificação.\n- Delivery exige gates, integração, Acceptance Criteria, outcomes e Evidence próprios do pai.\n\n## Reconciliação manual\n\nO dashboard executa `zaip run reconcile --open --json` somente depois que o usuário confirma o popup Reconciliar. Não há reconciliação global ao abrir o dashboard, em cada turno ou em intervalo automático.\n\nO algoritmo é idempotente e conservador:\n\n- `task_complete` local exato permite finalizar tecnicamente a Run e tentar os gates;\n- gate insuficiente produz `blocked`, nunca sucesso inventado;\n- Run sem invocação ativa por dez minutos é órfã e termina como `failed`;\n- `cancelled` nunca é inferido;\n- Tasks apenas prontas, sem Run terminal atribuída, não são reavaliadas como travadas.\n\nO hook pre-write é diferente da reconciliação: ele verifica localmente se o turno atual possui Run raiz e Task em execução antes de permitir mutação. Essa checagem não chama modelo, não consome tokens e não percorre o backlog.\n\n## Projeção no dashboard\n\nEm Operação e Monitor de Custos, “Chamadas do agente orquestrador” e “Chamadas de subagentes” possuem filtros separados. A tabela de Executions agrega, sem dupla contagem, Runs de orquestrador, Sub-Runs, Sub-Runs finalizadores, Tasks finalizadas e Calls de LLM conhecidas. Quando nem todas as Calls são observáveis, a contagem é marcada como parcial em vez de assumir zero.\n\nTrabalho possui duas leituras da mesma projeção: Trabalho (Kanban), por estágio, e Trabalho (Lista), tabular. As duas mantêm os filtros Todas as Tarefas, Visão Unificada Geral, PRDs, SPECs e Tarefas Avulsas. A lista expõe indicadores operacionais por item, incluindo status, origem, Runs, Sub-Runs, duração, tokens, custo e cobertura.\n\nCada segmento de telemetria possui uma chave de origem e só pode ser atribuído uma vez. Correções de duplicidade preservam o evento histórico e registram uma supersessão; projeções nunca devem somar os dois eventos.\n\n## Persistência compacta da telemetria\n\nMicroeventos observáveis do Codex são sanitizados e gravados primeiro no spool local ignorado pelo\nGit. Depois de um terminal ou erro, eles são compactados em um `InvocationSummaryV1` por invocação\nde agente. Os summaries são organizados em chunks imutáveis e manifestos mensais por writer em\n`.agents/records/telemetry/<ano>/<mês>/writers/<writer-id>/`.\n\nEssa compactação não substitui o ledger `RUN-*`: a Run continua sendo a fonte de lifecycle,\natribuição e evidência. O summary é a fonte compacta de métricas observadas. O Dashboard combina as\nduas leituras sem dupla contagem; tokens e custos do summary são autoritativos quando válidos, mas\numa duração delimitada do lifecycle é preservada se a fonte compacta não conhece a duração.\n\nCobertura é independente por métrica. Tokens, Calls, custo, duração e latência podem ter estados\ndiferentes na mesma invocação. `known_sum`, `unknown_count` e `coverage_ratio` precisam viajar\njuntos; `null` nunca é normalizado para zero. Detalhes de armazenamento, integridade, fallback e\nrecuperação estão em [Telemetria Git-native do Codex](27-telemetria-git-native.md).\n',j=e(),M=`# ZAIP-AIOS (6 Squads + 23 Agents)
1641
1641
 
1642
+ [English](README-ENG.md) | Português
1643
+
1644
+ > **Manutenção bilíngue / bilingual maintenance:** \`README.md\` é a fonte principal em português; mantenha \`README-ENG.md\` como sua tradução correspondente em inglês quando este documento for atualizado.
1645
+
1642
1646
  ## Visão rápida
1643
1647
 
1644
1648
  O ZAIP-AIOS é um sistema operacional para execução autônoma de trabalho com agentes de IA, que coordena 23 agentes especializados, organizados em 6 squads, dentro do Codex.
@@ -1694,19 +1698,64 @@ A atualização documental não aprova uma release. Consulte o [registro de limi
1694
1698
 
1695
1699
  ## Instalação em um comando
1696
1700
 
1697
- Com Node.js 22.16.0 ou superior e npm, execute a instalação na raiz do projeto que receberá o ZAIP-AIOS. O \`init\` instala automaticamente as dependências ausentes da stack (TypeScript, Vite, Astro, cliente Redis, BullMQ, Hono, React e React DOM), verifica os runtimes distribuídos e prepara e valida o SQLite local. Um projeto novo recebe \`package.json\` e lockfile; versões locais existentes são preservadas e o retorno informa a versão encontrada e a configurada no ZAIP-AIOS. Não é necessário um driver SQLite separado:
1701
+ Com Node.js 22.16.0 ou superior e npm, execute a instalação na raiz do projeto que receberá o ZAIP-AIOS. Em uma instalação nova, o \`init\` usa o perfil completo (\`full\`): instala as dependências ausentes da stack e prepara o Terraform. Todos os perfis verificam os runtimes distribuídos e preparam e validam o SQLite local, sem driver separado. Versões de pacotes existentes no projeto são preservadas, com aviso das versões atual e configurada no ZAIP-AIOS:
1698
1702
 
1699
1703
  \`\`\`bash
1700
1704
  npx @zaip-ai/cli@latest init
1701
1705
  \`\`\`
1702
1706
 
1703
- O sufixo \`@latest\` instala a release pública atual sem fixar o README a uma versão específica. O CLI encontra a raiz Git mesmo quando o comando é iniciado em uma subpasta, valida o template antes de escrever e interrompe a instalação se detectar conflito com arquivo pertencente ao usuário. O mesmo comando pode ser executado novamente para receber arquivos novos e atualizar adapters gerenciados sem apagar o histórico do projeto.
1707
+ Também é possível aceitar automaticamente o download inicial do CLI pelo \`npx\`:
1708
+
1709
+ \`\`\`bash
1710
+ npx --yes @zaip-ai/cli@latest init
1711
+ \`\`\`
1712
+
1713
+ Os dois comandos usam o perfil salvo no projeto ou \`full\` quando ainda não existe uma escolha. A opção \`--yes\` antes do nome do pacote apenas aceita o download inicial do CLI pelo \`npx\`; ela não força a substituição de dependências, arquivos ou versões já existentes.
1714
+
1715
+ Ela pode ser combinada com qualquer um dos três perfis, por exemplo: \`npx --yes @zaip-ai/cli@latest init --profile lite\`. Já \`init --yes\`, depois do nome do pacote, confirma a substituição de arquivos solicitada com \`--force\`. Use \`--force --yes\` somente após revisar o dry-run; o instalador cria um backup antes da substituição.
1716
+
1717
+ ### Perfis de instalação
1718
+
1719
+ \`\`\`bash
1720
+ npx @zaip-ai/cli@latest init --profile dev-lite
1721
+ npx @zaip-ai/cli@latest init --profile lite
1722
+ \`\`\`
1723
+
1724
+ | Perfil | Comando | Indicado para |
1725
+ | --- | --- | --- |
1726
+ | Completo (\`full\`, padrão inicial) | \`npx @zaip-ai/cli@latest init\` | Desenvolvimento e infraestrutura com Terraform |
1727
+ | Desenvolvimento (\`dev-lite\`) | \`npx @zaip-ai/cli@latest init --profile dev-lite\` | Desenvolvimento de aplicações, sem instalar Terraform |
1728
+ | Operações (\`lite\`) | \`npx @zaip-ai/cli@latest init --profile lite\` | Growth e Ops, sem instalar pacotes da stack de programação ou Terraform |
1729
+
1730
+ Todos incluem o framework, os agentes, as skills e o Dashboard. O perfil \`lite\` mantém as dependências necessárias ao próprio ZAIP; Node/npm continuam necessários para executar o instalador. Os perfis \`full\` e \`dev-lite\` criam \`package.json\` e lockfile quando o projeto ainda não os possui.
1731
+
1732
+ A escolha fica salva no projeto e é respeitada nas próximas atualizações. Para habilitar desenvolvimento depois de uma instalação \`lite\`, execute \`init --profile dev-lite\`; para incluir Terraform, execute \`init --profile full\`. Mudar para um perfil menor não desinstala pacotes nem ferramentas existentes.
1733
+
1734
+ As opções também funcionam pelo inicializador npm: \`npm create zaip-aios@latest -- --profile lite\`. Use \`--dry-run --profile full\` para consultar a mudança antes de instalar.
1735
+
1736
+ | Dependência | Função | Versão padrão |
1737
+ | --- | --- | --- |
1738
+ | TypeScript | Linguagem e tipagem | 7.0.2 |
1739
+ | Vite | Build e desenvolvimento web | 8.1.4 |
1740
+ | Astro | Framework do site | 7.2.4 |
1741
+ | Redis | Cliente JavaScript para Redis | 6.2.1 |
1742
+ | BullMQ | Filas e jobs | 6.2.0 |
1743
+ | Hono | API web | 4.12.34 |
1744
+ | React | Interface web | 19.2.7 |
1745
+ | React DOM | Renderização do React no DOM | 19.2.7 |
1746
+ | Node.js local | Runtime da stack, preparado automaticamente quando necessário | 22.23.2 (condicional) |
1747
+ | SQLite | Banco local do Dashboard | Integrada ao Node.js; varia conforme o runtime |
1748
+ | Terraform CLI | Provisionamento de infraestrutura; somente no perfil \`full\` | 1.16.1 para a instalação gerenciada |
1749
+
1750
+ O comando instala a versão pública mais recente do ZAIP-AIOS, prepara as dependências ausentes do perfil selecionado e preserva as versões de pacotes existentes no projeto. Alterações deste código-fonte só chegam ao comando \`@latest\` depois de publicadas no npm.
1751
+
1752
+ A instalação inclui Dashboard, regras, skills e configurações para Codex e Claude. Execute o mesmo comando novamente para atualizar os arquivos gerenciados sem apagar o histórico.
1704
1753
 
1705
- Cada release do CLI leva seu próprio template verificado. A árvore documentada neste README representa o estado atual do repositório-fonte; uma funcionalidade recém-integrada passa a chegar pelo mesmo comando assim que a release correspondente é publicada.
1754
+ O pacote Redis inclui apenas o cliente JavaScript; o servidor deve ser configurado separadamente.
1706
1755
 
1707
- O instalador cria [\`.agents\`](.agents/) com regras, requisitos, skills, documentação operacional, catálogo de ferramentas, Dashboard, design system e estado Git-native do lifecycle. Também instala os adapters \`AGENTS.md\` e \`CLAUDE.md\`, as skills de descoberta em \`.codex/skills/zaip-aios/SKILL.md\` e \`.claude/skills/zaip-aios/SKILL.md\`, a configuração de projeto \`.codex/config.toml\` e as configurações equivalentes do Claude. Todos apontam para a mesma fonte canônica, preservando o Codex como experiência principal sem acoplar PRDs, SPECs, Tasks e evidências a um único host.
1756
+ O perfil \`full\` reutiliza um Terraform compatível ou prepara uma instalação local com download oficial e verificação SHA-256. Credenciais de cloud são configuradas separadamente. Os providers declarados nos arquivos \`.tf\` são baixados quando você executa \`terraform init\`; instalar o ZAIP não provisiona recursos nem executa \`terraform apply\`.
1708
1757
 
1709
- Depois da instalação, o [índice operacional](.agents/zaip-aios/INDEX.md) organiza os guias de primeiros passos, execução, revisão, custos, ferramentas, diagnóstico e atualização.
1758
+ Após instalar, consulte o [índice operacional](.agents/zaip-aios/INDEX.md) para começar.
1710
1759
 
1711
1760
  ## Como as camadas se complementam
1712
1761
 
@@ -1780,7 +1829,7 @@ Os registros Git-native continuam sendo a fonte oficial. Tudo o que aparece nas
1780
1829
 
1781
1830
  Os registros ZAIP canônicos permanecem na estrutura padrão em \`.agents/records\`. Para acelerar consultas e visualizações, o Dashboard reconstrói um SQLite descartável como *read model*. Esse arquivo não é fonte de verdade nem armazenamento canônico: é apenas uma projeção local reconstruível.
1782
1831
 
1783
- Não é preciso instalar servidor SQLite, DBeaver ou banco externo. O runtime usa \`node:sqlite\` e mantém a projeção em \`.local/dashboard-sqlite/read-model.sqlite\`. Abrir ou atualizar o Dashboard não autoriza reconciliação global de Runs: essa operação é separada e exige confirmação.
1832
+ Não é preciso instalar servidor SQLite, DBeaver ou banco externo. \`.local/sqlite/\` é o diretório central por workspace para bancos SQLite gerenciados localmente; vários nomes estáveis podem coexistir conforme seu propósito. O Dashboard usa exatamente \`.local/sqlite/zaip-aios-dashboard.sqlite\`, sem cópias por porta, PID, hash ou geração. WAL, SHM e JOURNAL são auxiliares normais do banco aberto. Fixtures descartáveis ficam em \`.local/sqlite/tests/<fixture>/\` com limpeza automática; workspaces isolados usam sua própria \`.local/sqlite/\`; bancos internos de ferramentas externas seguem o armazenamento dessas ferramentas. Abrir ou atualizar o Dashboard não autoriza reconciliação global de Runs: essa operação é separada e exige confirmação.
1784
1833
 
1785
1834
 
1786
1835
  ### Kanban
@@ -2167,7 +2216,9 @@ As seções seguintes preservam os contratos necessários para instalação avan
2167
2216
  .local/ # na raiz do workspace; ignorado pelo Git
2168
2217
  ├── claims/ # claims atômicos de lifecycle
2169
2218
  ├── codex-telemetry-spool/v1/ # captura sanitizada, privada e recuperável
2170
- └── dashboard-sqlite/ # read model descartável
2219
+ └── sqlite/ # bancos SQLite locais, separados por finalidade
2220
+ ├── zaip-aios-dashboard.sqlite # modelo de consulta do dashboard
2221
+ └── <finalidade>.sqlite # exemplo: outros bancos, criados conforme a necessidade
2171
2222
  \`\`\`
2172
2223
 
2173
2224
  As pastas \`branding/\`, \`marketing/\`, \`sales/\` e \`growth/\` são áreas de artefatos de negócio criadas sob demanda. A existência e o conteúdo variam por projeto; não é necessário criar pastas vazias.
@@ -2307,6 +2358,19 @@ do pedido. Quando uma operação puder ser executada com contenção de workspac
2307
2358
  selecionar \`zaip-aios-security\` e reiniciar completamente o Codex para que o sandbox materialize o
2308
2359
  perfil escolhido. Não altere perfis apenas para contornar uma negação de permissão.
2309
2360
 
2361
+ ### Branch de deploy
2362
+
2363
+ Todo deploy GitHub consulta \`.agents/config/project.yaml\`. Para escolher a branch, ajuste:
2364
+
2365
+ \`\`\`yaml
2366
+ deploy:
2367
+ branch: main
2368
+ \`\`\`
2369
+
2370
+ Troque \`main\` por outra branch, como \`production\`, quando necessário. Se o arquivo ou a chave
2371
+ não existir, o destino será \`main\`. A branch atual e o upstream não substituem essa configuração.
2372
+ O preflight valida o destino e o agente relê o arquivo antes do push, usando um refspec explícito.
2373
+
2310
2374
  ### Defesa em profundidade
2311
2375
 
2312
2376
  Os dois perfis mantêm camadas compensatórias que reduzem risco, mas elas não substituem o
@@ -1 +1 @@
1
- import{S as e,b as t}from"./cost-monitor-C09KmlSw.js";import{n}from"./dashboard-localization-CLJ0lT9v.js";var r=e(),i=t();function a({catalog:e,fxRate:t,locale:a,onClose:s,onSave:c,onSaveFxRate:l}){let u=n[a],[d,f]=(0,r.useState)(e),[p,m]=(0,r.useState)(t?.rate??0),[h,g]=(0,r.useState)(!1),_=(e,t)=>f(n=>({...n,models:n.models.map((n,r)=>r===e?{...n,...t}:n)})),v=e=>Math.max(0,Number(e)||0);return(0,i.jsx)(`main`,{className:`pricing-backdrop`,children:(0,i.jsxs)(`section`,{"aria-labelledby":`pricing-page-title`,className:`pricing-dialog`,children:[(0,i.jsxs)(`header`,{children:[(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`small`,{children:u.eyebrow}),(0,i.jsx)(`h1`,{id:`pricing-page-title`,children:u.title}),(0,i.jsx)(`p`,{children:u.description})]}),(0,i.jsxs)(`button`,{className:`pricing-back-button`,onClick:s,type:`button`,children:[(0,i.jsx)(`span`,{"aria-hidden":`true`,children:`←`}),` `,u.back]})]}),(0,i.jsxs)(`div`,{className:`pricing-fx-settings`,children:[(0,i.jsxs)(`div`,{className:`pricing-fx-copy`,children:[(0,i.jsx)(`strong`,{children:u.fxTitle}),(0,i.jsx)(`p`,{children:u.fxDescription})]}),(0,i.jsxs)(`label`,{children:[(0,i.jsx)(`span`,{children:u.fxLabel}),(0,i.jsxs)(`div`,{className:`pricing-fx-input`,children:[(0,i.jsx)(`span`,{children:`R$`}),(0,i.jsx)(`input`,{"aria-label":u.fxAriaLabel,min:`0.0001`,onChange:e=>m(Math.max(1e-4,Number(e.target.value)||0)),step:`0.0001`,type:`number`,value:p})]})]})]}),(0,i.jsxs)(`div`,{className:`pricing-table-heading`,children:[(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`strong`,{children:u.catalog}),(0,i.jsx)(`p`,{children:u.pricesPerMillion})]}),(0,i.jsxs)(`span`,{children:[d.models.length,` `,u.models]})]}),(0,i.jsx)(`div`,{className:`pricing-table-wrap`,children:(0,i.jsxs)(`table`,{children:[(0,i.jsx)(`thead`,{children:(0,i.jsxs)(`tr`,{children:[(0,i.jsx)(`th`,{children:u.model}),(0,i.jsx)(`th`,{children:u.provider}),(0,i.jsx)(`th`,{children:u.input}),(0,i.jsx)(`th`,{children:u.cache}),(0,i.jsx)(`th`,{children:u.output}),(0,i.jsx)(`th`,{children:u.reasoning}),(0,i.jsx)(`th`,{children:u.priorityInput}),(0,i.jsx)(`th`,{children:u.priorityCache}),(0,i.jsx)(`th`,{children:u.priorityOutput}),(0,i.jsx)(`th`,{children:u.priorityReasoning}),(0,i.jsx)(`th`,{children:u.contextLimit}),(0,i.jsx)(`th`,{children:u.inputMultiplier}),(0,i.jsx)(`th`,{children:u.outputMultiplier}),(0,i.jsx)(`th`,{})]})}),(0,i.jsx)(`tbody`,{children:d.models.map((e,t)=>(0,i.jsxs)(`tr`,{children:[(0,i.jsxs)(`td`,{children:[(0,i.jsx)(`input`,{"aria-label":u.model,onChange:e=>_(t,{id:e.target.value}),value:e.id}),(0,i.jsx)(`small`,{children:e.aliases.join(`, `)||u.noAliases})]}),(0,i.jsx)(`td`,{children:(0,i.jsxs)(`select`,{onChange:e=>_(t,{provider:e.target.value}),value:e.provider,children:[(0,i.jsx)(`option`,{value:`openai`,children:`OpenAI`}),(0,i.jsx)(`option`,{value:`anthropic`,children:`Anthropic`})]})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{input_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.input_per_million_usd})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{cached_input_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.cached_input_per_million_usd??0})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{output_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.output_per_million_usd})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{reasoning_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.reasoning_per_million_usd??0})}),[`priority_input_per_million_usd`,`priority_cached_input_per_million_usd`,`priority_output_per_million_usd`,`priority_reasoning_per_million_usd`].map(n=>(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{[n]:v(e.target.value)}),step:`0.001`,type:`number`,value:e[n]??0})},n)),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{long_context_threshold_tokens:v(e.target.value)||null}),step:`1`,type:`number`,value:e.long_context_threshold_tokens??0})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0.001`,onChange:e=>_(t,{long_context_input_multiplier:Math.max(.001,Number(e.target.value)||1)}),step:`0.1`,type:`number`,value:e.long_context_input_multiplier})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0.001`,onChange:e=>_(t,{long_context_output_multiplier:Math.max(.001,Number(e.target.value)||1)}),step:`0.1`,type:`number`,value:e.long_context_output_multiplier})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`button`,{"aria-label":u.removeModel,onClick:()=>f(e=>({...e,models:e.models.filter((e,n)=>n!==t)})),type:`button`,children:`×`})})]},e.id))})]})}),(0,i.jsxs)(`footer`,{children:[(0,i.jsxs)(`button`,{onClick:()=>f(e=>({...e,models:[...e.models,o(a)]})),type:`button`,children:[`+ `,u.addModel]}),(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`button`,{onClick:s,type:`button`,children:u.cancel}),(0,i.jsx)(`button`,{disabled:h,onClick:async()=>{g(!0);try{await c(d),await l(p),s()}finally{g(!1)}},type:`button`,children:h?u.saving:u.save})]})]})]})})}function o(e=`pt-BR`){let t=n[e];return{id:t.newModel,provider:`openai`,aliases:[],input_per_million_usd:0,cached_input_per_million_usd:0,output_per_million_usd:0,reasoning_per_million_usd:0,priority_input_per_million_usd:null,priority_cached_input_per_million_usd:null,priority_output_per_million_usd:null,priority_reasoning_per_million_usd:null,reasoning_billed_separately:!1,long_context_threshold_tokens:null,long_context_input_multiplier:1,long_context_output_multiplier:1,source_label:t.manualOverride,source_url:`https://developers.openai.com/api/docs/pricing`,notes:[t.editedNote]}}export{a as PricingSettingsPage};
1
+ import{S as e,b as t}from"./cost-monitor-DbaLbU2q.js";import{n}from"./dashboard-localization-CLJ0lT9v.js";var r=e(),i=t();function a({catalog:e,fxRate:t,locale:a,onClose:s,onSave:c,onSaveFxRate:l}){let u=n[a],[d,f]=(0,r.useState)(e),[p,m]=(0,r.useState)(t?.rate??0),[h,g]=(0,r.useState)(!1),_=(e,t)=>f(n=>({...n,models:n.models.map((n,r)=>r===e?{...n,...t}:n)})),v=e=>Math.max(0,Number(e)||0);return(0,i.jsx)(`main`,{className:`pricing-backdrop`,children:(0,i.jsxs)(`section`,{"aria-labelledby":`pricing-page-title`,className:`pricing-dialog`,children:[(0,i.jsxs)(`header`,{children:[(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`small`,{children:u.eyebrow}),(0,i.jsx)(`h1`,{id:`pricing-page-title`,children:u.title}),(0,i.jsx)(`p`,{children:u.description})]}),(0,i.jsxs)(`button`,{className:`pricing-back-button`,onClick:s,type:`button`,children:[(0,i.jsx)(`span`,{"aria-hidden":`true`,children:`←`}),` `,u.back]})]}),(0,i.jsxs)(`div`,{className:`pricing-fx-settings`,children:[(0,i.jsxs)(`div`,{className:`pricing-fx-copy`,children:[(0,i.jsx)(`strong`,{children:u.fxTitle}),(0,i.jsx)(`p`,{children:u.fxDescription})]}),(0,i.jsxs)(`label`,{children:[(0,i.jsx)(`span`,{children:u.fxLabel}),(0,i.jsxs)(`div`,{className:`pricing-fx-input`,children:[(0,i.jsx)(`span`,{children:`R$`}),(0,i.jsx)(`input`,{"aria-label":u.fxAriaLabel,min:`0.0001`,onChange:e=>m(Math.max(1e-4,Number(e.target.value)||0)),step:`0.0001`,type:`number`,value:p})]})]})]}),(0,i.jsxs)(`div`,{className:`pricing-table-heading`,children:[(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`strong`,{children:u.catalog}),(0,i.jsx)(`p`,{children:u.pricesPerMillion})]}),(0,i.jsxs)(`span`,{children:[d.models.length,` `,u.models]})]}),(0,i.jsx)(`div`,{className:`pricing-table-wrap`,children:(0,i.jsxs)(`table`,{children:[(0,i.jsx)(`thead`,{children:(0,i.jsxs)(`tr`,{children:[(0,i.jsx)(`th`,{children:u.model}),(0,i.jsx)(`th`,{children:u.provider}),(0,i.jsx)(`th`,{children:u.input}),(0,i.jsx)(`th`,{children:u.cache}),(0,i.jsx)(`th`,{children:u.output}),(0,i.jsx)(`th`,{children:u.reasoning}),(0,i.jsx)(`th`,{children:u.priorityInput}),(0,i.jsx)(`th`,{children:u.priorityCache}),(0,i.jsx)(`th`,{children:u.priorityOutput}),(0,i.jsx)(`th`,{children:u.priorityReasoning}),(0,i.jsx)(`th`,{children:u.contextLimit}),(0,i.jsx)(`th`,{children:u.inputMultiplier}),(0,i.jsx)(`th`,{children:u.outputMultiplier}),(0,i.jsx)(`th`,{})]})}),(0,i.jsx)(`tbody`,{children:d.models.map((e,t)=>(0,i.jsxs)(`tr`,{children:[(0,i.jsxs)(`td`,{children:[(0,i.jsx)(`input`,{"aria-label":u.model,onChange:e=>_(t,{id:e.target.value}),value:e.id}),(0,i.jsx)(`small`,{children:e.aliases.join(`, `)||u.noAliases})]}),(0,i.jsx)(`td`,{children:(0,i.jsxs)(`select`,{onChange:e=>_(t,{provider:e.target.value}),value:e.provider,children:[(0,i.jsx)(`option`,{value:`openai`,children:`OpenAI`}),(0,i.jsx)(`option`,{value:`anthropic`,children:`Anthropic`})]})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{input_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.input_per_million_usd})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{cached_input_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.cached_input_per_million_usd??0})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{output_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.output_per_million_usd})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{reasoning_per_million_usd:v(e.target.value)}),step:`0.001`,type:`number`,value:e.reasoning_per_million_usd??0})}),[`priority_input_per_million_usd`,`priority_cached_input_per_million_usd`,`priority_output_per_million_usd`,`priority_reasoning_per_million_usd`].map(n=>(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{[n]:v(e.target.value)}),step:`0.001`,type:`number`,value:e[n]??0})},n)),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0`,onChange:e=>_(t,{long_context_threshold_tokens:v(e.target.value)||null}),step:`1`,type:`number`,value:e.long_context_threshold_tokens??0})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0.001`,onChange:e=>_(t,{long_context_input_multiplier:Math.max(.001,Number(e.target.value)||1)}),step:`0.1`,type:`number`,value:e.long_context_input_multiplier})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`input`,{min:`0.001`,onChange:e=>_(t,{long_context_output_multiplier:Math.max(.001,Number(e.target.value)||1)}),step:`0.1`,type:`number`,value:e.long_context_output_multiplier})}),(0,i.jsx)(`td`,{children:(0,i.jsx)(`button`,{"aria-label":u.removeModel,onClick:()=>f(e=>({...e,models:e.models.filter((e,n)=>n!==t)})),type:`button`,children:`×`})})]},e.id))})]})}),(0,i.jsxs)(`footer`,{children:[(0,i.jsxs)(`button`,{onClick:()=>f(e=>({...e,models:[...e.models,o(a)]})),type:`button`,children:[`+ `,u.addModel]}),(0,i.jsxs)(`div`,{children:[(0,i.jsx)(`button`,{onClick:s,type:`button`,children:u.cancel}),(0,i.jsx)(`button`,{disabled:h,onClick:async()=>{g(!0);try{await c(d),await l(p),s()}finally{g(!1)}},type:`button`,children:h?u.saving:u.save})]})]})]})})}function o(e=`pt-BR`){let t=n[e];return{id:t.newModel,provider:`openai`,aliases:[],input_per_million_usd:0,cached_input_per_million_usd:0,output_per_million_usd:0,reasoning_per_million_usd:0,priority_input_per_million_usd:null,priority_cached_input_per_million_usd:null,priority_output_per_million_usd:null,priority_reasoning_per_million_usd:null,reasoning_billed_separately:!1,long_context_threshold_tokens:null,long_context_input_multiplier:1,long_context_output_multiplier:1,source_label:t.manualOverride,source_url:`https://developers.openai.com/api/docs/pricing`,notes:[t.editedNote]}}export{a as PricingSettingsPage};
@@ -0,0 +1,3 @@
1
+ import{S as e,b as t}from"./cost-monitor-DbaLbU2q.js";var n=e(),r=[{id:`primary_language`,defaultName:`TypeScript`,scope:`backend`},{id:`backend_runtime`,defaultName:`Node.js`,scope:`backend`},{id:`backend_api`,defaultName:`Hono`,scope:`backend`},{id:`query_builder`,defaultName:`Kysely`,scope:`backend`},{id:`database`,defaultName:`PostgreSQL via Supabase`,scope:`backend`},{id:`auth_storage`,defaultName:`Supabase Auth + Storage`,scope:`backend`},{id:`cache_messaging`,defaultName:`Redis`,scope:`backend`},{id:`async_queue`,defaultName:`BullMQ`,scope:`backend`},{id:`backend_infrastructure`,defaultName:`Terraform`,scope:`backend`},{id:`backend_hosting`,defaultName:`Hostinger VPS`,scope:`backend`},{id:`web_framework`,defaultName:`React`,scope:`frontend`},{id:`web_language`,defaultName:`TypeScript`,scope:`frontend`},{id:`web_build`,defaultName:`Vite`,scope:`frontend`},{id:`frontend_hosting`,defaultName:`Cloudflare Pages`,scope:`frontend`},{id:`site_framework`,defaultName:`Astro`,scope:`site`},{id:`site_language`,defaultName:`TypeScript`,scope:`site`},{id:`site_islands`,defaultName:`React Islands`,scope:`site`},{id:`site_build`,defaultName:`Vite`,scope:`site`},{id:`site_hosting`,defaultName:`Cloudflare Pages`,scope:`site`},{id:`prometheus`,defaultName:`Prometheus`,scope:`observability`},{id:`grafana`,defaultName:`Grafana`,scope:`observability`},{id:`uptime_kuma`,defaultName:`Uptime Kuma`,scope:`observability`},{id:`cadvisor`,defaultName:`cAdvisor`,scope:`observability`},{id:`node_exporter`,defaultName:`node-exporter`,scope:`observability`},{id:`redis_exporter`,defaultName:`Redis Exporter`,scope:`observability`},{id:`k6`,defaultName:`k6`,scope:`testing`},{id:`autocannon`,defaultName:`autocannon`,scope:`testing`}];function i(e){let{languages:t,components:n,...i}=e.stack.overrides,a=p(n)?n:{};return{components:Object.fromEntries(r.map(e=>{let t=a[e.id],n=p(t)?t:{};return[e.id,{name:f(n.name)||e.defaultName,version:f(n.version),reference:f(n.reference)}]})),otherOverrides:JSON.stringify(i,null,2)}}function a(e,t){let n=new Map(t.filter(e=>e.installation===`installed`&&e.version!==null).map(e=>[e.name.toLowerCase(),e.version]));return Object.fromEntries(r.map(t=>{let r=e[t.id],i=n.get(u(t.id));return[t.id,r.version!==``||i===void 0?r:{...r,version:i}]}))}function o(e,t,n){let i=JSON.parse(n);if(!p(i))throw Error(`Demais overrides deve ser um objeto JSON.`);let{languages:a,components:o,...s}=i;for(let e of r){let n=t[e.id].version.trim();if(n!==``&&!/^\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?$/.test(n))throw Error(`A versão de ${t[e.id].name||e.defaultName} deve ser exata, como 22.16.0 ou 17.6, sem ^, ~, >= ou latest.`)}let c=Object.fromEntries(r.map(e=>[e.id,{name:t[e.id].name.trim()||e.defaultName,version:t[e.id].version.trim(),reference:t[e.id].reference.trim()}])),l=p(e.stack.overrides.components)?e.stack.overrides.components:{};return{...e,stack:{...e.stack,overrides:{...s,components:{...l,...c},languages:{frontend:d(c,`frontend`),backend:d(c,`backend`),site:d(c,`site`)}}}}}function s(e){return[...new Set(e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean))]}function c(){return{runtime:`autonomous`,autonomous:{provider:`codex`,model:`gpt-5.6-terra`,max_parallelism:1,lease_ms:6e4}}}function l(e){let t=e?.match(/^v?(\d+)\.(\d+)\.\d+(?:[-+][0-9A-Za-z.-]+)?$/);return t?`v${t[1]}.${t[2]}`:null}function u(e){return e===`backend_runtime`?`node.js`:e===`backend_api`?`hono`:e===`site_framework`?`astro`:e===`cache_messaging`?`redis`:e===`async_queue`?`bullmq`:e===`web_framework`||e===`site_islands`?`react`:e===`web_build`||e===`site_build`?`vite`:e===`primary_language`||e===`web_language`||e===`site_language`?`typescript`:``}function d(e,t){return[...new Set(r.filter(e=>e.scope===t).map(t=>e[t.id].name.trim()).filter(Boolean))]}function f(e){return typeof e==`string`?e:``}function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var m=t(),h={primary_language:{pt:`Linguagem principal`,en:`Primary language`},backend_runtime:{pt:`Runtime backend`,en:`Backend runtime`},backend_api:{pt:`Framework backend / API`,en:`Backend framework / API`},query_builder:{pt:`Query builder`,en:`Query builder`},database:{pt:`Banco de dados`,en:`Database`},auth_storage:{pt:`Autenticação e Storage`,en:`Authentication and Storage`},cache_messaging:{pt:`Cache e mensageria`,en:`Cache and messaging`},async_queue:{pt:`Filas e processamento assíncrono`,en:`Queues and async processing`},backend_infrastructure:{pt:`Infraestrutura backend`,en:`Backend infrastructure`},backend_hosting:{pt:`Hospedagem do backend`,en:`Backend hosting`},web_framework:{pt:`Framework do Web App`,en:`Web App framework`},web_language:{pt:`Linguagem do Web App`,en:`Web App language`},web_build:{pt:`Build do Web App`,en:`Web App build`},frontend_hosting:{pt:`Hospedagem do frontend`,en:`Frontend hosting`},site_framework:{pt:`Framework do site`,en:`Site framework`},site_language:{pt:`Linguagem do site`,en:`Site language`},site_islands:{pt:`Componentes interativos`,en:`Interactive components`},site_build:{pt:`Build do site`,en:`Site build`},site_hosting:{pt:`Hospedagem do site`,en:`Site hosting`},prometheus:{pt:`Coleta de métricas`,en:`Metrics collection`},grafana:{pt:`Dashboards`,en:`Dashboards`},uptime_kuma:{pt:`Monitoramento de disponibilidade`,en:`Availability monitoring`},cadvisor:{pt:`Métricas de containers`,en:`Container metrics`},node_exporter:{pt:`Métricas de host`,en:`Host metrics`},redis_exporter:{pt:`Métricas do Redis`,en:`Redis metrics`},k6:{pt:`Teste de carga`,en:`Load testing`},autocannon:{pt:`Teste HTTP de carga`,en:`HTTP load testing`}};function g({components:e,locale:t,onChange:n,referenceHint:i,versionHint:a}){let o=[{scope:`backend`,title:t===`pt-BR`?`Backend e dados`:`Backend and data`},{scope:`frontend`,title:`Web App`},{scope:`site`,title:t===`pt-BR`?`Site e landing pages`:`Site and landing pages`},{scope:`observability`,title:t===`pt-BR`?`Observabilidade`:`Observability`},{scope:`testing`,title:t===`pt-BR`?`Testes sob demanda`:`On-demand testing`}],s=(t,r,i)=>n({...e,[t]:{...e[t],[r]:i}});return(0,m.jsxs)(`div`,{className:`project-stack-editor`,children:[o.map(n=>(0,m.jsxs)(`section`,{children:[(0,m.jsx)(`h3`,{children:n.title}),(0,m.jsxs)(`div`,{className:`project-stack-table`,children:[(0,m.jsxs)(`div`,{className:`project-stack-table-head`,"aria-hidden":`true`,children:[(0,m.jsx)(`span`,{children:`Item`}),(0,m.jsx)(`span`,{children:t===`pt-BR`?`Tecnologia`:`Technology`}),(0,m.jsx)(`span`,{children:t===`pt-BR`?`Versão exata`:`Exact version`}),(0,m.jsx)(`span`,{children:t===`pt-BR`?`Pacote / imagem / serviço`:`Package / image / service`})]}),r.filter(e=>e.scope===n.scope).map(n=>(0,m.jsxs)(`div`,{className:`project-stack-row`,children:[(0,m.jsx)(`strong`,{children:h[n.id][t===`pt-BR`?`pt`:`en`]}),(0,m.jsx)(`input`,{"aria-label":`${h[n.id].pt}: tecnologia`,value:e[n.id].name,onChange:e=>s(n.id,`name`,e.target.value)}),(0,m.jsx)(`input`,{"aria-label":`${h[n.id].pt}: versão exata`,inputMode:`decimal`,placeholder:`x.y.z`,value:e[n.id].version,onChange:e=>s(n.id,`version`,e.target.value)}),(0,m.jsx)(`input`,{"aria-label":`${h[n.id].pt}: referência`,placeholder:`npm:pacote ou service:nome`,value:e[n.id].reference,onChange:e=>s(n.id,`reference`,e.target.value)})]},n.id))]})]},n.scope)),(0,m.jsxs)(`div`,{className:`project-stack-format-help`,children:[(0,m.jsxs)(`p`,{children:[(0,m.jsx)(`strong`,{children:t===`pt-BR`?`Formato da versão:`:`Version format:`}),` `,a]}),(0,m.jsxs)(`p`,{children:[(0,m.jsx)(`strong`,{children:t===`pt-BR`?`Formato da referência:`:`Reference format:`}),` `,i]})]})]})}function _({components:e,text:t}){return e.length===0?null:(0,m.jsxs)(`section`,{className:`project-stack-versions`,"aria-label":t.versions,children:[(0,m.jsx)(`h3`,{children:t.versions}),(0,m.jsx)(`div`,{children:e.map(e=>(0,m.jsxs)(`article`,{children:[(0,m.jsxs)(`div`,{className:`project-stack-version-identity`,children:[(0,m.jsx)(`strong`,{children:e.name}),(0,m.jsxs)(`code`,{children:[t.current,`: `,e.version??t.versionUnavailable]}),e.configured_version!==null&&e.configured_version!==e.version?(0,m.jsxs)(`code`,{children:[t.configured,`: `,e.configured_version]}):null]}),(0,m.jsx)(`span`,{className:`is-${e.verification}`,children:e.installation===`runtime`?t.runtime:e.installation===`installed`?t.installed:e.installation===`bundled`?t.bundled:t.missing}),e.source?(0,m.jsx)(`small`,{children:e.source}):null]},e.name))})]})}var v={"pt-BR":{eyebrow:`Configurações`,title:`Configuração do projeto`,intro:`Edite o arquivo central do projeto com validação do schema antes da gravação.`,loading:`Carregando…`,back:`Voltar ao dashboard`,save:`Salvar configurações`,saving:`Validando e salvando…`,saved:`Configurações salvas e validadas.`,framework:`Framework ZAIP-AIOS`,frameworkHint:`Ativa ou desativa o framework para este projeto.`,identity:`Identidade do projeto`,stack:`Stack e linguagens`,execution:`Execução`,assurance:`Assurance`,executionToggleHint:`Grava ou remove o bloco execution. Sem ele, o projeto usa execução manual.`,runtimeHint:`Manual apenas materializa o trabalho; autonomous executa a DAG pelo provider configurado quando as precondições passam.`,providerHint:`Provider que inicia os agentes da execução autônoma: Codex ou Claude.`,executionModelHint:`Modelo-base do runtime autônomo. A política automática de PRD/SPEC ainda pode selecionar um modelo permitido por agente.`,parallelismHint:`Teto de agentes simultâneos. O valor efetivo é o menor limite entre projeto, DAG, provider e squad.`,leaseHint:`Valor persistido no projeto. O coordenador atual ainda usa internamente um lease fixo de 60 segundos.`,assuranceToggleHint:`Ativa ou remove os gates de evidência, revisão e qualidade do projeto. Recomenda-se manter ativo.`,assuranceVersionHint:`Versão do contrato de assurance. É fixa e somente leitura.`,assuranceDepthHint:`Auto ajusta o rigor ao escopo; base exige o conjunto padrão; elevated amplia validações para mudanças mais abrangentes.`,finalCommitHint:`Exige que as evidências comprovem o commit final integrado. Sinais de produção ou migração ainda podem exigir isso mesmo quando desativado.`,context:`Contexto`,overview:`Visão geral do projeto`,available:`Criado`,unavailable:`Ainda não criado`,componentGuide:`Preencha cada responsabilidade separadamente. A versão fica sem prefixos (^, ~, >=) e a referência identifica o pacote, imagem ou serviço.`,versionHint:`Versão exata: 22.16.0 ou 17.6. Deixe vazio para serviços sem versão fixada.`,referenceHint:`Ex.: npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase ou provider:cloudflare-pages.`,overrides:`Opções avançadas (JSON)`,overridesHint:`Use apenas fatos técnicos transversais confirmados. Deixe vazio quando não houver exceções.`,versions:`Versões detectadas no workspace`,exact:`Verificada`,constraint:`Requisito`,versionUnavailable:`Não encontrada`,runtime:`Runtime do Dashboard`,installed:`Instalado no projeto`,missing:`Ausente no projeto`,bundled:`Empacotado no Dashboard`,current:`Atual`,configured:`Configurado`,contextGuide:`O contexto começa pelas fontes canônicas e inclui somente arquivos relevantes para a tarefa. Saídas geradas são consultadas apenas em setup, release ou checagem de paridade.`,contextDomains:`Branding, Marketing, Growth e Sales são usados sob demanda pelos respectivos especialistas, quando houver uma tarefa e artefatos desses domínios. Não os adicione aqui apenas por existirem como capacidades.`},"en-US":{eyebrow:`Settings`,title:`Project settings`,intro:`Edit the central project file with schema validation before writing.`,loading:`Loading project settings…`,back:`Back to dashboard`,save:`Save settings`,saving:`Validating and saving…`,saved:`Settings saved and validated.`,framework:`ZAIP-AIOS framework`,frameworkHint:`Enable or disable the framework for this project.`,identity:`Project identity`,stack:`Stack and languages`,execution:`Execution`,assurance:`Assurance`,executionToggleHint:`Writes or removes the execution block. Without it, the project uses manual execution.`,runtimeHint:`Manual only materializes work; autonomous runs the DAG through the configured provider after preconditions pass.`,providerHint:`Provider that starts autonomous execution agents: Codex or Claude.`,executionModelHint:`Base model for the autonomous runtime. PRD/SPEC automatic policy may still select an allowed model per agent.`,parallelismHint:`Maximum simultaneous agents. Effective parallelism is the smallest project, DAG, provider, and squad limit.`,leaseHint:`Value persisted in the project. The current coordinator still uses a fixed internal 60-second lease.`,assuranceToggleHint:`Enables or removes project evidence, review, and quality gates. Keeping it enabled is recommended.`,assuranceVersionHint:`Assurance contract version. It is fixed and read-only.`,assuranceDepthHint:`Auto adapts rigor to scope; base uses the standard set; elevated expands validation for broader changes.`,finalCommitHint:`Requires evidence for the final integrated commit. Production or migration signals may still require it when disabled.`,context:`Context`,overview:`Project overview`,available:`Created`,unavailable:`Not created yet`,componentGuide:`Fill each responsibility separately. Versions have no prefixes (^, ~, >=), and the reference identifies the package, image, or service.`,versionHint:`Exact version: 22.16.0 or 17.6. Leave blank for services without a pinned version.`,referenceHint:`E.g. npm:hono, docker:node:22.16.0-bookworm-slim, service:supabase, or provider:cloudflare-pages.`,overrides:`Advanced options (JSON)`,overridesHint:`Use only confirmed cross-cutting technical facts. Leave empty when there are no exceptions.`,versions:`Versions detected in the workspace`,exact:`Verified`,constraint:`Requirement`,versionUnavailable:`Not found`,runtime:`Dashboard runtime`,installed:`Installed in project`,missing:`Missing from project`,bundled:`Bundled in Dashboard`,current:`Current`,configured:`Configured`,contextGuide:`Context starts from canonical sources and includes only files relevant to the task. Generated outputs are consulted only for setup, release, or parity checks.`,contextDomains:`Branding, Marketing, Growth, and Sales are used on demand by their respective specialists when there is a task and artifacts in those domains. Do not add them here merely because they exist as capabilities.`}};function y({api:e,locale:t,onClose:r}){let u=v[t],[d,f]=(0,n.useState)(null),[p,h]=(0,n.useState)(null),[y,T]=(0,n.useState)(null),[E,D]=(0,n.useState)(`{}`),[O,k]=(0,n.useState)(!1),[A,j]=(0,n.useState)(null),[M,N]=(0,n.useState)(null);(0,n.useEffect)(()=>{Promise.all([e.projectSettings(),e.projectOverview()]).then(([e,t])=>{let n=i(e);f(e),h(t),T(a(n.components,t.stack_components)),D(n.otherOverrides)}).catch(e=>j(e instanceof Error?e.message:String(e)))},[e]);async function P(t){if(t.preventDefault(),d!==null){k(!0),j(null),N(null);try{let t=await e.saveProjectSettings(o(d,y??i(d).components,E)),n=await e.projectOverview(),r=i(t);f(t),h(n),T(r.components),D(r.otherOverrides),N(u.saved)}catch(e){j(e instanceof Error?e.message:String(e))}finally{k(!1)}}}if(d===null){let e=A===null;return(0,m.jsx)(`main`,{"aria-busy":e,className:`project-settings-state`,children:(0,m.jsxs)(`div`,{"aria-live":e?`polite`:`assertive`,className:`project-settings-state-card`,role:e?`status`:`alert`,children:[e?(0,m.jsx)(`span`,{"aria-hidden":`true`,className:`project-settings-loader`}):null,(0,m.jsx)(`p`,{children:u.eyebrow}),(0,m.jsx)(`h1`,{children:A??u.loading}),(0,m.jsxs)(`button`,{onClick:r,type:`button`,children:[`← `,u.back]})]})})}return(0,m.jsx)(`main`,{className:`project-settings-page`,children:(0,m.jsxs)(`form`,{onSubmit:P,children:[(0,m.jsxs)(`header`,{className:`project-settings-header`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`p`,{children:u.eyebrow}),(0,m.jsx)(`h1`,{children:u.title}),(0,m.jsx)(`span`,{children:u.intro})]}),(0,m.jsxs)(`button`,{className:`project-settings-back`,onClick:r,type:`button`,children:[`← `,u.back]})]}),A?(0,m.jsx)(`div`,{className:`project-settings-message is-error`,children:A}):null,M?(0,m.jsx)(`div`,{className:`project-settings-message is-success`,role:`status`,children:M}):null,(0,m.jsxs)(`section`,{className:`project-settings-feature`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsxs)(`h2`,{children:[u.framework,l(p?.framework_version)?` - ${l(p?.framework_version)}`:``]}),(0,m.jsx)(`p`,{children:u.frameworkHint})]}),(0,m.jsx)(S,{checked:d.zaip?.enabled===!0,label:t===`pt-BR`?`Framework ativo`:`Framework enabled`,onChange:e=>f({...d,zaip:{enabled:e}})})]}),(0,m.jsx)(`section`,{className:`project-settings-summary`,"aria-label":u.overview,children:p?.metrics.map(e=>(0,m.jsxs)(`div`,{className:`project-settings-metric`,children:[(0,m.jsx)(`strong`,{children:e.value}),(0,m.jsx)(`span`,{children:e.label})]},e.id))}),(0,m.jsx)(b,{className:`is-wide`,title:u.overview,children:(0,m.jsx)(`div`,{className:`project-overview`,"aria-live":`polite`,children:p?.areas.map(e=>(0,m.jsxs)(`div`,{className:`project-overview-item`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`strong`,{children:e.label}),(0,m.jsx)(`code`,{children:e.artifact})]}),(0,m.jsx)(`span`,{className:e.available?`is-available`:`is-unavailable`,children:e.available?u.available:u.unavailable})]},e.id))})}),(0,m.jsxs)(`div`,{className:`project-settings-grid`,children:[(0,m.jsxs)(b,{className:`is-wide project-identity-card`,title:u.identity,children:[(0,m.jsx)(x,{label:`Schema`,children:(0,m.jsx)(`input`,{readOnly:!0,value:d.schema_version})}),(0,m.jsx)(x,{label:t===`pt-BR`?`ID do projeto`:`Project ID`,children:(0,m.jsx)(`input`,{required:!0,value:d.project.id,onChange:e=>f({...d,project:{...d.project,id:e.target.value}})})}),(0,m.jsx)(x,{label:t===`pt-BR`?`Nome do projeto`:`Project name`,children:(0,m.jsx)(`input`,{required:!0,value:d.project.name,onChange:e=>f({...d,project:{...d.project,name:e.target.value}})})}),(0,m.jsx)(x,{label:`Timezone IANA`,children:(0,m.jsx)(`input`,{required:!0,value:d.project.timezone,onChange:e=>f({...d,project:{...d.project,timezone:e.target.value}})})})]}),(0,m.jsxs)(b,{className:`is-wide`,title:u.stack,children:[(0,m.jsx)(`p`,{className:`project-stack-guide`,children:u.componentGuide}),y?(0,m.jsx)(g,{components:y,locale:t,onChange:T,referenceHint:u.referenceHint,versionHint:u.versionHint}):null,(0,m.jsx)(_,{components:p?.stack_components??[],text:u}),(0,m.jsxs)(`details`,{className:`project-settings-advanced`,children:[(0,m.jsx)(`summary`,{children:u.overrides}),(0,m.jsx)(x,{hint:u.overridesHint,label:`Overrides`,children:(0,m.jsx)(`textarea`,{rows:7,value:E,onChange:e=>D(e.target.value)})})]})]}),(0,m.jsxs)(b,{title:u.execution,children:[(0,m.jsx)(C,{checked:d.execution!==void 0,hint:u.executionToggleHint,label:t===`pt-BR`?`Incluir configuração de execução`:`Include execution configuration`,onChange:e=>f({...d,execution:e?{runtime:`manual`}:void 0})}),d.execution?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(x,{hint:u.runtimeHint,label:`Runtime`,children:(0,m.jsxs)(`select`,{value:d.execution.runtime,onChange:e=>f({...d,execution:e.target.value===`manual`?{runtime:`manual`}:c()}),children:[(0,m.jsx)(`option`,{value:`manual`,children:`manual`}),(0,m.jsx)(`option`,{value:`autonomous`,children:`autonomous`})]})}),d.execution.runtime===`autonomous`?(0,m.jsx)(w,{config:d,setConfig:f,text:u}):null]}):null]}),(0,m.jsxs)(b,{title:u.assurance,children:[(0,m.jsx)(C,{checked:d.assurance!==void 0,hint:u.assuranceToggleHint,label:t===`pt-BR`?`Incluir assurance`:`Include assurance`,onChange:e=>f({...d,assurance:e?{version:1,standard_depth:`auto`,require_final_commit:!0}:void 0})}),d.assurance?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(x,{hint:u.assuranceVersionHint,label:t===`pt-BR`?`Versão`:`Version`,children:(0,m.jsx)(`input`,{readOnly:!0,value:d.assurance.version})}),(0,m.jsx)(x,{hint:u.assuranceDepthHint,label:t===`pt-BR`?`Profundidade padrão`:`Standard depth`,children:(0,m.jsxs)(`select`,{value:d.assurance.standard_depth,onChange:e=>f({...d,assurance:{...d.assurance??{version:1,standard_depth:`auto`,require_final_commit:!0},standard_depth:e.target.value}}),children:[(0,m.jsx)(`option`,{value:`auto`,children:`auto`}),(0,m.jsx)(`option`,{value:`base`,children:`base`}),(0,m.jsx)(`option`,{value:`elevated`,children:`elevated`})]})}),(0,m.jsx)(S,{checked:d.assurance.require_final_commit,hint:u.finalCommitHint,label:t===`pt-BR`?`Exigir commit final`:`Require final commit`,onChange:e=>f({...d,assurance:{...d.assurance??{version:1,standard_depth:`auto`,require_final_commit:!0},require_final_commit:e}})})]}):null]}),(0,m.jsxs)(b,{className:`is-wide`,title:u.context,children:[(0,m.jsx)(C,{checked:d.context!==void 0,label:t===`pt-BR`?`Incluir raízes de contexto`:`Include context roots`,onChange:e=>f({...d,context:e?{canonical_roots:[`packages`],projection_roots:[]}:void 0})}),d.context?(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`div`,{className:`project-settings-guidance`,children:[(0,m.jsx)(`p`,{children:u.contextGuide}),(0,m.jsx)(`p`,{children:u.contextDomains})]}),(0,m.jsxs)(`div`,{className:`project-settings-fields two-columns`,children:[(0,m.jsx)(x,{hint:t===`pt-BR`?`Uma pasta por linha. Estas são as fontes principais do projeto.`:`One folder per line. These are the project's primary sources.`,label:t===`pt-BR`?`Fontes canônicas`:`Canonical sources`,children:(0,m.jsx)(`textarea`,{required:!0,rows:5,value:d.context.canonical_roots.join(`
2
+ `),onChange:e=>f({...d,context:{...d.context??{canonical_roots:[`packages`],projection_roots:[]},canonical_roots:s(e.target.value)}})})}),(0,m.jsx)(x,{hint:t===`pt-BR`?`Uma pasta por linha. São saídas geradas, não fontes de contexto normal.`:`One folder per line. These are generated outputs, not normal context sources.`,label:t===`pt-BR`?`Saídas geradas/publicadas`:`Generated/published outputs`,children:(0,m.jsx)(`textarea`,{rows:5,value:d.context.projection_roots.join(`
3
+ `),onChange:e=>f({...d,context:{...d.context??{canonical_roots:[`packages`],projection_roots:[]},projection_roots:s(e.target.value)}})})})]})]}):null]})]}),(0,m.jsxs)(`footer`,{className:`project-settings-footer`,children:[(0,m.jsx)(`span`,{children:`.agents/config/project.yaml`}),(0,m.jsx)(`button`,{disabled:O,type:`submit`,children:O?u.saving:u.save})]})]})})}function b({children:e,className:t=``,title:n}){return(0,m.jsxs)(`section`,{className:`project-settings-card ${t}`,children:[(0,m.jsx)(`h2`,{children:n}),(0,m.jsx)(`div`,{className:`project-settings-fields`,children:e})]})}function x({children:e,hint:t,label:n}){return(0,m.jsxs)(`div`,{className:`project-settings-field`,children:[(0,m.jsx)(`span`,{children:n}),e,t?(0,m.jsx)(`small`,{children:t}):null]})}function S({checked:e,hint:t,label:n,onChange:r}){return(0,m.jsxs)(`div`,{className:`project-settings-toggle-field`,children:[(0,m.jsxs)(`label`,{className:`project-settings-toggle`,children:[(0,m.jsx)(`input`,{checked:e,onChange:e=>r(e.target.checked),type:`checkbox`}),(0,m.jsx)(`span`,{"aria-hidden":`true`}),(0,m.jsx)(`strong`,{children:n})]}),t?(0,m.jsx)(`small`,{children:t}):null]})}function C(e){return(0,m.jsx)(S,{...e})}function w({config:e,setConfig:t,text:n}){let r=e.execution?.runtime===`autonomous`?e.execution:c(),i=n=>t({...e,execution:{runtime:`autonomous`,autonomous:n}});return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(x,{hint:n.providerHint,label:`Provider`,children:(0,m.jsxs)(`select`,{value:r.autonomous.provider,onChange:e=>i({...r.autonomous,provider:e.target.value}),children:[(0,m.jsx)(`option`,{value:`codex`,children:`codex`}),(0,m.jsx)(`option`,{value:`claude`,children:`claude`})]})}),(0,m.jsx)(x,{hint:n.executionModelHint,label:`Model`,children:(0,m.jsx)(`input`,{required:!0,value:r.autonomous.model,onChange:e=>i({...r.autonomous,model:e.target.value})})}),(0,m.jsx)(x,{hint:n.parallelismHint,label:`Max parallelism`,children:(0,m.jsx)(`input`,{max:8,min:1,type:`number`,value:r.autonomous.max_parallelism,onChange:e=>i({...r.autonomous,max_parallelism:Number(e.target.value)})})}),(0,m.jsx)(x,{hint:n.leaseHint,label:`Lease (ms)`,children:(0,m.jsx)(`input`,{max:36e5,min:5e3,step:1e3,type:`number`,value:r.autonomous.lease_ms,onChange:e=>i({...r.autonomous,lease_ms:Number(e.target.value)})})})]})}export{y as ProjectSettingsPage};
@@ -1 +1 @@
1
- import{S as e,b as t}from"./cost-monitor-C09KmlSw.js";import{n}from"./traceability-I4AKqVDX.js";import{t as r}from"./index-Dyo_wpL4.js";var i=e(),a=t();function o(e,t){let n=t.trim().toLocaleLowerCase();return n===``?[...e]:e.filter(e=>`${e.title} ${e.id}`.toLocaleLowerCase().includes(n))}function s(e,t,n){return n?[...e]:o(e,t)}function c(e){return`traceability-task-option-${e}`}function l({locale:e,loadingTaskId:t,hasMoreTasks:o,isLoadingTasks:l,onLoadMoreTasks:u,onSelectTask:d,onOpenChange:f,onOpenPrd:p,onOpenSpec:m,selectedTaskId:h,tasks:g,trace:_}){let v=[...g].sort((e,t)=>Date.parse(t.created_at)-Date.parse(e.created_at)),y=v.find(e=>e.id===h),[b,x]=(0,i.useState)(()=>y?.title??h),[S,C]=(0,i.useState)(!1),[w,T]=(0,i.useState)(!1),[E,D]=(0,i.useState)(0),[O,k]=(0,i.useState)(12),A=(0,i.useMemo)(()=>s(v,b,w),[b,w,v]),j=A.slice(0,O),M=j.length<A.length,N=`traceability-task-search`,P=`traceability-task-results`,F=e===`pt-BR`?`Task selecionada`:`Selected task`,I=e===`pt-BR`?`Buscar task por nome ou ID`:`Search task by name or ID`,L=S?A[E]?.id:void 0;(0,i.useEffect)(()=>{x(y?.title??h),D(0)},[y?.title,h]);let R=e=>{x(e.title),C(!1),T(!1),d(e.id)},z=(e=!0)=>{C(!0),T(!0),e&&(D(0),k(12))};return(0,a.jsxs)(`section`,{className:`traceability-workspace`,children:[(0,a.jsxs)(`header`,{children:[(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:N,children:F}),(0,a.jsx)(`input`,{"aria-activedescendant":L===void 0?void 0:c(L),"aria-autocomplete":`list`,"aria-controls":P,"aria-expanded":S,"aria-label":I,id:N,onChange:e=>{x(e.target.value),D(0),T(!1),k(12),C(!0)},onClick:()=>z(),onFocus:()=>z(),onKeyDown:e=>{if(e.key===`ArrowDown`)e.preventDefault(),z(!1),D(e=>Math.min(e+1,Math.max(0,v.length-1)));else if(e.key===`ArrowUp`)e.preventDefault(),z(!1),D(e=>Math.max(0,e-1));else if(e.key===`Enter`&&S){let t=A[E];t!==void 0&&(e.preventDefault(),R(t))}else e.key===`Escape`&&C(!1)},role:`combobox`,type:`search`,value:b}),S?(0,a.jsx)(`div`,{"aria-label":I,className:`traceability-task-results`,id:P,onScroll:e=>{let{clientHeight:t,scrollHeight:n,scrollTop:i}=e.currentTarget;i+t<n-32||(o&&u(),j.length<A.length&&k(e=>r(e,A.length,12)))},role:`listbox`,children:A.length>0?j.map((e,t)=>(0,a.jsx)(`div`,{role:`presentation`,children:(0,a.jsx)(`button`,{"aria-selected":e.id===h,className:t===E?`is-active`:void 0,id:c(e.id),onClick:()=>R(e),role:`option`,type:`button`,children:(0,a.jsx)(`strong`,{children:e.title})})},e.id)):(0,a.jsx)(`div`,{className:`traceability-task-no-results`,role:`status`,children:e===`pt-BR`?`Nenhuma task encontrada.`:`No tasks found.`})}):null,S&&A.length>0?(0,a.jsx)(`p`,{"aria-live":`polite`,className:`traceability-task-pagination-status`,role:`status`,children:l?e===`pt-BR`?`Carregando mais tasks…`:`Loading more tasks…`:M||o?e===`pt-BR`?`${j.length} de ${A.length} tasks exibidas. Role para carregar mais.`:`${j.length} of ${A.length} tasks shown. Scroll to load more.`:e===`pt-BR`?`${A.length} tasks exibidas. Fim da lista.`:`${A.length} tasks shown. End of list.`}):null]}),(0,a.jsx)(`small`,{children:e===`pt-BR`?`Selecione pelo nome para visualizar o ciclo completo sem precisar do ID.`:`Select by name to inspect the complete lifecycle without knowing the ID.`})]}),t?(0,a.jsx)(`div`,{"aria-live":`polite`,className:`traceability-workspace-loading`,children:e===`pt-BR`?`Carregando as 6 etapas…`:`Loading all 6 stages…`}):_?(0,a.jsx)(n,{embedded:!0,locale:e,onClose:()=>void 0,onOpenChange:f,onOpenPrd:p,onOpenSpec:m,trace:_}):(0,a.jsx)(`p`,{children:e===`pt-BR`?`Nenhuma task disponível.`:`No task available.`})]})}export{l as TraceabilityWorkspace};
1
+ import{S as e,b as t}from"./cost-monitor-DbaLbU2q.js";import{n}from"./traceability-BDe4_Ubl.js";import{t as r}from"./index-ZJFXmK7m.js";var i=e(),a=t();function o(e,t){let n=t.trim().toLocaleLowerCase();return n===``?[...e]:e.filter(e=>`${e.title} ${e.id}`.toLocaleLowerCase().includes(n))}function s(e,t,n){return n?[...e]:o(e,t)}function c(e){return`traceability-task-option-${e}`}function l({locale:e,loadingTaskId:t,hasMoreTasks:o,isLoadingTasks:l,onLoadMoreTasks:u,onSelectTask:d,onOpenChange:f,onOpenPrd:p,onOpenSpec:m,selectedTaskId:h,tasks:g,trace:_}){let v=[...g].sort((e,t)=>Date.parse(t.created_at)-Date.parse(e.created_at)),y=v.find(e=>e.id===h),[b,x]=(0,i.useState)(()=>y?.title??h),[S,C]=(0,i.useState)(!1),[w,T]=(0,i.useState)(!1),[E,D]=(0,i.useState)(0),[O,k]=(0,i.useState)(12),A=(0,i.useMemo)(()=>s(v,b,w),[b,w,v]),j=A.slice(0,O),M=j.length<A.length,N=`traceability-task-search`,P=`traceability-task-results`,F=e===`pt-BR`?`Task selecionada`:`Selected task`,I=e===`pt-BR`?`Buscar task por nome ou ID`:`Search task by name or ID`,L=S?A[E]?.id:void 0;(0,i.useEffect)(()=>{x(y?.title??h),D(0)},[y?.title,h]);let R=e=>{x(e.title),C(!1),T(!1),d(e.id)},z=(e=!0)=>{C(!0),T(!0),e&&(D(0),k(12))};return(0,a.jsxs)(`section`,{className:`traceability-workspace`,children:[(0,a.jsxs)(`header`,{children:[(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`label`,{htmlFor:N,children:F}),(0,a.jsx)(`input`,{"aria-activedescendant":L===void 0?void 0:c(L),"aria-autocomplete":`list`,"aria-controls":P,"aria-expanded":S,"aria-label":I,id:N,onChange:e=>{x(e.target.value),D(0),T(!1),k(12),C(!0)},onClick:()=>z(),onFocus:()=>z(),onKeyDown:e=>{if(e.key===`ArrowDown`)e.preventDefault(),z(!1),D(e=>Math.min(e+1,Math.max(0,v.length-1)));else if(e.key===`ArrowUp`)e.preventDefault(),z(!1),D(e=>Math.max(0,e-1));else if(e.key===`Enter`&&S){let t=A[E];t!==void 0&&(e.preventDefault(),R(t))}else e.key===`Escape`&&C(!1)},role:`combobox`,type:`search`,value:b}),S?(0,a.jsx)(`div`,{"aria-label":I,className:`traceability-task-results`,id:P,onScroll:e=>{let{clientHeight:t,scrollHeight:n,scrollTop:i}=e.currentTarget;i+t<n-32||(o&&u(),j.length<A.length&&k(e=>r(e,A.length,12)))},role:`listbox`,children:A.length>0?j.map((e,t)=>(0,a.jsx)(`div`,{role:`presentation`,children:(0,a.jsx)(`button`,{"aria-selected":e.id===h,className:t===E?`is-active`:void 0,id:c(e.id),onClick:()=>R(e),role:`option`,type:`button`,children:(0,a.jsx)(`strong`,{children:e.title})})},e.id)):(0,a.jsx)(`div`,{className:`traceability-task-no-results`,role:`status`,children:e===`pt-BR`?`Nenhuma task encontrada.`:`No tasks found.`})}):null,S&&A.length>0?(0,a.jsx)(`p`,{"aria-live":`polite`,className:`traceability-task-pagination-status`,role:`status`,children:l?e===`pt-BR`?`Carregando mais tasks…`:`Loading more tasks…`:M||o?e===`pt-BR`?`${j.length} de ${A.length} tasks exibidas. Role para carregar mais.`:`${j.length} of ${A.length} tasks shown. Scroll to load more.`:e===`pt-BR`?`${A.length} tasks exibidas. Fim da lista.`:`${A.length} tasks shown. End of list.`}):null]}),(0,a.jsx)(`small`,{children:e===`pt-BR`?`Selecione pelo nome para visualizar o ciclo completo sem precisar do ID.`:`Select by name to inspect the complete lifecycle without knowing the ID.`})]}),t?(0,a.jsx)(`div`,{"aria-live":`polite`,className:`traceability-workspace-loading`,children:e===`pt-BR`?`Carregando as 6 etapas…`:`Loading all 6 stages…`}):_?(0,a.jsx)(n,{embedded:!0,locale:e,onClose:()=>void 0,onOpenChange:f,onOpenPrd:p,onOpenSpec:m,trace:_}):(0,a.jsx)(`p`,{children:e===`pt-BR`?`Nenhuma task disponível.`:`No task available.`})]})}export{l as TraceabilityWorkspace};