From 7357070fb9a3aabc340f49e08867b941c7d9db02 Mon Sep 17 00:00:00 2001 From: nntrivi2001 Date: Tue, 11 Aug 2026 12:16:54 +0700 Subject: [PATCH] chore: remove unused desktop app, cloud deployment infra, and monitoring stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deletes desktop/ (Electron wrapper), deployments/ (Helm/Kustomize/ Terraform/CI for cloud deploy), and monitoring/ (Prometheus + Grafana stack) along with DESKTOP.md, DEPLOYMENT.md, docker-compose.full.yml, their npm scripts, and every dangling reference across README, ARCHITECTURE, INSTALL, SETUP, docs/, and the repeated per-file MODULE_GUIDE "Observability" boilerplate comment. The GET /api/metrics endpoint itself is untouched — it's the dashboard's own route, not part of the removed monitoring stack. --- .../update-project-docs/references/doc-map.md | 4 +- ARCHITECTURE.md | 393 +- DEPLOYMENT.md | 1080 ---- DESKTOP.md | 253 - INSTALL.md | 141 +- README.md | 5 +- SETUP.md | 100 +- client/src/App.tsx | 5 - client/src/components/AgentCard.tsx | 5 - client/src/components/AlertsNotifications.tsx | 5 - client/src/components/Checkbox.tsx | 5 - client/src/components/DateTimePicker.tsx | 5 - client/src/components/EmptyState.tsx | 5 - client/src/components/EventDetail.tsx | 5 - client/src/components/EventFilters.tsx | 5 - client/src/components/EventFiltersInfo.tsx | 5 - client/src/components/FieldHelp.tsx | 5 - client/src/components/ImportHistory.tsx | 5 - client/src/components/Layout.tsx | 5 - client/src/components/RemoteSources.tsx | 5 - client/src/components/Select.tsx | 5 - client/src/components/SessionCard.tsx | 5 - client/src/components/SessionOverview.tsx | 5 - client/src/components/Sidebar.tsx | 5 - client/src/components/Skeleton.tsx | 5 - client/src/components/SplashScreen.tsx | 5 - client/src/components/StatCard.tsx | 5 - client/src/components/StatusBadge.tsx | 5 - client/src/components/Tabby/CatAvatar.tsx | 5 - client/src/components/Tabby/SpeechBubble.tsx | 5 - client/src/components/Tabby/Tabby.tsx | 5 - client/src/components/Tabby/TabbyPanel.tsx | 5 - client/src/components/Tabby/brain.ts | 5 - client/src/components/Tabby/intents.ts | 5 - client/src/components/Tabby/prefs.ts | 5 - client/src/components/Tabby/quips.ts | 5 - client/src/components/Tabby/useTabbyBrain.ts | 5 - .../src/components/Tabby/useTabbyPosition.ts | 5 - client/src/components/Tip.tsx | 5 - client/src/components/UpdateNotifier.tsx | 5 - client/src/components/WebhookSettings.tsx | 5 - .../src/components/conversation/CodeBlock.tsx | 5 - .../conversation/ConversationView.tsx | 5 - .../conversation/MarkdownContent.tsx | 5 - .../components/conversation/MessageList.tsx | 5 - .../components/conversation/ToolCallBlock.tsx | 5 - .../src/components/conversation/toolStyle.ts | 5 - .../components/conversation/tuiSegments.ts | 5 - .../src/components/event-views/primitives.tsx | 5 - .../src/components/event-views/tool-views.tsx | 5 - client/src/components/webhookGuides.ts | 5 - .../workflows/AgentCollaborationNetwork.tsx | 5 - .../components/workflows/CompactionImpact.tsx | 5 - .../workflows/ConcurrencyTimeline.tsx | 5 - .../workflows/ErrorPropagationMap.tsx | 5 - .../workflows/ModelDelegationFlow.tsx | 5 - .../components/workflows/OrchestrationDAG.tsx | 5 - .../workflows/SessionComplexityScatter.tsx | 5 - .../components/workflows/SessionDrillIn.tsx | 5 - .../workflows/SubagentEffectiveness.tsx | 5 - .../workflows/ToolExecutionFlow.tsx | 5 - .../components/workflows/WorkflowPatterns.tsx | 5 - .../workflows/WorkflowRunsPanel.tsx | 5 - .../components/workflows/WorkflowStats.tsx | 5 - client/src/hooks/useNotifications.ts | 5 - client/src/hooks/useWebSocket.ts | 5 - client/src/i18n/index.ts | 5 - client/src/lib/api.ts | 5 - client/src/lib/dataScope.ts | 5 - client/src/lib/event-grouping.ts | 5 - client/src/lib/event-summary.ts | 5 - client/src/lib/eventBus.ts | 5 - client/src/lib/format.ts | 5 - client/src/lib/highlight.ts | 5 - client/src/lib/push.ts | 5 - client/src/lib/types.ts | 5 - client/src/main.tsx | 5 - client/src/pages/ActivityFeed.tsx | 5 - client/src/pages/Analytics.tsx | 5 - client/src/pages/CcConfig.tsx | 5 - client/src/pages/Dashboard.tsx | 5 - client/src/pages/KanbanBoard.tsx | 5 - client/src/pages/NotFound.tsx | 5 - client/src/pages/SessionDetail.tsx | 5 - client/src/pages/Sessions.tsx | 5 - client/src/pages/Settings.tsx | 5 - client/src/pages/Workflows.tsx | 5 - deployments/README.md | 559 -- deployments/ci/github-actions/ci.yaml | 250 - deployments/ci/github-actions/deploy.yaml | 335 -- deployments/ci/github-actions/rollback.yaml | 160 - deployments/ci/gitlab-ci/.gitlab-ci.yml | 323 - deployments/helm/agent-monitor/.helmignore | 18 - deployments/helm/agent-monitor/Chart.yaml | 28 - .../helm/agent-monitor/templates/NOTES.txt | 79 - .../helm/agent-monitor/templates/_helpers.tpl | 88 - .../agent-monitor/templates/configmap.yaml | 13 - .../agent-monitor/templates/deployment.yaml | 159 - .../helm/agent-monitor/templates/hpa.yaml | 53 - .../helm/agent-monitor/templates/ingress.yaml | 41 - .../templates/networkpolicy.yaml | 46 - .../helm/agent-monitor/templates/pdb.yaml | 18 - .../helm/agent-monitor/templates/pvc.yaml | 23 - .../helm/agent-monitor/templates/service.yaml | 33 - .../templates/serviceaccount.yaml | 13 - .../templates/servicemonitor.yaml | 29 - .../templates/tests/test-connection.yaml | 34 - .../helm/agent-monitor/values-dev.yaml | 50 - .../helm/agent-monitor/values-production.yaml | 117 - .../helm/agent-monitor/values-staging.yaml | 65 - deployments/helm/agent-monitor/values.yaml | 312 - deployments/kubernetes/README.md | 58 - deployments/kubernetes/base/configmap.yaml | 15 - deployments/kubernetes/base/deployment.yaml | 147 - deployments/kubernetes/base/hpa.yaml | 49 - deployments/kubernetes/base/ingress.yaml | 51 - .../kubernetes/base/kustomization.yaml | 23 - deployments/kubernetes/base/namespace.yaml | 17 - .../kubernetes/base/networkpolicy.yaml | 53 - deployments/kubernetes/base/pdb.yaml | 17 - deployments/kubernetes/base/pvc.yaml | 17 - deployments/kubernetes/base/service.yaml | 29 - .../kubernetes/base/serviceaccount.yaml | 12 - .../mcp-sidecar/deployment-patch.yaml | 69 - .../components/mcp-sidecar/kustomization.yaml | 11 - .../components/monitoring/kustomization.yaml | 8 - .../components/monitoring/servicemonitor.yaml | 31 - .../overlays/dev/kustomization.yaml | 36 - .../dev/patches/deployment-patch.yaml | 22 - .../overlays/production/kustomization.yaml | 26 - .../production/patches/deployment-patch.yaml | 42 - .../production/patches/hpa-patch.yaml | 26 - .../overlays/staging/kustomization.yaml | 25 - .../staging/patches/deployment-patch.yaml | 18 - .../blue-green/deployment-blue.yaml | 136 - .../blue-green/deployment-green.yaml | 136 - .../strategies/blue-green/service-switch.yaml | 32 - .../strategies/canary/canary-analysis.yaml | 97 - .../strategies/canary/canary-deployment.yaml | 124 - .../monitoring/alertmanager/alertmanager.yaml | 241 - deployments/monitoring/coralogix/README.md | 140 - deployments/monitoring/coralogix/alerts.yaml | 194 - .../coralogix/coralogix-terraform.tf | 353 -- .../monitoring/coralogix/dashboards.yaml | 245 - deployments/monitoring/coralogix/values.yaml | 180 - .../grafana/dashboards/agent-monitor.json | 707 --- .../monitoring/grafana/datasources.yaml | 51 - .../monitoring/prometheus/prometheus.yaml | 226 - .../prometheus/rules/agent-monitor.rules.yaml | 310 - deployments/scripts/blue-green-switch.sh | 294 - deployments/scripts/db-backup.sh | 298 - deployments/scripts/db-restore.sh | 396 -- deployments/scripts/deploy.sh | 572 -- deployments/scripts/health-check.sh | 342 -- deployments/scripts/rollback.sh | 221 - deployments/scripts/teardown.sh | 335 -- deployments/terraform/README.md | 88 - deployments/terraform/backend.tf | 47 - .../environments/dev/terraform.tfvars | 67 - .../environments/production/terraform.tfvars | 80 - .../environments/staging/terraform.tfvars | 70 - deployments/terraform/main.tf | 185 - deployments/terraform/modules/compute/main.tf | 396 -- .../terraform/modules/compute/outputs.tf | 53 - .../terraform/modules/compute/variables.tf | 146 - .../terraform/modules/database/main.tf | 142 - .../terraform/modules/database/outputs.tf | 38 - .../terraform/modules/database/variables.tf | 60 - .../terraform/modules/loadbalancer/main.tf | 247 - .../terraform/modules/loadbalancer/outputs.tf | 43 - .../modules/loadbalancer/variables.tf | 134 - .../terraform/modules/monitoring/main.tf | 312 - .../terraform/modules/monitoring/outputs.tf | 40 - .../terraform/modules/monitoring/variables.tf | 66 - .../terraform/modules/networking/main.tf | 279 - .../terraform/modules/networking/outputs.tf | 53 - .../terraform/modules/networking/variables.tf | 69 - deployments/terraform/outputs.tf | 53 - deployments/terraform/providers/aws/main.tf | 264 - .../terraform/providers/aws/outputs.tf | 58 - .../terraform/providers/aws/terraform.tf | 14 - .../terraform/providers/aws/variables.tf | 254 - deployments/terraform/providers/azure/main.tf | 615 -- .../terraform/providers/azure/outputs.tf | 58 - .../terraform/providers/azure/terraform.tf | 14 - .../terraform/providers/azure/variables.tf | 190 - deployments/terraform/providers/gcp/main.tf | 678 --- .../terraform/providers/gcp/outputs.tf | 53 - .../terraform/providers/gcp/terraform.tf | 18 - .../terraform/providers/gcp/variables.tf | 201 - deployments/terraform/providers/oci/main.tf | 602 -- .../terraform/providers/oci/outputs.tf | 53 - .../terraform/providers/oci/terraform.tf | 14 - .../terraform/providers/oci/variables.tf | 186 - deployments/terraform/variables.tf | 280 - deployments/terraform/versions.tf | 26 - desktop/.gitignore | 10 - desktop/README.md | 833 --- desktop/assets/icon.icns | Bin 1020994 -> 0 bytes desktop/assets/icon.ico | Bin 372526 -> 0 bytes desktop/assets/icon.png | Bin 662784 -> 0 bytes desktop/assets/icon.svg | 34 - desktop/assets/tray-icon-Template.png | Bin 95 -> 0 bytes desktop/assets/tray-icon-Template@2x.png | Bin 124 -> 0 bytes desktop/assets/tray-icon.svg | 19 - desktop/electron-builder.yml | 167 - desktop/package-lock.json | 5176 ----------------- desktop/package.json | 40 - desktop/scripts/build-icons.sh | 91 - desktop/scripts/build-win-icon.ps1 | 121 - desktop/scripts/install.js | 40 - desktop/scripts/notarize.js | 48 - desktop/scripts/prebuild.js | 100 - desktop/scripts/preflight.js | 82 - desktop/src/constants.ts | 126 - desktop/src/logger.ts | 125 - desktop/src/login-item.ts | 163 - desktop/src/main.ts | 377 -- desktop/src/menu.ts | 258 - desktop/src/preload.ts | 45 - desktop/src/server-host.ts | 556 -- desktop/src/shell-path.ts | 152 - desktop/src/tray.ts | 242 - desktop/src/window.ts | 219 - desktop/tests/smoke.test.mjs | 150 - desktop/tsconfig.json | 23 - docker-compose.full.yml | 92 - docker-compose.yml | 4 +- docs/API.md | 2 - docs/README.md | 56 - mcp/build/.srchash | 2 +- mcp/build/clients/dashboard-api-client.js | 5 - mcp/build/config/app-config.js | 5 - mcp/build/core/logger.js | 5 - mcp/build/core/tool-registry.js | 5 - mcp/build/core/tool-result.js | 5 - mcp/build/index.js | 5 - mcp/build/policy/tool-guards.js | 5 - mcp/build/server.js | 5 - mcp/build/tools/domains/agent-tools.js | 5 - mcp/build/tools/domains/event-tools.js | 5 - mcp/build/tools/domains/maintenance-tools.js | 5 - .../tools/domains/observability-tools.js | 5 - mcp/build/tools/domains/pricing-tools.js | 5 - mcp/build/tools/domains/session-tools.js | 5 - mcp/build/tools/index.js | 5 - mcp/build/tools/schemas.js | 5 - mcp/build/transports/http-server.js | 5 - mcp/build/transports/repl.js | 5 - mcp/build/transports/tool-collector.js | 5 - mcp/build/types/tool-context.js | 5 - mcp/build/ui/banner.js | 5 - mcp/build/ui/colors.js | 5 - mcp/build/ui/formatter.js | 5 - mcp/src/clients/dashboard-api-client.ts | 5 - mcp/src/config/app-config.ts | 5 - mcp/src/core/logger.ts | 5 - mcp/src/core/tool-registry.ts | 5 - mcp/src/core/tool-result.ts | 5 - mcp/src/index.ts | 5 - mcp/src/policy/tool-guards.ts | 5 - mcp/src/server.ts | 5 - mcp/src/tools/domains/agent-tools.ts | 5 - mcp/src/tools/domains/event-tools.ts | 5 - mcp/src/tools/domains/maintenance-tools.ts | 5 - mcp/src/tools/domains/observability-tools.ts | 5 - mcp/src/tools/domains/pricing-tools.ts | 5 - mcp/src/tools/domains/session-tools.ts | 5 - mcp/src/tools/index.ts | 5 - mcp/src/tools/schemas.ts | 5 - mcp/src/transports/http-server.ts | 5 - mcp/src/transports/repl.ts | 5 - mcp/src/transports/tool-collector.ts | 5 - mcp/src/types/tool-context.ts | 5 - mcp/src/ui/banner.ts | 5 - mcp/src/ui/colors.ts | 5 - mcp/src/ui/formatter.ts | 5 - monitoring/.gitignore | 4 - monitoring/README.md | 272 - monitoring/docker-compose.yml | 48 - monitoring/grafana.defaults.env | 6 - .../grafana/dashboards/ccam-overview.json | 855 --- .../grafana/dashboards/ccam-platform.json | 401 -- .../dashboards/ccam-sessions-agents.json | 371 -- .../dashboards/ccam-tokens-events.json | 350 -- .../dashboards/provider.yml | 15 - .../datasources/datasource.yml | 12 - .../provisioning/dashboards/provider.yml | 14 - .../provisioning/datasources/datasource.yml | 12 - monitoring/package.json | 20 - monitoring/prometheus/ccam-rules.yml | 21 - monitoring/prometheus/consoles/index.html | 294 - monitoring/prometheus/prometheus-docker.yml | 19 - monitoring/prometheus/prometheus-native.yml | 26 - monitoring/prometheus/prometheus.yml | 29 - monitoring/scripts/ensure-binaries.js | 101 - monitoring/scripts/install-utils.js | 88 - monitoring/scripts/lib.js | 158 - monitoring/scripts/paths.js | 212 - monitoring/scripts/start.js | 154 - monitoring/scripts/stop.js | 15 - monitoring/scripts/verify.js | 199 - package.json | 22 +- scripts/import-history.js | 21 +- server/README.md | 2 +- server/__tests__/monitoring-paths.test.js | 53 - server/routes/metrics.js | 3 +- 307 files changed, 23 insertions(+), 31257 deletions(-) delete mode 100644 DEPLOYMENT.md delete mode 100644 DESKTOP.md delete mode 100644 deployments/README.md delete mode 100644 deployments/ci/github-actions/ci.yaml delete mode 100644 deployments/ci/github-actions/deploy.yaml delete mode 100644 deployments/ci/github-actions/rollback.yaml delete mode 100644 deployments/ci/gitlab-ci/.gitlab-ci.yml delete mode 100644 deployments/helm/agent-monitor/.helmignore delete mode 100644 deployments/helm/agent-monitor/Chart.yaml delete mode 100644 deployments/helm/agent-monitor/templates/NOTES.txt delete mode 100644 deployments/helm/agent-monitor/templates/_helpers.tpl delete mode 100644 deployments/helm/agent-monitor/templates/configmap.yaml delete mode 100644 deployments/helm/agent-monitor/templates/deployment.yaml delete mode 100644 deployments/helm/agent-monitor/templates/hpa.yaml delete mode 100644 deployments/helm/agent-monitor/templates/ingress.yaml delete mode 100644 deployments/helm/agent-monitor/templates/networkpolicy.yaml delete mode 100644 deployments/helm/agent-monitor/templates/pdb.yaml delete mode 100644 deployments/helm/agent-monitor/templates/pvc.yaml delete mode 100644 deployments/helm/agent-monitor/templates/service.yaml delete mode 100644 deployments/helm/agent-monitor/templates/serviceaccount.yaml delete mode 100644 deployments/helm/agent-monitor/templates/servicemonitor.yaml delete mode 100644 deployments/helm/agent-monitor/templates/tests/test-connection.yaml delete mode 100644 deployments/helm/agent-monitor/values-dev.yaml delete mode 100644 deployments/helm/agent-monitor/values-production.yaml delete mode 100644 deployments/helm/agent-monitor/values-staging.yaml delete mode 100644 deployments/helm/agent-monitor/values.yaml delete mode 100644 deployments/kubernetes/README.md delete mode 100644 deployments/kubernetes/base/configmap.yaml delete mode 100644 deployments/kubernetes/base/deployment.yaml delete mode 100644 deployments/kubernetes/base/hpa.yaml delete mode 100644 deployments/kubernetes/base/ingress.yaml delete mode 100644 deployments/kubernetes/base/kustomization.yaml delete mode 100644 deployments/kubernetes/base/namespace.yaml delete mode 100644 deployments/kubernetes/base/networkpolicy.yaml delete mode 100644 deployments/kubernetes/base/pdb.yaml delete mode 100644 deployments/kubernetes/base/pvc.yaml delete mode 100644 deployments/kubernetes/base/service.yaml delete mode 100644 deployments/kubernetes/base/serviceaccount.yaml delete mode 100644 deployments/kubernetes/components/mcp-sidecar/deployment-patch.yaml delete mode 100644 deployments/kubernetes/components/mcp-sidecar/kustomization.yaml delete mode 100644 deployments/kubernetes/components/monitoring/kustomization.yaml delete mode 100644 deployments/kubernetes/components/monitoring/servicemonitor.yaml delete mode 100644 deployments/kubernetes/overlays/dev/kustomization.yaml delete mode 100644 deployments/kubernetes/overlays/dev/patches/deployment-patch.yaml delete mode 100644 deployments/kubernetes/overlays/production/kustomization.yaml delete mode 100644 deployments/kubernetes/overlays/production/patches/deployment-patch.yaml delete mode 100644 deployments/kubernetes/overlays/production/patches/hpa-patch.yaml delete mode 100644 deployments/kubernetes/overlays/staging/kustomization.yaml delete mode 100644 deployments/kubernetes/overlays/staging/patches/deployment-patch.yaml delete mode 100644 deployments/kubernetes/strategies/blue-green/deployment-blue.yaml delete mode 100644 deployments/kubernetes/strategies/blue-green/deployment-green.yaml delete mode 100644 deployments/kubernetes/strategies/blue-green/service-switch.yaml delete mode 100644 deployments/kubernetes/strategies/canary/canary-analysis.yaml delete mode 100644 deployments/kubernetes/strategies/canary/canary-deployment.yaml delete mode 100644 deployments/monitoring/alertmanager/alertmanager.yaml delete mode 100644 deployments/monitoring/coralogix/README.md delete mode 100644 deployments/monitoring/coralogix/alerts.yaml delete mode 100644 deployments/monitoring/coralogix/coralogix-terraform.tf delete mode 100644 deployments/monitoring/coralogix/dashboards.yaml delete mode 100644 deployments/monitoring/coralogix/values.yaml delete mode 100644 deployments/monitoring/grafana/dashboards/agent-monitor.json delete mode 100644 deployments/monitoring/grafana/datasources.yaml delete mode 100644 deployments/monitoring/prometheus/prometheus.yaml delete mode 100644 deployments/monitoring/prometheus/rules/agent-monitor.rules.yaml delete mode 100755 deployments/scripts/blue-green-switch.sh delete mode 100755 deployments/scripts/db-backup.sh delete mode 100755 deployments/scripts/db-restore.sh delete mode 100755 deployments/scripts/deploy.sh delete mode 100755 deployments/scripts/health-check.sh delete mode 100755 deployments/scripts/rollback.sh delete mode 100755 deployments/scripts/teardown.sh delete mode 100644 deployments/terraform/README.md delete mode 100644 deployments/terraform/backend.tf delete mode 100644 deployments/terraform/environments/dev/terraform.tfvars delete mode 100644 deployments/terraform/environments/production/terraform.tfvars delete mode 100644 deployments/terraform/environments/staging/terraform.tfvars delete mode 100644 deployments/terraform/main.tf delete mode 100644 deployments/terraform/modules/compute/main.tf delete mode 100644 deployments/terraform/modules/compute/outputs.tf delete mode 100644 deployments/terraform/modules/compute/variables.tf delete mode 100644 deployments/terraform/modules/database/main.tf delete mode 100644 deployments/terraform/modules/database/outputs.tf delete mode 100644 deployments/terraform/modules/database/variables.tf delete mode 100644 deployments/terraform/modules/loadbalancer/main.tf delete mode 100644 deployments/terraform/modules/loadbalancer/outputs.tf delete mode 100644 deployments/terraform/modules/loadbalancer/variables.tf delete mode 100644 deployments/terraform/modules/monitoring/main.tf delete mode 100644 deployments/terraform/modules/monitoring/outputs.tf delete mode 100644 deployments/terraform/modules/monitoring/variables.tf delete mode 100644 deployments/terraform/modules/networking/main.tf delete mode 100644 deployments/terraform/modules/networking/outputs.tf delete mode 100644 deployments/terraform/modules/networking/variables.tf delete mode 100644 deployments/terraform/outputs.tf delete mode 100644 deployments/terraform/providers/aws/main.tf delete mode 100644 deployments/terraform/providers/aws/outputs.tf delete mode 100644 deployments/terraform/providers/aws/terraform.tf delete mode 100644 deployments/terraform/providers/aws/variables.tf delete mode 100644 deployments/terraform/providers/azure/main.tf delete mode 100644 deployments/terraform/providers/azure/outputs.tf delete mode 100644 deployments/terraform/providers/azure/terraform.tf delete mode 100644 deployments/terraform/providers/azure/variables.tf delete mode 100644 deployments/terraform/providers/gcp/main.tf delete mode 100644 deployments/terraform/providers/gcp/outputs.tf delete mode 100644 deployments/terraform/providers/gcp/terraform.tf delete mode 100644 deployments/terraform/providers/gcp/variables.tf delete mode 100644 deployments/terraform/providers/oci/main.tf delete mode 100644 deployments/terraform/providers/oci/outputs.tf delete mode 100644 deployments/terraform/providers/oci/terraform.tf delete mode 100644 deployments/terraform/providers/oci/variables.tf delete mode 100644 deployments/terraform/variables.tf delete mode 100644 deployments/terraform/versions.tf delete mode 100644 desktop/.gitignore delete mode 100644 desktop/README.md delete mode 100644 desktop/assets/icon.icns delete mode 100644 desktop/assets/icon.ico delete mode 100644 desktop/assets/icon.png delete mode 100644 desktop/assets/icon.svg delete mode 100644 desktop/assets/tray-icon-Template.png delete mode 100644 desktop/assets/tray-icon-Template@2x.png delete mode 100644 desktop/assets/tray-icon.svg delete mode 100644 desktop/electron-builder.yml delete mode 100644 desktop/package-lock.json delete mode 100644 desktop/package.json delete mode 100755 desktop/scripts/build-icons.sh delete mode 100644 desktop/scripts/build-win-icon.ps1 delete mode 100644 desktop/scripts/install.js delete mode 100755 desktop/scripts/notarize.js delete mode 100755 desktop/scripts/prebuild.js delete mode 100644 desktop/scripts/preflight.js delete mode 100644 desktop/src/constants.ts delete mode 100644 desktop/src/logger.ts delete mode 100644 desktop/src/login-item.ts delete mode 100644 desktop/src/main.ts delete mode 100644 desktop/src/menu.ts delete mode 100644 desktop/src/preload.ts delete mode 100644 desktop/src/server-host.ts delete mode 100644 desktop/src/shell-path.ts delete mode 100644 desktop/src/tray.ts delete mode 100644 desktop/src/window.ts delete mode 100644 desktop/tests/smoke.test.mjs delete mode 100644 desktop/tsconfig.json delete mode 100644 docker-compose.full.yml delete mode 100644 monitoring/.gitignore delete mode 100644 monitoring/README.md delete mode 100644 monitoring/docker-compose.yml delete mode 100644 monitoring/grafana.defaults.env delete mode 100644 monitoring/grafana/dashboards/ccam-overview.json delete mode 100644 monitoring/grafana/dashboards/ccam-platform.json delete mode 100644 monitoring/grafana/dashboards/ccam-sessions-agents.json delete mode 100644 monitoring/grafana/dashboards/ccam-tokens-events.json delete mode 100644 monitoring/grafana/provisioning-native/dashboards/provider.yml delete mode 100644 monitoring/grafana/provisioning-native/datasources/datasource.yml delete mode 100644 monitoring/grafana/provisioning/dashboards/provider.yml delete mode 100644 monitoring/grafana/provisioning/datasources/datasource.yml delete mode 100644 monitoring/package.json delete mode 100644 monitoring/prometheus/ccam-rules.yml delete mode 100644 monitoring/prometheus/consoles/index.html delete mode 100644 monitoring/prometheus/prometheus-docker.yml delete mode 100644 monitoring/prometheus/prometheus-native.yml delete mode 100644 monitoring/prometheus/prometheus.yml delete mode 100644 monitoring/scripts/ensure-binaries.js delete mode 100644 monitoring/scripts/install-utils.js delete mode 100644 monitoring/scripts/lib.js delete mode 100644 monitoring/scripts/paths.js delete mode 100644 monitoring/scripts/start.js delete mode 100644 monitoring/scripts/stop.js delete mode 100644 monitoring/scripts/verify.js delete mode 100644 server/__tests__/monitoring-paths.test.js diff --git a/.claude/skills/update-project-docs/references/doc-map.md b/.claude/skills/update-project-docs/references/doc-map.md index 16ad250..f49da6f 100644 --- a/.claude/skills/update-project-docs/references/doc-map.md +++ b/.claude/skills/update-project-docs/references/doc-map.md @@ -52,10 +52,10 @@ i18n architecture: **Supported languages** list, `supportedLngs`, the 15 namespa ## Tier 3 — situational - `.env.example` — every env var belongs here with a sane default + comment. -- `INSTALL.md`, `SETUP.md`, `DEPLOYMENT.md`, `docs/DEPLOYMENT.md` — install/run/deploy commands. +- `INSTALL.md`, `SETUP.md` — install/run commands. - `CLAUDE.md`, `AGENTS.md` — agent working guides; update when commands, file locations, or workflows change. - `docs/README.md` — docs index; add a link when a new `docs/*.md` is created. -- `desktop/README.md`, `vscode-extension/README.md`, `statusline/README.md` — surface-specific; update only when that surface changes. +- `vscode-extension/README.md`, `statusline/README.md` — surface-specific; update only when that surface changes. ## Consistency invariants diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 1529309..4b92890 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -35,35 +35,13 @@ Architectural overview and technical reference for the Agent Dashboard system, c ![OpenAPI](https://img.shields.io/badge/OpenAPI-3.0-000000?style=flat-square&logo=openapiinitiative&logoColor=white) ![Swagger](https://img.shields.io/badge/Swagger-3.0-85EA2D?style=flat-square&logo=swagger&logoColor=white) ![VS Code](https://img.shields.io/badge/VS_Code-Extension-007ACC?style=flat-square&logo=vscodium&logoColor=white) -![Electron](https://img.shields.io/badge/Electron-35-47848F?style=flat-square&logo=electron&logoColor=white) -![electron-builder](https://img.shields.io/badge/electron--builder-25.1-2c2e3b?style=flat-square&logo=electron&logoColor=white) -![macOS](https://img.shields.io/badge/macOS-Desktop_App-000000?style=flat-square&logo=apple&logoColor=white) -![Windows](https://img.shields.io/badge/Windows-Desktop_App-0078D6?style=flat-square&logo=windows&logoColor=white) -![SMAppService](https://img.shields.io/badge/SMAppService-Login_Items-000000?style=flat-square&logo=apple&logoColor=white) -![macOS DMG](https://img.shields.io/badge/macOS_DMG-arm64_%2B_x64-7c3aed?style=flat-square&logo=apple&logoColor=white) ![Vitest](https://img.shields.io/badge/Vitest-1.0-646CFF?style=flat-square&logo=vitest&logoColor=white) ![React Testing Library](https://img.shields.io/badge/React_Testing_Library-13.0-FF5733?style=flat-square&logo=testinglibrary&logoColor=white) ![ESLint](https://img.shields.io/badge/ESLint-8.44-4B32C3?style=flat-square&logo=eslint&logoColor=white) ![Prettier](https://img.shields.io/badge/Prettier-3.8-F7B93E?style=flat-square&logo=prettier&logoColor=white) ![Docker](https://img.shields.io/badge/Docker-20.10-2496ED?style=flat-square&logo=docker&logoColor=white) ![Podman](https://img.shields.io/badge/Podman-4.0-CC342D?style=flat-square&logo=podman&logoColor=white) -![Terraform](https://img.shields.io/badge/Terraform-%3E%3D1.5-844FBA?style=flat-square&logo=terraform&logoColor=white) -![Kubernetes](https://img.shields.io/badge/Kubernetes-%3E%3D1.24-326CE5?style=flat-square&logo=kubernetes&logoColor=white) -![Helm](https://img.shields.io/badge/Helm-3-0F1689?style=flat-square&logo=helm&logoColor=white) -![Kustomize](https://img.shields.io/badge/Kustomize-5.0-326CE5?style=flat-square&logo=kubernetes&logoColor=white) -![Nginx](https://img.shields.io/badge/Nginx-Ingress-009639?style=flat-square&logo=nginx&logoColor=white) -![Prometheus](https://img.shields.io/badge/Prometheus-2.x-E6522C?style=flat-square&logo=prometheus&logoColor=white) -![Grafana](https://img.shields.io/badge/Grafana-10.x-F46800?style=flat-square&logo=grafana&logoColor=white) -![Coralogix](https://img.shields.io/badge/Coralogix-Observability-1a1a2e?style=flat-square&logo=datadog&logoColor=white) -![OpenTelemetry](https://img.shields.io/badge/OpenTelemetry-Collector-4f46e5?style=flat-square&logo=opentelemetry&logoColor=white) -![AWS](https://img.shields.io/badge/AWS-ECS%20%7C%20RDS-232F3E?style=flat-square&logo=task&logoColor=white) -![Google Cloud](https://img.shields.io/badge/Google_Cloud-GKE%20%7C%20SQL-4285F4?style=flat-square&logo=googlecloud&logoColor=white) -![Azure](https://img.shields.io/badge/Azure-AKS%20%7C%20SQL-0078D4?style=flat-square&logo=cloudflare&logoColor=white) -![Oracle Cloud](https://img.shields.io/badge/Oracle_Cloud-OKE%20%7C%20DB-F80000?style=flat-square&logo=cloudways&logoColor=white) -![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-pipelines-2088FF?style=flat-square&logo=githubactions&logoColor=white) -![GitLab CI](https://img.shields.io/badge/GitLab_CI-pipelines-FC6D26?style=flat-square&logo=gitlab&logoColor=white) ![Make](https://img.shields.io/badge/Make-4.3-000000?style=flat-square&logo=make&logoColor=white) -![Auto Release](https://img.shields.io/badge/CI-auto--release_to_GitHub-22c55e?style=flat-square&logo=githubactions&logoColor=white) --- @@ -87,7 +65,6 @@ Architectural overview and technical reference for the Agent Dashboard system, c - [Update Notifier Subsystem](#update-notifier-subsystem) - [Tabby Companion Subsystem](#tabby-companion-subsystem) - [VS Code Extension Architecture](#vs-code-extension-architecture) -- [Desktop App Architecture (macOS & Windows / Electron)](#desktop-app-architecture-macos--windows--electron) - [Security Considerations](#security-considerations) - [Performance Characteristics](#performance-characteristics) - [Deployment Modes](#deployment-modes) @@ -348,8 +325,7 @@ graph TD | `routes/agents.js` | CRUD with status/session_id filtering. PATCH broadcasts `agent_updated`. Agent-list responses (`GET /api/agents`, `GET /api/sessions/:id/agents`) attach a per-agent `cost` via `pricing.attachAgentCosts` — each subagent's OWN cost, computed from its `metadata.tokens` at current rates (main agents get 0; their cost is the session total), so a subagent card shows only what that subagent spent rather than the session total | | `routes/events.js` | Read-only event listing with session_id filter and pagination | | `routes/stats.js` | Single aggregate query returning total/active counts + status distributions | -| `routes/metrics.js` | Prometheus / OpenMetrics text-exposition endpoint (`GET /api/metrics`) — re-exposes the dashboard's live counters (sessions/agents by status, event + token totals, connected WebSocket clients, configured remote sources, process uptime/RSS, build version) in the v0.0.4 text format for scraping into Prometheus / Grafana. Read-only; reads the same `db.js` prepared statements the REST API uses, so numbers match the UI. Status series are enumerated so a gauge never drops out at zero. Mounted under `/api`, so it sits behind the Host-header (DNS-rebinding) guard and the optional `DASHBOARD_TOKEN` guard — a non-loopback scraper needs `DASHBOARD_ALLOWED_HOSTS` (+ token if set). A turnkey Prometheus + Grafana stack with four auto-provisioned dashboards lives in `monitoring/` (`npm run monitoring:up` or `npm run docker:full:up`) | -| `monitoring/` | Optional npm-managed or Docker Compose Prometheus + Grafana stack that scrapes `GET /api/metrics`. Ships four Grafana dashboards (`ccam-overview`, `ccam-sessions-agents`, `ccam-tokens-events`, `ccam-platform`), recording rules (`prometheus/ccam-rules.yml`), a Prometheus 3.x-compatible static HTML console (`prometheus/consoles/index.html`), and lifecycle scripts (`monitoring:install`, `monitoring:up`, `monitoring:verify`). See [`monitoring/README.md`](./monitoring/README.md) | +| `routes/metrics.js` | Prometheus / OpenMetrics text-exposition endpoint (`GET /api/metrics`) — re-exposes the dashboard's live counters (sessions/agents by status, event + token totals, connected WebSocket clients, configured remote sources, process uptime/RSS, build version) in the v0.0.4 text format for scraping into Prometheus / Grafana. Read-only; reads the same `db.js` prepared statements the REST API uses, so numbers match the UI. Status series are enumerated so a gauge never drops out at zero. Mounted under `/api`, so it sits behind the Host-header (DNS-rebinding) guard and the optional `DASHBOARD_TOKEN` guard — a non-loopback scraper needs `DASHBOARD_ALLOWED_HOSTS` (+ token if set) | | `routes/analytics.js` | Extended analytics — token totals, tool usage counts, daily event/session trends, agent type distribution. The client-side analytics heatmap grid is aligned to a Sunday start for correct day-of-week positioning | | `routes/pricing.js` | Model pricing CRUD (list/upsert/delete) and per-session / global cost calculation with pattern-based model matching. `PUT /api/pricing` upserts a rule and accepts optional time-limited **introductory** rates (`intro_*_per_mtok` + `intro_until`): usage on/before the cutoff date prices at the intro rate, after it at the standard rate — the calculator picks the effective rate per usage day (`ratesForBucket`), so a promo like Sonnet 5's launch discount is correct before AND after the cutoff, retroactively. Intro columns are written only when the caller sends them (a standard-rate edit never disturbs a promo). Cost is computed per token bucket — keyed by (model, speed, inference_geo, service_tier) — applying fast-mode premium, US data-residency (1.1x), and Batch (0.5x) modifiers, the 5m/1h cache-write split, plus server-tool surcharges (web search $10/1k; code execution estimated by container-time with the monthly free-hours allowance; web fetch free). `attachAgentCosts`/`agentOwnCost` reuse the same calculator to price each agent's `metadata.tokens` for the per-agent `cost` on agent-list responses. Feature rates + modifier math live in `lib/pricing-constants.js`; usage normalization in `lib/token-usage.js` | | `routes/settings.js` | System info (DB size, hook status, server uptime, transcript cache stats), data export as one versioned JSON bundle and matching import/restore (`POST /api/settings/import` via `server/lib/data-transfer.js` — idempotent, session-atomic, non-destructive; consolidates machines), session cleanup (abandon stale, purge old), clear all data (including the fired-alert feed and webhook delivery log; alert *rules* and webhook *targets* are preserved as user configuration), reset pricing, reinstall hooks | @@ -2011,7 +1987,7 @@ Cache versioning is controlled by the `CACHE_NAME` constant (`dashboard-v2`). On `client/src/main.tsx` snapshots `navigator.serviceWorker.controller` before registration and listens for `controllerchange`: when a new SW activates on an already-controlled page, it reloads exactly once so the page picks up the new asset URLs without a hard refresh. The first install (no previous controller) does **not** reload. -These behaviors are reinforced by explicit `Cache-Control` headers from the production Express static middleware in `server/index.js`: `immutable, max-age=31536000` for `/assets/*`; `no-cache, must-revalidate` for `index.html`, `sw.js`, and `manifest.json`; a short revalidation window for other static files. The SPA fallback `sendFile` sends the same `no-cache` header. The native desktop shell (macOS and Windows) loads the dashboard from this same in-process server (`NODE_ENV=production`), so it inherits the policy automatically. +These behaviors are reinforced by explicit `Cache-Control` headers from the production Express static middleware in `server/index.js`: `immutable, max-age=31536000` for `/assets/*`; `no-cache, must-revalidate` for `index.html`, `sw.js`, and `manifest.json`; a short revalidation window for other static files. The SPA fallback `sendFile` sends the same `no-cache` header. --- @@ -2308,299 +2284,6 @@ For the extension source code, refer to the [vscode-extension/](./vscode-extensi --- -## Desktop App Architecture (macOS & Windows / Electron) - -The `desktop/` workspace ships the dashboard as a **native desktop app** for **macOS** (`Claude Code Monitor.app`, distributed as a `.dmg`) **and Windows** (`Claude Code Monitor.exe`, distributed as an NSIS installer plus a no-install portable build). It is an Electron shell that **embeds the existing Express server in-process** and renders the already-built React client in a `BrowserWindow`. The desktop app does not reimplement the dashboard -- it `require()`s `server/index.js` directly, in the same Node runtime as the Electron main process, and points a Chromium window at it. - -For the user-facing guide (download, install, Gatekeeper / SmartScreen, tray menu, auto-start), see [DESKTOP.md](./DESKTOP.md). For the full contributor/architecture reference -- including build performance, code signing, notarization, and CI details -- see [desktop/README.md](./desktop/README.md). - -### Workspace Position - -`desktop/` is a **sibling workspace**, not an npm-workspaces conversion. It has its own `package.json`, its own `node_modules`, and its own TypeScript toolchain. It pins **Electron 35** (bundled Node 22.16). It consumes the rest of the repo as plain files and touches no other workspace's runtime behavior. - -```mermaid -flowchart TD - subgraph repo["Claude-Code-Agent-Monitor (repo root)"] - server["server/
Express API · SQLite · WebSocket"] - client["client/
React + Vite SPA"] - scripts["scripts/
hook installer/handler, import, seed"] - mcp["mcp/
local MCP server"] - vscode["vscode-extension/"] - desktop["desktop/
Electron shell (sibling workspace)"] - end - - desktop -->|"require() in-process"| server - desktop -->|"loads built SPA from"| client - desktop -->|"auto-installs hooks via"| scripts - server -->|"serves static"| client - - style desktop fill:#1f6feb,stroke:#1158c7,color:#fff - style server fill:#238636,stroke:#196c2e,color:#fff -``` - -The **only** change outside `desktop/` is a behavior-preserving refactor of `server/index.js` (see [Background Services & Hook Bootstrap](#background-services--hook-bootstrap-1) below). `client/`, `scripts/`, `mcp/`, and `vscode-extension/` are untouched. - -### Process Model - -Electron runs a **main process** (Node.js) and one or more **renderer processes** (Chromium). In this app: - -- The **main process** hosts the embedded Express server _and_ manages the window, tray, and menus. There is **no child process and no IPC** for the server -- it runs inside the main process's own event loop. -- The **renderer** is plain Chromium loading `http://127.0.0.1:` -- exactly the same origin a normal browser would use. `preload.ts` is intentionally empty (`contextIsolation: true`, `nodeIntegration: false`, `webSecurity: true`), so the renderer has **zero privileged surface**. - -```mermaid -flowchart LR - subgraph main["Electron Main Process (Node 22 / Electron 35)"] - boot["main.ts
lifecycle"] - host["server-host.ts
embedded server"] - express["server/index.js
Express + WS + SQLite"] - tray["tray.ts"] - menu["menu.ts"] - host --> express - boot --> host - boot --> tray - boot --> menu - end - - subgraph renderer["Renderer Process (Chromium)"] - win["BrowserWindow
React dashboard"] - preload["preload.ts
(empty -- no bridge)"] - end - - express -->|"http + ws on 127.0.0.1:port"| win - win -.->|loads| preload - - hooks["Claude Code hooks
(separate node processes)"] -->|"POST /api/hooks/event"| express - - style main fill:#0d1117,stroke:#30363d,color:#e6edf3 - style renderer fill:#161b22,stroke:#30363d,color:#e6edf3 -``` - -### In-Process Server Hosting - -`server-host.ts` is the **only file** that imports `server/index.js`. The dashboard server already exports `{ createApp, startServer, startBackgroundServices }` and serves the built React client (`client/dist`) as static assets in production -- so the host imports that module directly, with no child process, no IPC, and no port marshalling. - -| Component | Responsibility | -| --- | --- | -| **`main.ts`** | Main-process entry. Single-instance lock, app menu + tray wiring, dashboard window, `Restart Server`, lifecycle (`window-all-closed`, `before-quit`). | -| **`server-host.ts`** | In-process Express boot: port discovery, adoption, `better-sqlite3` ABI patch, `startBackgroundServices()` + hook bootstrap, clean DB close. Returns a `ServerHandle`. | -| **`window.ts`** | `BrowserWindow` with persisted geometry (`userData/window-state.json`). External links open in the system browser. Sets the window/taskbar `icon` to the colored app logo (`assets/icon.ico` on Windows, `icon.png` elsewhere) so an unpackaged `desktop:dev` run no longer shows the generic Electron icon. | -| **`menu.ts` / `tray.ts`** | Native application menu and menu-bar / notification-area (tray) icon. `tray.ts` selects a platform tray image — a macOS template glyph that the OS tints for the menu bar, or the colored `assets/icon.ico` for the Windows notification area (a black template would vanish on the dark taskbar). Tray uses a single-click dropdown (left or right) with a **live status snapshot** queried straight from SQLite at click time — server port, active sessions, working agents, events today — followed by *Open Dashboard*, *Open in Browser*, *Restart Server*, *Show Logs*, *Open at Login* (toggle), and *Quit*. The menu is rebuilt on each open so every value stays current. Snapshot rows are enabled and click-to-open-dashboard rather than disabled (which the OS dims). The application menu's *File ▸ Open Dashboard* (⌘1) is **macOS-only** — there the global menu bar persists after the window hides; on Windows/Linux the window-attached menu can't reopen a hidden window, so reopening is the tray's job. `focusOrCreateWindow` calls `show()` unconditionally so the tray reliably raises a backgrounded/minimized window (a bare `focus()` on Windows often only flashes the taskbar). | -| **`login-item.ts`** | Auto-start-at-login toggle through Electron's first-party `app.setLoginItemSettings` API on every platform. On macOS it drives the modern `SMAppService` Login Items (not a `LaunchAgent` plist); on Windows it writes a per-user `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` entry. Login launches are tagged with a `--ccam-hidden` arg so the app can stay tray-only at startup — Windows has no `wasOpenedAtLogin` signal, so the arg is the cross-platform detection mechanism. | -| **`shell-path.ts`** | (macOS) Recovers the user's login-shell `PATH` at startup and merges it onto `process.env.PATH`, so the embedded server (and the `claude` CLI it spawns) is not limited to launchd's minimal `PATH`. On Windows the process already inherits the full user `PATH`, so no recovery is needed. | -| **`logger.ts`** | File logger to `~/Library/Logs/Claude Code Monitor/desktop.log` (macOS) or `%APPDATA%\Claude Code Monitor\logs\desktop.log` (Windows) -- the main process has no console when launched from Finder / Explorer. | -| **`constants.ts`** | Shared identifiers, including the `APP_ID` (`com.vn.smartgift.ccam.desktop`) that `main.ts` sets as the Windows AppUserModelId. | - -`server-host.ts` resolves the directory containing the bundled `server/` and `client/dist/` via `resolveAppRoot()`: `process.resourcesPath/app` when packaged, or the repo root (one directory up from `desktop/`) in development. - -The `ServerHandle` returned to `main.ts`: - -```ts -interface ServerHandle { - url: string; // e.g. "http://127.0.0.1:4820" - port: number; - ownedByUs: boolean; // false when an existing server was adopted - stop: () => Promise; -} -``` - -### Port Discovery & Adoption - -On startup `server-host.ts` picks a port, then either adopts an already-healthy server or boots its own. **Adoption** -- `probePort()` connects to `:4820`, then checks that the listener answers `GET /api/health` with `{ status: "ok" }`. If a healthy dashboard server is already running there (e.g. the user ran `npm start` in a terminal), the desktop app **adopts** it rather than double-binding -- no SQLite contention. An adopted server is not owned by the app, so quitting the app leaves it running. - -```mermaid -flowchart TD - start["startEmbeddedServer()"] --> forced{"CCAM_DESKTOP_BIND_PORT set?"} - forced -->|yes| bind["bind exactly that port
(no adoption, no fallback)"] - forced -->|no| adopt{"healthy server
already on :4820?"} - adopt -->|yes| reuse["adopt it
ownedByUs = false"] - adopt -->|no| pick["pickFreePort()"] - - pick --> p1{":4820 free?"} - p1 -->|yes| use4820["use 4820"] - p1 -->|no| p2{"any of
:4821–:4829 free?"} - p2 -->|yes| usefb["use that"] - p2 -->|no| p3{"any of
:49152–:49500 free?"} - p3 -->|yes| userand["use that"] - p3 -->|no| fail["throw — no free port"] - - bind --> bootsrv["createApp() + startServer()"] - use4820 --> bootsrv - usefb --> bootsrv - userand --> bootsrv - bootsrv --> healthy["waitForHealthy()
poll /api/health ≤ 30s"] - healthy --> bg["bootstrapOwnedServer()"] - bg --> handle["ServerHandle ownedByUs = true"] - reuse --> handleR["ServerHandle ownedByUs = false"] - - style reuse fill:#9e6a03,stroke:#7d5300,color:#fff - style fail fill:#da3633,stroke:#b62324,color:#fff -``` - -Port preference order is **4820 → 4821–4829 → a random port in 49152–49500**. Two environment overrides exist primarily for testing: `CCAM_DESKTOP_BIND_PORT` binds an exact port (disabling adoption and fallback, used by the smoke test), and `CCAM_DESKTOP_NO_ADOPT=1` always starts a fresh server. Before `require()`ing the server module, the host sets `NODE_ENV=production`, `DASHBOARD_PORT=`, and `DASHBOARD_DATA_DIR=/data` (see [Writable Data Directory](#writable-data-directory) below) so the server reads them from `process.env`. - -### Writable Data Directory - -A packaged install directory is **read-only** in practice: on macOS a `.app` bundle installed under `/Applications`, code-signed, or run through **app translocation** cannot write to `Resources/app/`, and on Windows the NSIS install dir under `%ProgramFiles%` (or the read-only mount a portable build runs from) is no place for mutable state. The dashboard's SQLite database and the VAPID keypair (`server/lib/push.js`) are writable state, so they must not live inside the bundle / install dir. Before booting the embedded server, `server-host.ts` creates `app.getPath('userData')/data` and points the server at it via the `DASHBOARD_DATA_DIR` environment variable: - -- `server/db.js` honors `DASHBOARD_DATA_DIR` for the SQLite file. -- `server/lib/push.js` honors it for the persisted VAPID keys. - -The resulting per-user location is `~/Library/Application Support/Claude Code Monitor/data/` on macOS and `%APPDATA%\Claude Code Monitor\data\` on Windows. Because this lives outside the bundle / install dir, imported history and persisted events **survive an app reinstall or update** (the Windows NSIS uninstaller keeps this data by default). Without this, writing a database into the read-only install location failed on a packaged build and broke History Import and event persistence. - -The standalone `node server/index.js` path is **unaffected**: `DASHBOARD_DATA_DIR` is unset there, and `server-host.ts` only sets it when it is not already defined -- so `server/db.js` falls back to its usual repo-relative default. - -### Shell `PATH` Recovery (macOS) - -This step is **macOS-only**. A macOS app launched from Finder, the Dock, or Login Items auto-start is spawned by `launchd`, which hands it a **minimal `PATH`** (roughly `/usr/bin:/bin:/usr/sbin:/sbin`) and does **not** source the user's shell profile. The dashboard's "Run Claude" feature (`server/routes/run.js`, `server/lib/run-spawner.js`) spawns the `claude` CLI, which is almost always installed somewhere only the shell `PATH` knows about (`/opt/homebrew/bin`, `~/.local/bin`, `~/.claude/local`, a Node version-manager's bin dir). Under launchd's `PATH`, `claude` cannot be resolved or spawned. - -`shell-path.ts` repairs this **before the server boots**: at startup it runs the user's login+interactive shell once (`$SHELL -ilc`, so `.zprofile`/`.zshrc` are sourced), captures the resulting `PATH` between sentinel markers, and merges it -- plus a fallback list of common CLI install directories -- onto `process.env.PATH`. The merge is order-preserving and deduplicated, so it is idempotent. Because the embedded server runs in the same process, it and every `claude` it spawns inherit the corrected `PATH`. (A `claude` shell _alias_ or _function_ still cannot be spawned -- only a real executable on the `PATH` can.) - -On **Windows** there is no equivalent step: a process launched from Explorer, the Start menu, or the `HKCU\…\Run` startup entry already inherits the full user `PATH`, so the embedded server can resolve `claude` directly. - -### `better-sqlite3` Native-Module Handling - -`better-sqlite3` is the only **native** module in the dependency tree, and a native module must be compiled against the exact Node ABI it runs on. The repo-root copy is built for the **system Node** (so `npm run test:server` works for contributors); Electron ships its **own Node ABI**. - -The desktop workspace solves this without disturbing the root install: the desktop workspace has its own `better-sqlite3`, rebuilt for Electron's Node ABI by `electron-builder install-app-deps` (run in its `postinstall`). `server-host.ts` then installs a one-time, **process-local** patch to `Module._resolveFilename` that redirects `require("better-sqlite3")` -- from anywhere in the embedded server -- to that ABI-correct copy. - -Desktop setup is **guarded** so a missing or unbuilt binary never escapes as a raw node-gyp trace or a runtime crash: `desktop/scripts/preflight.js` (shared by `install.js` and `prebuild.js`) verifies the Electron-ABI binary exists and, when it doesn't, prints actionable, copy-pasteable setup help -- the per-OS C++ toolchain prerequisites (or a no-toolchain alternative that fetches Electron's prebuilt binary directly) -- before exiting non-zero. `desktop:install` runs this on install; the `prebuild` gate enforces it before every `desktop:*` build, turning a would-be runtime failure into a build-time error. - -```mermaid -flowchart TD - subgraph desk["desktop/node_modules"] - d1["better-sqlite3
rebuilt for Electron's ABI
(electron-builder install-app-deps)"] - end - subgraph root["node_modules (repo root)"] - r1["better-sqlite3
built for system Node
(used by npm run test:server)"] - end - - patch["ensureNativeModulesPatched()
overrides Module._resolveFilename"] - srv["server/db.js
require('better-sqlite3')"] - - srv -->|"request intercepted"| patch - patch -->|"redirected to"| d1 - patch -.->|"everything else
passes through"| root - - style d1 fill:#238636,stroke:#196c2e,color:#fff - style patch fill:#1f6feb,stroke:#1158c7,color:#fff -``` - -- The patch is installed exactly once, **before** `server/index.js` is `require()`d, and rewrites _only_ `require("better-sqlite3")` -- every other module resolves normally. -- `electron-builder.yml` therefore **excludes** the root `better-sqlite3` from the bundle (it would trip `@electron/universal`'s identical-file detector) and `asarUnpack`s the desktop copy (native `.node` files cannot live inside an `asar` archive). -- The `compat-sqlite` (`node:sqlite`) fallback remains a safety net -- one reason the desktop app pins **Electron 35**, whose bundled Node 22.16 has `node:sqlite`. - -### Background Services & Hook Bootstrap - -`node server/index.js` runs its production bootstrap from an `if (require.main === module)` block. Because the desktop app **`require()`s** that module, the block never fires -- so the bootstrap was extracted into an exported `startBackgroundServices()` that both paths call. This is a **behavior-preserving refactor** of `server/index.js`: the standalone server path is functionally unchanged. - -```mermaid -flowchart LR - subgraph standalone["node server/index.js"] - s1["require.main === module"] --> s2["startBackgroundServices()"] - end - subgraph desktopapp["desktop app"] - d1["server-host.ts
bootstrapOwnedServer()"] --> d2["startBackgroundServices()"] - d1 --> d3["installHooks()"] - end - - d2 --> svc - s2 --> svc - subgraph svc["Background services"] - u["update scheduler"] - w["cc-watcher (Claude config watcher)"] - r["orphaned-run reconciliation"] - end - - style d1 fill:#1f6feb,stroke:#1158c7,color:#fff -``` - -`bootstrapOwnedServer()` runs **once** -- guarded by a module-level flag so a `Restart Server` does not double-register schedulers or watchers -- and: - -1. Calls `startBackgroundServices()` -- the update scheduler, the `cc-watcher` config watcher, and one-time orphaned-run reconciliation. -2. Calls `installHooks()` -- writes the Claude Code hook configuration to `~/.claude/settings.json`, so an install-only user (DMG on macOS, `.exe` on Windows) gets events flowing without ever running `npm run install-hooks` from a checkout. - -It runs only when the server is **owned** by the app -- an adopted server has already done its own bootstrap. - -### App Lifecycle - -```mermaid -sequenceDiagram - autonumber - participant OS as macOS / Windows - participant Main as main.ts - participant Host as server-host.ts - participant Srv as server/index.js - participant UI as BrowserWindow - - OS->>Main: launch app - Main->>Main: setAppUserModelId (win32) · requestSingleInstanceLock() - alt lock not acquired - Main->>OS: exit(0) — focus existing instance - end - Main->>Host: ensureUserPath() — recover login-shell PATH (macOS only) - Main->>Host: startEmbeddedServer() - Host->>Host: probe :4820 — adopt if a healthy server answers - alt no server to adopt - Host->>Host: pickFreePort() · set DASHBOARD_DATA_DIR · patch better-sqlite3 ABI - Host->>Srv: require() · createApp() · startServer(port) - Host->>Srv: waitForHealthy() — poll /api/health ≤ 30s - Host->>Srv: bootstrapOwnedServer() — schedulers, cc-watcher, install hooks - end - Host-->>Main: ServerHandle { url, port, ownedByUs, stop } - Main->>Main: installApplicationMenu() · createTray() - alt launched at login (--ccam-hidden / wasOpenedAtLogin) - Main->>OS: stay tray-only, hide dock (macOS) - else normal launch - Main->>UI: createDashboardWindow(url) - UI->>Srv: GET http://127.0.0.1:port - end - Note over Main: window "close" → hide (server keeps running) - Note over Main: ⌘Q / Ctrl+Q → confirm (second press bypasses) - Note over Main: before-quit → stop owned server + closeEmbeddedDatabase() -``` - -| Event | Behavior | -| --- | --- | -| **Second launch** | `requestSingleInstanceLock()` (enabled on **every platform**) fails -- the new process exits and the existing window is focused. | -| **Window close** | Intercepted -- the window **hides** (`hide()`); the server and tray keep running. | -| **`window-all-closed`** | App stays alive in tray-only mode (the handler is intentionally a no-op). | -| **Launched at login** | The dashboard window is **not** shown -- only the tray icon. Detected via macOS `wasOpenedAtLogin` (dock hidden, `openAsHidden`) or, on Windows, the `--ccam-hidden` arg written into the `HKCU\…\Run` startup command. | -| **Quit shortcut** | ⌘Q (macOS) / Ctrl+Q (Windows) shows a confirmation dialog; a second press bypasses it. | -| **`before-quit`** | If the server is owned: stop the HTTP server, then `closeEmbeddedDatabase()` for a clean WAL checkpoint, then `app.exit(0)`. The DB handle is closed here -- never on `Restart Server`, where the cached `server/db.js` singleton must stay usable. | - -### Packaged App Layout - -`electron-builder` produces `Claude Code Monitor.app` on macOS and `Claude Code Monitor.exe` (NSIS installer + portable) on Windows. On both platforms the Electron main-process code is compiled (`tsc` → `out/`) and packed into `app.asar`; the rest of the repo is shipped as **`extraResources`** -- plain files under the bundle's `Resources/app/` (macOS) or the install dir's `resources\app\` (Windows). The internal layout is the same shape on both: - -```mermaid -flowchart TD - appbundle["Claude Code Monitor.app (macOS)
Claude Code Monitor install dir (Windows)"] - appbundle --> contents["Contents/ (macOS)
install root (Windows)"] - contents --> macos["MacOS/ — Electron binary (macOS)
Claude Code Monitor.exe (Windows)"] - contents --> res["Resources/ (macOS)
resources\ (Windows)"] - res --> asar["app.asar
(compiled out/**, package.json)"] - res --> unpacked["app.asar.unpacked/
node_modules/better-sqlite3 (.node)"] - res --> appdir["app/"] - appdir --> a1["server/ — Express server (no tests)"] - appdir --> a2["client/dist/ — built React SPA"] - appdir --> a3["scripts/ — hook-handler, install-hooks"] - appdir --> a4["node_modules/ — server runtime deps"] - appdir --> a5["package.json"] - - style asar fill:#1f6feb,stroke:#1158c7,color:#fff - style appdir fill:#238636,stroke:#196c2e,color:#fff -``` - -At runtime `server-host.ts` resolves this root as `process.resourcesPath/app` when packaged, on both platforms. Everything under the packaged `app/` is **read-only** on a packaged, signed, or app-translocated macOS bundle and on a Windows install under `%ProgramFiles%` (or a portable build's mount) -- so all writable state (the SQLite database, VAPID keys) lives in the per-user data dir (`~/Library/Application Support/Claude Code Monitor/data/` on macOS, `%APPDATA%\Claude Code Monitor\data\` on Windows), **never inside the bundle / install dir** (see [Writable Data Directory](#writable-data-directory)). - -On macOS `electron-builder` produces **two per-architecture DMGs** — one `arm64` (Apple Silicon), one `x64` (Intel) — via `--mac --arm64 --x64` (not a merged universal binary; the release ships both), ad-hoc signed by default so anyone can build a working `.dmg` without a paid Apple Developer account; real Developer ID signing and notarization are opt-in via environment variables (`CSC_LINK`, `APPLE_ID`, etc.). On Windows it produces an **NSIS installer `.exe`** and a **no-install portable `.exe`** (both x64), using `assets/icon.ico` (generated from the source PNG by `desktop/scripts/build-win-icon.ps1`) as the application and tray icon. **`electron-builder` packages for the host OS** -- DMGs build on macOS, Windows `.exe`s build on Windows -- so the two artifacts come from two CI jobs (see below). The `desktop/scripts/prebuild.js` guard also **self-heals** a `better-sqlite3` native binary that a prior cross-arch DMG build (`electron-builder --mac --x64/--arm64`) left compiled for the wrong CPU architecture -- it detects the mismatch via `file` and re-runs `electron-builder install-app-deps`, so `desktop:dev` and `desktop:test` do not fail with `ERR_DLOPEN_FAILED`; on Windows it shells the `.cmd` shims for `npm`/`npx`. CI runs a path-filtered `🍎 macOS Desktop (DMG)` job on `macos-latest` (artifact `ClaudeCodeMonitor-dmg`) and a `🪟 Windows Desktop (EXE)` job on `windows-latest` (artifact `ClaudeCodeMonitor-win`); the release attaches both. See [`desktop/README.md`](./desktop/README.md) for the full build pipeline, build-performance notes, and signing details. - -### Relation to Standalone Deployment - -The desktop app is a fourth deployment mode alongside Development, Production, and Container (see [Deployment Modes](#deployment-modes)). The data path is **identical to the standalone Production path** -- Claude Code hooks `POST /api/hooks/event` to the embedded Express server, which writes to SQLite and broadcasts over WebSocket to the renderer. The only structural difference is that the server runs inside the Electron main process instead of a standalone `node server/index.js`, and the renderer is a `BrowserWindow` rather than a browser tab pointed at the same origin. - ---- - ## Security Considerations | Area | Approach | @@ -2687,26 +2370,6 @@ graph LR | **File watching** | `node --watch` + Vite HMR | None | | **Source maps** | Inline | External files | -### Desktop App (macOS & Windows) - -The native desktop app (macOS `.app`/`.dmg`, Windows NSIS / portable `.exe`) is a self-contained deployment mode: a single Electron process embeds the Express server in-process and renders the React client in a `BrowserWindow`. No terminal, no separate `npm start`. - -```mermaid -graph LR - LAUNCH["Open Claude Code Monitor
(.app / .exe)"] --> MAIN["Electron main process
(Node 22 / Electron 35)"] - MAIN --> HOST["server-host.ts
port discovery + adopt"] - HOST --> SERVER["server/index.js (in-process)
Port 4820 → fallback"] - SERVER -->|serves| DIST["client/dist/
(extraResources)"] - MAIN --> WIN["BrowserWindow"] - WIN --> SERVER - - style MAIN fill:#1f6feb,stroke:#1158c7,color:#fff - style SERVER fill:#339933,stroke:#5cb85c,color:#fff - style DIST fill:#646CFF,stroke:#818cf8,color:#fff -``` - -The hook ingestion path (Claude Code hooks → `POST /api/hooks/event` → SQLite → WebSocket) is **identical to the standalone Production path** -- only the process that hosts the server differs. See [Desktop App Architecture](#desktop-app-architecture-macos--windows--electron) for the full design. - ### MCP Sidecar (Optional) The MCP server runs as a sidecar alongside the dashboard, connecting to the same API. It supports three transport modes: @@ -2792,58 +2455,6 @@ docker run -d -p 4820:4820 \ > [!NOTE] > **Hook note:** Claude Code hooks run on the host, not inside the container. The containerized server still receives hook events via HTTP on `localhost:4820` — run `npm run install-hooks` on the host after the container is up. `scripts/install-hooks.js` detects container execution and refuses there (issue #193) so it cannot write a container-internal handler path into a bind-mounted host `~/.claude`; the containerized server's boot-time auto-install is skipped for the same reason. Override with `CCAM_ALLOW_CONTAINER_HOOKS=1` only when Claude Code itself runs inside the container. -### Cloud Deployment - -For production cloud deployments, the `deployments/` directory provides enterprise-grade infrastructure supporting four cloud providers and multiple deployment strategies. - -```mermaid -graph TB - subgraph "Deployment Pipeline" - direction LR - CI["CI Pipeline
Build · Test · Scan"] --> DEPLOY["Deployment
Helm · Kustomize · Terraform"] - DEPLOY --> VERIFY["Verification
Health Check · Smoke Tests"] - VERIFY -->|Fail| ROLLBACK["Rollback
Instant Revert"] - end - - subgraph "Infrastructure" - direction TB - subgraph "Compute" - BLUE["Blue Slot
Current Version"] - GREEN["Green Slot
New Version"] - end - LB["Load Balancer
TLS 1.3 · WebSocket
Weighted Routing"] - PV["Persistent Storage
Encrypted NFS"] - MON["Monitoring
Prometheus · Grafana
13 Alert Rules"] - OTEL["OTel Collector
Coralogix"] - end - - LB -->|"Active"| BLUE - LB -.->|"Standby"| GREEN - BLUE & GREEN --> PV - MON -->|"Scrape"| BLUE & GREEN - BLUE & GREEN -->|"logs + metrics + traces"| OTEL - - style BLUE fill:#2563eb,color:#fff - style GREEN fill:#16a34a,color:#fff - style LB fill:#7c3aed,color:#fff - style CI fill:#2088ff,color:#fff - style OTEL fill:#4f46e5,color:#fff -``` - -| Capability | Details | -| --- | --- | -| **Cloud Providers** | AWS (ECS Fargate + ALB), GCP (Cloud Run + GCLB), Azure (ACI + App Gateway), OCI (OKE + LBaaS) | -| **Deployment Methods** | Helm chart, Kustomize overlays, Terraform modules | -| **Release Strategies** | Rolling update, blue-green (instant switchover), canary (automated analysis) | -| **Environments** | Dev, staging, production with per-environment configuration | -| **CI/CD** | GitHub Actions and GitLab CI pipelines with Trivy security scanning | -| **Observability** | Prometheus scraping, 13 alert rules, Grafana dashboard (16 panels), Alertmanager routing, Coralogix full-stack observability (logs, metrics, traces, SLO tracking) via OpenTelemetry Collector | -| **Operations** | Scripts for deploy, rollback, blue-green switch, database backup/restore, teardown | -| **Security** | Restricted PSS, network policies, TLS enforcement, OIDC auth, no long-lived credentials | - -> [!NOTE] -> 📘 **Full guide:** See [DEPLOYMENT.md](DEPLOYMENT.md) for step-by-step deployment instructions, and [deployments/README.md](deployments/README.md) for the infrastructure technical reference. - --- ## Statusline Utility diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md deleted file mode 100644 index 2744de2..0000000 --- a/DEPLOYMENT.md +++ /dev/null @@ -1,1080 +0,0 @@ -# Deployment Guide - -Production deployment guide for Claude Code Agent Monitor. This document covers every supported deployment path — from a single Docker container to a fully orchestrated, multi-cloud Kubernetes deployment with blue-green releases, automated canary analysis, and comprehensive observability. - -> [!NOTE] -> **Scope.** This guide is for the **server-side dashboard** — the Node + SQLite + React app you host on Docker, Kubernetes, or a cloud VM. The optional **macOS desktop app** is a per-user downloadable that embeds the same server in-process; it ships as a DMG via GitHub Releases (CI auto-publishes a new `vX.Y.Z` whenever the version in `package.json` is bumped on `master`) and needs none of the infrastructure described below — no cluster, no Terraform, no ingress. See [`DESKTOP.md`](./DESKTOP.md) for the user-facing guide, [`INSTALL.md → Desktop App (macOS & Windows)`](./INSTALL.md#desktop-app-macos--windows-optional) for build / install commands, and [Releases → latest](https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/releases/latest) for the pre-built DMG. - -## Architecture Overview - -```mermaid -graph TB - subgraph "Internet" - U[Users / Browsers] - end - - subgraph "Edge Layer" - LB[Load Balancer
TLS Termination
WebSocket Upgrade] - end - - subgraph "Compute Layer" - subgraph "Blue Slot" - B1[Dashboard Pod 1] - B2[Dashboard Pod 2] - B3[Dashboard Pod N] - end - subgraph "Green Slot" - G1[Dashboard Pod 1] - G2[Dashboard Pod 2] - G3[Dashboard Pod N] - end - end - - subgraph "MCP Sidecar" - MCP1[MCP Server] - end - - subgraph "Persistence" - PV[(SQLite on
Persistent Volume)] - end - - subgraph "Observability" - PROM[Prometheus] - GRAF[Grafana] - ALERT[Alertmanager] - CX[Coralogix] - OTEL[OTel Collector] - end - - U --> LB - LB -->|Active| B1 & B2 & B3 - LB -.->|Standby| G1 & G2 & G3 - B1 --- MCP1 - B1 & B2 & B3 --> PV - PROM -->|Scrape| B1 & B2 & B3 - PROM --> ALERT - OTEL -->|Ship logs, metrics, traces| CX - B1 & B2 & B3 --> OTEL - GRAF --> PROM -``` - -## Deployment Methods - -Three deployment methods are supported, each targeting different operational maturity levels: - -```mermaid -flowchart LR - Start([Choose Method]) --> Q1{Have
Kubernetes?} - Q1 -->|No| Docker["🐳 Docker Compose
Simplest path"] - Q1 -->|Yes| Q2{Need
IaC?} - Q2 -->|No| Q3{Prefer
templating?} - Q2 -->|Yes| TF["🏗️ Terraform
Full cloud provisioning"] - Q3 -->|Helm| Helm["⎈ Helm Chart
Parameterized installs"] - Q3 -->|Raw YAML| Kust["📦 Kustomize
Overlay-based patching"] - - style Docker fill:#0db7ed,color:#fff - style Helm fill:#0f1689,color:#fff - style Kust fill:#326ce5,color:#fff - style TF fill:#7b42bc,color:#fff -``` - -| Method | Best For | Prerequisites | Cloud Agnostic | -|--------|----------|---------------|:--------------:| -| **Docker Compose** | Local dev, single-server | Docker | ✅ | -| **Helm** | Teams with Kubernetes | `helm`, `kubectl` | ✅ | -| **Kustomize** | GitOps, raw YAML fans | `kustomize`, `kubectl` | ✅ | -| **Terraform** | Full infra provisioning | `terraform` | ✅ AWS/GCP/Azure/OCI | - ---- - -## Quick Start: Docker Compose - -The fastest path to a running production instance: - -```bash -# Build and start everything -docker compose up -d --build - -# Verify -curl http://localhost:4820/api/health -# → {"status":"ok","timestamp":"..."} - -# View logs -docker compose logs -f -``` - -The included `docker-compose.yml` at the project root runs the dashboard on port `4820` with a bind mount from `~/.claude/agent-dashboard` to `/app/data` for SQLite — the **same** canonical database path as `npm start` and `npm run dev`. The image binds `0.0.0.0` inside the container and writes data to `/app/data` (both baked into the `Dockerfile`); Compose publishes the port on `127.0.0.1` only, so the dashboard is local-only out of the box. To expose it on a LAN, change the `ports` mapping to `"${DASHBOARD_PORT:-4820}:4820"` and set `DASHBOARD_TOKEN`. - ---- - -## Helm Deployment - -### Prerequisites - -```bash -# Verify tools -helm version # >= 3.12 -kubectl version # >= 1.27 -``` - -### Install - -```bash -# From the repository root: -cd deployments/helm/agent-monitor - -# Dev environment (1 replica, relaxed resources) -helm install agent-monitor . \ - -f values-dev.yaml \ - -n agent-monitor-dev --create-namespace - -# Staging (2 replicas, moderate resources) -helm install agent-monitor . \ - -f values-staging.yaml \ - -n agent-monitor-staging --create-namespace - -# Production (3+ replicas, HPA, strict security) -helm install agent-monitor . \ - -f values-production.yaml \ - -n agent-monitor-production --create-namespace -``` - -### Helm Values Hierarchy - -```mermaid -graph TD - Base["values.yaml
Defaults for all environments"] - Dev["values-dev.yaml
1 replica · 64Mi memory
No HPA · No network policy"] - Stg["values-staging.yaml
2 replicas · 256Mi memory
HPA 2→5 · TLS enabled"] - Prod["values-production.yaml
3 replicas · 512Mi memory
HPA 3→20 · Strict PSS"] - - Base --> Dev - Base --> Stg - Base --> Prod - - style Dev fill:#4caf50,color:#fff - style Stg fill:#ff9800,color:#fff - style Prod fill:#f44336,color:#fff -``` - -### Key Configuration - -| Parameter | Default | Description | -|-----------|---------|-------------| -| `replicaCount` | `2` | Number of pod replicas | -| `image.registry` | `ghcr.io` | Container registry | -| `image.tag` | `""` (appVersion) | Image tag | -| `service.type` | `ClusterIP` | Service type | -| `ingress.enabled` | `false` | Enable Ingress resource | -| `persistence.enabled` | `true` | Enable PVC for SQLite | -| `persistence.size` | `5Gi` | PVC size | -| `autoscaling.enabled` | `true` | Enable HPA | -| `mcp.enabled` | `false` | Deploy MCP sidecar | -| `monitoring.enabled` | `false` | Enable ServiceMonitor | -| `networkPolicy.enabled` | `true` | Enable NetworkPolicy | - -### Upgrade - -```bash -helm upgrade agent-monitor . \ - -f values-production.yaml \ - -n agent-monitor-production \ - --set image.tag=sha-abc1234 -``` - -### Rollback - -```bash -# View history -helm history agent-monitor -n agent-monitor-production - -# Roll back to previous -helm rollback agent-monitor -n agent-monitor-production - -# Roll back to specific revision -helm rollback agent-monitor 3 -n agent-monitor-production -``` - -### Test - -```bash -helm test agent-monitor -n agent-monitor-production -``` - ---- - -## Kustomize Deployment - -### Base + Overlays Structure - -```mermaid -graph TB - subgraph "kubernetes/" - Base["base/
11 resource manifests"] - Dev["overlays/dev/
1 replica, low resources"] - Stg["overlays/staging/
2 replicas, mid resources"] - Prod["overlays/production/
3 replicas, HA, strict HPA"] - - Base --> Dev - Base --> Stg - Base --> Prod - - Comp1["components/mcp-sidecar/
Adds MCP container"] - Comp2["components/monitoring/
Adds ServiceMonitor"] - - Comp1 -.->|Optional| Dev & Stg & Prod - Comp2 -.->|Optional| Stg & Prod - end - - style Base fill:#326ce5,color:#fff - style Dev fill:#4caf50,color:#fff - style Stg fill:#ff9800,color:#fff - style Prod fill:#f44336,color:#fff - style Comp1 fill:#9c27b0,color:#fff - style Comp2 fill:#9c27b0,color:#fff -``` - -### Deploy - -```bash -cd deployments/kubernetes - -# Preview what will be applied -kubectl kustomize overlays/production - -# Apply -kubectl apply -k overlays/dev # Dev -kubectl apply -k overlays/staging # Staging -kubectl apply -k overlays/production # Production -``` - -### Enable MCP Sidecar - -Add the component to your overlay's `kustomization.yaml`: - -```yaml -# overlays/production/kustomization.yaml -components: - - ../../components/mcp-sidecar - - ../../components/monitoring -``` - -Then re-apply: - -```bash -kubectl apply -k overlays/production -``` - -### Base Resources - -The base layer includes all required Kubernetes resources: - -| Resource | File | Purpose | -|----------|------|---------| -| Namespace | `namespace.yaml` | Isolated namespace with Restricted PSS | -| Deployment | `deployment.yaml` | App pods with probes, security context, anti-affinity | -| Service | `service.yaml` | ClusterIP with WebSocket session affinity | -| Ingress | `ingress.yaml` | TLS, HSTS, WebSocket upgrade headers | -| HPA | `hpa.yaml` | CPU/memory auto-scaling with scale-down stabilization | -| PDB | `pdb.yaml` | Disruption budget (`minAvailable: 1`) | -| NetworkPolicy | `networkpolicy.yaml` | Restricted ingress/egress | -| ConfigMap | `configmap.yaml` | Runtime configuration | -| PVC | `pvc.yaml` | Persistent storage for SQLite | -| ServiceAccount | `serviceaccount.yaml` | Dedicated SA, no token mount | - ---- - -## Terraform Deployment - -Full cloud infrastructure provisioning with support for AWS, GCP, Azure, and OCI. - -### Cloud Provider Architecture - -```mermaid -graph TB - subgraph "Terraform Root Module" - TF[main.tf
Module orchestration] - TF --> NET[networking/] - TF --> DB[database/] - TF --> COMP[compute/] - TF --> LB[loadbalancer/] - TF --> MON[monitoring/] - end - - subgraph "Provider Implementations" - AWS["☁️ AWS
VPC → ECS Fargate → EFS → ALB"] - GCP["☁️ GCP
VPC → Cloud Run → Filestore → GCLB"] - AZ["☁️ Azure
VNet → ACI → Files → AppGW"] - OCI["☁️ OCI
VCN → OKE → FSS → LBaaS"] - end - - TF -.-> AWS & GCP & AZ & OCI - - style AWS fill:#ff9900,color:#fff - style GCP fill:#4285f4,color:#fff - style AZ fill:#0078d4,color:#fff - style OCI fill:#f80000,color:#fff -``` - -### Modules - -| Module | Provisions | Key Features | -|--------|-----------|--------------| -| **networking** | VPC/VNet, subnets, NAT, security groups | Multi-AZ, public/private subnet separation | -| **compute** | Container instances, task definitions | Blue-green dual slots, auto-scaling | -| **database** | Managed file storage (EFS/Filestore/Files/FSS) | Encrypted at rest, NFS mount | -| **loadbalancer** | Application load balancer | TLS 1.3, WebSocket sticky sessions, weighted routing | -| **monitoring** | CloudWatch/Stackdriver/Azure Monitor | Alarms, dashboards, log retention | - -### Deploy with Terraform - -```bash -cd deployments/terraform - -# 1. Select a cloud provider -# Copy the provider directory as your working root, or symlink: -cp -r providers/aws/* . -# Or for GCP: cp -r providers/gcp/* . -# Or for Azure: cp -r providers/azure/* . -# Or for OCI: cp -r providers/oci/* . - -# 2. Configure backend (edit backend.tf — uncomment your provider's backend block) -vim backend.tf - -# 3. Initialize -terraform init - -# 4. Plan with environment-specific variables -terraform plan -var-file=environments/dev/terraform.tfvars -out=tfplan - -# 5. Apply -terraform apply tfplan - -# 6. Get outputs -terraform output application_url -``` - -### Environment Configuration - -Each environment has a pre-configured `terraform.tfvars`: - -| Environment | Replicas | CPU | Memory | Monitoring | Strategy | -|-------------|:--------:|:---:|:------:|:----------:|----------| -| **dev** | 1 | 256 | 512 | Off | Rolling | -| **staging** | 2 | 512 | 1024 | On | Rolling | -| **production** | 3 | 1024 | 2048 | On | Blue-green | - -### Blue-Green with Terraform - -```mermaid -sequenceDiagram - participant Op as Operator - participant TF as Terraform - participant LB as Load Balancer - participant Blue as Blue Slot - participant Green as Green Slot - - Note over Blue: Serving 100% traffic - Op->>TF: Update green image tag - TF->>Green: Deploy new version - Green-->>TF: Health checks pass - Op->>TF: Shift weights (blue=0, green=100) - TF->>LB: Update target group weights - LB->>Green: 100% traffic - Note over Green: Now serving all traffic - Note over Blue: Available for instant rollback -``` - -Adjust weights in your tfvars: - -```hcl -# Switch traffic from blue to green -blue_weight = 0 -green_weight = 100 -``` - -Then apply: - -```bash -terraform plan -var-file=environments/production/terraform.tfvars -out=tfplan -terraform apply tfplan -``` - ---- - -## Deployment Strategies - -### Rolling Update (Default) - -Zero-downtime rolling replacement. One pod at a time is replaced while the rest continue serving. - -```mermaid -gantt - title Rolling Update Timeline - dateFormat X - axisFormat %s - - section Pod 1 - Running (old) :done, 0, 3 - Terminating :crit, 3, 4 - Running (new) :active, 4, 10 - - section Pod 2 - Running (old) :done, 0, 5 - Terminating :crit, 5, 6 - Running (new) :active, 6, 10 - - section Pod 3 - Running (old) :done, 0, 7 - Terminating :crit, 7, 8 - Running (new) :active, 8, 10 -``` - -```bash -# Rolling is the default strategy -./deployments/scripts/deploy.sh --env production --method helm -``` - -### Blue-Green - -Two identical environments. Traffic switches instantly between them. Enables instant rollback. - -```mermaid -stateDiagram-v2 - [*] --> BlueActive: Initial state - BlueActive --> GreenActive: Switch to green - GreenActive --> BlueActive: Switch to blue (rollback) - - state BlueActive { - Blue_100: Blue receives 100% traffic - Green_Standby: Green on standby - } - - state GreenActive { - Green_100: Green receives 100% traffic - Blue_Standby: Blue on standby - } -``` - -```bash -# Deploy with blue-green strategy -./deployments/scripts/deploy.sh \ - --env production --method helm --strategy blue-green - -# Switch traffic to green slot -./deployments/scripts/blue-green-switch.sh \ - --env production --target green - -# Instant rollback to blue -./deployments/scripts/blue-green-switch.sh \ - --env production --target blue -``` - -### Canary - -Gradually shift traffic to the new version while monitoring error rates and latency. Automatic rollback if metrics exceed thresholds. - -```mermaid -graph LR - subgraph "Canary Progression" - S1["5% traffic
Monitor 60s"] --> S2["25% traffic
Monitor 60s"] - S2 --> S3["50% traffic
Monitor 60s"] - S3 --> S4["100% traffic
Promotion complete"] - end - - subgraph "Auto-Rollback Triggers" - T1["Success rate < 99%"] - T2["P99 latency > 500ms"] - T3["Error rate > 1%"] - end - - T1 & T2 & T3 -->|"failureLimit: 2"| RB[Automatic Rollback] - - style S4 fill:#4caf50,color:#fff - style RB fill:#f44336,color:#fff -``` - -```bash -# Deploy with canary strategy (requires Argo Rollouts) -./deployments/scripts/deploy.sh \ - --env production --method helm --strategy canary -``` - -Canary analysis is defined in `kubernetes/strategies/canary/canary-analysis.yaml` with three Prometheus queries: - -| Metric | Threshold | Window | -|--------|-----------|--------| -| Success rate | ≥ 99% | 60s | -| P99 latency | < 500ms | 60s | -| Error rate | ≤ 1% | 60s | - ---- - -## Operations Scripts - -All scripts live in `deployments/scripts/` and share consistent flags: - -```mermaid -graph LR - Deploy["deploy.sh
Build, push, deploy"] --> Health["health-check.sh
Verify deployment"] - Deploy --> Rollback["rollback.sh
Undo deployment"] - Deploy --> BGSwitch["blue-green-switch.sh
Switch traffic slots"] - - Backup["db-backup.sh
Backup SQLite"] --> Restore["db-restore.sh
Restore from backup"] - - Teardown["teardown.sh
Destroy environment"] -.->|"Requires confirmation"| Deploy - - style Deploy fill:#4caf50,color:#fff - style Rollback fill:#ff9800,color:#fff - style Teardown fill:#f44336,color:#fff -``` - -### deploy.sh - -The primary deployment orchestrator. Builds images, pushes to registry, and deploys using your chosen method and strategy. - -```bash -# Basic deployment -./deployments/scripts/deploy.sh --env dev --method helm - -# Production with blue-green -./deployments/scripts/deploy.sh \ - --env production \ - --method helm \ - --strategy blue-green \ - --tag v1.2.3 - -# Dry run (preview changes) -./deployments/scripts/deploy.sh \ - --env staging --method kustomize --dry-run - -# Skip image build (use existing image) -./deployments/scripts/deploy.sh \ - --env production --method helm --skip-build --tag sha-abc1234 - -# Terraform deployment -./deployments/scripts/deploy.sh --env production --method terraform -``` - -### health-check.sh - -Comprehensive health verification — HTTP endpoint, WebSocket connectivity, and response time thresholds. - -```bash -# Basic health check -./deployments/scripts/health-check.sh --url http://localhost:4820 - -# With custom thresholds -./deployments/scripts/health-check.sh \ - --url https://monitor.example.com \ - --retries 60 \ - --interval 10 \ - --threshold 1000 - -# JSON output (for CI pipelines) -./deployments/scripts/health-check.sh \ - --url http://localhost:4820 --json - -# Skip WebSocket check -./deployments/scripts/health-check.sh \ - --url http://localhost:4820 --no-websocket -``` - -### rollback.sh - -Roll back to a previous deployment version. - -```bash -# Roll back Helm to previous release -./deployments/scripts/rollback.sh --env production --method helm - -# Roll back to specific revision -./deployments/scripts/rollback.sh --env production --method helm --revision 5 - -# Roll back Kustomize deployment -./deployments/scripts/rollback.sh --env staging --method kustomize -``` - -### blue-green-switch.sh - -Switch live traffic between blue and green deployment slots. - -```bash -# Switch production to green -./deployments/scripts/blue-green-switch.sh --env production --target green - -# Instant rollback to blue -./deployments/scripts/blue-green-switch.sh --env production --target blue - -# Dry run -./deployments/scripts/blue-green-switch.sh \ - --env production --target green --dry-run -``` - -### db-backup.sh / db-restore.sh - -Back up and restore the SQLite database from Kubernetes PVCs. - -```bash -# Backup -./deployments/scripts/db-backup.sh \ - --env production --output ./backups - -# Backup with S3 upload -./deployments/scripts/db-backup.sh \ - --env production --output ./backups \ - --upload s3://my-bucket/backups/ - -# Restore from backup -./deployments/scripts/db-restore.sh \ - --env production --input ./backups/dashboard-20240128-143022.db.gz -``` - -### teardown.sh - -Destroy an entire environment. Requires explicit confirmation for production. - -```bash -# Tear down dev environment -./deployments/scripts/teardown.sh --env dev --method helm - -# Tear down production (requires typing environment name to confirm) -./deployments/scripts/teardown.sh --env production --method terraform - -# Also delete PVCs (permanent data loss) -./deployments/scripts/teardown.sh \ - --env staging --method helm --delete-pvc -``` - ---- - -## CI/CD Pipelines - -Pre-built pipelines for GitHub Actions and GitLab CI. - -### Pipeline Flow - -```mermaid -graph LR - subgraph "CI Pipeline" - Lint["Lint &
Typecheck"] --> Test["Unit
Tests"] - Test --> Build["Build
Images"] - Build --> Scan["Security
Scan (Trivy)"] - end - - subgraph "CD Pipeline" - Scan --> DeployStg["Deploy
Staging"] - DeployStg --> SmokeTest["Smoke
Tests"] - SmokeTest --> Gate["Manual
Approval"] - Gate --> DeployProd["Deploy
Production"] - DeployProd --> HealthCheck["Health
Check"] - end - - subgraph "Safety" - HealthCheck -->|Fail| AutoRollback["Auto
Rollback"] - DeployProd -->|Manual| ManualRollback["Manual
Rollback"] - end - - style Scan fill:#e91e63,color:#fff - style Gate fill:#ff9800,color:#fff - style AutoRollback fill:#f44336,color:#fff -``` - -### GitHub Actions - -Three workflow files in `deployments/ci/github-actions/`: - -| Workflow | Trigger | Actions | -|----------|---------|---------| -| `ci.yaml` | Push, PR | Lint, test, build images, Trivy scan | -| `deploy.yaml` | Tag `v*`, manual | Deploy to staging → approval → production | -| `rollback.yaml` | Manual | Roll back any environment | - -```bash -# Copy workflows to your repo -cp -r deployments/ci/github-actions/*.yaml .github/workflows/ - -# Required GitHub secrets: -# - KUBE_CONFIG (base64 kubeconfig) -# - REGISTRY_USERNAME (container registry user) -# - REGISTRY_PASSWORD (container registry token) -``` - -### GitLab CI - -Single pipeline file in `deployments/ci/gitlab-ci/`: - -```bash -# Copy to repo root -cp deployments/ci/gitlab-ci/.gitlab-ci.yml . - -# Required CI/CD variables: -# - KUBE_CONFIG (base64 kubeconfig, type: File) -# - CI_REGISTRY_USER (auto-provided by GitLab) -# - CI_REGISTRY_PASSWORD (auto-provided by GitLab) -``` - ---- - -## Monitoring & Observability - -### Stack Overview - -```mermaid -graph TB - App[Agent Monitor
Pods] -->|"/metrics"| Prom[Prometheus
Scraping & Storage] - App -->|"logs + metrics"| OTEL[OTel Collector
DaemonSet] - Prom --> Graf[Grafana
Dashboards] - Prom --> AM[Alertmanager
Routing & Notifications] - OTEL -->|"OTLP gRPC"| CX[Coralogix
Full-Stack Observability] - - AM --> Slack[Slack] - AM --> PD[PagerDuty] - AM --> Email[Email] - CX --> CXA[Coralogix Alerts] - CXA --> PD - CXA --> Slack - - subgraph "Grafana Dashboard" - P1[Request Rate] - P2[Error Rate] - P3[Latency P50/P95/P99] - P4[WebSocket Connections] - P5[CPU / Memory Usage] - P6[SQLite Operations] - end - - subgraph "Coralogix Dashboard" - C1[Log Analytics / DataPrime] - C2[Metrics + Recording Rules] - C3[SLO Tracking + Error Budget] - C4[Distributed Tracing] - end - - Graf --- P1 & P2 & P3 & P4 & P5 & P6 - CX --- C1 & C2 & C3 & C4 - - style Prom fill:#e6522c,color:#fff - style Graf fill:#f46800,color:#fff - style AM fill:#e6522c,color:#fff - style CX fill:#1a1a2e,color:#fff - style OTEL fill:#4f46e5,color:#fff - style CXA fill:#dc2626,color:#fff -``` - -### Setup - -```bash -# Import Grafana dashboard -# File: deployments/monitoring/grafana/dashboards/agent-monitor.json -# → Import via Grafana UI: Dashboards → Import → Upload JSON - -# Apply Prometheus rules -kubectl apply -f deployments/monitoring/prometheus/rules/agent-monitor.rules.yaml - -# Apply Prometheus scrape config -# Merge deployments/monitoring/prometheus/prometheus.yaml into your Prometheus config - -# Apply Alertmanager config -# Merge deployments/monitoring/alertmanager/alertmanager.yaml into your Alertmanager config - -# Deploy Coralogix OTel Collector (optional – full-stack observability) -helm repo add coralogix https://cgx.jfrog.io/artifactory/coralogix-charts-virtual -kubectl create secret generic coralogix-keys \ - --namespace agent-monitor \ - --from-literal=PRIVATE_KEY= -helm install coralogix-otel coralogix/opentelemetry \ - --namespace agent-monitor \ - -f deployments/monitoring/coralogix/values.yaml -``` - -### Alert Rules - -13 alert rules organized by category: - -| Alert | Severity | Condition | -|-------|----------|-----------| -| `AgentMonitorDown` | critical | Instance unreachable > 2min | -| `HighErrorRate` | critical | 5xx rate > 5% for 5min | -| `HighLatency` | warning | P95 latency > 2s for 5min | -| `WebSocketConnectionSpike` | warning | WS connections > 1000 | -| `HighMemoryUsage` | warning | Memory > 85% of limit | -| `HighCpuUsage` | warning | CPU > 80% for 10min | -| `PVNearlyFull` | critical | PV usage > 90% | -| `PodRestartLooping` | critical | > 5 restarts in 15min | -| `HpaMaxedOut` | warning | Replicas at max for 15min | -| `SlowDatabaseQueries` | warning | DB query time > 1s | - -### Grafana Dashboard - -The pre-built dashboard (`agent-monitor.json`) includes 16 panels across 6 rows: - -- **Overview** — Request rate, active sessions, WebSocket connections -- **HTTP Performance** — Latency histograms, status code distribution, error rate -- **WebSocket** — Connection count, message throughput, connection duration -- **Database** — Query duration, row counts, WAL checkpoint time -- **Resources** — CPU, memory, network I/O, filesystem usage -- **Deployment** — Pod status, restart count, HPA scaling events - -### Coralogix Dashboard - -The Coralogix custom dashboard (`monitoring/coralogix/dashboards.yaml`) provides 18 panels across 6 rows with SLO tracking: - -- **Overview** — Active sessions, request rate, WebSocket connections -- **HTTP Performance** — Latency P50/P95/P99, error rate with thresholds, status code distribution -- **Application Logs** — Error log stream via DataPrime, log volume by severity, hook event throughput -- **Infrastructure** — CPU, memory, pod status gauges -- **Database & Storage** — SQLite query duration, PV usage gauge, network I/O -- **SLO Tracking** — Availability SLO (99.9% target), latency SLO (P95 < 500ms), error budget remaining - ---- - -## Security Model - -```mermaid -graph TB - subgraph "Network Security" - NS1[Private subnets for compute] - NS2[NetworkPolicy: restricted egress] - NS3[TLS 1.3 at load balancer] - NS4[HSTS enforcement] - end - - subgraph "Pod Security" - PS1[Restricted PSS enforcement] - PS2[runAsNonRoot / UID 1000] - PS3[readOnlyRootFilesystem] - PS4[Drop ALL capabilities] - PS5[Seccomp RuntimeDefault] - PS6[No privilege escalation] - PS7[No automount SA token] - end - - subgraph "Data Security" - DS1[Encrypted storage at rest] - DS2[Encrypted transit NFS] - DS3[DB backups before destructive ops] - DS4[Production confirmation gates] - end - - subgraph "CI/CD Security" - CS1[OIDC auth - no long-lived creds] - CS2[Trivy vulnerability scanning] - CS3[Pipeline blocks on CRITICAL/HIGH CVEs] - CS4[GitHub Environment protection rules] - end -``` - ---- - -## Directory Reference - -``` -deployments/ -├── ci/ # CI/CD pipeline definitions -│ ├── github-actions/ -│ │ ├── ci.yaml # Build, test, scan -│ │ ├── deploy.yaml # Staged deployment -│ │ └── rollback.yaml # Emergency rollback -│ └── gitlab-ci/ -│ └── .gitlab-ci.yml # Full GitLab pipeline -├── helm/ -│ └── agent-monitor/ # Helm chart -│ ├── Chart.yaml -│ ├── values.yaml # Default values -│ ├── values-dev.yaml # Dev overrides -│ ├── values-staging.yaml # Staging overrides -│ ├── values-production.yaml # Production overrides -│ └── templates/ # 12 Kubernetes templates -├── kubernetes/ # Kustomize manifests -│ ├── base/ # 11 base resources -│ ├── overlays/ -│ │ ├── dev/ -│ │ ├── staging/ -│ │ └── production/ -│ ├── components/ -│ │ ├── mcp-sidecar/ # Optional MCP sidecar -│ │ └── monitoring/ # Optional ServiceMonitor -│ └── strategies/ -│ ├── blue-green/ # Blue-green deployments -│ └── canary/ # Canary with analysis -├── monitoring/ -│ ├── alertmanager/ # Alert routing config -│ ├── coralogix/ # Coralogix full-stack observability -│ │ ├── values.yaml # OTel Collector Helm values -│ │ ├── alerts.yaml # Alert definitions -│ │ ├── dashboards.yaml # Custom dashboard (18 panels) -│ │ └── coralogix-terraform.tf # Terraform-managed resources -│ ├── grafana/ -│ │ ├── dashboards/ # Pre-built dashboard JSON -│ │ └── datasources.yaml -│ └── prometheus/ -│ ├── prometheus.yaml # Scrape configuration -│ └── rules/ # 13 alerting rules -├── scripts/ # Operational scripts -│ ├── deploy.sh # Primary deploy orchestrator -│ ├── rollback.sh # Version rollback -│ ├── blue-green-switch.sh # Traffic slot switching -│ ├── health-check.sh # Deployment verification -│ ├── db-backup.sh # Database backup -│ ├── db-restore.sh # Database restore -│ └── teardown.sh # Environment teardown -└── terraform/ # Infrastructure as Code - ├── main.tf # Root module - ├── variables.tf # Input variables - ├── outputs.tf # Output values - ├── versions.tf # Provider version constraints - ├── backend.tf # State backend configs - ├── modules/ - │ ├── networking/ # VPC, subnets, security groups - │ ├── compute/ # Container orchestration - │ ├── database/ # Persistent storage - │ ├── loadbalancer/ # ALB with TLS & WebSocket - │ └── monitoring/ # Alarms & dashboards - ├── providers/ - │ ├── aws/ # ECS Fargate + ALB + EFS - │ ├── gcp/ # Cloud Run + GCLB + Filestore - │ ├── azure/ # ACI + App Gateway + Files - │ └── oci/ # OKE + LBaaS + FSS - └── environments/ - ├── dev/ - ├── staging/ - └── production/ -``` - ---- - -## Common Workflows - -### First Production Deployment - -```mermaid -graph TD - A[1. Build image] --> B[2. Push to registry] - B --> C[3. Create namespace] - C --> D[4. Deploy with Helm] - D --> E[5. Health check] - E -->|Pass| F[6. Configure DNS] - E -->|Fail| G[6. Rollback] - F --> H[7. Enable monitoring] -``` - -```bash -# 1–2. Build and push -docker build -t ghcr.io/your-org/agent-monitor:v1.0.0 . -docker push ghcr.io/your-org/agent-monitor:v1.0.0 - -# 3–4. Deploy -./deployments/scripts/deploy.sh \ - --env production \ - --method helm \ - --tag v1.0.0 \ - --skip-build - -# 5. Verify -./deployments/scripts/health-check.sh --url https://monitor.example.com - -# 7. Enable monitoring -helm upgrade agent-monitor deployments/helm/agent-monitor \ - -f deployments/helm/agent-monitor/values-production.yaml \ - --set monitoring.enabled=true \ - -n agent-monitor-production -``` - -### Zero-Downtime Release - -```bash -# 1. Deploy new version to green slot -./deployments/scripts/deploy.sh \ - --env production --method helm \ - --strategy blue-green --tag v1.1.0 - -# 2. Verify green is healthy -./deployments/scripts/health-check.sh \ - --url http://green-internal:4820 - -# 3. Switch traffic -./deployments/scripts/blue-green-switch.sh \ - --env production --target green - -# 4. Verify production -./deployments/scripts/health-check.sh \ - --url https://monitor.example.com - -# 5. If something goes wrong — instant rollback -./deployments/scripts/blue-green-switch.sh \ - --env production --target blue -``` - -### Disaster Recovery - -```bash -# 1. Backup current state -./deployments/scripts/db-backup.sh \ - --env production --output ./backups - -# 2. Restore from backup -./deployments/scripts/db-restore.sh \ - --env production \ - --input ./backups/dashboard-latest.db.gz - -# 3. Verify -./deployments/scripts/health-check.sh --url https://monitor.example.com -``` - ---- - -## Troubleshooting - -### Pod not starting - -```bash -# Check pod status -kubectl get pods -n agent-monitor-production - -# Check events -kubectl describe pod -n agent-monitor-production - -# Check logs -kubectl logs -n agent-monitor-production -``` - -### WebSocket connections dropping - -The dashboard requires WebSocket sticky sessions. Verify: - -```bash -# Helm: check service session affinity -kubectl get svc -n agent-monitor-production -o yaml | grep -A5 sessionAffinity - -# Ingress: check WebSocket annotations -kubectl get ingress -n agent-monitor-production -o yaml | grep -A10 annotations -``` - -Required ingress annotations for WebSocket: -```yaml -nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" -nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" -``` - -### Database locked errors - -SQLite supports one writer at a time. Ensure: - -1. PVC access mode is `ReadWriteOnce` (not `ReadWriteMany`) -2. Only one pod writes at a time (replica count or leader election) -3. WAL mode is enabled (default in the application) - -### Terraform state issues - -```bash -# Refresh state -terraform refresh -var-file=environments/production/terraform.tfvars - -# Import existing resource -terraform import -var-file=environments/production/terraform.tfvars \ - module.networking.aws_vpc.main vpc-12345 - -# Unlock state (if locked by a failed run) -terraform force-unlock -``` diff --git a/DESKTOP.md b/DESKTOP.md deleted file mode 100644 index 622c7a1..0000000 --- a/DESKTOP.md +++ /dev/null @@ -1,253 +0,0 @@ -# Claude Code Monitor — Desktop App (macOS & Windows) - -The dashboard ships with an optional **native desktop app** (built with Electron 35) that wraps the existing server + client into a single application you install once and forget — a macOS `.app` (shipped as a `.dmg`) and a Windows `.exe` (an NSIS installer plus a no-install portable build). Everything you see in the browser at `localhost:4820` lives inside this window, with native OS lifecycle on top: a menu-bar / notification-area (tray) icon, a native application menu, auto-start at login, and a single quit button that cleans up the server. - -## Why this exists in addition to the PWA - -The PWA (added in #144) makes the dashboard installable in Chromium-based browsers, which is great for users who already keep the server running. The desktop app solves the orthogonal problem: **starting and keeping the server running** without a terminal window. Concretely: - -| Capability | PWA | Desktop App | -|---|---|---| -| Installs to dock / Applications | ✅ | ✅ | -| Manages the Express server | ❌ — user must `npm start` separately | ✅ — embedded in-process | -| Auto-starts at login | ❌ | ✅ via macOS Login Items / Windows `HKCU\…\Run` | -| Menu-bar / notification-area (tray) icon for always-on status | ❌ | ✅ | -| Native application menu (⌘ / Ctrl shortcuts, etc.) | ❌ | ✅ | -| Survives browser restart | ⚠️ depends on browser | ✅ | - -The two coexist — install whichever fits your workflow. - -## Quick install - -**Option A — download a pre-built installer** (recommended): - -1. Open [**Releases → latest**](https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/releases/latest) and grab the asset for your platform. Every `master` commit that bumps the version in `package.json` cuts a new `vX.Y.Z` release automatically (CI publishes it), so this link always lands on the current build — no GitHub sign-in required. - - | Platform | Asset | Notes | - |---|---|---| - | macOS (Apple Silicon) | `ClaudeCodeMonitor--arm64.dmg` | drag into `/Applications` | - | macOS (Intel) | `ClaudeCodeMonitor--x64.dmg` | drag into `/Applications` | - | Windows (installer) | `ClaudeCodeMonitor-Setup--x64.exe` | per-user install, no admin | - | Windows (portable) | `ClaudeCodeMonitor--x64-portable.exe` | run without installing | - -2. Want a **per-commit build** instead of waiting for a release? Every green CI run uploads a workflow artifact (sign-in required, 14-day retention) — `ClaudeCodeMonitor-dmg` from the `🍎 macOS Desktop (DMG)` job and `ClaudeCodeMonitor-win` from the `🪟 Windows Desktop (EXE)` job: - ```bash - gh run download -R Smartgift-AI/Claude-Code-Monitor -n ClaudeCodeMonitor-dmg # or ClaudeCodeMonitor-win - ``` -3. **macOS:** double-click the DMG → drag `Claude Code Monitor.app` into your `Applications` folder. Open it; macOS may show a Gatekeeper warning the first time — see [Gatekeeper & SmartScreen](#gatekeeper--smartscreen-first-launch) below. -4. **Windows:** run `ClaudeCodeMonitor-Setup--x64.exe` (per-user, no admin) and follow the wizard, or just run the `*-portable.exe` to launch without installing. Windows **SmartScreen** may show *"Windows protected your PC"* the first time — see [Gatekeeper & SmartScreen](#gatekeeper--smartscreen-first-launch) below. - -**Option B — build locally:** - -```bash -# In the project root, after `git clone`: -npm run setup # installs root + client + vscode-extension deps -npm run build # builds the React client -npm run desktop:install # installs Electron + electron-builder - -# Build for macOS (run ON macOS) — pick one: -npm run desktop:dmg:arm64 # Apple Silicon only — FAST (~1 min); use this for your own Mac -npm run desktop:dmg:x64 # Intel only — FAST -npm run desktop:dmg # BOTH per-arch DMGs (arm64 + x64) — the release build; slower (packages each arch) -npm run desktop:dmg:universal # ONE merged universal DMG (arm64 + x86_64 in a single file) — optional, slowest - -# Build for Windows (run ON Windows) — pick one: -npm run desktop:win # NSIS installer → desktop/release/ClaudeCodeMonitor-Setup--x64.exe -npm run desktop:win:portable # no-install portable → desktop/release/ClaudeCodeMonitor--x64-portable.exe - -# electron-builder packages for the HOST OS — you cannot build a Windows .exe -# on macOS or a macOS .dmg on Windows. - -# Open the macOS DMG you just built. desktop:dmg:arm64 / :x64 wipe release/ and emit -# one DMG; desktop:dmg wipes release/ and emits both (…-arm64.dmg + …-x64.dmg). -open desktop/release/ClaudeCodeMonitor-*-arm64.dmg # …-x64.dmg for the Intel build -``` - -> **`desktop:dmg` builds both architectures, so it takes longer.** It packages -> and ad-hoc-signs the app **twice** — once for `arm64`, once for `x64` — and -> emits two separate DMGs (`…-arm64.dmg` + `…-x64.dmg`). It does **not** merge -> them into a single universal binary; the release ships the two per-arch DMGs. -> For running on **your own Mac**, use the arch-specific command -> (`desktop:dmg:arm64` / `desktop:dmg:x64`) — half the work, and it finishes in -> about a minute. CI runs `desktop:dmg` for you and uploads both DMGs as the -> `ClaudeCodeMonitor-dmg` artifact, so you rarely need to build them locally. - -## What happens when you launch the app - -1. The Electron main process picks a free port — preferring **4820**, falling back to 4821–4829, then a random high port if all those are taken. -2. If something already answers `/api/health` on port 4820 (e.g. you ran `npm start` in a terminal), the app **adopts that server** and skips starting a second one. No double-binding, no SQLite contention. -3. Otherwise it `require()`s `server/index.js` directly in-process — same Node runtime as the main process, same memory. Boot is typically under two seconds. -4. On startup the server records its **live port** to `~/.claude/.agent-dashboard.json`. The Claude Code hook handler reads that file, so events still reach the dashboard when the app bound a fallback port instead of 4820. -5. The dashboard window opens — unless the app was launched at login (on macOS via Login Items; on Windows via the `HKCU\…\Run` entry, detected through a `--ccam-hidden` launch arg since Windows has no `wasOpenedAtLogin`), in which case it stays tray-only. -6. A tray icon appears — the macOS **menu bar** or the Windows **notification area**. One click opens a dropdown with a **live status snapshot** (server port, active sessions, working agents, events today — all clickable to jump into the dashboard) plus *Open Dashboard*, *Open in Browser*, *Restart Server*, *Show Logs*, *Open at Login* (toggle), and *Quit*. - -## Lifecycle semantics - -- **Closing the window hides it.** The server keeps running, the tray icon stays, and (on macOS) the **dock icon stays too** — clicking either re-opens the window. Independent signals that the app is still alive. -- **Quitting** (⌘Q / Ctrl+Q, *Quit* in the application menu, or *Quit* in the tray menu) pops a confirmation dialog — *"Quit Claude Code Monitor? Press ⌘Q again to skip this prompt and quit immediately."* Press **Quit** in the dialog, or **press ⌘Q / Ctrl+Q a second time** to bypass the prompt. Either way the SQLite handle is checkpointed cleanly before the process exits. -- **Tray** — the macOS menu bar / Windows notification area. macOS uses a black template glyph the OS tints for light/dark menu bars; Windows uses the colored `icon.ico`, because a template glyph would vanish on the dark taskbar. A single click (left or right) opens the dropdown, which shows a **live status snapshot** pulled straight from the embedded SQLite handle each time it opens: server port, active sessions, working agents, and events today. Snapshot rows are clickable — they open the dashboard. The tray's *Open Dashboard* reliably **raises** the window even when it is minimized or behind other windows. (The application menu's *File ▸ Open Dashboard* / ⌘1 is **macOS-only** — on Windows/Linux a window-attached menu accelerator can't reopen a hidden window, so reopening is the tray's job there.) -- **Window / taskbar icon** — the `BrowserWindow` sets its `icon` to the colored app logo (`icon.ico` on Windows, `icon.png` elsewhere — the same logo as the macOS Dock, rendered from `assets/icon.svg`), so an unpackaged `desktop:dev` run shows the real app logo in the title bar / taskbar instead of the generic Electron icon. The macOS dev Dock icon is set too; packaged apps already get theirs from the bundle `.icns`/`.exe`. -- **Open-at-login toggle:** flip *Open at Login* in the tray menu (or the app menu). Both platforms go through Electron's first-party `app.*LoginItemSettings` API — no third-party deps. On **macOS** it registers via the `SMAppService` API, so the entry appears under → *System Settings → General → Login Items*. On **Windows** it writes a per-user `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` entry, visible under *Task Manager → Startup*; a login-triggered launch is detected via a `--ccam-hidden` arg (Windows has no `wasOpenedAtLogin`). On Linux the toggle is a no-op (unsupported). -- **Single-instance:** double-launching just focuses the existing window. No second server, no port collision. (Applies on every platform.) -- **Logs** live at `~/Library/Logs/Claude Code Monitor/desktop.log` on macOS and `%APPDATA%\Claude Code Monitor\logs\desktop.log` on Windows (use *Show Logs* in the tray menu to open the folder). -- **Your data** (the SQLite database and VAPID keys) lives outside the app bundle / install dir, so it **survives app reinstalls and updates** — `~/Library/Application Support/Claude Code Monitor/data/` on macOS, `%APPDATA%\Claude Code Monitor\data\` on Windows. The Windows NSIS uninstaller **keeps this data by default** (`deleteAppDataOnUninstall: false`), mirroring how dragging the `.app` to the Trash on macOS never touches your data. -- **The `claude` CLI on PATH.** On **macOS** the app resolves it using your login-shell `PATH`, recovered at startup — so "Run Claude" works even though a Finder/Dock-launched app would otherwise only inherit a minimal `PATH`. On **Windows** the inherited user `PATH` already includes it, so no recovery is needed. -- **Notifications** (including the in-dashboard *Send test notification* button) are delivered as **native OS toasts** on both platforms when running inside the app — the embedded server calls Electron's `Notification` API directly. On Windows the app sets an `AppUserModelId` (`com.vn.smartgift.ccam.desktop`, matching the electron-builder `appId`) so toasts attribute to the app and its taskbar windows group correctly. Web Push doesn't work reliably inside Electron (Chromium-in-Electron ships without Firebase Cloud Messaging credentials, so `pushManager.subscribe` returns endpoints nothing can deliver to), and this path bypasses it entirely. The web dashboard at `npm start` continues to use Web Push as before. -- **Coexists with the web dashboard.** You can run the desktop app and `npm run dev` (or `npm start`) at the same time. Each server writes its `{port, pid, startedAt, dataDir}` entry to a shared discovery file at `~/.claude/.agent-dashboard.json`, and the Claude Code hook handler POSTs to **one ingest target per unique SQLite data directory** (lowest port wins when both share `~/.claude/agent-dashboard`, so events are never double-ingested). Servers with **different** databases (e.g. the desktop app's Application Support dir alongside `npm run dev`) still each receive hooks and stay real-time. - -## File layout (for contributors) - -``` -desktop/ -├── package.json # Electron + electron-builder -├── tsconfig.json -├── electron-builder.yml # macOS (dmg) + Windows (nsis/portable) targets; signing/notarization hooks -├── assets/ # icon.svg + generated icon.icns (macOS) + icon.ico (Windows) + tray PNGs -├── src/ -│ ├── main.ts # main process entry, lifecycle; setAppUserModelId on win32 -│ ├── server-host.ts # in-process Express boot, port discovery, adopt -│ ├── window.ts # BrowserWindow + persisted state -│ ├── tray.ts # tray icon (platform image: template PNG on macOS, icon.ico on Windows) + context menu -│ ├── menu.ts # native application menu -│ ├── login-item.ts # open-at-login (macOS Login Items + Windows HKCU\…\Run startup) -│ ├── shell-path.ts # recover the user's shell PATH (find `claude`) -│ ├── preload.ts # (empty — kept for future renderer bridges) -│ ├── logger.ts # file logger -│ └── constants.ts # incl. APP_ID (matches electron-builder appId) -├── scripts/ -│ ├── install.js # `desktop:install` wrapper: runs npm install, then prints actionable native-dep help + exits non-zero on failure -│ ├── preflight.js # shared native-dep check (hasBetterSqliteBinary) + per-OS prerequisite help (printNativeDepHelp) -│ ├── prebuild.js # ensures root + client are built before tsc; shells npm/npx on Windows (.cmd shims); fails fast with setup help when the better-sqlite3 native binary is missing -│ ├── build-icons.sh # SVG → PNG/ICNS + tray PNGs via qlmanage/sips/iconutil (macOS) -│ ├── build-win-icon.ps1 # icon.png → icon.ico for Windows (PowerShell + .NET) -│ └── notarize.js # electron-builder afterSign hook (opt-in; macOS only) -└── tests/ - └── smoke.test.mjs # spawn-and-probe /api/health (resolves the real electron binary via createRequire) -``` - -**Changes outside `desktop/` are deliberately minimal:** - -- `server/index.js` — a behavior-preserving refactor: the post-listen bootstrap (one-time legacy-session import, update scheduler, Claude Code config watcher, orphaned-run reconciliation) was extracted into an exported `startBackgroundServices()` so the embedded server runs exactly what `node server/index.js` runs. The standalone server path is functionally unchanged. (The legacy-session import previously sat in the standalone-only `require.main` block, so the desktop dashboard started empty — moving it into `startBackgroundServices()` fixes that.) It also now publishes its live port via `server/lib/server-info.js` on startup. -- `server/lib/server-info.js` *(new)* — writes/reads the `~/.claude/.agent-dashboard.json` port discovery file. -- `scripts/hook-handler.js` — resolves the dashboard port from the discovery file (falling back to `CLAUDE_DASHBOARD_PORT`, then 4820), so hook events reach the server even when it bound a fallback port. - -`client/`, `mcp/`, and `vscode-extension/` are untouched. The Electron main process is otherwise just a host for the same code. - -## Gatekeeper & SmartScreen (first launch) - -### macOS — Gatekeeper - -The DMG is **ad-hoc signed** by default — that's all the project can offer without a paid Apple Developer ID. macOS will warn the first time you open it: *"Apple could not verify…"*. - -Two ways past it: - -```bash -# Easiest: strip the quarantine attribute from the DMG before opening. -xattr -cr ~/Downloads/ClaudeCodeMonitor-*.dmg -``` - -Or open → *System Settings → Privacy & Security*, scroll to the blocked DMG, click *Open Anyway*. - -### Windows — SmartScreen - -The Windows `.exe` (both the installer and the portable build) is **unsigned** by default, so Windows **SmartScreen** may show *"Windows protected your PC"* the first time you run it. Click **More info → Run anyway** to launch it. - -Authenticode signing is opt-in for the maintainer: provide a code-signing certificate via `CSC_LINK` (a base64-encoded `.p12`) and `CSC_KEY_PASSWORD` and electron-builder signs the `.exe` automatically — no code change required. A signed build skips the SmartScreen prompt. - -### Notarization (for the maintainer) - -When you're ready to make this go away for everyone, add these three repository secrets: - -| Secret | Where it comes from | -|---|---| -| `APPLE_ID` | Your Apple ID email | -| `APPLE_TEAM_ID` | Your Apple Developer team ID | -| `APPLE_APP_SPECIFIC_PASSWORD` | An app-specific password created at appleid.apple.com | - -Optionally, also `CSC_LINK` (base64-encoded `.p12`) and `CSC_KEY_PASSWORD` to provide an explicit Developer ID certificate from outside the runner keychain. The CI workflow picks them up automatically — no code change required. See [`desktop/scripts/notarize.js`](desktop/scripts/notarize.js) for the hook. - -> Local builds are **always ad-hoc signed**: the `package` script sets `CSC_IDENTITY_AUTO_DISCOVERY=false`, so a code-signing certificate already in your macOS keychain is never auto-discovered (an Apple Development cert would otherwise be picked up and fail distribution-type signing). Real signing activates only through the explicit `CSC_LINK` certificate above — that path is unaffected by the flag. - -## Development workflow - -```bash -# Hot-iterate on the main process (rebuilds tsc on save would be next steps; -# v1 ships without watch mode — just re-run desktop:dev after changes): -npm run desktop:dev - -# Smoke test (also runs in CI on macOS): -npm run desktop:test - -# macOS — single-architecture DMG — fast (~1 min): -npm run desktop:dmg:arm64 # or desktop:dmg:x64 for Intel - -# macOS — both per-arch DMGs — slower (builds + signs each architecture): -npm run desktop:dmg - -# macOS — one merged universal DMG (arm64 + x86_64 in a single file) — optional, slowest: -npm run desktop:dmg:universal - -# Windows — NSIS installer / no-install portable (run ON Windows): -npm run desktop:win # NSIS installer .exe -npm run desktop:win:portable # no-install portable .exe -``` - -> electron-builder packages for the **host OS** — build DMGs on macOS and the -> Windows `.exe`s on Windows. The Windows icon regenerates from `icon.png` with -> `npm run build:win-icon` (PowerShell + .NET); the macOS icns + tray PNGs come -> from `npm run build:icons`. On Windows, `better-sqlite3` is fetched as a -> prebuilt Electron binary by `npm run desktop:install` (its postinstall runs -> `electron-builder install-app-deps`), so no Visual Studio C++ toolchain is -> needed in the common case. If that fetch/rebuild *does* fail (no C++ toolchain, -> or a Node version with no prebuilt binary), `npm run desktop:install` — and any -> `desktop:*` build, gated by `prebuild.js` — prints the exact per-OS fix plus a -> no-toolchain alternative and **fails loudly** rather than crashing at runtime: -> -> ```bash -> cd desktop -> npm install --ignore-scripts -> node node_modules/electron/install.js -> npx electron-builder install-app-deps -> ``` -> -> A Node LTS (20/22) ships prebuilt `better-sqlite3` binaries and avoids the -> compile entirely. - -> After `npm run clean` in `desktop/`, you must `npm run build` again before -> packaging — `clean` removes `out/`, and `electron-builder` only packages, it -> does not compile. The `desktop:dmg*` scripts chain the build for you; a bare -> `electron-builder` call does not, and fails with -> _"entry file out/main.js does not exist"_. - -The smoke test does not exercise the BrowserWindow (no display on headless CI). It spawns Electron, waits for the embedded server to answer `/api/health`, then shuts down. Anything that depends on the renderer is part of the manual QA checklist on the PR. - -## Known caveats - -- **Bundle size** ≈ 80 MB DMG, ≈ 250 MB on disk. The standard Electron tax. The Windows installer is comparable. Tauri would cut this dramatically but at the cost of a sidecar-process model and a Rust toolchain dependency — fair to revisit in a follow-up PR if bundle size becomes a real complaint. -- **Native modules**: `better-sqlite3` is rebuilt against Electron's Node version automatically via `electron-builder install-app-deps` in the desktop workspace's `postinstall`. On Windows it is fetched as a **prebuilt Electron binary**, so no Visual Studio C++ toolchain is needed in the common case. If that build *does* fail (or the binary is missing afterward), `npm run desktop:install` — and any `desktop:*` build — prints the exact per-OS fix (Windows: Visual Studio Build Tools with the "Desktop development with C++" workload; macOS: `xcode-select --install`; Linux: build-essential + python3) plus a no-toolchain alternative (`npm install --ignore-scripts` → `node node_modules/electron/install.js` → `npx electron-builder install-app-deps`), and exits non-zero — failing loudly at install/build time rather than crashing at runtime. Even so, if the module is unavailable the server falls back to `node:sqlite` (per #37), so the app still boots. -- **Per-architecture DMGs**: `npm run desktop:dmg` builds **both** macOS DMGs (one `arm64`, one `x64`) — the release build, and slower because it packages each architecture separately. It does **not** produce a merged universal binary; the release ships the two per-arch DMGs. `npm run desktop:dmg:arm64` and `npm run desktop:dmg:x64` build a single architecture instead — much faster, and roughly half the disk. If you specifically want a **single merged universal binary** (both slices in one `.dmg`, `lipo`-fat), `npm run desktop:dmg:universal` produces one via `@electron/universal` — the slowest option, and not what the release ships, but handy for hand-distributing one file that runs on any Mac. -- **Auto-update**: not wired on either platform. The current update path is *re-download the latest installer* (DMG on macOS, `.exe` on Windows). `electron-updater` + GitHub Releases is the natural follow-up. - -## Troubleshooting - -| Symptom | Cause | Fix | -|---|---|---| -| "Apple could not verify…" on first launch (macOS) | Unnotarized DMG | `xattr -cr ~/Downloads/ClaudeCodeMonitor-*.dmg` | -| "Windows protected your PC" on first launch (Windows) | The `.exe` is unsigned by default (SmartScreen) | Click **More info → Run anyway**. To remove the prompt for everyone, the maintainer can enable Authenticode signing via `CSC_LINK` + `CSC_KEY_PASSWORD` | -| macOS prompts to install Rosetta when opening the app | You installed the **x64** build on an Apple Silicon Mac | Check your arch with `uname -m` (`arm64` → Apple Silicon, build with `desktop:dmg:arm64`). The arch-specific `desktop:dmg:arm64` / `desktop:dmg:x64` builds each wipe `release/` and emit a single DMG whose mounted-volume title states the architecture — e.g. *Claude Code Monitor (Apple Silicon)* — so there is no ambiguous window to drag from. (`desktop:dmg` emits both per-arch DMGs at once, for release.) If stale DMGs from an older build linger, clear them with `rm -rf desktop/release` and rebuild | -| Window shows but content is blank (macOS) | Server didn't boot — check `~/Library/Logs/Claude Code Monitor/desktop.log` | Restart from tray → *Restart Server* | -| Window shows but content is blank (Windows) | Server didn't boot — check `%APPDATA%\Claude Code Monitor\logs\desktop.log` | Restart from tray → *Restart Server* | -| Tray icon missing (macOS) | The OS hides tray icons when the menu bar is full | Move other menu-bar items aside, or look in the overflow chevron | -| Tray icon missing (Windows) | Windows tucked it into the notification-area overflow | Click the **^** overflow chevron in the taskbar; drag the icon out to keep it pinned | -| App didn't auto-start at login (macOS) | Login Items entry got revoked by macOS | Toggle *Open at Login* off and on again from the tray menu | -| App didn't auto-start at login (Windows) | The `HKCU\…\Run` startup entry is missing or was disabled | Toggle *Open at Login* off and on again from the tray menu, then confirm the entry under *Task Manager → Startup* is **Enabled** | -| `npm run desktop:win` / `:win:portable` fails or produces nothing | electron-builder packages for the host OS — you ran it on macOS/Linux | Build the Windows `.exe` **on Windows** (and DMGs on macOS) | -| Desktop build/install fails on `better-sqlite3` / native binary missing | No C++ toolchain, or no prebuilt for your Node version | Run `npm run desktop:install` and follow the printed help, or use the no-toolchain alternative (`npm install --ignore-scripts` → `node node_modules/electron/install.js` → `npx electron-builder install-app-deps`); or use Node LTS 20/22 | -| Port 4820 already in use, app refuses to start | Something other than the dashboard is on 4820 and it doesn't answer `/api/health` | The app will pick a fallback (4821–4829, then a random high port) — check the tray menu's port indicator | -| Dashboard stays empty — 0 sessions, 0 agents, no real-time updates | The app bound a fallback port (4820 was taken), and the Claude Code hooks were posting events to the wrong port | Fixed — the server publishes its live port to `~/.claude/.agent-dashboard.json` and the hook handler reads it. After upgrading from a pre-fix build, **start a new Claude Code session** so the updated hooks take effect | -| `desktop:dmg` seems slow | Not stuck — it packages two architectures back-to-back (`arch=x64` then `arch=arm64`) | Wait it out, or build a single architecture with `desktop:dmg:arm64` / `desktop:dmg:x64` | -| Build fails: `entry file out/main.js does not exist` | `electron-builder` was run without compiling TypeScript first | Build via `npm run desktop:dmg*` (chains the build); don't invoke `electron-builder` bare | -| Signing fails with `Application … could not be found` | A code-signing certificate in your keychain was auto-discovered | Fixed — the `package` script sets `CSC_IDENTITY_AUTO_DISCOVERY=false`; build via `npm run desktop:dmg*` | -| "Run Claude" reports the `claude` CLI isn't on your PATH | A Finder/Dock-launched app inherits launchd's minimal PATH, not your shell PATH | Fixed — the app recovers your login-shell PATH at startup. If it persists, ensure `claude` is a real executable (not a shell alias/function) and on your shell PATH | -| Imported history / sessions vanished after updating the app | Older builds stored the database inside the (replaceable) app bundle | Fixed — data now lives in `~/Library/Application Support/Claude Code Monitor/data/` and survives reinstalls. After upgrading from a pre-fix build, re-run **Import History → Rescan** once | -| Signing fails: `Application … could not be found` after retries | A keychain code-signing certificate was auto-discovered | Fixed — the `package` script sets `CSC_IDENTITY_AUTO_DISCOVERY=false`; build via `npm run desktop:dmg*` | diff --git a/INSTALL.md b/INSTALL.md index 9594ba2..aa46560 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,6 +1,6 @@ # Installation -A step-by-step guide to get the Claude Code Agent Monitor up and running on your machine, with optional sections for importing history, running in a container, and using the native desktop app (macOS & Windows). +A step-by-step guide to get the Claude Code Agent Monitor up and running on your machine, with optional sections for importing history and running in a container. ## Fastest path — install it as a Claude Code plugin @@ -189,122 +189,6 @@ Open **http://localhost:4820** in your browser. --- -## Desktop App (macOS & Windows) (optional) - -If you'd rather not keep a terminal window open, the project also ships an Electron 35-based **native desktop app** (the `desktop/` workspace), available for both **macOS** and **Windows**. It embeds the Express server in-process, renders the built React client in a `BrowserWindow`, registers a menu-bar / notification-area (tray) icon, and offers a one-click "Open at Login" toggle. Everything you'd see in the browser at `localhost:4820` lives inside a single app you install once — distributed as a macOS `.app` (in a `.dmg`) and a Windows `.exe` (an NSIS installer plus a no-install portable build). - -### Prerequisites - -| For… | You need | -|---|---| -| Downloading a pre-built installer (macOS) | macOS — nothing else | -| Downloading a pre-built installer (Windows) | Windows 10/11 (x64) — nothing else | -| Building the DMG locally (macOS) | macOS, Node.js 20+ (22+ recommended), npm 9+, and **Xcode command-line tools** (`xcode-select --install`) so the native `better-sqlite3` module can be rebuilt for Electron's ABI | -| Building the `.exe` locally (Windows) | Windows, Node.js 20+ (22+ recommended), npm 9+. `better-sqlite3` is fetched as a **prebuilt Electron binary** by `npm run desktop:install`, so no Visual Studio C++ toolchain is needed in the common case. If the build _does_ fail, `npm run desktop:install` prints the exact fix (Visual Studio Build Tools + "Desktop development with C++") plus a no-toolchain alternative and exits non-zero rather than failing silently | - -### Way 1 — Download a pre-built installer - -The fastest path. There are two flavours: - -**1a. From the latest GitHub Release** *(recommended — public, no sign-in)* - -Open [**Releases → latest**](https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/releases/latest) and download the asset for your platform. CI publishes a new `vX.Y.Z` release automatically every time the version in `package.json` is bumped on `master`, so this link always points at the current shipping build. - -| Platform | Asset | Notes | -|---|---|---| -| macOS (Apple Silicon) | `ClaudeCodeMonitor--arm64.dmg` | drag into `/Applications` | -| macOS (Intel) | `ClaudeCodeMonitor--x64.dmg` | drag into `/Applications` | -| Windows (installer) | `ClaudeCodeMonitor-Setup--x64.exe` | per-user install, no admin | -| Windows (portable) | `ClaudeCodeMonitor--x64-portable.exe` | run without installing | - -**1b. From the per-commit CI artifact** *(useful for testing master before it's tagged — sign-in required, 14-day retention)* - -Every green run of the desktop CI jobs uploads a packaged artifact — `ClaudeCodeMonitor-dmg` from the `🍎 macOS Desktop (DMG)` job and `ClaudeCodeMonitor-win` from the `🪟 Windows Desktop (EXE)` job: - -- **Via the GitHub UI:** open the latest passing run under [Actions](https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/actions/workflows/ci.yml?query=branch%3Amaster+is%3Asuccess), scroll to **Artifacts**, and download `ClaudeCodeMonitor-dmg` (macOS) or `ClaudeCodeMonitor-win` (Windows). -- **Via the `gh` CLI:** - - ```bash - gh run download -R Smartgift-AI/Claude-Code-Monitor -n ClaudeCodeMonitor-dmg # macOS - gh run download -R Smartgift-AI/Claude-Code-Monitor -n ClaudeCodeMonitor-win # Windows - ``` - - Unzip the macOS artifact to get the `.dmg`s, or the Windows artifact to get the NSIS installer + portable `.exe`s. - -Then jump to [Install the app](#install-the-app). - -### Way 2 — Build the installer locally - -From the project root, after `git clone`. electron-builder packages for the **host OS**, so build the macOS DMG on a Mac and the Windows `.exe` on Windows. The common prelude is the same: - -```bash -npm run setup # install root + client + vscode-extension deps -npm run build # build the React client (the SPA the window loads) -npm run desktop:install # install Electron + electron-builder into desktop/ - -# macOS (run on macOS): -npm run desktop:dmg:arm64 # fast single-arch DMG → desktop/release/ - -# Windows (run on Windows): -npm run desktop:win # NSIS installer .exe → desktop/release/ -``` - -The artifact lands in `desktop/release/`. Pick the build command that matches your goal: - -| Command | Platform / Architecture | Speed | Use when | -|---|---|---|---| -| `npm run desktop:dmg` | macOS — both per-arch DMGs (arm64 + x64) | **Slower** | Building the release DMGs for everyone | -| `npm run desktop:dmg:arm64` | macOS — Apple Silicon only | Fast (~1 min) | Building for your own Apple Silicon Mac | -| `npm run desktop:dmg:x64` | macOS — Intel only | Fast (~1 min) | Building for your own Intel Mac | -| `npm run desktop:dmg:universal` | macOS — one merged universal DMG (arm64 + x86_64) | **Slowest** | Hand-distributing a single file that runs on any Mac (not what the release ships) | -| `npm run desktop:win` | Windows — NSIS installer `.exe` (x64) | — | Building the per-user installer | -| `npm run desktop:win:portable` | Windows — portable `.exe` (x64) | — | Building the no-install portable build | -| `npm run desktop:install` | — | — | Install Electron + electron-builder deps; preflights the native `better-sqlite3` build and prints actionable setup help on failure | -| `npm run desktop:build` | — | — | TypeScript compile only (`out/`) | -| `npm run desktop:dev` | — | — | Build, then launch Electron locally | -| `npm run desktop:test` | — | — | Smoke test (spawn Electron, probe `/api/health`) | - -> [!IMPORTANT] -> **DMGs build on macOS; Windows `.exe`s build on Windows** — electron-builder packages for the host OS. On macOS, `npm run desktop:dmg` builds the app **twice** (one tree per architecture) and emits **both** per-arch DMGs (`arm64` + `x64`) — the release build. It does **not** merge them into a single universal binary; the two DMGs are what ship. **When building for your own Mac, use `desktop:dmg:arm64` or `desktop:dmg:x64`** — a single architecture finishes in roughly a minute. CI already builds both DMGs and the Windows `.exe`s for you (see Way 1). - -### Install the app - -**macOS.** Each `desktop:dmg*` build wipes `release/` first. `desktop:dmg:arm64` -→ `…-arm64.dmg` and `desktop:dmg:x64` → `…-x64.dmg` each emit a single DMG whose -mounted-volume title states the architecture (e.g. *Claude Code Monitor (Apple -Silicon)*); `desktop:dmg` emits **both** (`…-arm64.dmg` + `…-x64.dmg`) for -release. Install the one matching your Mac: an x64 build on Apple Silicon makes -macOS prompt for Rosetta. - -```bash -open desktop/release/ClaudeCodeMonitor-*-arm64.dmg # the arch you built -``` - -1. The DMG mounts — drag **Claude Code Monitor** into your `Applications` folder. -2. The DMG is ad-hoc signed, so macOS Gatekeeper shows a warning (*"Apple could not verify…"*) on first launch. Strip the quarantine attribute, then open it: - - ```bash - xattr -cr "/Applications/Claude Code Monitor.app" - open "/Applications/Claude Code Monitor.app" - ``` - - Alternatively, open → *System Settings → Privacy & Security* and click *Open Anyway*. - -**Windows.** - -1. Run `ClaudeCodeMonitor-Setup--x64.exe`. It installs **per-user** (no administrator elevation) and lets you pick the install directory — or run the `*-portable.exe` to launch without installing. -2. The installer is **unsigned** by default, so Windows **SmartScreen** may show *"Windows protected your PC"* on first launch — click **More info → Run anyway**. -3. Launch from the Start menu / desktop shortcut. - -Once running, the embedded server boots on port `4820` (or adopts an already-healthy server on `4820`, or falls back to `4821`–`4829` / a random high port), the menu-bar / notification-area (tray) icon appears, and the dashboard window opens. **Hooks are installed automatically on first boot** — an install-only user does not need `npm run install-hooks`; just start a new Claude Code session. Closing the window hides it but keeps the server running; **Quit** from the tray exits. - -> [!NOTE] -> The packaged app stores its SQLite database and VAPID keys in a per-user app-data directory **outside** the app bundle / install dir — `~/Library/Application Support/Claude Code Monitor/data/` on macOS, `%APPDATA%\Claude Code Monitor\data\` on Windows. Your imported history and events therefore **survive app reinstalls and updates** (the Windows NSIS uninstaller keeps this data by default). (Older macOS builds kept the database inside the bundle, which is read-only once installed and code-signed — that broke History Import; it is now fixed. If you are upgrading from a pre-fix build, there is a one-time data gap: re-run **Settings → Import History → Rescan** once.) - -Full user guide: [`DESKTOP.md`](DESKTOP.md). Contributor / architecture reference: [`desktop/README.md`](desktop/README.md). Desktop-specific setup details (logs, auto-start, port adoption) are in [SETUP.md → Desktop App Setup](./SETUP.md#desktop-app-setup). - ---- - ## Optional: Local MCP server If you want AI agents to call dashboard functionality through MCP tools, run the local MCP server in `mcp/`: @@ -469,17 +353,6 @@ If you see an error box at startup saying *"SQLite backend not available"*, eith Then run: `npm rebuild better-sqlite3` -### Desktop build or install fails on the native dependency - -Unlike the root server (which falls back to `node:sqlite`), the desktop app **requires** `better-sqlite3` built for Electron's ABI. If that build can't happen, `npm run desktop:install` (and the desktop `prebuild` gate that runs before every `desktop:*` build) now stops with copy-pasteable setup help instead of a raw node-gyp trace or a runtime crash: it lists the per-OS C++ toolchain prerequisites (Windows: Visual Studio Build Tools + "Desktop development with C++"; macOS: `xcode-select --install`; Linux: build-essential + python3), notes that Node LTS 20/22 ship prebuilt binaries, and offers a no-toolchain alternative: - -```bash -cd desktop -npm install --ignore-scripts -node node_modules/electron/install.js -npx electron-builder install-app-deps -``` - ### `npm run dev` fails immediately Ensure both server and client dependencies are installed: @@ -503,18 +376,6 @@ The Vite dev server and Express server run on different ports. Make sure both ar See [SETUP.md — Troubleshooting](./SETUP.md#troubleshooting) for detailed hook debugging steps. -### Desktop App (macOS & Windows) issues - -| Symptom | Cause | Fix | -|---|---|---| -| *"Apple could not verify…"* on first launch (macOS) | The DMG is ad-hoc signed (no paid Apple Developer ID) | `xattr -cr "/Applications/Claude Code Monitor.app"`, then open it — or use *System Settings → Privacy & Security → Open Anyway* | -| *"Windows protected your PC"* on first launch (Windows) | The `.exe` is unsigned by default, so SmartScreen prompts | Click **More info → Run anyway** | -| `npm run desktop:dmg` seems slow (macOS) | Not hung — it packages two architectures back-to-back (`arch=x64` then `arch=arm64`) | Wait it out, or use `npm run desktop:dmg:arm64` / `npm run desktop:dmg:x64` for a fast single-arch build | -| `entry file out/main.js does not exist` | `npm run clean` (in `desktop/`) deleted `out/`; `electron-builder` only packages, it does not compile | Re-run `npm run desktop:build` (or just use a `desktop:dmg*` / `desktop:win*` script, which chains the build) | -| Desktop window opens but is blank | The embedded server failed `/api/health` within 30 s | Check the desktop log (`~/Library/Logs/Claude Code Monitor/desktop.log` on macOS, `%APPDATA%\Claude Code Monitor\logs\desktop.log` on Windows), then tray → *Restart Server* | -| "Run Claude" says `claude` is not on your PATH | A Finder/Dock-launched macOS app only inherits launchd's minimal PATH, not your login-shell PATH (on Windows the process already inherits the user PATH) | The app recovers your login-shell PATH at startup so it can find and spawn the `claude` CLI. If it still fails, make sure `claude` is a real executable on your shell PATH — not a shell alias or function | -| Imported history vanished after updating the app | Older builds stored the database inside the (replaceable) `.app` bundle | Fixed — data now lives in the per-user app-data dir (`~/Library/Application Support/Claude Code Monitor/data/` on macOS, `%APPDATA%\Claude Code Monitor\data\` on Windows) and survives reinstalls/updates. After upgrading from a pre-fix build, re-run **Settings → Import History → Rescan** once | - --- ## Ports diff --git a/README.md b/README.md index 237e235..8ce7522 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,7 @@ Both must be green before a commit; the pre-commit hook runs them plus Prettier. | `client/` | React 18 + Vite + Tailwind dashboard | | `bin/ccam.js` | CLI | | `mcp/` | MCP server exposing read-only dashboard tools | -| `desktop/` | Electron wrapper that embeds the server | -| `docs/` | Architecture, API, lanes, database, deployment | +| `docs/` | Architecture, API, lanes, database | | `plugins/` | Claude Code plugins shipped with the dashboard | ## Docs @@ -148,5 +147,5 @@ Both must be green before a commit; the pre-commit hook runs them plus Prettier. - [`docs/LANES.md`](docs/LANES.md) — lanes, pipelines, stage detection - [`docs/API.md`](docs/API.md) — REST endpoints (`openapi.yaml` is generated) - [`docs/DATABASE.md`](docs/DATABASE.md) — tables and migrations -- [`INSTALL.md`](INSTALL.md) · [`DEPLOYMENT.md`](DEPLOYMENT.md) · [`DESKTOP.md`](DESKTOP.md) +- [`INSTALL.md`](INSTALL.md) - [`CLAUDE.md`](CLAUDE.md) — the rules an agent working in this repo must follow diff --git a/SETUP.md b/SETUP.md index 09de175..1d6dd7f 100644 --- a/SETUP.md +++ b/SETUP.md @@ -118,7 +118,7 @@ DASHBOARD_PORT=9000 npm run dev > [!NOTE] > You usually do **not** need to set `DASHBOARD_PORT` manually. `npm run dev` is wrapped by `scripts/dev.js`, which probes both `127.0.0.1` and `::1` (so an SSH `LocalForward` bound to one loopback can't slip past) and picks the first free port in `4820–4859` automatically. The chosen port is propagated to the Vite dev proxy via `DASHBOARD_PORT`, and the Express server writes it to `~/.claude/.agent-dashboard.json` so the Claude Code hook handler discovers it without any env var. > -> Multiple dashboards can run side by side — for example `npm run dev` and the desktop app (macOS or Windows) at the same time. Each one appends its `{port, pid, startedAt}` entry to the discovery file, and `scripts/hook-handler.js` fan-outs every hook event to every live entry, so both UIs keep their real-time stream. +> Multiple dashboards can run side by side — for example two `npm run dev` checkouts, or `npm run dev` alongside `npm start`. Each one appends its `{port, pid, startedAt}` entry to the discovery file, and `scripts/hook-handler.js` fan-outs every hook event to every live entry, so both UIs keep their real-time stream. > > Setting `CLAUDE_DASHBOARD_PORT=N` overrides discovery entirely and forces the hook handler to a single port — useful for tests and container setups where the in-process discovery file isn't reachable from the host. > @@ -217,59 +217,6 @@ The dashboard, landing page, and wiki each ship as independent Progressive Web A **Verifying PWA status:** Open DevTools → Application → Manifest to confirm the manifest loads. Check the Service Workers section to verify the SW is registered and active. The Lighthouse PWA audit should pass all core checks. -### Desktop App Setup - -The `desktop/` workspace ships the dashboard as a **native desktop app** for both **macOS** (a `.app` distributed as a `.dmg`) and **Windows** (an `.exe` — an NSIS installer plus a no-install portable build), built with Electron 35. It is an Electron shell that **embeds the existing Express server in-process** — it does not reimplement anything. For installation (download a pre-built installer from the [latest GitHub Release](https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/releases/latest) or the per-commit `ClaudeCodeMonitor-dmg` / `ClaudeCodeMonitor-win` CI artifact, or build one locally — then on macOS mount, drag, Gatekeeper bypass; on Windows run the installer / portable, SmartScreen bypass), see [INSTALL.md → Desktop App (macOS & Windows)](./INSTALL.md#desktop-app-macos--windows-optional). The full user guide is [`DESKTOP.md`](./DESKTOP.md); the contributor / architecture reference is [`desktop/README.md`](./desktop/README.md). - -This section covers the parts of running the desktop app that matter for setup. - -**Building and running.** All commands run from the repo root. electron-builder packages for the **host OS** — build the macOS DMG on a Mac (`desktop:dmg*`) and the Windows `.exe` on Windows (`desktop:win*`): - -| Script | Command | Description | -|---|---|---| -| `desktop:install` | `npm run desktop:install` | Install Electron + electron-builder into `desktop/`; fetches `better-sqlite3` as a prebuilt Electron binary for Electron's ABI (no Visual Studio C++ toolchain needed in the common case; on macOS, Xcode CLI tools cover any fallback build). Preflights the native `better-sqlite3` build; on failure prints actionable per-OS setup help plus a no-toolchain alternative and exits non-zero (also enforced by the desktop `prebuild` gate) | -| `desktop:build` | `npm run desktop:build` | Prebuild guard + `tsc` → `desktop/out/` | -| `desktop:dev` | `npm run desktop:dev` | Build, then launch Electron against `out/main.js` | -| `desktop:test` | `npm run desktop:test` | Build, then run the smoke test (spawn Electron, probe `/api/health`) | -| `desktop:dmg` | `npm run desktop:dmg` | **macOS** — **both** per-arch DMGs (arm64 + x64) → `desktop/release/`. Correct for release. **Slower** (packages each arch). | -| `desktop:dmg:arm64` | `npm run desktop:dmg:arm64` | **macOS** — Apple-Silicon-only DMG → `desktop/release/`. **Fast (~1 min).** | -| `desktop:dmg:x64` | `npm run desktop:dmg:x64` | **macOS** — Intel-only DMG → `desktop/release/`. **Fast (~1 min).** | -| `desktop:win` | `npm run desktop:win` | **Windows** — NSIS installer `.exe` (x64) → `desktop/release/`. | -| `desktop:win:portable` | `npm run desktop:win:portable` | **Windows** — no-install portable `.exe` (x64) → `desktop/release/`. | - -> [!NOTE] -> Every `desktop:dmg*` / `desktop:win*` script chains `npm run build` first. Running `electron-builder` bare skips the TypeScript compile and fails with `entry file out/main.js does not exist`. `npm run clean` inside `desktop/` deletes `out/` and `release/` — after a clean you must `npm run desktop:build` again before packaging. - -> [!TIP] -> On macOS, building a DMG rebuilds the native `better-sqlite3` module for the **target** architecture, which can leave it built for the wrong CPU arch for your local machine. The desktop `prebuild` step auto-heals this — it rebuilds `better-sqlite3` for the local machine on the next `desktop:build` — so `npm run desktop:dev` and `npm run desktop:test` keep working after a cross-arch DMG build with no manual `npm run desktop:install` needed. - -**Hooks are auto-installed by the app.** On its first **owned-server** boot the desktop app writes the Claude Code hook configuration to `~/.claude/settings.json` itself, then starts the background services (update scheduler, `cc-watcher` config watcher, orphaned-run reconciliation) — the same `startBackgroundServices()` that `node server/index.js` runs. An install-only user (macOS or Windows) therefore never needs `npm run install-hooks` from a checkout: just **start a new Claude Code session** after the app is running. (If the app *adopts* an existing server instead of starting its own, that server already did its own hook bootstrap — see port adoption below.) - -**Port-adoption behavior.** When the desktop app launches, its embedded server picks a port: - -1. It prefers **`4820`**. -2. If a healthy dashboard server already answers `GET /api/health` on `4820` (for example you ran `npm start` in a terminal), the app **adopts that server** instead of double-binding — no SQLite contention. An adopted server is *not* owned by the app, so quitting the app leaves it running. -3. Otherwise it falls back to `4821`–`4829`, then to a random high port (`49152`–`49500`). - -The chosen port is shown in the tray menu. The embedded server also honors the dashboard env vars in [Environment variables](#environment-variables) (`DASHBOARD_PORT` is set automatically by the desktop host). - -**Data directory.** The packaged app stores its SQLite database and VAPID keys in a per-user app-data directory — `~/Library/Application Support/Claude Code Monitor/data/` on macOS, `%APPDATA%\Claude Code Monitor\data\` on Windows — **outside** the app bundle / install dir. The desktop host sets `DASHBOARD_DATA_DIR` to this per-user location automatically. Keeping writable state out of the bundle means a packaged, code-signed (and therefore read-only) `.app` never tries to write inside itself, and your imported history and events **survive app reinstalls and updates** (the Windows NSIS uninstaller keeps this data by default). (Older macOS builds kept the database inside the bundle, which broke History Import; after upgrading from a pre-fix build, re-run **Settings → Import History → Rescan** once to close the one-time data gap.) - -**`claude` CLI resolution.** A Finder/Dock-launched macOS app inherits only launchd's minimal `PATH`, not your login-shell `PATH`. So the app can find and spawn the `claude` CLI for the "Run Claude" feature, the desktop host recovers your login-shell `PATH` at startup. (On Windows the process already inherits the user `PATH`, so no recovery is needed.) If "Run Claude" still reports that `claude` is not on `PATH`, make sure `claude` is a real executable on your shell `PATH` — a shell alias or function cannot be spawned. - -**Auto-start at login.** Toggle *Open at Login* from the tray menu or the application menu. On macOS it registers via the first-party `SMAppService` API (Electron's `app.setLoginItemSettings`), so the entry appears under → *System Settings → General → Login Items*. On Windows it writes a per-user `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` entry, visible in *Task Manager → Startup*. When the app is launched at login, it starts **tray-only** — the dashboard window stays hidden until you click the tray icon. - -**Logs.** The Electron main process has no terminal when launched from Finder / the Start menu, so it writes to a per-user log file: - -``` -~/Library/Logs/Claude Code Monitor/desktop.log # macOS -%APPDATA%\Claude Code Monitor\logs\desktop.log # Windows -``` - -Open it from the tray menu → **Show Logs**. Set `CCAM_DESKTOP_VERBOSE=1` to also mirror `info`/`warn` lines to stdout when running via `npm run desktop:dev`. - -**Lifecycle reminder.** Closing the dashboard window only **hides** it — the server and tray keep running. **Quit** (⌘Q or tray → *Quit*) shuts the embedded server down gracefully and exits. Double-launching just focuses the existing window (single-instance lock); it never starts a second server. - --- ## Database @@ -607,48 +554,3 @@ If the build fails in Stage 1 with `better-sqlite3` errors, this is expected and - Ensure you are using the latest Dockerfile (it should use `node:22-alpine` and **not** install `python3`, `make`, or `g++`) - Run `docker build --no-cache -t agent-monitor .` to force a clean rebuild - Check that `package.json` has `better-sqlite3` under `optionalDependencies`, not `dependencies` - ---- - -### macOS desktop app — `npm run desktop:dmg` is slow - -This is expected. `desktop:dmg` compiles, packages, and ad-hoc-signs the app **twice** — once for `arm64`, once for `x64` — and emits **both** per-arch DMGs (`…-arm64.dmg` + `…-x64.dmg`). It does not merge them into a single universal binary; the two per-arch DMGs are what ship. Packaging two architectures back-to-back is what takes the time; it is not hung. - -For a build that targets your own Mac, use a single-arch command instead — it builds one architecture and finishes in roughly a minute: - -```bash -npm run desktop:dmg:arm64 # Apple Silicon -npm run desktop:dmg:x64 # Intel -``` - -CI already produces both DMGs — pulled either from the [latest GitHub Release](https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/releases/latest) (CI auto-publishes a `vX.Y.Z` when `package.json` is bumped on `master`) or from the per-commit `ClaudeCodeMonitor-dmg` workflow artifact — so you rarely need to build them locally. - ---- - -### Desktop app — `entry file out/main.js does not exist` - -You ran `electron-builder` without a TypeScript compile. `npm run clean` (in `desktop/`) deletes `out/`, and `electron-builder` only packages — it does not compile. Re-run `npm run desktop:build` first, or use a `desktop:dmg*` / `desktop:win*` script (each one chains `npm run build` for you). Never invoke `electron-builder` bare. - ---- - -### macOS desktop app — Gatekeeper blocks the app on first launch - -The DMG is **ad-hoc signed** by default (the project ships no paid Apple Developer ID), so macOS shows *"Apple could not verify…"* the first time you open the app. Strip the quarantine attribute: - -```bash -xattr -cr "/Applications/Claude Code Monitor.app" -``` - -Or open → *System Settings → Privacy & Security* and click *Open Anyway*. Real Developer ID signing and notarization are opt-in via the `CSC_LINK` / `CSC_KEY_PASSWORD` and `APPLE_ID` / `APPLE_TEAM_ID` / `APPLE_APP_SPECIFIC_PASSWORD` repository secrets — see [`DESKTOP.md`](./DESKTOP.md#notarization-for-the-maintainer). - ---- - -### Windows desktop app — SmartScreen blocks the app on first launch - -The Windows `.exe` (NSIS installer and portable build) is **unsigned** by default, so Windows SmartScreen shows *"Windows protected your PC"* the first time you run it. Click **More info → Run anyway**. Authenticode signing is opt-in via the `CSC_LINK` / `CSC_KEY_PASSWORD` repository secrets — CI picks them up automatically when provided. - ---- - -### Desktop app — no sessions appearing - -The desktop app installs hooks on its **first owned-server boot**, not before. After the app is running, start a **new** Claude Code session and confirm `~/.claude/settings.json` contains entries referencing `hook-handler.js`. If the app adopted an existing server on `4820`, that server's own hook configuration applies instead. For a blank dashboard window, check the desktop log (`~/Library/Logs/Claude Code Monitor/desktop.log` on macOS, `%APPDATA%\Claude Code Monitor\logs\desktop.log` on Windows) via tray → *Show Logs* and use tray → *Restart Server*. diff --git a/client/src/App.tsx b/client/src/App.tsx index 093a814..86f15ab 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -35,11 +35,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./components/Layout` * - `./components/SplashScreen` diff --git a/client/src/components/AgentCard.tsx b/client/src/components/AgentCard.tsx index 4c176ef..089204c 100644 --- a/client/src/components/AgentCard.tsx +++ b/client/src/components/AgentCard.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./StatusBadge` * - `../lib/types` diff --git a/client/src/components/AlertsNotifications.tsx b/client/src/components/AlertsNotifications.tsx index 719b474..d90818f 100644 --- a/client/src/components/AlertsNotifications.tsx +++ b/client/src/components/AlertsNotifications.tsx @@ -27,11 +27,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/components/Checkbox.tsx b/client/src/components/Checkbox.tsx index 93f8313..efeb090 100644 --- a/client/src/components/Checkbox.tsx +++ b/client/src/components/Checkbox.tsx @@ -31,11 +31,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `CheckboxProps` — exported API; see TSDoc on the symbol for behavior. * - `Checkbox` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/DateTimePicker.tsx b/client/src/components/DateTimePicker.tsx index 8fd4c05..3e9220a 100644 --- a/client/src/components/DateTimePicker.tsx +++ b/client/src/components/DateTimePicker.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `DateTimePicker` — exported API; see TSDoc on the symbol for behavior. * diff --git a/client/src/components/EmptyState.tsx b/client/src/components/EmptyState.tsx index 063c3c2..8f99f84 100644 --- a/client/src/components/EmptyState.tsx +++ b/client/src/components/EmptyState.tsx @@ -35,11 +35,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `EmptyStateProps` — exported API; see TSDoc on the symbol for behavior. * - `EmptyState` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/EventDetail.tsx b/client/src/components/EventDetail.tsx index a2ec15a..8951fc1 100644 --- a/client/src/components/EventDetail.tsx +++ b/client/src/components/EventDetail.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/types` * - `../lib/event-grouping` diff --git a/client/src/components/EventFilters.tsx b/client/src/components/EventFilters.tsx index 49e682f..f313320 100644 --- a/client/src/components/EventFilters.tsx +++ b/client/src/components/EventFilters.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `./DateTimePicker` diff --git a/client/src/components/EventFiltersInfo.tsx b/client/src/components/EventFiltersInfo.tsx index f7b7828..4a673a9 100644 --- a/client/src/components/EventFiltersInfo.tsx +++ b/client/src/components/EventFiltersInfo.tsx @@ -28,11 +28,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./StatusBadge` * diff --git a/client/src/components/FieldHelp.tsx b/client/src/components/FieldHelp.tsx index d093600..6f12ccf 100644 --- a/client/src/components/FieldHelp.tsx +++ b/client/src/components/FieldHelp.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `FieldHelpProps` — exported API; see TSDoc on the symbol for behavior. * - `FieldHelp` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/ImportHistory.tsx b/client/src/components/ImportHistory.tsx index 4151d11..7d1d76f 100644 --- a/client/src/components/ImportHistory.tsx +++ b/client/src/components/ImportHistory.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/components/Layout.tsx b/client/src/components/Layout.tsx index d6182c9..9b9c46e 100644 --- a/client/src/components/Layout.tsx +++ b/client/src/components/Layout.tsx @@ -35,11 +35,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./Sidebar` * - `./UpdateNotifier` diff --git a/client/src/components/RemoteSources.tsx b/client/src/components/RemoteSources.tsx index d98b097..3623586 100644 --- a/client/src/components/RemoteSources.tsx +++ b/client/src/components/RemoteSources.tsx @@ -30,11 +30,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/components/Select.tsx b/client/src/components/Select.tsx index 1104fad..cd1ffa0 100644 --- a/client/src/components/Select.tsx +++ b/client/src/components/Select.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `SelectOption` — exported API; see TSDoc on the symbol for behavior. * - `SelectProps` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/SessionCard.tsx b/client/src/components/SessionCard.tsx index 29851cc..2eb07b3 100644 --- a/client/src/components/SessionCard.tsx +++ b/client/src/components/SessionCard.tsx @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./StatusBadge` * - `../lib/types` diff --git a/client/src/components/SessionOverview.tsx b/client/src/components/SessionOverview.tsx index 03f0104..03fac9e 100644 --- a/client/src/components/SessionOverview.tsx +++ b/client/src/components/SessionOverview.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/components/Sidebar.tsx b/client/src/components/Sidebar.tsx index 40e0a2a..a7c53a3 100644 --- a/client/src/components/Sidebar.tsx +++ b/client/src/components/Sidebar.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/components/Skeleton.tsx b/client/src/components/Skeleton.tsx index 5657e41..347d781 100644 --- a/client/src/components/Skeleton.tsx +++ b/client/src/components/Skeleton.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `Skeleton` — exported API; see TSDoc on the symbol for behavior. * - `StatValueSkeleton` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/SplashScreen.tsx b/client/src/components/SplashScreen.tsx index b0cb762..f0774d1 100644 --- a/client/src/components/SplashScreen.tsx +++ b/client/src/components/SplashScreen.tsx @@ -27,11 +27,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `SplashScreen` — exported API; see TSDoc on the symbol for behavior. * diff --git a/client/src/components/StatCard.tsx b/client/src/components/StatCard.tsx index f8c51ab..b1ebc07 100644 --- a/client/src/components/StatCard.tsx +++ b/client/src/components/StatCard.tsx @@ -28,11 +28,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./Tip` * - `./Skeleton` diff --git a/client/src/components/StatusBadge.tsx b/client/src/components/StatusBadge.tsx index b312265..e37f576 100644 --- a/client/src/components/StatusBadge.tsx +++ b/client/src/components/StatusBadge.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/types` * - `./Tip` diff --git a/client/src/components/Tabby/CatAvatar.tsx b/client/src/components/Tabby/CatAvatar.tsx index ca6ac63..7c1802f 100644 --- a/client/src/components/Tabby/CatAvatar.tsx +++ b/client/src/components/Tabby/CatAvatar.tsx @@ -26,11 +26,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./brain` * diff --git a/client/src/components/Tabby/SpeechBubble.tsx b/client/src/components/Tabby/SpeechBubble.tsx index 87f9a4e..2c879c1 100644 --- a/client/src/components/Tabby/SpeechBubble.tsx +++ b/client/src/components/Tabby/SpeechBubble.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `SpeechBubble` — exported API; see TSDoc on the symbol for behavior. * diff --git a/client/src/components/Tabby/Tabby.tsx b/client/src/components/Tabby/Tabby.tsx index e3c0e0b..2c36fde 100644 --- a/client/src/components/Tabby/Tabby.tsx +++ b/client/src/components/Tabby/Tabby.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./CatAvatar` * - `./SpeechBubble` diff --git a/client/src/components/Tabby/TabbyPanel.tsx b/client/src/components/Tabby/TabbyPanel.tsx index 630e068..cbb7e86 100644 --- a/client/src/components/Tabby/TabbyPanel.tsx +++ b/client/src/components/Tabby/TabbyPanel.tsx @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./brain` * diff --git a/client/src/components/Tabby/brain.ts b/client/src/components/Tabby/brain.ts index 2872a47..631cb58 100644 --- a/client/src/components/Tabby/brain.ts +++ b/client/src/components/Tabby/brain.ts @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/Tabby/intents.ts b/client/src/components/Tabby/intents.ts index 7296e2b..db3d2d1 100644 --- a/client/src/components/Tabby/intents.ts +++ b/client/src/components/Tabby/intents.ts @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./brain` * diff --git a/client/src/components/Tabby/prefs.ts b/client/src/components/Tabby/prefs.ts index b2ea5be..54c83c8 100644 --- a/client/src/components/Tabby/prefs.ts +++ b/client/src/components/Tabby/prefs.ts @@ -22,11 +22,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `TabbyPos` — exported API; see TSDoc on the symbol for behavior. * - `tabbyPrefs` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/Tabby/quips.ts b/client/src/components/Tabby/quips.ts index 8e31220..9905496 100644 --- a/client/src/components/Tabby/quips.ts +++ b/client/src/components/Tabby/quips.ts @@ -22,11 +22,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./brain` * diff --git a/client/src/components/Tabby/useTabbyBrain.ts b/client/src/components/Tabby/useTabbyBrain.ts index 566471c..d1f7672 100644 --- a/client/src/components/Tabby/useTabbyBrain.ts +++ b/client/src/components/Tabby/useTabbyBrain.ts @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/eventBus` * - `../../lib/api` diff --git a/client/src/components/Tabby/useTabbyPosition.ts b/client/src/components/Tabby/useTabbyPosition.ts index 2f07f2f..8986772 100644 --- a/client/src/components/Tabby/useTabbyPosition.ts +++ b/client/src/components/Tabby/useTabbyPosition.ts @@ -25,11 +25,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./prefs` * diff --git a/client/src/components/Tip.tsx b/client/src/components/Tip.tsx index 6663458..191525c 100644 --- a/client/src/components/Tip.tsx +++ b/client/src/components/Tip.tsx @@ -32,11 +32,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `Tip` — exported API; see TSDoc on the symbol for behavior. * diff --git a/client/src/components/UpdateNotifier.tsx b/client/src/components/UpdateNotifier.tsx index 879365a..42d78ef 100644 --- a/client/src/components/UpdateNotifier.tsx +++ b/client/src/components/UpdateNotifier.tsx @@ -33,11 +33,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/components/WebhookSettings.tsx b/client/src/components/WebhookSettings.tsx index 8c366bf..0d177b5 100644 --- a/client/src/components/WebhookSettings.tsx +++ b/client/src/components/WebhookSettings.tsx @@ -27,11 +27,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `./Select` diff --git a/client/src/components/conversation/CodeBlock.tsx b/client/src/components/conversation/CodeBlock.tsx index 3ba1c61..15a8be6 100644 --- a/client/src/components/conversation/CodeBlock.tsx +++ b/client/src/components/conversation/CodeBlock.tsx @@ -22,11 +22,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/highlight` * diff --git a/client/src/components/conversation/ConversationView.tsx b/client/src/components/conversation/ConversationView.tsx index c0dbd41..d0b0570 100644 --- a/client/src/components/conversation/ConversationView.tsx +++ b/client/src/components/conversation/ConversationView.tsx @@ -25,11 +25,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/api` * - `../../lib/eventBus` diff --git a/client/src/components/conversation/MarkdownContent.tsx b/client/src/components/conversation/MarkdownContent.tsx index fd2fbec..e0dd8dd 100644 --- a/client/src/components/conversation/MarkdownContent.tsx +++ b/client/src/components/conversation/MarkdownContent.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./CodeBlock` * diff --git a/client/src/components/conversation/MessageList.tsx b/client/src/components/conversation/MessageList.tsx index bbb4f2a..d9ec352 100644 --- a/client/src/components/conversation/MessageList.tsx +++ b/client/src/components/conversation/MessageList.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * - `./ToolCallBlock` diff --git a/client/src/components/conversation/ToolCallBlock.tsx b/client/src/components/conversation/ToolCallBlock.tsx index a058bc5..9fdcb7d 100644 --- a/client/src/components/conversation/ToolCallBlock.tsx +++ b/client/src/components/conversation/ToolCallBlock.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * - `./CodeBlock` diff --git a/client/src/components/conversation/toolStyle.ts b/client/src/components/conversation/toolStyle.ts index 92780bd..253cd83 100644 --- a/client/src/components/conversation/toolStyle.ts +++ b/client/src/components/conversation/toolStyle.ts @@ -22,11 +22,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `ToolStyle` — exported API; see TSDoc on the symbol for behavior. * - `styleForTool` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/conversation/tuiSegments.ts b/client/src/components/conversation/tuiSegments.ts index 0ff9d5c..72c2cff 100644 --- a/client/src/components/conversation/tuiSegments.ts +++ b/client/src/components/conversation/tuiSegments.ts @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `TuiSegment` — exported API; see TSDoc on the symbol for behavior. * - `stripAnsi` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/event-views/primitives.tsx b/client/src/components/event-views/primitives.tsx index 5b31c1b..9be363d 100644 --- a/client/src/components/event-views/primitives.tsx +++ b/client/src/components/event-views/primitives.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `CopyButton` — exported API; see TSDoc on the symbol for behavior. * - `Terminal` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/event-views/tool-views.tsx b/client/src/components/event-views/tool-views.tsx index 5b06932..b8fbf60 100644 --- a/client/src/components/event-views/tool-views.tsx +++ b/client/src/components/event-views/tool-views.tsx @@ -36,11 +36,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./primitives` * diff --git a/client/src/components/webhookGuides.ts b/client/src/components/webhookGuides.ts index 3beb26b..74d2b6e 100644 --- a/client/src/components/webhookGuides.ts +++ b/client/src/components/webhookGuides.ts @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/types` * diff --git a/client/src/components/workflows/AgentCollaborationNetwork.tsx b/client/src/components/workflows/AgentCollaborationNetwork.tsx index c61fca8..e6bab79 100644 --- a/client/src/components/workflows/AgentCollaborationNetwork.tsx +++ b/client/src/components/workflows/AgentCollaborationNetwork.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `AgentCollaborationNetworkProps` — exported API; see TSDoc on the symbol for behavior. * - `AgentCollaborationNetwork` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/components/workflows/CompactionImpact.tsx b/client/src/components/workflows/CompactionImpact.tsx index bf2b298..09bcf17 100644 --- a/client/src/components/workflows/CompactionImpact.tsx +++ b/client/src/components/workflows/CompactionImpact.tsx @@ -25,11 +25,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/ConcurrencyTimeline.tsx b/client/src/components/workflows/ConcurrencyTimeline.tsx index ee89ad6..9ce2652 100644 --- a/client/src/components/workflows/ConcurrencyTimeline.tsx +++ b/client/src/components/workflows/ConcurrencyTimeline.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/ErrorPropagationMap.tsx b/client/src/components/workflows/ErrorPropagationMap.tsx index 0169f55..a271da4 100644 --- a/client/src/components/workflows/ErrorPropagationMap.tsx +++ b/client/src/components/workflows/ErrorPropagationMap.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/ModelDelegationFlow.tsx b/client/src/components/workflows/ModelDelegationFlow.tsx index bce5679..a93729a 100644 --- a/client/src/components/workflows/ModelDelegationFlow.tsx +++ b/client/src/components/workflows/ModelDelegationFlow.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * - `../../lib/format` diff --git a/client/src/components/workflows/OrchestrationDAG.tsx b/client/src/components/workflows/OrchestrationDAG.tsx index 71ca299..fb106f6 100644 --- a/client/src/components/workflows/OrchestrationDAG.tsx +++ b/client/src/components/workflows/OrchestrationDAG.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/SessionComplexityScatter.tsx b/client/src/components/workflows/SessionComplexityScatter.tsx index 2867f09..facc1d8 100644 --- a/client/src/components/workflows/SessionComplexityScatter.tsx +++ b/client/src/components/workflows/SessionComplexityScatter.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * - `../../lib/format` diff --git a/client/src/components/workflows/SessionDrillIn.tsx b/client/src/components/workflows/SessionDrillIn.tsx index 30c5fd6..66d2ed8 100644 --- a/client/src/components/workflows/SessionDrillIn.tsx +++ b/client/src/components/workflows/SessionDrillIn.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/api` * - `../../lib/format` diff --git a/client/src/components/workflows/SubagentEffectiveness.tsx b/client/src/components/workflows/SubagentEffectiveness.tsx index 36a1fee..f49a1f1 100644 --- a/client/src/components/workflows/SubagentEffectiveness.tsx +++ b/client/src/components/workflows/SubagentEffectiveness.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/ToolExecutionFlow.tsx b/client/src/components/workflows/ToolExecutionFlow.tsx index 01e7f90..df8e2b3 100644 --- a/client/src/components/workflows/ToolExecutionFlow.tsx +++ b/client/src/components/workflows/ToolExecutionFlow.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/WorkflowPatterns.tsx b/client/src/components/workflows/WorkflowPatterns.tsx index dd50f5c..58856b6 100644 --- a/client/src/components/workflows/WorkflowPatterns.tsx +++ b/client/src/components/workflows/WorkflowPatterns.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/components/workflows/WorkflowRunsPanel.tsx b/client/src/components/workflows/WorkflowRunsPanel.tsx index de8a631..92024b6 100644 --- a/client/src/components/workflows/WorkflowRunsPanel.tsx +++ b/client/src/components/workflows/WorkflowRunsPanel.tsx @@ -29,11 +29,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/api` * - `../../lib/eventBus` diff --git a/client/src/components/workflows/WorkflowStats.tsx b/client/src/components/workflows/WorkflowStats.tsx index 0b33c90..b2e9665 100644 --- a/client/src/components/workflows/WorkflowStats.tsx +++ b/client/src/components/workflows/WorkflowStats.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../lib/types` * diff --git a/client/src/hooks/useNotifications.ts b/client/src/hooks/useNotifications.ts index d9ab343..00cecc3 100644 --- a/client/src/hooks/useNotifications.ts +++ b/client/src/hooks/useNotifications.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../i18n` * - `../lib/eventBus` diff --git a/client/src/hooks/useWebSocket.ts b/client/src/hooks/useWebSocket.ts index ba2fb15..a3f0001 100644 --- a/client/src/hooks/useWebSocket.ts +++ b/client/src/hooks/useWebSocket.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/types` * - `../lib/eventBus` diff --git a/client/src/i18n/index.ts b/client/src/i18n/index.ts index 4e45a17..eacd09e 100644 --- a/client/src/i18n/index.ts +++ b/client/src/i18n/index.ts @@ -35,11 +35,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./locales/en/common.json` * - `./locales/vi/common.json` diff --git a/client/src/lib/api.ts b/client/src/lib/api.ts index 9204a12..268222e 100644 --- a/client/src/lib/api.ts +++ b/client/src/lib/api.ts @@ -78,11 +78,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./types` * - `./dataScope` diff --git a/client/src/lib/dataScope.ts b/client/src/lib/dataScope.ts index 7706c52..c10a60b 100644 --- a/client/src/lib/dataScope.ts +++ b/client/src/lib/dataScope.ts @@ -36,11 +36,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `ScopeMode` — exported API; see TSDoc on the symbol for behavior. * - `DataScope` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/lib/event-grouping.ts b/client/src/lib/event-grouping.ts index e89f51a..c0f1ab3 100644 --- a/client/src/lib/event-grouping.ts +++ b/client/src/lib/event-grouping.ts @@ -51,11 +51,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./types` * diff --git a/client/src/lib/event-summary.ts b/client/src/lib/event-summary.ts index 10993c5..5650201 100644 --- a/client/src/lib/event-summary.ts +++ b/client/src/lib/event-summary.ts @@ -47,11 +47,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./types` * diff --git a/client/src/lib/eventBus.ts b/client/src/lib/eventBus.ts index 10b6bc8..2ad6482 100644 --- a/client/src/lib/eventBus.ts +++ b/client/src/lib/eventBus.ts @@ -44,11 +44,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./types` * diff --git a/client/src/lib/format.ts b/client/src/lib/format.ts index 02596cd..e5c0b76 100644 --- a/client/src/lib/format.ts +++ b/client/src/lib/format.ts @@ -41,11 +41,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../i18n` * diff --git a/client/src/lib/highlight.ts b/client/src/lib/highlight.ts index 11fcf7a..8b197d8 100644 --- a/client/src/lib/highlight.ts +++ b/client/src/lib/highlight.ts @@ -61,11 +61,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `TokenType` — exported API; see TSDoc on the symbol for behavior. * - `Token` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/lib/push.ts b/client/src/lib/push.ts index 9678aa6..e97c16e 100644 --- a/client/src/lib/push.ts +++ b/client/src/lib/push.ts @@ -40,11 +40,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `subscribeToPush` — exported API; see TSDoc on the symbol for behavior. * - `unsubscribeFromPush` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/lib/types.ts b/client/src/lib/types.ts index 6d2291a..a65d90c 100644 --- a/client/src/lib/types.ts +++ b/client/src/lib/types.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `SessionStatus` — exported API; see TSDoc on the symbol for behavior. * - `AgentStatus` — exported API; see TSDoc on the symbol for behavior. diff --git a/client/src/main.tsx b/client/src/main.tsx index e6cc151..b189bd9 100644 --- a/client/src/main.tsx +++ b/client/src/main.tsx @@ -33,11 +33,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./App` * diff --git a/client/src/pages/ActivityFeed.tsx b/client/src/pages/ActivityFeed.tsx index aeba781..a224b0c 100644 --- a/client/src/pages/ActivityFeed.tsx +++ b/client/src/pages/ActivityFeed.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/Analytics.tsx b/client/src/pages/Analytics.tsx index 686a8f4..2e0cb98 100644 --- a/client/src/pages/Analytics.tsx +++ b/client/src/pages/Analytics.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/CcConfig.tsx b/client/src/pages/CcConfig.tsx index 4c42c83..6596a16 100644 --- a/client/src/pages/CcConfig.tsx +++ b/client/src/pages/CcConfig.tsx @@ -27,11 +27,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/eventBus` * - `../lib/api` diff --git a/client/src/pages/Dashboard.tsx b/client/src/pages/Dashboard.tsx index 53c2f69..e7e2146 100644 --- a/client/src/pages/Dashboard.tsx +++ b/client/src/pages/Dashboard.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/KanbanBoard.tsx b/client/src/pages/KanbanBoard.tsx index 3cd98f8..8d47d3c 100644 --- a/client/src/pages/KanbanBoard.tsx +++ b/client/src/pages/KanbanBoard.tsx @@ -24,11 +24,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/NotFound.tsx b/client/src/pages/NotFound.tsx index 9336efc..b61553d 100644 --- a/client/src/pages/NotFound.tsx +++ b/client/src/pages/NotFound.tsx @@ -26,11 +26,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `NotFound` — exported API; see TSDoc on the symbol for behavior. * diff --git a/client/src/pages/SessionDetail.tsx b/client/src/pages/SessionDetail.tsx index e94a521..d5e9c8f 100644 --- a/client/src/pages/SessionDetail.tsx +++ b/client/src/pages/SessionDetail.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/Sessions.tsx b/client/src/pages/Sessions.tsx index ef255db..bf88242 100644 --- a/client/src/pages/Sessions.tsx +++ b/client/src/pages/Sessions.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/Settings.tsx b/client/src/pages/Settings.tsx index dc8206f..350ff86 100644 --- a/client/src/pages/Settings.tsx +++ b/client/src/pages/Settings.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/client/src/pages/Workflows.tsx b/client/src/pages/Workflows.tsx index 13f8456..bdb7593 100644 --- a/client/src/pages/Workflows.tsx +++ b/client/src/pages/Workflows.tsx @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../lib/api` * - `../lib/eventBus` diff --git a/deployments/README.md b/deployments/README.md deleted file mode 100644 index a2d241a..0000000 --- a/deployments/README.md +++ /dev/null @@ -1,559 +0,0 @@ -# Deployments - -Production-ready, cloud-agnostic deployment infrastructure for the Claude Code Agent Monitor. Supports AWS, GCP, Azure, and OCI with Helm, Kustomize, and Terraform deployment methods, blue-green and canary release strategies, and full observability. - -![Claude Code](https://img.shields.io/badge/Claude_Code-orange?style=flat-square&logo=claude&logoColor=white) -![Terraform](https://img.shields.io/badge/Terraform-%3E%3D1.5-844FBA?style=flat-square&logo=terraform&logoColor=white) -![Kubernetes](https://img.shields.io/badge/Kubernetes-%3E%3D1.24-326CE5?style=flat-square&logo=kubernetes&logoColor=white) -![Helm](https://img.shields.io/badge/Helm-3-0F1689?style=flat-square&logo=helm&logoColor=white) -![Kustomize](https://img.shields.io/badge/Kustomize-5.0-326CE5?style=flat-square&logo=kubernetes&logoColor=white) -![Prometheus](https://img.shields.io/badge/Prometheus-2.x-E6522C?style=flat-square&logo=prometheus&logoColor=white) -![Grafana](https://img.shields.io/badge/Grafana-10.x-F46800?style=flat-square&logo=grafana&logoColor=white) -![Nginx](https://img.shields.io/badge/Nginx-Ingress-009639?style=flat-square&logo=nginx&logoColor=white) -![Coralogix](https://img.shields.io/badge/Coralogix-Observability-1a1a2e?style=flat-square&logo=datadog&logoColor=white) -![OpenTelemetry](https://img.shields.io/badge/OpenTelemetry-Collector-4f46e5?style=flat-square&logo=opentelemetry&logoColor=white) -![AWS](https://img.shields.io/badge/AWS-ECS%20%7C%20RDS-232F3E?style=flat-square&logo=task&logoColor=white) -![Google Cloud](https://img.shields.io/badge/Google_Cloud-GKE%20%7C%20SQL-4285F4?style=flat-square&logo=googlecloud&logoColor=white) -![Azure](https://img.shields.io/badge/Azure-AKS%20%7C%20SQL-0078D4?style=flat-square&logo=cloudflare&logoColor=white) -![Oracle Cloud](https://img.shields.io/badge/Oracle_Cloud-OKE%20%7C%20DB-F80000?style=flat-square&logo=cloudways&logoColor=white) -![GitLab CI](https://img.shields.io/badge/GitLab_CI-pipelines-FC6D26?style=flat-square&logo=gitlab&logoColor=white) -![Make](https://img.shields.io/badge/Make-4.3-000000?style=flat-square&logo=make&logoColor=white) -![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-pipelines-2088FF?style=flat-square&logo=githubactions&logoColor=white) -![VS Code](https://img.shields.io/badge/VS_Code-Extension-007ACC?style=flat-square&logo=vscodium&logoColor=white) - -> **User-facing guide:** See [DEPLOYMENT.md](../DEPLOYMENT.md) in the project root for the step-by-step deployment guide with commands and workflows. -> -> This README is the **technical reference** for the infrastructure code in this directory. - ---- - -## Infrastructure Architecture - -```mermaid -graph TB - subgraph "deployments/" - direction TB - - subgraph "Infrastructure Provisioning" - TF["terraform/
Cloud resource provisioning
AWS · GCP · Azure · OCI"] - end - - subgraph "Application Deployment" - HELM["helm/
Parameterized Helm chart
12 templates · 4 value sets"] - KUST["kubernetes/
Kustomize base + overlays
11 resources · 3 envs"] - end - - subgraph "Operations" - SCRIPTS["scripts/
7 operational scripts
deploy · rollback · backup"] - CI["ci/
GitHub Actions + GitLab CI
Build · Scan · Deploy"] - end - - subgraph "Observability" - MON["monitoring/
Prometheus · Grafana · Alertmanager · Coralogix
13 rules · 16 panels · OTel Collector"] - end - end - - TF -->|"Provisions cloud infra"| HELM & KUST - SCRIPTS -->|"Orchestrates"| HELM & KUST & TF - CI -->|"Automates"| SCRIPTS - MON -->|"Monitors"| HELM & KUST - - style TF fill:#7b42bc,color:#fff - style HELM fill:#0f1689,color:#fff - style KUST fill:#326ce5,color:#fff - style SCRIPTS fill:#4caf50,color:#fff - style CI fill:#2088ff,color:#fff - style MON fill:#e6522c,color:#fff -``` - -## Directory Structure - -``` -deployments/ -├── terraform/ # Infrastructure as Code (HashiCorp Terraform) -│ ├── main.tf # Root module — orchestrates all child modules -│ ├── variables.tf # Input variables with validation -│ ├── outputs.tf # Exported values (URLs, IDs, endpoints) -│ ├── versions.tf # Terraform + provider version constraints -│ ├── backend.tf # State backends (S3, GCS, Azure Blob, OCI S3) -│ ├── modules/ # Reusable, cloud-agnostic modules -│ │ ├── networking/ # VPC, subnets, security groups, NAT -│ │ ├── compute/ # Container orchestration (ECS/Cloud Run/ACI/OKE) -│ │ ├── database/ # Persistent storage for SQLite (EFS/Filestore/Azure Files/FSS) -│ │ ├── loadbalancer/ # Application LB with WebSocket + blue-green weighted routing -│ │ ├── monitoring/ # Metrics, logs, alerts, dashboards -│ │ └── secrets/ # Vault integration or cloud-native secret stores -│ ├── providers/ # Cloud-specific root configurations -│ │ ├── aws/ # ECS Fargate + ALB + EFS + CloudWatch -│ │ ├── gcp/ # Cloud Run + GCLB + Filestore + Cloud Monitoring -│ │ ├── azure/ # ACI + App Gateway + Azure Files + Azure Monitor -│ │ └── oci/ # OKE + LBaaS + FSS + OCI Monitoring -│ └── environments/ # Per-environment variable overrides -│ ├── dev/ # 1 replica, 256 CPU, monitoring off -│ ├── staging/ # 2 replicas, 512 CPU, monitoring on -│ └── production/ # 3 replicas, 1024 CPU, HA, blue-green -├── kubernetes/ # Kubernetes-native manifests (Kustomize) -│ ├── base/ # 11 shared base resources -│ ├── overlays/ # Environment-specific patches -│ │ ├── dev/ -│ │ ├── staging/ -│ │ └── production/ -│ ├── strategies/ # Advanced deployment patterns -│ │ ├── blue-green/ # Zero-downtime slot switching -│ │ └── canary/ # Progressive traffic shifting -│ └── components/ # Optional add-ons (Kustomize components) -│ ├── mcp-sidecar/ # MCP server as a sidecar container -│ └── monitoring/ # Prometheus ServiceMonitor -├── helm/ # Helm chart (alternative to Kustomize) -│ └── agent-monitor/ -│ ├── templates/ # Kubernetes resource templates -│ ├── values.yaml # Default values -│ ├── values-dev.yaml -│ ├── values-staging.yaml -│ └── values-production.yaml -├── scripts/ # Operational shell scripts -│ ├── deploy.sh # Main deployment orchestrator -│ ├── rollback.sh # Rollback to previous revision -│ ├── blue-green-switch.sh # Switch active blue/green slot -│ ├── health-check.sh # Comprehensive health verification -│ ├── db-backup.sh # SQLite backup (local + cloud upload) -│ ├── db-restore.sh # SQLite restore from backup -│ └── teardown.sh # Full environment teardown -├── monitoring/ # Observability stack configs -│ ├── prometheus/ # Scrape config + alert rules -│ ├── grafana/ # Dashboards + datasources -│ ├── alertmanager/ # Alert routing (Slack, PagerDuty, email) -│ └── coralogix/ # Full-stack observability (logs, metrics, traces, SLOs) -└── ci/ # CI/CD pipeline definitions - ├── github-actions/ # GitHub Actions workflows - └── gitlab-ci/ # GitLab CI pipeline -``` - -## Architecture Overview - -```mermaid -graph TB - subgraph Internet - USER["Users / API Clients"] - end - - subgraph Cloud["Cloud Provider (AWS / GCP / Azure / OCI)"] - LB["Load Balancer
TLS termination
WebSocket upgrade
Blue/Green routing"] - - subgraph Cluster["Container Cluster"] - subgraph Blue["Blue Slot"] - B1["agent-monitor:blue"] - B_MCP["mcp-sidecar:blue"] - end - subgraph Green["Green Slot"] - G1["agent-monitor:green"] - G_MCP["mcp-sidecar:green"] - end - end - - PV["Persistent Volume
(EFS / Filestore / Azure Files / FSS)"] - SECRETS["Secret Store
(Vault / Secrets Manager)"] - MON["Monitoring
(Prometheus / Grafana)"] - OTEL["OTel Collector
(Coralogix)"] - end - - USER -->|HTTPS + WSS| LB - LB -->|active slot| Blue - LB -.->|standby| Green - B1 --> PV - G1 --> PV - B1 --> SECRETS - B_MCP -->|localhost:4820| B1 - G_MCP -->|localhost:4820| G1 - MON -->|scrape /api/health| Blue - MON -->|scrape /api/health| Green - Blue -->|logs + metrics| OTEL - Green -->|logs + metrics| OTEL - - style Blue fill:#2563eb,stroke:#3b82f6,color:#fff - style Green fill:#16a34a,stroke:#22c55e,color:#fff - style LB fill:#7c3aed,stroke:#a78bfa,color:#fff -``` - -## Quick Start - -### Option A: Helm (recommended for Kubernetes) - -```bash -# Dev -helm install agent-monitor ./deployments/helm/agent-monitor \ - -f ./deployments/helm/agent-monitor/values-dev.yaml \ - -n agent-monitor --create-namespace - -# Production -helm install agent-monitor ./deployments/helm/agent-monitor \ - -f ./deployments/helm/agent-monitor/values-production.yaml \ - -n agent-monitor --create-namespace -``` - -### Option B: Kustomize - -```bash -# Dev -kubectl apply -k ./deployments/kubernetes/overlays/dev - -# Production -kubectl apply -k ./deployments/kubernetes/overlays/production -``` - -### Option C: Terraform (full infra + app) - -```bash -cd deployments/terraform/providers/aws # or gcp, azure, oci -terraform init -terraform plan -var-file=../../environments/production/terraform.tfvars -terraform apply -var-file=../../environments/production/terraform.tfvars -``` - -### Option D: Script orchestrator - -```bash -./deployments/scripts/deploy.sh --env production --method helm --strategy rolling -``` - -## Deployment Strategies - -### Rolling Update (default) - -Zero-downtime rolling replacement. One pod at a time is replaced with the new version. - -```bash -./deployments/scripts/deploy.sh --env production --method helm --strategy rolling -``` - -### Blue-Green - -Two identical environments. Traffic switches instantly from blue to green after validation. - -```mermaid -sequenceDiagram - participant Ops as Operator - participant LB as Load Balancer - participant Blue as Blue Slot (current) - participant Green as Green Slot (new) - - Ops->>Green: Deploy new version - Ops->>Green: Run health checks - Green-->>Ops: Healthy ✔ - Ops->>LB: Switch traffic → Green - LB-->>Blue: Drain connections - LB-->>Green: Route all traffic - Note over Blue: Keep as rollback target -``` - -```bash -# Deploy to inactive slot -./deployments/scripts/deploy.sh --env production --method helm --strategy blue-green - -# Switch traffic -./deployments/scripts/blue-green-switch.sh --env production --target green - -# Instant rollback -./deployments/scripts/blue-green-switch.sh --env production --target blue -``` - -### Canary - -Progressive traffic shifting with automated analysis. Rolls back on metric degradation. - -```bash -./deployments/scripts/deploy.sh --env production --method helm --strategy canary -``` - -## Cloud Provider Comparison - -| Feature | AWS | GCP | Azure | OCI | -|---|---|---|---|---| -| Compute | ECS Fargate | Cloud Run / GKE | ACI / AKS | OKE | -| Load Balancer | ALB | GCLB | App Gateway | LBaaS | -| Persistent Storage | EFS | Filestore | Azure Files | FSS | -| Secrets | Secrets Manager | Secret Manager | Key Vault | Vault | -| Monitoring | CloudWatch | Cloud Monitoring | Azure Monitor | OCI Monitoring | -| DNS | Route 53 | Cloud DNS | Azure DNS | OCI DNS | -| TLS Certs | ACM | Managed Certs | App Gateway Certs | Certificates | - -## Operations - -### Health Checks - -```bash -./deployments/scripts/health-check.sh --url https://monitor.example.com -./deployments/scripts/health-check.sh --url http://localhost:4820 --retries 30 -``` - -### Backup & Restore - -```bash -# Backup SQLite database -./deployments/scripts/db-backup.sh --env production --output ./backups/ -./deployments/scripts/db-backup.sh --env production --upload s3://my-bucket/backups/ - -# Restore from backup -./deployments/scripts/db-restore.sh --env production --input ./backups/dashboard-20240101.db -``` - -### Rollback - -```bash -# Helm rollback -./deployments/scripts/rollback.sh --env production --method helm --revision 3 - -# Kubernetes rollback -./deployments/scripts/rollback.sh --env production --method kustomize -``` - -### Teardown - -```bash -./deployments/scripts/teardown.sh --env dev --method helm -``` - -## Monitoring - -The monitoring stack provides: - -- **Prometheus** scrape configuration and alert rules -- **Grafana** dashboard with request rate, latency, errors, WebSocket connections, resource usage -- **Alertmanager** routing to Slack, PagerDuty, and email -- **Coralogix** full-stack observability with log analytics (DataPrime), metrics, distributed tracing, SLO tracking, and error budget management via OpenTelemetry Collector - -```mermaid -graph LR - APP["agent-monitor pods"] -->|metrics| PROM["Prometheus"] - APP -->|"logs + metrics"| OTEL["OTel Collector"] - PROM -->|query| GRAF["Grafana Dashboards"] - PROM -->|evaluate rules| AM["Alertmanager"] - OTEL -->|"OTLP gRPC"| CX["Coralogix"] - AM -->|critical| PD["PagerDuty"] - AM -->|warning| SLACK["Slack"] - AM -->|info| EMAIL["Email"] - CX -->|alerts| PD - CX -->|alerts| SLACK - - style PROM fill:#e6522c,stroke:#e6522c,color:#fff - style GRAF fill:#f46800,stroke:#f46800,color:#fff - style AM fill:#e6522c,stroke:#e6522c,color:#fff - style CX fill:#1a1a2e,stroke:#1a1a2e,color:#fff - style OTEL fill:#4f46e5,stroke:#4f46e5,color:#fff -``` - -Deploy the monitoring stack: - -```bash -# Apply Prometheus rules -kubectl apply -f ./deployments/monitoring/prometheus/rules/ - -# Import Grafana dashboard -# Upload monitoring/grafana/dashboards/agent-monitor.json via Grafana UI or API - -# Apply Alertmanager config -kubectl create secret generic alertmanager-config \ - --from-file=./deployments/monitoring/alertmanager/alertmanager.yaml - -# Deploy Coralogix OTel Collector (optional) -helm repo add coralogix https://cgx.jfrog.io/artifactory/coralogix-charts-virtual -kubectl create secret generic coralogix-keys \ - --namespace agent-monitor \ - --from-literal=PRIVATE_KEY= -helm install coralogix-otel coralogix/opentelemetry \ - --namespace agent-monitor \ - -f ./deployments/monitoring/coralogix/values.yaml -``` - -## CI/CD - -### GitHub Actions - -Three workflows are provided: - -| Workflow | Trigger | Purpose | -|---|---|---| -| `ci.yaml` | Push/PR to main | Lint, test, build, security scan | -| `deploy.yaml` | Tag `v*` or manual | Build → staging (auto) → production (manual) | -| `rollback.yaml` | Manual dispatch | Rollback to a specific revision | - -### GitLab CI - -Single `.gitlab-ci.yml` covering all stages from test through production deploy. - -## Environment Variables - -| Variable | Default | Description | -|---|---|---| -| `IMAGE_REGISTRY` | — | Container image registry URL | -| `IMAGE_TAG` | `latest` | Container image tag | -| `DASHBOARD_PORT` | `4820` | Dashboard API + UI port | -| `NODE_ENV` | `production` | Node.js environment | -| `MCP_TRANSPORT` | `stdio` | MCP transport mode (stdio/http/repl) | -| `MCP_HTTP_PORT` | `8819` | MCP HTTP server port | -| `TLS_CERT_ARN` | — | TLS certificate ARN/ID (cloud-specific) | -| `DOMAIN` | — | Public domain for ingress/DNS | - ---- - -## Terraform Module Reference - -The Terraform infrastructure is organized as reusable modules that work across all four cloud providers. - -### Module Dependency Chain - -```mermaid -graph LR - NET[networking/] --> DB[database/] - NET --> COMP[compute/] - NET --> LB[loadbalancer/] - DB --> COMP - COMP --> LB - COMP --> MON[monitoring/] - LB --> MON - - style NET fill:#42a5f5,color:#fff - style DB fill:#66bb6a,color:#fff - style COMP fill:#ffa726,color:#fff - style LB fill:#ab47bc,color:#fff - style MON fill:#ef5350,color:#fff -``` - -### networking/ - -Provisions the cloud network foundation. - -| Output | Description | -|--------|-------------| -| `vpc_id` | VPC / VNet / VCN identifier | -| `public_subnet_ids` | Subnets for load balancers | -| `private_subnet_ids` | Subnets for containers | -| `storage_security_group_ids` | SG allowing NFS (port 2049) | - -### database/ - -Provisions persistent storage for SQLite data. - -| Provider | Service | Encryption | -|----------|---------|:----------:| -| AWS | EFS (Elastic File System) | AES-256 at rest + TLS in transit | -| GCP | Filestore (NFS) | Google-managed | -| Azure | Azure Files (SMB/NFS) | SSE with platform key | -| OCI | File Storage Service (NFS) | Oracle-managed | - -### compute/ - -Provisions dual blue/green container slots with auto-scaling. - -| Provider | Service | Container Runtime | -|----------|---------|-------------------| -| AWS | ECS Fargate | Docker | -| GCP | Cloud Run v2 | Docker | -| Azure | Container Instances | Docker | -| OCI | Container Instances / OKE | Docker | - -### loadbalancer/ - -Provisions the application load balancer with TLS termination and WebSocket support. - -| Feature | Implementation | -|---------|---------------| -| TLS | TLS 1.3 minimum policy | -| WebSocket | Sticky sessions (cookie/ClientIP) | -| Blue-green | Weighted target groups (0-100) | -| Health checks | HTTP GET `/api/health` every 30s | -| Idle timeout | 300s (for long-lived WebSocket) | - -### monitoring/ - -Provisions cloud-native monitoring and alerting, with optional Coralogix full-stack observability. - -| Provider | Metrics | Alarms | Logs | -|----------|---------|--------|------| -| AWS | CloudWatch | SNS → Email | CloudWatch Logs | -| GCP | Cloud Monitoring | Notification Channel | Cloud Logging | -| Azure | Azure Monitor | Action Group | Log Analytics | -| OCI | OCI Monitoring | Notification Topic | OCI Logging | -| Coralogix | PromQL + Recording Rules | Coralogix Alerts → PagerDuty/Slack | DataPrime Log Analytics | - -### Root Variables - -Key variables defined in `terraform/variables.tf`: - -| Variable | Type | Validation | Description | -|----------|------|-----------|-------------| -| `cloud_provider` | string | `aws\|gcp\|azure\|oci` | Target cloud | -| `environment` | string | `dev\|staging\|production` | Deployment tier | -| `vpc_cidr` | string | Valid CIDR | Network address space | -| `cpu` | number | `256\|512\|1024\|2048\|4096` | CPU units per container | -| `deployment_strategy` | string | `rolling\|blue-green\|canary` | Release strategy | -| `blue_weight` / `green_weight` | number | `0-100` | Traffic distribution | - ---- - -## Kubernetes Security Posture - -All Kubernetes manifests enforce the **Restricted Pod Security Standard**: - -```mermaid -graph TB - subgraph "Namespace" - NS["pod-security.kubernetes.io/enforce: restricted"] - end - - subgraph "Pod Security Context" - PSC1[runAsNonRoot: true] - PSC2[runAsUser: 1000] - PSC3[fsGroup: 1000] - PSC4["seccompProfile: RuntimeDefault"] - end - - subgraph "Container Security Context" - CSC1[readOnlyRootFilesystem: true] - CSC2[allowPrivilegeEscalation: false] - CSC3["capabilities.drop: ALL"] - CSC4[automountServiceAccountToken: false] - end - - NS --> PSC1 & PSC2 & PSC3 & PSC4 - PSC1 --> CSC1 & CSC2 & CSC3 & CSC4 - - style NS fill:#f44336,color:#fff -``` - ---- - -## Data Flow - -```mermaid -sequenceDiagram - participant User as Browser - participant LB as Load Balancer - participant App as Dashboard Pod - participant DB as SQLite (PV) - participant WS as WebSocket - participant Hook as Claude Code Hook - - Hook->>App: POST /api/hooks/event - App->>DB: INSERT event - App->>WS: broadcast(new_event) - WS->>User: WebSocket message - - User->>LB: GET /api/sessions - LB->>App: Forward (sticky session) - App->>DB: SELECT sessions - App->>LB: JSON response - LB->>User: HTTPS response - - User->>LB: WSS upgrade - LB->>App: WebSocket handshake - App->>User: Real-time events -``` - ---- - -## Related Documentation - -- [DEPLOYMENT.md](../DEPLOYMENT.md) — Step-by-step deployment guide with workflows -- [terraform/README.md](./terraform/README.md) — Terraform module details -- [kubernetes/README.md](./kubernetes/README.md) — Kustomize overlay guide diff --git a/deployments/ci/github-actions/ci.yaml b/deployments/ci/github-actions/ci.yaml deleted file mode 100644 index b2c2e57..0000000 --- a/deployments/ci/github-actions/ci.yaml +++ /dev/null @@ -1,250 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GitHub Actions CI Pipeline – Claude Code Agent Monitor -# -# Triggers on push to main and PRs. Runs linting, tests, builds Docker -# images, and scans for security vulnerabilities. -# ───────────────────────────────────────────────────────────────────────────── -name: CI - -on: - push: - branches: [main] - pull_request: - branches: [main] - -permissions: - contents: read - packages: write - security-events: write - -concurrency: - group: ci-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_VERSION: "22" - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }}/agent-monitor - MCP_IMAGE_NAME: ${{ github.repository }}/agent-monitor-mcp - -jobs: - # ── Lint & Format Check ───────────────────────────────────────────────── - lint: - name: Lint & Format - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "npm" - - - name: Install dependencies - run: npm ci - - - name: Check formatting - run: npm run format:check - - # ── Server Tests ──────────────────────────────────────────────────────── - test-server: - name: Server Tests - runs-on: ubuntu-latest - needs: lint - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "npm" - - - name: Install dependencies - run: npm ci - - - name: Run server tests - run: npm run test:server - - # ── Client Tests ──────────────────────────────────────────────────────── - test-client: - name: Client Tests - runs-on: ubuntu-latest - needs: lint - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "npm" - - - name: Install root dependencies - run: npm ci - - - name: Install client dependencies - run: cd client && npm ci - - - name: Run client tests - run: npm run test:client - - # ── MCP Tests ─────────────────────────────────────────────────────────── - test-mcp: - name: MCP Sidecar Tests - runs-on: ubuntu-latest - needs: lint - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "npm" - - - name: Install MCP dependencies - run: npm run mcp:install - - - name: Type check MCP - run: npm run mcp:typecheck - - - name: Run MCP tests - run: npm run mcp:test - - # ── Build Docker Images ──────────────────────────────────────────────── - build-image: - name: Build Docker Images - runs-on: ubuntu-latest - needs: [test-server, test-client, test-mcp] - # Only push images on main branch - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - outputs: - image-tag: ${{ steps.meta.outputs.version }} - image-digest: ${{ steps.build-app.outputs.digest }} - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (app) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=branch - type=sha,prefix=sha- - type=raw,value=latest,enable={{is_default_branch}} - type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - - name: Build & push app image - id: build-app - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64 - - - name: Extract metadata (MCP) - id: meta-mcp - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.MCP_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=sha,prefix=sha- - type=raw,value=latest,enable={{is_default_branch}} - - - name: Build & push MCP image - id: build-mcp - uses: docker/build-push-action@v5 - with: - context: . - file: ./mcp/Dockerfile - push: true - tags: ${{ steps.meta-mcp.outputs.tags }} - labels: ${{ steps.meta-mcp.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64 - - # ── Security Scan ────────────────────────────────────────────────────── - security-scan: - name: Security Scan - runs-on: ubuntu-latest - needs: build-image - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Login to Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Run Trivy vulnerability scanner (app) - uses: aquasecurity/trivy-action@master - with: - image-ref: "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.build-image.outputs.image-tag }}" - format: "sarif" - output: "trivy-app-results.sarif" - severity: "CRITICAL,HIGH" - exit-code: "1" - - - name: Run Trivy vulnerability scanner (MCP) - uses: aquasecurity/trivy-action@master - with: - image-ref: "${{ env.REGISTRY }}/${{ env.MCP_IMAGE_NAME }}:${{ needs.build-image.outputs.image-tag }}" - format: "sarif" - output: "trivy-mcp-results.sarif" - severity: "CRITICAL,HIGH" - exit-code: "1" - - - name: Upload Trivy SARIF (app) - uses: github/codeql-action/upload-sarif@v3 - if: always() - with: - sarif_file: "trivy-app-results.sarif" - category: "trivy-app" - - - name: Upload Trivy SARIF (MCP) - uses: github/codeql-action/upload-sarif@v3 - if: always() - with: - sarif_file: "trivy-mcp-results.sarif" - category: "trivy-mcp" - - - name: Run npm audit - run: npm audit --production --audit-level=high - - - name: Trivy filesystem scan (IaC) - uses: aquasecurity/trivy-action@master - with: - scan-type: "fs" - scan-ref: "./deployments" - format: "table" - severity: "CRITICAL,HIGH" - exit-code: "1" diff --git a/deployments/ci/github-actions/deploy.yaml b/deployments/ci/github-actions/deploy.yaml deleted file mode 100644 index d182ec7..0000000 --- a/deployments/ci/github-actions/deploy.yaml +++ /dev/null @@ -1,335 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GitHub Actions Deploy Pipeline – Claude Code Agent Monitor -# -# Triggers on version tags and manual dispatch. Deploys to staging -# automatically and to production after manual approval. -# ───────────────────────────────────────────────────────────────────────────── -name: Deploy - -on: - push: - tags: - - "v*" - workflow_dispatch: - inputs: - environment: - description: "Target environment" - required: true - type: choice - options: - - staging - - production - image_tag: - description: "Image tag to deploy (default: latest from main)" - required: false - type: string - -permissions: - contents: read - packages: read - id-token: write # For OIDC cloud auth - -concurrency: - group: deploy-${{ github.event.inputs.environment || 'staging' }} - cancel-in-progress: false - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }}/agent-monitor - MCP_IMAGE_NAME: ${{ github.repository }}/agent-monitor-mcp - HELM_CHART_PATH: deployments/helm/agent-monitor - -jobs: - # ── Resolve image tag ────────────────────────────────────────────────── - prepare: - name: Prepare Deployment - runs-on: ubuntu-latest - outputs: - image-tag: ${{ steps.resolve.outputs.tag }} - version: ${{ steps.resolve.outputs.version }} - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Resolve image tag - id: resolve - run: | - if [[ -n "${{ github.event.inputs.image_tag }}" ]]; then - TAG="${{ github.event.inputs.image_tag }}" - elif [[ "${{ github.ref_type }}" == "tag" ]]; then - TAG="${{ github.ref_name }}" - else - TAG="sha-$(git rev-parse --short HEAD)" - fi - echo "tag=${TAG}" >> "$GITHUB_OUTPUT" - echo "version=${TAG#v}" >> "$GITHUB_OUTPUT" - echo "Resolved image tag: ${TAG}" - - # ── Build (if triggered by tag) ──────────────────────────────────────── - build: - name: Build Images - runs-on: ubuntu-latest - needs: prepare - if: github.ref_type == 'tag' - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build & push app image - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - push: true - tags: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.prepare.outputs.image-tag }} - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64 - - - name: Build & push MCP image - uses: docker/build-push-action@v5 - with: - context: . - file: ./mcp/Dockerfile - push: true - tags: | - ${{ env.REGISTRY }}/${{ env.MCP_IMAGE_NAME }}:${{ needs.prepare.outputs.image-tag }} - ${{ env.REGISTRY }}/${{ env.MCP_IMAGE_NAME }}:latest - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64 - - # ── Deploy to Staging ────────────────────────────────────────────────── - deploy-staging: - name: Deploy to Staging - runs-on: ubuntu-latest - needs: [prepare, build] - if: | - always() && - needs.prepare.result == 'success' && - (needs.build.result == 'success' || needs.build.result == 'skipped') && - (github.event.inputs.environment == 'staging' || github.event.inputs.environment == '' || github.ref_type == 'tag') - environment: - name: staging - url: https://staging.agent-monitor.example.com - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Configure AWS credentials (OIDC) - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN_STAGING }} - aws-region: ${{ vars.AWS_REGION || 'us-west-2' }} - - - name: Setup kubectl - uses: azure/setup-kubectl@v3 - with: - version: "v1.29.0" - - - name: Setup Helm - uses: azure/setup-helm@v4 - with: - version: "v3.14.0" - - - name: Update kubeconfig - run: | - aws eks update-kubeconfig \ - --region ${{ vars.AWS_REGION || 'us-west-2' }} \ - --name ${{ vars.EKS_CLUSTER_STAGING || 'agent-monitor-staging' }} - - - name: Deploy to staging via Helm - run: | - helm upgrade --install agent-monitor ${{ env.HELM_CHART_PATH }} \ - --namespace agent-monitor-staging \ - --create-namespace \ - --set image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ - --set image.tag=${{ needs.prepare.outputs.image-tag }} \ - --set mcp.image.repository=${{ env.REGISTRY }}/${{ env.MCP_IMAGE_NAME }} \ - --set mcp.image.tag=${{ needs.prepare.outputs.image-tag }} \ - --set environment=staging \ - --set ingress.host=staging.agent-monitor.example.com \ - --values ${{ env.HELM_CHART_PATH }}/values-staging.yaml \ - --wait \ - --atomic \ - --timeout 600s - - - name: Health check - run: | - echo "Waiting for pods to be ready..." - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=agent-monitor \ - -n agent-monitor-staging \ - --timeout=300s - - # Port forward and check health - kubectl port-forward svc/agent-monitor 14820:4820 -n agent-monitor-staging & - PF_PID=$! - sleep 5 - - for i in $(seq 1 10); do - if curl -sf http://localhost:14820/api/health | grep -q '"status":"ok"'; then - echo "✔ Health check passed" - kill $PF_PID 2>/dev/null || true - exit 0 - fi - echo "Attempt $i/10..." - sleep 5 - done - - kill $PF_PID 2>/dev/null || true - echo "✖ Health check failed" - exit 1 - - - name: Notify Slack (staging) - if: always() - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "text": "${{ job.status == 'success' && '✅' || '❌' }} Staging deployment ${{ job.status }}: `${{ needs.prepare.outputs.image-tag }}`", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ job.status == 'success' && ':white_check_mark:' || ':x:' }} *Staging Deployment ${{ job.status }}*\n*Image:* `${{ needs.prepare.outputs.image-tag }}`\n*Commit:* `${{ github.sha }}`\n*Actor:* ${{ github.actor }}" - } - } - ] - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK - - # ── Deploy to Production ─────────────────────────────────────────────── - deploy-production: - name: Deploy to Production - runs-on: ubuntu-latest - needs: [prepare, deploy-staging] - if: | - always() && - needs.prepare.result == 'success' && - needs.deploy-staging.result == 'success' && - (github.event.inputs.environment == 'production' || github.ref_type == 'tag') - environment: - name: production - url: https://agent-monitor.example.com - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Configure AWS credentials (OIDC) - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN_PRODUCTION }} - aws-region: ${{ vars.AWS_REGION || 'us-west-2' }} - - - name: Setup kubectl - uses: azure/setup-kubectl@v3 - with: - version: "v1.29.0" - - - name: Setup Helm - uses: azure/setup-helm@v4 - with: - version: "v3.14.0" - - - name: Update kubeconfig - run: | - aws eks update-kubeconfig \ - --region ${{ vars.AWS_REGION || 'us-west-2' }} \ - --name ${{ vars.EKS_CLUSTER_PRODUCTION || 'agent-monitor-production' }} - - - name: Create database backup - run: | - chmod +x deployments/scripts/db-backup.sh - # Find a running pod to backup from - POD=$(kubectl get pods -n agent-monitor-production \ - -l app.kubernetes.io/name=agent-monitor \ - --field-selector=status.phase=Running \ - -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "") - - if [[ -n "$POD" ]]; then - echo "Backing up database from pod: $POD" - kubectl exec "$POD" -n agent-monitor-production -- \ - sh -c "cp /app/data/dashboard.db /tmp/pre-deploy-backup.db 2>/dev/null || true" - echo "Pre-deploy backup created" - else - echo "⚠ No running pods found – skipping backup" - fi - - - name: Deploy to production via Helm - run: | - helm upgrade --install agent-monitor ${{ env.HELM_CHART_PATH }} \ - --namespace agent-monitor-production \ - --create-namespace \ - --set image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ - --set image.tag=${{ needs.prepare.outputs.image-tag }} \ - --set mcp.image.repository=${{ env.REGISTRY }}/${{ env.MCP_IMAGE_NAME }} \ - --set mcp.image.tag=${{ needs.prepare.outputs.image-tag }} \ - --set environment=production \ - --set ingress.host=agent-monitor.example.com \ - --values ${{ env.HELM_CHART_PATH }}/values-production.yaml \ - --wait \ - --atomic \ - --timeout 600s - - - name: Health check - run: | - echo "Waiting for pods to be ready..." - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=agent-monitor \ - -n agent-monitor-production \ - --timeout=300s - - kubectl port-forward svc/agent-monitor 14820:4820 -n agent-monitor-production & - PF_PID=$! - sleep 5 - - for i in $(seq 1 15); do - if curl -sf http://localhost:14820/api/health | grep -q '"status":"ok"'; then - echo "✔ Production health check passed" - kill $PF_PID 2>/dev/null || true - exit 0 - fi - echo "Attempt $i/15..." - sleep 5 - done - - kill $PF_PID 2>/dev/null || true - echo "✖ Production health check failed!" - exit 1 - - - name: Notify Slack (production) - if: always() - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "text": "${{ job.status == 'success' && '🚀' || '🚨' }} Production deployment ${{ job.status }}: `${{ needs.prepare.outputs.image-tag }}`", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ job.status == 'success' && ':rocket:' || ':rotating_light:' }} *Production Deployment ${{ job.status }}*\n*Image:* `${{ needs.prepare.outputs.image-tag }}`\n*Version:* `${{ needs.prepare.outputs.version }}`\n*Commit:* `${{ github.sha }}`\n*Actor:* ${{ github.actor }}\n*Workflow:* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run>" - } - } - ] - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK diff --git a/deployments/ci/github-actions/rollback.yaml b/deployments/ci/github-actions/rollback.yaml deleted file mode 100644 index 5db1df2..0000000 --- a/deployments/ci/github-actions/rollback.yaml +++ /dev/null @@ -1,160 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GitHub Actions Rollback Pipeline – Claude Code Agent Monitor -# -# Manual workflow to roll back a Helm deployment to a previous revision. -# ───────────────────────────────────────────────────────────────────────────── -name: Rollback - -on: - workflow_dispatch: - inputs: - environment: - description: "Target environment to rollback" - required: true - type: choice - options: - - staging - - production - revision: - description: "Helm revision number (leave empty for previous)" - required: false - type: string - reason: - description: "Reason for rollback" - required: true - type: string - -permissions: - contents: read - id-token: write - -concurrency: - group: deploy-${{ github.event.inputs.environment }} - cancel-in-progress: false - -jobs: - rollback: - name: Rollback ${{ github.event.inputs.environment }} - runs-on: ubuntu-latest - environment: - name: ${{ github.event.inputs.environment }} - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Configure AWS credentials (OIDC) - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: ${{ github.event.inputs.environment == 'production' && secrets.AWS_ROLE_ARN_PRODUCTION || secrets.AWS_ROLE_ARN_STAGING }} - aws-region: ${{ vars.AWS_REGION || 'us-west-2' }} - - - name: Setup kubectl - uses: azure/setup-kubectl@v3 - with: - version: "v1.29.0" - - - name: Setup Helm - uses: azure/setup-helm@v4 - with: - version: "v3.14.0" - - - name: Update kubeconfig - run: | - CLUSTER_NAME="${{ github.event.inputs.environment == 'production' && vars.EKS_CLUSTER_PRODUCTION || vars.EKS_CLUSTER_STAGING }}" - CLUSTER_NAME="${CLUSTER_NAME:-agent-monitor-${{ github.event.inputs.environment }}}" - aws eks update-kubeconfig \ - --region ${{ vars.AWS_REGION || 'us-west-2' }} \ - --name "${CLUSTER_NAME}" - - - name: Show Helm history - run: | - NAMESPACE="agent-monitor-${{ github.event.inputs.environment }}" - echo "## Current Helm History" - helm history agent-monitor -n "${NAMESPACE}" --max 10 || echo "No history found" - - - name: Execute rollback - run: | - NAMESPACE="agent-monitor-${{ github.event.inputs.environment }}" - REVISION="${{ github.event.inputs.revision }}" - - echo "Rolling back in namespace: ${NAMESPACE}" - - ROLLBACK_ARGS="helm rollback agent-monitor" - if [[ -n "${REVISION}" ]]; then - ROLLBACK_ARGS="${ROLLBACK_ARGS} ${REVISION}" - echo "Target revision: ${REVISION}" - else - echo "Target revision: previous" - fi - - ${ROLLBACK_ARGS} -n "${NAMESPACE}" --wait --timeout 300s - - echo "✔ Rollback command succeeded" - - - name: Health check after rollback - run: | - NAMESPACE="agent-monitor-${{ github.event.inputs.environment }}" - - echo "Waiting for pods to be ready..." - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=agent-monitor \ - -n "${NAMESPACE}" \ - --timeout=300s - - kubectl port-forward svc/agent-monitor 14820:4820 -n "${NAMESPACE}" & - PF_PID=$! - sleep 5 - - HEALTHY=false - for i in $(seq 1 10); do - if curl -sf http://localhost:14820/api/health | grep -q '"status":"ok"'; then - echo "✔ Health check passed after rollback" - HEALTHY=true - break - fi - echo "Attempt $i/10..." - sleep 5 - done - - kill $PF_PID 2>/dev/null || true - - if [[ "$HEALTHY" != true ]]; then - echo "✖ Health check failed after rollback!" - exit 1 - fi - - - name: Show post-rollback status - if: always() - run: | - NAMESPACE="agent-monitor-${{ github.event.inputs.environment }}" - echo "## Post-Rollback Status" - echo "" - echo "### Helm Status" - helm status agent-monitor -n "${NAMESPACE}" || true - echo "" - echo "### Pod Status" - kubectl get pods -n "${NAMESPACE}" -l app.kubernetes.io/name=agent-monitor || true - echo "" - echo "### Recent Events" - kubectl get events -n "${NAMESPACE}" --sort-by='.lastTimestamp' | tail -20 || true - - - name: Notify Slack - if: always() - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: | - { - "text": "${{ job.status == 'success' && '⏪' || '🚨' }} Rollback ${{ job.status }} on ${{ github.event.inputs.environment }}", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ job.status == 'success' && ':rewind:' || ':rotating_light:' }} *Rollback ${{ job.status }}*\n*Environment:* `${{ github.event.inputs.environment }}`\n*Revision:* `${{ github.event.inputs.revision || 'previous' }}`\n*Reason:* ${{ github.event.inputs.reason }}\n*Actor:* ${{ github.actor }}\n*Workflow:* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run>" - } - } - ] - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK diff --git a/deployments/ci/gitlab-ci/.gitlab-ci.yml b/deployments/ci/gitlab-ci/.gitlab-ci.yml deleted file mode 100644 index 8f62b41..0000000 --- a/deployments/ci/gitlab-ci/.gitlab-ci.yml +++ /dev/null @@ -1,323 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GitLab CI/CD Pipeline – Claude Code Agent Monitor -# -# Stages: test → build → deploy-staging → deploy-production -# ───────────────────────────────────────────────────────────────────────────── - -# ── Global settings ───────────────────────────────────────────────────────── -default: - image: node:22-alpine - interruptible: true - retry: - max: 1 - when: - - runner_system_failure - - stuck_or_timeout_failure - -variables: - NODE_VERSION: "22" - REGISTRY: "${CI_REGISTRY}" - IMAGE_NAME: "${CI_REGISTRY_IMAGE}/agent-monitor" - MCP_IMAGE_NAME: "${CI_REGISTRY_IMAGE}/agent-monitor-mcp" - HELM_CHART_PATH: "deployments/helm/agent-monitor" - APP_NAME: "agent-monitor" - # Kaniko cache - KANIKO_CACHE_ARGS: "--cache=true --cache-repo=${CI_REGISTRY_IMAGE}/cache" - -stages: - - test - - build - - deploy-staging - - deploy-production - - rollback - -# ── Cache configuration ──────────────────────────────────────────────────── -.node_cache: &node_cache - cache: - key: - files: - - package-lock.json - paths: - - node_modules/ - policy: pull-push - -# ── Test stage ────────────────────────────────────────────────────────────── -lint: - stage: test - <<: *node_cache - script: - - npm ci --prefer-offline - - npm run format:check - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -test:server: - stage: test - <<: *node_cache - script: - - npm ci --prefer-offline - - npm run test:server - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - artifacts: - when: on_failure - paths: - - server/__tests__/ - expire_in: 7 days - -test:client: - stage: test - <<: *node_cache - script: - - npm ci --prefer-offline - - cd client && npm ci --prefer-offline - - npm run test:client - cache: - key: - files: - - client/package-lock.json - paths: - - client/node_modules/ - policy: pull-push - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -test:mcp: - stage: test - <<: *node_cache - script: - - npm run mcp:install - - npm run mcp:typecheck - - npm run mcp:test - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -# ── Build stage ───────────────────────────────────────────────────────────── -.kaniko_build: &kaniko_build - stage: build - image: - name: gcr.io/kaniko-project/executor:v1.22.0-debug - entrypoint: [""] - before_script: - - mkdir -p /kaniko/.docker - - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64)\"}}}" > /kaniko/.docker/config.json - -build:app: - <<: *kaniko_build - script: - - >- - /kaniko/executor - --context "${CI_PROJECT_DIR}" - --dockerfile "${CI_PROJECT_DIR}/Dockerfile" - --destination "${IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}" - --destination "${IMAGE_NAME}:${CI_COMMIT_REF_SLUG}" - --destination "${IMAGE_NAME}:latest" - ${KANIKO_CACHE_ARGS} - --label "org.opencontainers.image.revision=${CI_COMMIT_SHA}" - --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" - --label "org.opencontainers.image.source=${CI_PROJECT_URL}" - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ - -build:mcp: - <<: *kaniko_build - script: - - >- - /kaniko/executor - --context "${CI_PROJECT_DIR}" - --dockerfile "${CI_PROJECT_DIR}/mcp/Dockerfile" - --destination "${MCP_IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}" - --destination "${MCP_IMAGE_NAME}:${CI_COMMIT_REF_SLUG}" - --destination "${MCP_IMAGE_NAME}:latest" - ${KANIKO_CACHE_ARGS} - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ - -# Security scan -security:scan: - stage: build - needs: ["build:app", "build:mcp"] - image: - name: aquasec/trivy:latest - entrypoint: [""] - script: - - trivy image --exit-code 1 --severity HIGH,CRITICAL --format table "${IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}" - - trivy image --exit-code 1 --severity HIGH,CRITICAL --format table "${MCP_IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}" - - trivy image --exit-code 1 --severity CRITICAL --format json --output trivy-app-report.json "${IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}" - - trivy image --exit-code 1 --severity CRITICAL --format json --output trivy-mcp-report.json "${MCP_IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}" - artifacts: - paths: - - trivy-app-report.json - - trivy-mcp-report.json - expire_in: 30 days - allow_failure: false - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ - -# ── Deploy Staging ────────────────────────────────────────────────────────── -deploy:staging: - stage: deploy-staging - image: - name: alpine/helm:3.14.0 - entrypoint: [""] - needs: - - build:app - - build:mcp - environment: - name: staging - url: https://staging.agent-monitor.example.com - on_stop: stop:staging - before_script: - - apk add --no-cache curl aws-cli kubectl - - aws eks update-kubeconfig --region "${AWS_REGION:-us-west-2}" --name "${EKS_CLUSTER_STAGING:-agent-monitor-staging}" - script: - - | - helm upgrade --install ${APP_NAME} ${HELM_CHART_PATH} \ - --namespace agent-monitor-staging \ - --create-namespace \ - --set image.repository=${IMAGE_NAME} \ - --set image.tag=${CI_COMMIT_SHORT_SHA} \ - --set mcp.image.repository=${MCP_IMAGE_NAME} \ - --set mcp.image.tag=${CI_COMMIT_SHORT_SHA} \ - --set environment=staging \ - --values ${HELM_CHART_PATH}/values-staging.yaml \ - --wait \ - --atomic \ - --timeout 600s - - | - echo "Running health check..." - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=${APP_NAME} \ - -n agent-monitor-staging \ - --timeout=300s - echo "✔ Staging deployment successful" - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ - -stop:staging: - stage: deploy-staging - image: - name: alpine/helm:3.14.0 - entrypoint: [""] - environment: - name: staging - action: stop - before_script: - - apk add --no-cache aws-cli kubectl - - aws eks update-kubeconfig --region "${AWS_REGION:-us-west-2}" --name "${EKS_CLUSTER_STAGING:-agent-monitor-staging}" - script: - - helm uninstall ${APP_NAME} -n agent-monitor-staging --wait || true - when: manual - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -# ── Deploy Production ─────────────────────────────────────────────────────── -deploy:production: - stage: deploy-production - image: - name: alpine/helm:3.14.0 - entrypoint: [""] - needs: - - deploy:staging - environment: - name: production - url: https://agent-monitor.example.com - before_script: - - apk add --no-cache curl aws-cli kubectl - - aws eks update-kubeconfig --region "${AWS_REGION:-us-west-2}" --name "${EKS_CLUSTER_PRODUCTION:-agent-monitor-production}" - script: - # Pre-deploy backup - - | - POD=$(kubectl get pods -n agent-monitor-production \ - -l app.kubernetes.io/name=${APP_NAME} \ - --field-selector=status.phase=Running \ - -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "") - if [ -n "$POD" ]; then - echo "Creating pre-deploy backup..." - kubectl exec "$POD" -n agent-monitor-production -- \ - sh -c "cp /app/data/dashboard.db /tmp/pre-deploy-backup.db" 2>/dev/null || true - fi - # Deploy - - | - helm upgrade --install ${APP_NAME} ${HELM_CHART_PATH} \ - --namespace agent-monitor-production \ - --create-namespace \ - --set image.repository=${IMAGE_NAME} \ - --set image.tag=${CI_COMMIT_SHORT_SHA} \ - --set mcp.image.repository=${MCP_IMAGE_NAME} \ - --set mcp.image.tag=${CI_COMMIT_SHORT_SHA} \ - --set environment=production \ - --values ${HELM_CHART_PATH}/values-production.yaml \ - --wait \ - --atomic \ - --timeout 600s - # Health check - - | - echo "Running production health check..." - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=${APP_NAME} \ - -n agent-monitor-production \ - --timeout=300s - echo "✔ Production deployment successful" - when: manual - allow_failure: false - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ - -# ── Rollback ──────────────────────────────────────────────────────────────── -rollback:staging: - stage: rollback - image: - name: alpine/helm:3.14.0 - entrypoint: [""] - environment: - name: staging - before_script: - - apk add --no-cache aws-cli kubectl - - aws eks update-kubeconfig --region "${AWS_REGION:-us-west-2}" --name "${EKS_CLUSTER_STAGING:-agent-monitor-staging}" - script: - - echo "Rolling back staging..." - - helm rollback ${APP_NAME} ${ROLLBACK_REVISION:-0} -n agent-monitor-staging --wait --timeout 300s - - | - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=${APP_NAME} \ - -n agent-monitor-staging \ - --timeout=300s - - echo "✔ Staging rollback complete" - when: manual - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -rollback:production: - stage: rollback - image: - name: alpine/helm:3.14.0 - entrypoint: [""] - environment: - name: production - before_script: - - apk add --no-cache aws-cli kubectl - - aws eks update-kubeconfig --region "${AWS_REGION:-us-west-2}" --name "${EKS_CLUSTER_PRODUCTION:-agent-monitor-production}" - script: - - echo "⚠ Rolling back PRODUCTION..." - - helm history ${APP_NAME} -n agent-monitor-production --max 5 - - helm rollback ${APP_NAME} ${ROLLBACK_REVISION:-0} -n agent-monitor-production --wait --timeout 300s - - | - kubectl wait --for=condition=ready pod \ - -l app.kubernetes.io/name=${APP_NAME} \ - -n agent-monitor-production \ - --timeout=300s - - echo "✔ Production rollback complete" - when: manual - allow_failure: false - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH diff --git a/deployments/helm/agent-monitor/.helmignore b/deployments/helm/agent-monitor/.helmignore deleted file mode 100644 index 414bb6e..0000000 --- a/deployments/helm/agent-monitor/.helmignore +++ /dev/null @@ -1,18 +0,0 @@ -# Patterns to ignore when building packages. -.DS_Store -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -*.swp -*.bak -*.tmp -*.orig -*~ -.project -.idea/ -*.tmproj -.vscode/ diff --git a/deployments/helm/agent-monitor/Chart.yaml b/deployments/helm/agent-monitor/Chart.yaml deleted file mode 100644 index 2915a01..0000000 --- a/deployments/helm/agent-monitor/Chart.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v2 -name: agent-monitor -description: Claude Code Agent Monitor - Real-time dashboard for tracking Claude Code agent activity -type: application -version: 1.0.0 -appVersion: "1.0.0" - -home: https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor -sources: - - https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor - -keywords: - - claude - - agent - - monitor - - dashboard - - ai - - devtools - - observability - -maintainers: - - name: David Nguyen - url: https://git.smartgift.io.vn/Smartgift-AI - -icon: https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/raw/branch/master/favicon.svg - -annotations: - artifacthub.io/category: monitoring-logging diff --git a/deployments/helm/agent-monitor/templates/NOTES.txt b/deployments/helm/agent-monitor/templates/NOTES.txt deleted file mode 100644 index 2002e43..0000000 --- a/deployments/helm/agent-monitor/templates/NOTES.txt +++ /dev/null @@ -1,79 +0,0 @@ -╔══════════════════════════════════════════════════════════════════════╗ -║ Claude Code Agent Monitor - Deployment Notes ║ -╚══════════════════════════════════════════════════════════════════════╝ - -{{- $fullName := include "agent-monitor.fullname" . -}} - -🎉 {{ $fullName }} has been deployed to namespace "{{ .Release.Namespace }}"! - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -📡 Accessing the Dashboard: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - - URL: http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - - export NODE_PORT=$(kubectl get -n {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ $fullName }}) - export NODE_IP=$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[0].address}") - echo "Dashboard URL: http://$NODE_IP:$NODE_PORT" - -{{- else if contains "LoadBalancer" .Values.service.type }} - - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - Watch status with: - kubectl get -n {{ .Release.Namespace }} svc {{ $fullName }} -w - - export SERVICE_IP=$(kubectl get svc -n {{ .Release.Namespace }} {{ $fullName }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo "Dashboard URL: http://$SERVICE_IP:{{ .Values.service.port }}" - -{{- else }} - - Port-forward to access locally: - kubectl port-forward -n {{ .Release.Namespace }} svc/{{ $fullName }} 4820:{{ .Values.service.port }} - - Then open: http://localhost:4820 - -{{- end }} - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -🔍 Health Check: - kubectl exec -n {{ .Release.Namespace }} deploy/{{ $fullName }} -- wget -qO- http://localhost:{{ .Values.service.targetPort }}/api/health - -🧪 Run Tests: - helm test {{ .Release.Name }} -n {{ .Release.Namespace }} - -📊 View Logs: - kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/name={{ include "agent-monitor.name" . }} -f - -📈 Check Pods: - kubectl get pods -n {{ .Release.Namespace }} -l app.kubernetes.io/name={{ include "agent-monitor.name" . }} - -{{- if .Values.persistence.enabled }} - -💾 Persistent Storage: - SQLite data is stored on PVC: {{ $fullName }}-data ({{ .Values.persistence.size }}) -{{- end }} - -{{- if .Values.mcp.enabled }} - -🔌 MCP Sidecar: - MCP server is running on port {{ .Values.mcp.port }} - Access via: kubectl port-forward -n {{ .Release.Namespace }} svc/{{ $fullName }} {{ .Values.mcp.port }}:{{ .Values.mcp.port }} -{{- end }} - -{{- if .Values.autoscaling.enabled }} - -📐 Autoscaling: - Min replicas: {{ .Values.autoscaling.minReplicas }} - Max replicas: {{ .Values.autoscaling.maxReplicas }} - CPU target: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}% - Memory target: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}% -{{- end }} - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/deployments/helm/agent-monitor/templates/_helpers.tpl b/deployments/helm/agent-monitor/templates/_helpers.tpl deleted file mode 100644 index 58d6917..0000000 --- a/deployments/helm/agent-monitor/templates/_helpers.tpl +++ /dev/null @@ -1,88 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "agent-monitor.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this -(by the DNS naming spec). If release name contains the chart name it will be used -as a full name. -*/}} -{{- define "agent-monitor.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "agent-monitor.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "agent-monitor.labels" -}} -helm.sh/chart: {{ include "agent-monitor.chart" . }} -{{ include "agent-monitor.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/part-of: claude-code-agent-monitor -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "agent-monitor.selectorLabels" -}} -app.kubernetes.io/name: {{ include "agent-monitor.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "agent-monitor.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "agent-monitor.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Return the container image string -*/}} -{{- define "agent-monitor.image" -}} -{{- $tag := default .Chart.AppVersion .Values.image.tag -}} -{{- if .Values.image.registry -}} -{{- printf "%s/%s:%s" .Values.image.registry .Values.image.repository $tag -}} -{{- else -}} -{{- printf "%s:%s" .Values.image.repository $tag -}} -{{- end -}} -{{- end }} - -{{/* -Return the MCP sidecar container image string -*/}} -{{- define "agent-monitor.mcpImage" -}} -{{- $tag := default .Chart.AppVersion .Values.mcp.image.tag -}} -{{- if .Values.mcp.image.registry -}} -{{- printf "%s/%s:%s" .Values.mcp.image.registry .Values.mcp.image.repository $tag -}} -{{- else -}} -{{- printf "%s:%s" .Values.mcp.image.repository $tag -}} -{{- end -}} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/configmap.yaml b/deployments/helm/agent-monitor/templates/configmap.yaml deleted file mode 100644 index 1bd1816..0000000 --- a/deployments/helm/agent-monitor/templates/configmap.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "agent-monitor.fullname" . }}-config - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} -data: - {{- range $key, $value := .Values.env }} - {{ $key }}: {{ $value | quote }} - {{- end }} - {{- range $key, $value := .Values.extraEnv }} - {{ $key }}: {{ $value | quote }} - {{- end }} diff --git a/deployments/helm/agent-monitor/templates/deployment.yaml b/deployments/helm/agent-monitor/templates/deployment.yaml deleted file mode 100644 index b16b3e8..0000000 --- a/deployments/helm/agent-monitor/templates/deployment.yaml +++ /dev/null @@ -1,159 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "agent-monitor.fullname" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - revisionHistoryLimit: {{ .Values.deployment.revisionHistoryLimit | default 5 }} - {{- with .Values.deployment.strategy }} - strategy: - {{- toYaml . | nindent 4 }} - {{- end }} - selector: - matchLabels: - {{- include "agent-monitor.selectorLabels" . | nindent 6 }} - template: - metadata: - annotations: - checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} - {{- with .Values.podAnnotations }} - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "agent-monitor.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "agent-monitor.serviceAccountName" . }} - automountServiceAccountToken: false - {{- with .Values.podSecurityContext }} - securityContext: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - # ── Main application container ──────────────────────────────────── - - name: {{ .Chart.Name }} - {{- with .Values.securityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - image: {{ include "agent-monitor.image" . }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: {{ .Values.service.targetPort }} - protocol: TCP - {{- with .Values.livenessProbe }} - livenessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.readinessProbe }} - readinessProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.startupProbe }} - startupProbe: - {{- toYaml . | nindent 12 }} - {{- end }} - envFrom: - - configMapRef: - name: {{ include "agent-monitor.fullname" . }}-config - {{- with .Values.extraEnvFrom }} - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - lifecycle: - preStop: - exec: - # Allow in-flight requests (including WebSockets) to drain before SIGTERM - command: ["sh", "-c", "sleep 5"] - volumeMounts: - - name: data - mountPath: /app/data - - name: tmp - mountPath: /tmp - {{- if .Values.mcp.enabled }} - # ── MCP sidecar container ───────────────────────────────────────── - - name: mcp - {{- with .Values.mcp.securityContext }} - securityContext: - {{- toYaml . | nindent 12 }} - {{- end }} - image: {{ include "agent-monitor.mcpImage" . }} - imagePullPolicy: {{ .Values.mcp.image.pullPolicy }} - ports: - - name: mcp - containerPort: {{ .Values.mcp.port }} - protocol: TCP - env: - {{- range $key, $value := .Values.mcp.env }} - - name: {{ $key }} - value: {{ $value | quote }} - {{- end }} - startupProbe: - tcpSocket: - port: mcp - failureThreshold: 30 - periodSeconds: 2 - livenessProbe: - tcpSocket: - port: mcp - initialDelaySeconds: 15 - periodSeconds: 20 - timeoutSeconds: 3 - failureThreshold: 3 - readinessProbe: - tcpSocket: - port: mcp - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 3 - failureThreshold: 3 - {{- with .Values.mcp.resources }} - resources: - {{- toYaml . | nindent 12 }} - {{- end }} - volumeMounts: - - name: tmp - mountPath: /tmp - {{- end }} - volumes: - - name: data - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (printf "%s-data" (include "agent-monitor.fullname" .)) }} - {{- else }} - emptyDir: {} - {{- end }} - - name: tmp - emptyDir: - sizeLimit: 100Mi - terminationGracePeriodSeconds: 30 - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.topologySpreadConstraints }} - topologySpreadConstraints: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/deployments/helm/agent-monitor/templates/hpa.yaml b/deployments/helm/agent-monitor/templates/hpa.yaml deleted file mode 100644 index 76aa112..0000000 --- a/deployments/helm/agent-monitor/templates/hpa.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if .Values.autoscaling.enabled -}} -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "agent-monitor.fullname" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "agent-monitor.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} - behavior: - scaleDown: - stabilizationWindowSeconds: {{ .Values.autoscaling.scaleDownStabilizationWindowSeconds | default 300 }} - policies: - - type: Pods - value: 1 - periodSeconds: 60 - - type: Percent - value: 10 - periodSeconds: 60 - selectPolicy: Min - scaleUp: - stabilizationWindowSeconds: 30 - policies: - - type: Pods - value: 2 - periodSeconds: 60 - - type: Percent - value: 50 - periodSeconds: 60 - selectPolicy: Max -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/ingress.yaml b/deployments/helm/agent-monitor/templates/ingress.yaml deleted file mode 100644 index 83340a8..0000000 --- a/deployments/helm/agent-monitor/templates/ingress.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if .Values.ingress.enabled -}} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ include "agent-monitor.fullname" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.ingress.className }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - pathType: {{ .pathType }} - backend: - service: - name: {{ include "agent-monitor.fullname" $ }} - port: - name: http - {{- end }} - {{- end }} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/networkpolicy.yaml b/deployments/helm/agent-monitor/templates/networkpolicy.yaml deleted file mode 100644 index 945fb58..0000000 --- a/deployments/helm/agent-monitor/templates/networkpolicy.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- if .Values.networkPolicy.enabled -}} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "agent-monitor.fullname" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "agent-monitor.selectorLabels" . | nindent 6 }} - policyTypes: - - Ingress - - Egress - ingress: - # Allow HTTP traffic to the application port from any pod (ingress controllers, etc.) - - ports: - - port: {{ .Values.service.targetPort }} - protocol: TCP - {{- if .Values.mcp.enabled }} - # Allow MCP traffic when sidecar is enabled - - ports: - - port: {{ .Values.mcp.port }} - protocol: TCP - {{- end }} - {{- with .Values.networkPolicy.additionalIngressRules }} - {{- toYaml . | nindent 4 }} - {{- end }} - egress: - # Allow DNS resolution - - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - # Allow outbound HTTPS (for external API calls) - - ports: - - port: 443 - protocol: TCP - # Allow internal communication within the cluster - - to: - - podSelector: {} - {{- with .Values.networkPolicy.additionalEgressRules }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/pdb.yaml b/deployments/helm/agent-monitor/templates/pdb.yaml deleted file mode 100644 index 592ba76..0000000 --- a/deployments/helm/agent-monitor/templates/pdb.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.podDisruptionBudget.enabled -}} -apiVersion: policy/v1 -kind: PodDisruptionBudget -metadata: - name: {{ include "agent-monitor.fullname" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} -spec: - {{- if .Values.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - {{- include "agent-monitor.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/pvc.yaml b/deployments/helm/agent-monitor/templates/pvc.yaml deleted file mode 100644 index 78aa7e1..0000000 --- a/deployments/helm/agent-monitor/templates/pvc.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "agent-monitor.fullname" . }}-data - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} - {{- with .Values.persistence.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . }} - {{- end }} - {{- if .Values.persistence.storageClass }} - storageClassName: {{ .Values.persistence.storageClass | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size }} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/service.yaml b/deployments/helm/agent-monitor/templates/service.yaml deleted file mode 100644 index 9c031d0..0000000 --- a/deployments/helm/agent-monitor/templates/service.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "agent-monitor.fullname" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - # Sticky sessions for WebSocket connections - sessionAffinity: ClientIP - sessionAffinityConfig: - clientIP: - timeoutSeconds: 10800 - ports: - - name: http - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - {{- if and (eq .Values.service.type "NodePort") .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- if .Values.mcp.enabled }} - - name: mcp - port: {{ .Values.mcp.port }} - targetPort: mcp - protocol: TCP - {{- end }} - selector: - {{- include "agent-monitor.selectorLabels" . | nindent 4 }} diff --git a/deployments/helm/agent-monitor/templates/serviceaccount.yaml b/deployments/helm/agent-monitor/templates/serviceaccount.yaml deleted file mode 100644 index 47b4541..0000000 --- a/deployments/helm/agent-monitor/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "agent-monitor.serviceAccountName" . }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken | default false }} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/servicemonitor.yaml b/deployments/helm/agent-monitor/templates/servicemonitor.yaml deleted file mode 100644 index 6714935..0000000 --- a/deployments/helm/agent-monitor/templates/servicemonitor.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if and .Values.monitoring.enabled .Values.monitoring.serviceMonitor.enabled -}} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "agent-monitor.fullname" . }} - {{- if .Values.monitoring.serviceMonitor.namespace }} - namespace: {{ .Values.monitoring.serviceMonitor.namespace }} - {{- end }} - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} - {{- with .Values.monitoring.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "agent-monitor.selectorLabels" . | nindent 6 }} - {{- if .Values.monitoring.serviceMonitor.namespace }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - {{- end }} - endpoints: - - port: http - path: {{ .Values.monitoring.serviceMonitor.path | default "/api/metrics" }} - interval: {{ .Values.monitoring.serviceMonitor.interval | default "30s" }} - scrapeTimeout: {{ .Values.monitoring.serviceMonitor.scrapeTimeout | default "10s" }} - honorLabels: {{ .Values.monitoring.serviceMonitor.honorLabels | default false }} -{{- end }} diff --git a/deployments/helm/agent-monitor/templates/tests/test-connection.yaml b/deployments/helm/agent-monitor/templates/tests/test-connection.yaml deleted file mode 100644 index 47eda89..0000000 --- a/deployments/helm/agent-monitor/templates/tests/test-connection.yaml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: "{{ include "agent-monitor.fullname" . }}-test-connection" - labels: - {{- include "agent-monitor.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded -spec: - restartPolicy: Never - securityContext: - runAsNonRoot: true - runAsUser: 65534 - runAsGroup: 65534 - seccompProfile: - type: RuntimeDefault - containers: - - name: wget - image: busybox:1.36 - command: ['wget'] - args: - - '--timeout=10' - - '--tries=3' - - '-qO-' - - 'http://{{ include "agent-monitor.fullname" . }}:{{ .Values.service.port }}/api/health' - securityContext: - runAsNonRoot: true - runAsUser: 65534 - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL diff --git a/deployments/helm/agent-monitor/values-dev.yaml b/deployments/helm/agent-monitor/values-dev.yaml deleted file mode 100644 index 8529530..0000000 --- a/deployments/helm/agent-monitor/values-dev.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# ============================================================================= -# Development Environment Overrides -# ============================================================================= -# Usage: helm install agent-monitor ./agent-monitor -f values-dev.yaml - -replicaCount: 1 - -image: - pullPolicy: Always - -env: - NODE_ENV: development - DASHBOARD_PORT: "4820" - LOG_LEVEL: debug - -resources: - requests: - cpu: 50m - memory: 64Mi - limits: - cpu: 250m - memory: 256Mi - -autoscaling: - enabled: false - -persistence: - enabled: true - size: 1Gi - -podDisruptionBudget: - enabled: false - -networkPolicy: - enabled: false - -monitoring: - enabled: false - -ingress: - enabled: false - -# Relax security for dev debugging -securityContext: - readOnlyRootFilesystem: false - runAsNonRoot: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL diff --git a/deployments/helm/agent-monitor/values-production.yaml b/deployments/helm/agent-monitor/values-production.yaml deleted file mode 100644 index fde5ff0..0000000 --- a/deployments/helm/agent-monitor/values-production.yaml +++ /dev/null @@ -1,117 +0,0 @@ -# ============================================================================= -# Production Environment Overrides -# ============================================================================= -# Usage: helm install agent-monitor ./agent-monitor -f values-production.yaml - -replicaCount: 3 - -env: - NODE_ENV: production - DASHBOARD_PORT: "4820" - LOG_LEVEL: warn - -resources: - requests: - cpu: 250m - memory: 256Mi - limits: - cpu: "1" - memory: "1Gi" - -autoscaling: - enabled: true - minReplicas: 3 - maxReplicas: 20 - targetCPUUtilizationPercentage: 70 - targetMemoryUtilizationPercentage: 80 - scaleDownStabilizationWindowSeconds: 600 - -deployment: - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - -persistence: - enabled: true - size: 20Gi - storageClass: gp3 - -podDisruptionBudget: - enabled: true - minAvailable: 2 - -networkPolicy: - enabled: true - -# -- Spread pods across nodes (required) and zones (preferred) for high availability -affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - agent-monitor - topologyKey: kubernetes.io/hostname - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 50 - podAffinityTerm: - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - agent-monitor - topologyKey: topology.kubernetes.io/zone - -topologySpreadConstraints: - - maxSkew: 1 - topologyKey: topology.kubernetes.io/zone - whenUnsatisfiable: ScheduleAnyway - labelSelector: - matchLabels: - app.kubernetes.io/name: agent-monitor - -ingress: - enabled: true - className: nginx - annotations: - nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" - nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" - nginx.ingress.kubernetes.io/proxy-http-version: "1.1" - nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" - nginx.ingress.kubernetes.io/configuration-snippet: | - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - nginx.ingress.kubernetes.io/ssl-redirect: "true" - nginx.ingress.kubernetes.io/force-ssl-redirect: "true" - cert-manager.io/cluster-issuer: letsencrypt-prod - hosts: - - host: agent-monitor.example.com - paths: - - path: / - pathType: Prefix - tls: - - secretName: agent-monitor-production-tls - hosts: - - agent-monitor.example.com - -monitoring: - enabled: true - serviceMonitor: - enabled: true - interval: 15s - scrapeTimeout: 10s - -mcp: - enabled: true - resources: - requests: - cpu: 100m - memory: 128Mi - limits: - cpu: 500m - memory: 512Mi diff --git a/deployments/helm/agent-monitor/values-staging.yaml b/deployments/helm/agent-monitor/values-staging.yaml deleted file mode 100644 index 90e411e..0000000 --- a/deployments/helm/agent-monitor/values-staging.yaml +++ /dev/null @@ -1,65 +0,0 @@ -# ============================================================================= -# Staging Environment Overrides -# ============================================================================= -# Usage: helm install agent-monitor ./agent-monitor -f values-staging.yaml - -replicaCount: 2 - -env: - NODE_ENV: production - DASHBOARD_PORT: "4820" - LOG_LEVEL: info - -resources: - requests: - cpu: 100m - memory: 128Mi - limits: - cpu: 500m - memory: 512Mi - -autoscaling: - enabled: true - minReplicas: 2 - maxReplicas: 5 - targetCPUUtilizationPercentage: 75 - targetMemoryUtilizationPercentage: 80 - scaleDownStabilizationWindowSeconds: 180 - -persistence: - enabled: true - size: 5Gi - -podDisruptionBudget: - enabled: true - minAvailable: 1 - -networkPolicy: - enabled: true - -ingress: - enabled: true - className: nginx - annotations: - nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" - nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" - nginx.ingress.kubernetes.io/proxy-http-version: "1.1" - nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" - nginx.ingress.kubernetes.io/configuration-snippet: | - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - hosts: - - host: agent-monitor.staging.internal - paths: - - path: / - pathType: Prefix - tls: - - secretName: agent-monitor-staging-tls - hosts: - - agent-monitor.staging.internal - -monitoring: - enabled: true - serviceMonitor: - enabled: true - interval: 30s diff --git a/deployments/helm/agent-monitor/values.yaml b/deployments/helm/agent-monitor/values.yaml deleted file mode 100644 index 5dd1748..0000000 --- a/deployments/helm/agent-monitor/values.yaml +++ /dev/null @@ -1,312 +0,0 @@ -# ============================================================================= -# Claude Code Agent Monitor - Default Helm Values -# ============================================================================= -# Override these values per environment using values-dev.yaml, values-staging.yaml, -# or values-production.yaml. - -# -- Number of pod replicas -replicaCount: 2 - -# -- Container image configuration -image: - registry: ghcr.io - repository: smartgift/claude-code-monitor - tag: "" # Defaults to .Chart.AppVersion if empty - pullPolicy: IfNotPresent - -# -- Image pull secrets for private registries -imagePullSecrets: [] - -# -- Override the release name -nameOverride: "" -# -- Override the full release name -fullnameOverride: "" - -# ============================================================================= -# Service Account -# ============================================================================= -serviceAccount: - # -- Whether to create a ServiceAccount - create: true - # -- Annotations to add to the ServiceAccount - annotations: {} - # -- The name of the ServiceAccount (auto-generated if empty) - name: "" - # -- Automount API credentials - automountServiceAccountToken: false - -# ============================================================================= -# Pod Configuration -# ============================================================================= - -# -- Annotations to add to pods -podAnnotations: {} - -# -- Labels to add to pods -podLabels: {} - -# -- Pod-level security context -podSecurityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - fsGroupChangePolicy: OnRootMismatch - seccompProfile: - type: RuntimeDefault - -# -- Container-level security context -securityContext: - runAsNonRoot: true - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - -# ============================================================================= -# Deployment Strategy -# ============================================================================= -deployment: - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - -# ============================================================================= -# Service -# ============================================================================= -service: - # -- Service type (ClusterIP, NodePort, LoadBalancer) - type: ClusterIP - # -- Service port (external) - port: 80 - # -- Container port the application listens on - targetPort: 4820 - # -- Node port (only used when type is NodePort) - nodePort: "" - # -- Additional service annotations - annotations: {} - -# ============================================================================= -# Ingress -# ============================================================================= -ingress: - # -- Enable ingress resource - enabled: false - # -- Ingress class name (e.g. nginx, traefik, alb) - className: "" - # -- Ingress annotations - annotations: {} - # nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" - # nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" - # nginx.ingress.kubernetes.io/proxy-http-version: "1.1" - # nginx.ingress.kubernetes.io/proxy-set-headers: "Upgrade=$http_upgrade,Connection=upgrade" - # -- Ingress host definitions - hosts: - - host: agent-monitor.local - paths: - - path: / - pathType: Prefix - # -- TLS configuration - tls: [] - # - secretName: agent-monitor-tls - # hosts: - # - agent-monitor.local - -# ============================================================================= -# Resource Limits -# ============================================================================= -resources: - requests: - cpu: 100m - memory: 128Mi - limits: - cpu: 500m - memory: 512Mi - -# ============================================================================= -# Autoscaling (HPA) -# ============================================================================= -autoscaling: - # -- Enable Horizontal Pod Autoscaler - enabled: true - # -- Minimum number of replicas - minReplicas: 2 - # -- Maximum number of replicas - maxReplicas: 10 - # -- Target CPU utilization percentage - targetCPUUtilizationPercentage: 70 - # -- Target memory utilization percentage - targetMemoryUtilizationPercentage: 80 - # -- Scale-down stabilization window (seconds) - scaleDownStabilizationWindowSeconds: 300 - -# ============================================================================= -# Persistence (SQLite database) -# ============================================================================= -persistence: - # -- Enable persistent storage for SQLite data - enabled: true - # -- Storage class name (empty string uses default) - storageClass: "" - # -- Access modes for the PVC - accessModes: - - ReadWriteOnce - # -- Size of the persistent volume - size: 10Gi - # -- Annotations for the PVC - annotations: {} - # -- Use an existing PVC instead of creating one - existingClaim: "" - -# ============================================================================= -# Scheduling -# ============================================================================= - -# -- Node selector for pod placement -nodeSelector: {} - -# -- Tolerations for pod placement -tolerations: [] - -# -- Affinity rules for pod placement -affinity: {} - -# -- Topology spread constraints -topologySpreadConstraints: [] - -# ============================================================================= -# Environment Variables -# ============================================================================= -env: - # -- Node.js environment - NODE_ENV: production - # -- Port the dashboard server listens on (must match service.targetPort) - DASHBOARD_PORT: "4820" - # -- Log level (debug, info, warn, error) - LOG_LEVEL: info - -# -- Additional environment variables as key-value pairs -extraEnv: {} - # MY_CUSTOM_VAR: my-value - -# -- Extra environment variables from secrets or configmaps -extraEnvFrom: [] - # - secretRef: - # name: my-secret - # - configMapRef: - # name: my-configmap - -# ============================================================================= -# Health Probes -# ============================================================================= -livenessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 30 - periodSeconds: 15 - timeoutSeconds: 5 - failureThreshold: 3 - successThreshold: 1 - -readinessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 3 - failureThreshold: 3 - successThreshold: 1 - -startupProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - failureThreshold: 30 - successThreshold: 1 - -# ============================================================================= -# Pod Disruption Budget -# ============================================================================= -podDisruptionBudget: - # -- Enable PodDisruptionBudget - enabled: true - # -- Minimum available pods during voluntary disruptions - minAvailable: 1 - # -- Maximum unavailable pods (alternative to minAvailable) - # maxUnavailable: 1 - -# ============================================================================= -# Network Policy -# ============================================================================= -networkPolicy: - # -- Enable NetworkPolicy - enabled: true - # -- Additional ingress rules - additionalIngressRules: [] - # -- Additional egress rules - additionalEgressRules: [] - -# ============================================================================= -# MCP Sidecar (Model Context Protocol server) -# ============================================================================= -mcp: - # -- Enable MCP sidecar container - enabled: false - image: - registry: ghcr.io - repository: smartgift/claude-code-monitor-mcp - tag: "" # Defaults to .Chart.AppVersion if empty - pullPolicy: IfNotPresent - # -- MCP HTTP transport port - port: 8819 - # -- Resource limits for MCP sidecar - resources: - requests: - cpu: 50m - memory: 64Mi - limits: - cpu: 200m - memory: 256Mi - # -- MCP environment variables - env: - MCP_TRANSPORT: http - MCP_PORT: "8819" - DASHBOARD_URL: "http://localhost:4820" - # -- Container security context for MCP - securityContext: - runAsNonRoot: true - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - -# ============================================================================= -# Monitoring -# ============================================================================= -monitoring: - # -- Enable Prometheus monitoring - enabled: false - serviceMonitor: - # -- Enable ServiceMonitor resource (requires Prometheus Operator) - enabled: false - # -- Namespace for the ServiceMonitor (defaults to release namespace) - namespace: "" - # -- Additional labels for the ServiceMonitor - labels: {} - # -- Scrape interval - interval: 30s - # -- Scrape timeout - scrapeTimeout: 10s - # -- Metric path - path: /api/metrics - # -- Honor labels from the target - honorLabels: false diff --git a/deployments/kubernetes/README.md b/deployments/kubernetes/README.md deleted file mode 100644 index bfed056..0000000 --- a/deployments/kubernetes/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Kubernetes Manifests - -Production-ready Kubernetes resources using Kustomize for environment management, with optional blue-green and canary deployment strategies. - -## Structure - -``` -kubernetes/ -├── base/ # Shared base (all environments inherit from this) -│ ├── kustomization.yaml -│ ├── namespace.yaml # agent-monitor namespace with Pod Security Standards -│ ├── configmap.yaml # Environment configuration -│ ├── serviceaccount.yaml # Minimal-privilege service account -│ ├── deployment.yaml # Main deployment (2 replicas, 3 health probes) -│ ├── service.yaml # ClusterIP with WebSocket sticky sessions -│ ├── ingress.yaml # NGINX ingress with TLS + WebSocket headers -│ ├── pvc.yaml # 10Gi persistent volume for SQLite -│ ├── hpa.yaml # Horizontal Pod Autoscaler (2–10 pods) -│ ├── pdb.yaml # Pod Disruption Budget (minAvailable: 1) -│ └── networkpolicy.yaml # Ingress restricted to NGINX controller -├── overlays/ -│ ├── dev/ # 1 replica, no HPA, minimal resources -│ ├── staging/ # 2 replicas, standard resources -│ └── production/ # 3 replicas, HPA 3–20, strict anti-affinity -├── strategies/ -│ ├── blue-green/ # Dual-slot deployment with service switching -│ └── canary/ # Progressive rollout with Argo Rollouts analysis -└── components/ - ├── mcp-sidecar/ # Adds MCP server container to pods - └── monitoring/ # Adds Prometheus ServiceMonitor -``` - -## Usage - -```bash -# Apply an environment -kubectl apply -k overlays/dev/ -kubectl apply -k overlays/staging/ -kubectl apply -k overlays/production/ - -# Add MCP sidecar (edit overlay kustomization.yaml): -# components: -# - ../../components/mcp-sidecar - -# Blue-green switch -kubectl patch svc agent-monitor -n agent-monitor \ - -p '{"spec":{"selector":{"slot":"green"}}}' -``` - -## Security - -All manifests enforce: -- `runAsNonRoot: true` -- `readOnlyRootFilesystem: true` -- `drop: [ALL]` capabilities -- `seccompProfile: RuntimeDefault` -- No service account token auto-mount -- NetworkPolicy restricting ingress sources diff --git a/deployments/kubernetes/base/configmap.yaml b/deployments/kubernetes/base/configmap.yaml deleted file mode 100644 index ceb54ce..0000000 --- a/deployments/kubernetes/base/configmap.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: agent-monitor-config - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: config - app.kubernetes.io/managed-by: kustomize -data: - NODE_ENV: "production" - DASHBOARD_PORT: "4820" - LOG_LEVEL: "info" diff --git a/deployments/kubernetes/base/deployment.yaml b/deployments/kubernetes/base/deployment.yaml deleted file mode 100644 index ff0ef9d..0000000 --- a/deployments/kubernetes/base/deployment.yaml +++ /dev/null @@ -1,147 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize -spec: - replicas: 2 - revisionHistoryLimit: 5 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - selector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - template: - metadata: - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - annotations: - # Force rollout on configmap changes via kustomize hash - checksum/config: "placeholder" - spec: - serviceAccountName: agent-monitor - automountServiceAccountToken: false - terminationGracePeriodSeconds: 30 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - fsGroupChangePolicy: OnRootMismatch - seccompProfile: - type: RuntimeDefault - - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 100 - podAffinityTerm: - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - agent-monitor - topologyKey: kubernetes.io/hostname - - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: kubernetes.io/hostname - whenUnsatisfiable: ScheduleAnyway - labelSelector: - matchLabels: - app.kubernetes.io/name: agent-monitor - - containers: - - name: agent-monitor - image: ${IMAGE_REGISTRY}/agent-monitor:${IMAGE_TAG} - imagePullPolicy: IfNotPresent - - ports: - - name: http - containerPort: 4820 - protocol: TCP - - envFrom: - - configMapRef: - name: agent-monitor-config - - resources: - requests: - memory: "128Mi" - cpu: "100m" - limits: - memory: "512Mi" - cpu: "500m" - - startupProbe: - httpGet: - path: /api/health - port: http - failureThreshold: 30 - periodSeconds: 2 - - readinessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - successThreshold: 1 - failureThreshold: 3 - - livenessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 15 - periodSeconds: 15 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 3 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - - volumeMounts: - - name: data - mountPath: /app/data - - name: tmp - mountPath: /tmp - - lifecycle: - preStop: - exec: - # Allow in-flight requests to drain before SIGTERM - command: ["sh", "-c", "sleep 5"] - - volumes: - - name: data - persistentVolumeClaim: - claimName: agent-monitor-data - - name: tmp - emptyDir: - sizeLimit: 100Mi diff --git a/deployments/kubernetes/base/hpa.yaml b/deployments/kubernetes/base/hpa.yaml deleted file mode 100644 index d26c6ce..0000000 --- a/deployments/kubernetes/base/hpa.yaml +++ /dev/null @@ -1,49 +0,0 @@ -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: autoscaling - app.kubernetes.io/managed-by: kustomize -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: agent-monitor - minReplicas: 2 - maxReplicas: 10 - metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 70 - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: 80 - behavior: - scaleDown: - stabilizationWindowSeconds: 300 - policies: - - type: Pods - value: 1 - periodSeconds: 60 - selectPolicy: Min - scaleUp: - stabilizationWindowSeconds: 30 - policies: - - type: Pods - value: 2 - periodSeconds: 60 - - type: Percent - value: 50 - periodSeconds: 60 - selectPolicy: Max diff --git a/deployments/kubernetes/base/ingress.yaml b/deployments/kubernetes/base/ingress.yaml deleted file mode 100644 index 8a6de70..0000000 --- a/deployments/kubernetes/base/ingress.yaml +++ /dev/null @@ -1,51 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: ingress - app.kubernetes.io/managed-by: kustomize - annotations: - # NGINX Ingress Controller annotations - nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" - nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" - # WebSocket upgrade support - nginx.ingress.kubernetes.io/proxy-http-version: "1.1" - nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" - nginx.ingress.kubernetes.io/configuration-snippet: | - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - # Sticky sessions for WebSocket - nginx.ingress.kubernetes.io/affinity: cookie - nginx.ingress.kubernetes.io/affinity-mode: persistent - nginx.ingress.kubernetes.io/session-cookie-name: agent-monitor-affinity - nginx.ingress.kubernetes.io/session-cookie-max-age: "10800" - nginx.ingress.kubernetes.io/session-cookie-samesite: Strict - nginx.ingress.kubernetes.io/session-cookie-secure: "true" - # Security headers - nginx.ingress.kubernetes.io/ssl-redirect: "true" - nginx.ingress.kubernetes.io/force-ssl-redirect: "true" - nginx.ingress.kubernetes.io/hsts: "true" - nginx.ingress.kubernetes.io/hsts-max-age: "31536000" - nginx.ingress.kubernetes.io/hsts-include-subdomains: "true" -spec: - ingressClassName: nginx - tls: - - hosts: - - agent-monitor.example.com - secretName: agent-monitor-tls - rules: - - host: agent-monitor.example.com - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: agent-monitor - port: - name: http diff --git a/deployments/kubernetes/base/kustomization.yaml b/deployments/kubernetes/base/kustomization.yaml deleted file mode 100644 index f26ea4b..0000000 --- a/deployments/kubernetes/base/kustomization.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -metadata: - name: agent-monitor-base - -commonLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/managed-by: kustomize - -resources: - - namespace.yaml - - configmap.yaml - - serviceaccount.yaml - - pvc.yaml - - deployment.yaml - - service.yaml - - ingress.yaml - - hpa.yaml - - pdb.yaml - - networkpolicy.yaml diff --git a/deployments/kubernetes/base/namespace.yaml b/deployments/kubernetes/base/namespace.yaml deleted file mode 100644 index 1a5f12b..0000000 --- a/deployments/kubernetes/base/namespace.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: namespace - app.kubernetes.io/managed-by: kustomize - # Enable Pod Security Standards (restricted) - pod-security.kubernetes.io/enforce: restricted - pod-security.kubernetes.io/enforce-version: latest - pod-security.kubernetes.io/audit: restricted - pod-security.kubernetes.io/audit-version: latest - pod-security.kubernetes.io/warn: restricted - pod-security.kubernetes.io/warn-version: latest diff --git a/deployments/kubernetes/base/networkpolicy.yaml b/deployments/kubernetes/base/networkpolicy.yaml deleted file mode 100644 index 53986db..0000000 --- a/deployments/kubernetes/base/networkpolicy.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: network - app.kubernetes.io/managed-by: kustomize -spec: - podSelector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - policyTypes: - - Ingress - - Egress - ingress: - # Allow traffic from ingress controller - - from: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: ingress-nginx - - podSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - ports: - - protocol: TCP - port: 4820 - # Allow intra-namespace traffic (pod-to-pod) - - from: - - podSelector: - matchLabels: - app.kubernetes.io/name: agent-monitor - ports: - - protocol: TCP - port: 4820 - egress: - # Allow DNS resolution (required for service discovery) - - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - # Allow outbound HTTPS (for external API calls if needed) - - ports: - - port: 443 - protocol: TCP - # Allow internal communication within the namespace (pod-to-pod) - - to: - - podSelector: {} diff --git a/deployments/kubernetes/base/pdb.yaml b/deployments/kubernetes/base/pdb.yaml deleted file mode 100644 index 560591f..0000000 --- a/deployments/kubernetes/base/pdb.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: policy/v1 -kind: PodDisruptionBudget -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: availability - app.kubernetes.io/managed-by: kustomize -spec: - minAvailable: 1 - selector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor diff --git a/deployments/kubernetes/base/pvc.yaml b/deployments/kubernetes/base/pvc.yaml deleted file mode 100644 index 19cbf83..0000000 --- a/deployments/kubernetes/base/pvc.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: agent-monitor-data - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: storage - app.kubernetes.io/managed-by: kustomize -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi diff --git a/deployments/kubernetes/base/service.yaml b/deployments/kubernetes/base/service.yaml deleted file mode 100644 index f8dd713..0000000 --- a/deployments/kubernetes/base/service.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - annotations: - # Document the WebSocket requirement - service.kubernetes.io/topology-mode: Auto -spec: - type: ClusterIP - # Sticky sessions for WebSocket support - sessionAffinity: ClientIP - sessionAffinityConfig: - clientIP: - timeoutSeconds: 10800 - selector: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - ports: - - name: http - port: 80 - targetPort: http - protocol: TCP diff --git a/deployments/kubernetes/base/serviceaccount.yaml b/deployments/kubernetes/base/serviceaccount.yaml deleted file mode 100644 index f6f6890..0000000 --- a/deployments/kubernetes/base/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: serviceaccount - app.kubernetes.io/managed-by: kustomize -automountServiceAccountToken: false diff --git a/deployments/kubernetes/components/mcp-sidecar/deployment-patch.yaml b/deployments/kubernetes/components/mcp-sidecar/deployment-patch.yaml deleted file mode 100644 index 85e44ea..0000000 --- a/deployments/kubernetes/components/mcp-sidecar/deployment-patch.yaml +++ /dev/null @@ -1,69 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor - namespace: agent-monitor -spec: - template: - spec: - containers: - - name: mcp-sidecar - image: ${IMAGE_REGISTRY}/agent-monitor-mcp:${IMAGE_TAG} - imagePullPolicy: IfNotPresent - - ports: - - name: mcp - containerPort: 8819 - protocol: TCP - - env: - - name: MCP_TRANSPORT - value: "http" - - name: MCP_DASHBOARD_BASE_URL - value: "http://localhost:4820" - - name: MCP_PORT - value: "8819" - - resources: - requests: - memory: "64Mi" - cpu: "50m" - limits: - memory: "256Mi" - cpu: "250m" - - startupProbe: - tcpSocket: - port: mcp - failureThreshold: 30 - periodSeconds: 2 - - readinessProbe: - tcpSocket: - port: mcp - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 3 - failureThreshold: 3 - - livenessProbe: - tcpSocket: - port: mcp - initialDelaySeconds: 10 - periodSeconds: 30 - timeoutSeconds: 5 - failureThreshold: 3 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - - volumeMounts: - - name: tmp - mountPath: /tmp diff --git a/deployments/kubernetes/components/mcp-sidecar/kustomization.yaml b/deployments/kubernetes/components/mcp-sidecar/kustomization.yaml deleted file mode 100644 index 7dc7769..0000000 --- a/deployments/kubernetes/components/mcp-sidecar/kustomization.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1alpha1 -kind: Component - -metadata: - name: mcp-sidecar - -patches: - - path: deployment-patch.yaml - target: - kind: Deployment - name: agent-monitor diff --git a/deployments/kubernetes/components/monitoring/kustomization.yaml b/deployments/kubernetes/components/monitoring/kustomization.yaml deleted file mode 100644 index e0d0cad..0000000 --- a/deployments/kubernetes/components/monitoring/kustomization.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1alpha1 -kind: Component - -metadata: - name: monitoring - -resources: - - servicemonitor.yaml diff --git a/deployments/kubernetes/components/monitoring/servicemonitor.yaml b/deployments/kubernetes/components/monitoring/servicemonitor.yaml deleted file mode 100644 index ce2f59d..0000000 --- a/deployments/kubernetes/components/monitoring/servicemonitor.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: monitoring - app.kubernetes.io/managed-by: kustomize - # Common label for Prometheus Operator discovery - release: prometheus -spec: - selector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - namespaceSelector: - matchNames: - - agent-monitor - endpoints: - - port: http - path: /api/health - interval: 30s - scrapeTimeout: 10s - honorLabels: true - metricRelabelings: - - sourceLabels: [__name__] - regex: "(http_requests_total|http_request_duration_.*|nodejs_.*|process_.*)" - action: keep diff --git a/deployments/kubernetes/overlays/dev/kustomization.yaml b/deployments/kubernetes/overlays/dev/kustomization.yaml deleted file mode 100644 index 4aad337..0000000 --- a/deployments/kubernetes/overlays/dev/kustomization.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -metadata: - name: agent-monitor-dev - -namespace: agent-monitor - -resources: - - ../../base - -images: - - name: ${IMAGE_REGISTRY}/agent-monitor - newName: agent-monitor - newTag: dev - -configMapGenerator: - - name: agent-monitor-config - behavior: merge - literals: - - NODE_ENV=development - - LOG_LEVEL=debug - -patches: - # Disable HPA in dev (single replica, no autoscaling needed) - - target: - kind: HorizontalPodAutoscaler - name: agent-monitor - patch: | - $patch: delete - apiVersion: autoscaling/v2 - kind: HorizontalPodAutoscaler - metadata: - name: agent-monitor - # Deployment overrides for dev - - path: patches/deployment-patch.yaml diff --git a/deployments/kubernetes/overlays/dev/patches/deployment-patch.yaml b/deployments/kubernetes/overlays/dev/patches/deployment-patch.yaml deleted file mode 100644 index 7121b04..0000000 --- a/deployments/kubernetes/overlays/dev/patches/deployment-patch.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor - namespace: agent-monitor -spec: - # Single replica for dev - replicas: 1 - template: - spec: - # Remove anti-affinity in dev (single node is fine) - affinity: null - topologySpreadConstraints: [] - containers: - - name: agent-monitor - resources: - requests: - memory: "64Mi" - cpu: "50m" - limits: - memory: "256Mi" - cpu: "250m" diff --git a/deployments/kubernetes/overlays/production/kustomization.yaml b/deployments/kubernetes/overlays/production/kustomization.yaml deleted file mode 100644 index c0af19d..0000000 --- a/deployments/kubernetes/overlays/production/kustomization.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -metadata: - name: agent-monitor-production - -namespace: agent-monitor - -resources: - - ../../base - -patches: - - path: patches/deployment-patch.yaml - - path: patches/hpa-patch.yaml - -images: - - name: ${IMAGE_REGISTRY}/agent-monitor - newName: agent-monitor - newTag: latest - -configMapGenerator: - - name: agent-monitor-config - behavior: merge - literals: - - NODE_ENV=production - - LOG_LEVEL=warn diff --git a/deployments/kubernetes/overlays/production/patches/deployment-patch.yaml b/deployments/kubernetes/overlays/production/patches/deployment-patch.yaml deleted file mode 100644 index 9f3d0ce..0000000 --- a/deployments/kubernetes/overlays/production/patches/deployment-patch.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor - namespace: agent-monitor -spec: - replicas: 3 - template: - spec: - # Production: require spreading across nodes - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - agent-monitor - topologyKey: kubernetes.io/hostname - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: kubernetes.io/hostname - whenUnsatisfiable: DoNotSchedule - labelSelector: - matchLabels: - app.kubernetes.io/name: agent-monitor - - maxSkew: 1 - topologyKey: topology.kubernetes.io/zone - whenUnsatisfiable: ScheduleAnyway - labelSelector: - matchLabels: - app.kubernetes.io/name: agent-monitor - containers: - - name: agent-monitor - resources: - requests: - memory: "256Mi" - cpu: "200m" - limits: - memory: "1Gi" - cpu: "1000m" diff --git a/deployments/kubernetes/overlays/production/patches/hpa-patch.yaml b/deployments/kubernetes/overlays/production/patches/hpa-patch.yaml deleted file mode 100644 index 2610351..0000000 --- a/deployments/kubernetes/overlays/production/patches/hpa-patch.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: agent-monitor - namespace: agent-monitor -spec: - minReplicas: 3 - maxReplicas: 20 - behavior: - scaleDown: - stabilizationWindowSeconds: 600 - policies: - - type: Pods - value: 1 - periodSeconds: 120 - selectPolicy: Min - scaleUp: - stabilizationWindowSeconds: 60 - policies: - - type: Pods - value: 4 - periodSeconds: 60 - - type: Percent - value: 100 - periodSeconds: 60 - selectPolicy: Max diff --git a/deployments/kubernetes/overlays/staging/kustomization.yaml b/deployments/kubernetes/overlays/staging/kustomization.yaml deleted file mode 100644 index 0498a96..0000000 --- a/deployments/kubernetes/overlays/staging/kustomization.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -metadata: - name: agent-monitor-staging - -namespace: agent-monitor - -resources: - - ../../base - -patches: - - path: patches/deployment-patch.yaml - -images: - - name: ${IMAGE_REGISTRY}/agent-monitor - newName: agent-monitor - newTag: staging - -configMapGenerator: - - name: agent-monitor-config - behavior: merge - literals: - - NODE_ENV=staging - - LOG_LEVEL=info diff --git a/deployments/kubernetes/overlays/staging/patches/deployment-patch.yaml b/deployments/kubernetes/overlays/staging/patches/deployment-patch.yaml deleted file mode 100644 index 8eebb24..0000000 --- a/deployments/kubernetes/overlays/staging/patches/deployment-patch.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor - namespace: agent-monitor -spec: - replicas: 2 - template: - spec: - containers: - - name: agent-monitor - resources: - requests: - memory: "128Mi" - cpu: "100m" - limits: - memory: "512Mi" - cpu: "500m" diff --git a/deployments/kubernetes/strategies/blue-green/deployment-blue.yaml b/deployments/kubernetes/strategies/blue-green/deployment-blue.yaml deleted file mode 100644 index 94dd6aa..0000000 --- a/deployments/kubernetes/strategies/blue-green/deployment-blue.yaml +++ /dev/null @@ -1,136 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor-blue - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - slot: blue -spec: - replicas: 3 - revisionHistoryLimit: 5 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - selector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - slot: blue - template: - metadata: - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - slot: blue - spec: - serviceAccountName: agent-monitor - automountServiceAccountToken: false - terminationGracePeriodSeconds: 30 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - fsGroupChangePolicy: OnRootMismatch - seccompProfile: - type: RuntimeDefault - - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - agent-monitor - topologyKey: kubernetes.io/hostname - - containers: - - name: agent-monitor - image: ${IMAGE_REGISTRY}/agent-monitor:blue - imagePullPolicy: IfNotPresent - - ports: - - name: http - containerPort: 4820 - protocol: TCP - - envFrom: - - configMapRef: - name: agent-monitor-config - - resources: - requests: - memory: "256Mi" - cpu: "200m" - limits: - memory: "1Gi" - cpu: "1000m" - - startupProbe: - httpGet: - path: /api/health - port: http - failureThreshold: 30 - periodSeconds: 2 - - readinessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - successThreshold: 1 - failureThreshold: 3 - - livenessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 15 - periodSeconds: 15 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 3 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - - volumeMounts: - - name: data - mountPath: /app/data - - name: tmp - mountPath: /tmp - - lifecycle: - preStop: - exec: - command: ["sh", "-c", "sleep 5"] - - volumes: - - name: data - persistentVolumeClaim: - claimName: agent-monitor-data - - name: tmp - emptyDir: - sizeLimit: 100Mi diff --git a/deployments/kubernetes/strategies/blue-green/deployment-green.yaml b/deployments/kubernetes/strategies/blue-green/deployment-green.yaml deleted file mode 100644 index a688a16..0000000 --- a/deployments/kubernetes/strategies/blue-green/deployment-green.yaml +++ /dev/null @@ -1,136 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor-green - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - slot: green -spec: - replicas: 3 - revisionHistoryLimit: 5 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - selector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - slot: green - template: - metadata: - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - slot: green - spec: - serviceAccountName: agent-monitor - automountServiceAccountToken: false - terminationGracePeriodSeconds: 30 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - fsGroupChangePolicy: OnRootMismatch - seccompProfile: - type: RuntimeDefault - - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - agent-monitor - topologyKey: kubernetes.io/hostname - - containers: - - name: agent-monitor - image: ${IMAGE_REGISTRY}/agent-monitor:green - imagePullPolicy: IfNotPresent - - ports: - - name: http - containerPort: 4820 - protocol: TCP - - envFrom: - - configMapRef: - name: agent-monitor-config - - resources: - requests: - memory: "256Mi" - cpu: "200m" - limits: - memory: "1Gi" - cpu: "1000m" - - startupProbe: - httpGet: - path: /api/health - port: http - failureThreshold: 30 - periodSeconds: 2 - - readinessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - successThreshold: 1 - failureThreshold: 3 - - livenessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 15 - periodSeconds: 15 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 3 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - - volumeMounts: - - name: data - mountPath: /app/data - - name: tmp - mountPath: /tmp - - lifecycle: - preStop: - exec: - command: ["sh", "-c", "sleep 5"] - - volumes: - - name: data - persistentVolumeClaim: - claimName: agent-monitor-data - - name: tmp - emptyDir: - sizeLimit: 100Mi diff --git a/deployments/kubernetes/strategies/blue-green/service-switch.yaml b/deployments/kubernetes/strategies/blue-green/service-switch.yaml deleted file mode 100644 index 3b2cc48..0000000 --- a/deployments/kubernetes/strategies/blue-green/service-switch.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: agent-monitor - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - annotations: - # Document which slot is currently active - # To switch traffic: kubectl patch svc agent-monitor -n agent-monitor \ - # -p '{"spec":{"selector":{"slot":"green"}}}' - agent-monitor.io/active-slot: blue -spec: - type: ClusterIP - sessionAffinity: ClientIP - sessionAffinityConfig: - clientIP: - timeoutSeconds: 10800 - selector: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - # Toggle this value between "blue" and "green" to switch traffic - slot: blue - ports: - - name: http - port: 80 - targetPort: http - protocol: TCP diff --git a/deployments/kubernetes/strategies/canary/canary-analysis.yaml b/deployments/kubernetes/strategies/canary/canary-analysis.yaml deleted file mode 100644 index 742c88b..0000000 --- a/deployments/kubernetes/strategies/canary/canary-analysis.yaml +++ /dev/null @@ -1,97 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: AnalysisTemplate -metadata: - name: agent-monitor-canary-analysis - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: canary-analysis - app.kubernetes.io/managed-by: kustomize -spec: - args: - - name: service-name - value: agent-monitor-canary - - name: namespace - value: agent-monitor - metrics: - # Success rate must be above 99% - - name: success-rate - interval: 60s - count: 5 - successCondition: result[0] >= 0.99 - failureLimit: 2 - provider: - prometheus: - address: http://prometheus.monitoring.svc.cluster.local:9090 - query: | - sum( - rate( - http_requests_total{ - namespace="{{args.namespace}}", - service="{{args.service-name}}", - code!~"5.." - }[2m] - ) - ) - / - sum( - rate( - http_requests_total{ - namespace="{{args.namespace}}", - service="{{args.service-name}}" - }[2m] - ) - ) - - # P99 latency must be under 500ms - - name: p99-latency - interval: 60s - count: 5 - successCondition: result[0] < 500 - failureLimit: 2 - provider: - prometheus: - address: http://prometheus.monitoring.svc.cluster.local:9090 - query: | - histogram_quantile( - 0.99, - sum( - rate( - http_request_duration_milliseconds_bucket{ - namespace="{{args.namespace}}", - service="{{args.service-name}}" - }[2m] - ) - ) by (le) - ) - - # Error rate must stay below 1% - - name: error-rate - interval: 60s - count: 5 - successCondition: result[0] <= 0.01 - failureLimit: 2 - provider: - prometheus: - address: http://prometheus.monitoring.svc.cluster.local:9090 - query: | - sum( - rate( - http_requests_total{ - namespace="{{args.namespace}}", - service="{{args.service-name}}", - code=~"5.." - }[2m] - ) - ) - / - sum( - rate( - http_requests_total{ - namespace="{{args.namespace}}", - service="{{args.service-name}}" - }[2m] - ) - ) diff --git a/deployments/kubernetes/strategies/canary/canary-deployment.yaml b/deployments/kubernetes/strategies/canary/canary-deployment.yaml deleted file mode 100644 index 74db553..0000000 --- a/deployments/kubernetes/strategies/canary/canary-deployment.yaml +++ /dev/null @@ -1,124 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: agent-monitor-canary - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor-canary - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - track: canary -spec: - replicas: 1 - revisionHistoryLimit: 5 - selector: - matchLabels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor-canary - track: canary - template: - metadata: - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/instance: agent-monitor-canary - app.kubernetes.io/version: "1.0.0" - app.kubernetes.io/component: server - app.kubernetes.io/managed-by: kustomize - track: canary - annotations: - prometheus.io/scrape: "true" - prometheus.io/port: "4820" - prometheus.io/path: "/api/health" - spec: - serviceAccountName: agent-monitor - automountServiceAccountToken: false - terminationGracePeriodSeconds: 30 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - fsGroup: 1000 - fsGroupChangePolicy: OnRootMismatch - seccompProfile: - type: RuntimeDefault - - containers: - - name: agent-monitor - image: ${IMAGE_REGISTRY}/agent-monitor:canary - imagePullPolicy: Always - - ports: - - name: http - containerPort: 4820 - protocol: TCP - - envFrom: - - configMapRef: - name: agent-monitor-config - - resources: - requests: - memory: "256Mi" - cpu: "200m" - limits: - memory: "1Gi" - cpu: "1000m" - - startupProbe: - httpGet: - path: /api/health - port: http - failureThreshold: 30 - periodSeconds: 2 - - readinessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 3 - successThreshold: 1 - failureThreshold: 3 - - livenessProbe: - httpGet: - path: /api/health - port: http - initialDelaySeconds: 15 - periodSeconds: 15 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 3 - - securityContext: - runAsNonRoot: true - runAsUser: 1000 - runAsGroup: 1000 - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - - volumeMounts: - - name: data - mountPath: /app/data - - name: tmp - mountPath: /tmp - - lifecycle: - preStop: - exec: - command: ["sh", "-c", "sleep 5"] - - volumes: - - name: data - persistentVolumeClaim: - claimName: agent-monitor-data - - name: tmp - emptyDir: - sizeLimit: 100Mi diff --git a/deployments/monitoring/alertmanager/alertmanager.yaml b/deployments/monitoring/alertmanager/alertmanager.yaml deleted file mode 100644 index 6dc95af..0000000 --- a/deployments/monitoring/alertmanager/alertmanager.yaml +++ /dev/null @@ -1,241 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Alertmanager configuration for Claude Code Agent Monitor -# -# Replace placeholder values (marked with ) before deploying. -# ───────────────────────────────────────────────────────────────────────────── -global: - # SMTP defaults for email notifications - smtp_smarthost: ":587" - smtp_from: "alertmanager@example.com" - smtp_auth_username: "" - smtp_auth_password: "" - smtp_require_tls: true - - # Slack API URL (override per-receiver if needed) - slack_api_url: "" - - # PagerDuty URL - pagerduty_url: "https://events.pagerduty.com/v2/enqueue" - - # Global resolve timeout - resolve_timeout: 5m - -# ── Templates ─────────────────────────────────────────────────────────────── -templates: - - "/etc/alertmanager/templates/*.tmpl" - -# ── Inhibition rules ─────────────────────────────────────────────────────── -# Prevent lower-severity alerts from firing when a higher-severity alert -# for the same service/alertname is already active. -inhibit_rules: - # If a critical alert is firing, suppress warning alerts for the same service - - source_matchers: - - severity = critical - target_matchers: - - severity = warning - equal: - - alertname - - service - - namespace - - # If a critical alert is firing, suppress info alerts for the same service - - source_matchers: - - severity = critical - target_matchers: - - severity = info - equal: - - service - - namespace - - # If a warning alert is firing, suppress info alerts for the same service - - source_matchers: - - severity = warning - target_matchers: - - severity = info - equal: - - service - - namespace - - # If AgentMonitorDown is firing, suppress all other agent-monitor alerts - - source_matchers: - - alertname = AgentMonitorDown - target_matchers: - - service = agent-monitor - equal: - - namespace - -# ── Route tree ────────────────────────────────────────────────────────────── -route: - # Default receiver for unmatched alerts - receiver: slack-default - - # Group alerts by these labels - group_by: - - alertname - - environment - - namespace - - # Wait before sending initial notification (allows grouping) - group_wait: 30s - - # Wait before sending updates to an existing group - group_interval: 5m - - # Wait before re-sending a resolved notification - repeat_interval: 4h - - # Child routes (evaluated top-to-bottom, first match wins) - routes: - # ── Critical → PagerDuty + Slack ────────────────────────────────────── - - matchers: - - severity = critical - receiver: pagerduty-critical - group_wait: 10s - repeat_interval: 1h - continue: true # Also notify Slack - - - matchers: - - severity = critical - receiver: slack-critical - group_wait: 10s - repeat_interval: 1h - - # ── Warning → Slack ─────────────────────────────────────────────────── - - matchers: - - severity = warning - receiver: slack-warning - group_wait: 30s - repeat_interval: 4h - - # ── Info → Email ────────────────────────────────────────────────────── - - matchers: - - severity = info - receiver: email-info - group_wait: 1m - repeat_interval: 12h - - # ── Watchdog (deadman's switch) ─────────────────────────────────────── - - matchers: - - alertname = Watchdog - receiver: "null" - repeat_interval: 5m - -# ── Receivers ─────────────────────────────────────────────────────────────── -receivers: - # ── Null receiver (discard alerts) ──────────────────────────────────────── - - name: "null" - - # ── Slack: Default channel ──────────────────────────────────────────────── - - name: slack-default - slack_configs: - - channel: "#agent-monitor-alerts" - send_resolved: true - username: "AlertManager" - icon_emoji: ":bell:" - title: >- - [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] - {{ .CommonLabels.alertname }} - text: >- - {{ range .Alerts }} - *Alert:* {{ .Labels.alertname }} - `{{ .Labels.severity }}` - *Environment:* {{ .Labels.namespace }} - *Description:* {{ .Annotations.description }} - *Details:* - {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}` - {{ end }} - {{ end }} - actions: - - type: button - text: "Dashboard :grafana:" - url: "{{ (index .Alerts 0).Annotations.dashboard_url }}" - - type: button - text: "Runbook :book:" - url: "{{ (index .Alerts 0).Annotations.runbook_url }}" - - # ── Slack: Critical alerts ──────────────────────────────────────────────── - - name: slack-critical - slack_configs: - - channel: "#agent-monitor-critical" - send_resolved: true - username: "AlertManager" - icon_emoji: ":rotating_light:" - color: >- - {{ if eq .Status "firing" }}danger{{ else }}good{{ end }} - title: >- - :rotating_light: [{{ .Status | toUpper }}] - {{ .CommonLabels.alertname }} - text: >- - {{ range .Alerts }} - *CRITICAL Alert:* {{ .Labels.alertname }} - *Environment:* {{ .Labels.namespace }} - *Description:* {{ .Annotations.description }} - *Summary:* {{ .Annotations.summary }} - *Started:* {{ .StartsAt.Format "2006-01-02 15:04:05 UTC" }} - {{ end }} - actions: - - type: button - text: "Dashboard" - url: "{{ (index .Alerts 0).Annotations.dashboard_url }}" - - type: button - text: "Runbook" - url: "{{ (index .Alerts 0).Annotations.runbook_url }}" - - # ── Slack: Warning alerts ───────────────────────────────────────────────── - - name: slack-warning - slack_configs: - - channel: "#agent-monitor-alerts" - send_resolved: true - username: "AlertManager" - icon_emoji: ":warning:" - color: >- - {{ if eq .Status "firing" }}warning{{ else }}good{{ end }} - title: >- - :warning: [{{ .Status | toUpper }}] - {{ .CommonLabels.alertname }} - text: >- - {{ range .Alerts }} - *Warning:* {{ .Labels.alertname }} - *Environment:* {{ .Labels.namespace }} - *Description:* {{ .Annotations.description }} - {{ end }} - - # ── PagerDuty: Critical alerts ─────────────────────────────────────────── - - name: pagerduty-critical - pagerduty_configs: - - routing_key: "" - severity: >- - {{ if eq .CommonLabels.severity "critical" }}critical{{ else }}warning{{ end }} - description: >- - {{ .CommonAnnotations.summary }} - details: - environment: "{{ .CommonLabels.namespace }}" - alertname: "{{ .CommonLabels.alertname }}" - service: "{{ .CommonLabels.service }}" - description: "{{ .CommonAnnotations.description }}" - num_firing: "{{ .Alerts.Firing | len }}" - - # ── Email: Info-level alerts ────────────────────────────────────────────── - - name: email-info - email_configs: - - to: "" - send_resolved: true - headers: - Subject: >- - [Agent Monitor {{ .Status | toUpper }}] - {{ .CommonLabels.alertname }} - ({{ .CommonLabels.namespace }}) - html: | -

{{ .CommonLabels.alertname }}

-

Status: {{ .Status }}

-

Environment: {{ .CommonLabels.namespace }}

- - - {{ range .Alerts }} - - - - - - - {{ end }} -
AlertSeverityDescriptionStarted
{{ .Labels.alertname }}{{ .Labels.severity }}{{ .Annotations.description }}{{ .StartsAt.Format "2006-01-02 15:04:05 UTC" }}
diff --git a/deployments/monitoring/coralogix/README.md b/deployments/monitoring/coralogix/README.md deleted file mode 100644 index ba404c5..0000000 --- a/deployments/monitoring/coralogix/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# Coralogix Integration - -Full-stack observability for Claude Code Agent Monitor via [Coralogix](https://coralogix.com) — logs, metrics, traces, and SLO tracking through a single platform. - -## Architecture - -```mermaid -graph TB - subgraph "Kubernetes Cluster" - APP["Agent Monitor Pods"] - MCP["MCP Sidecar"] - OTEL["OTel Collector
(DaemonSet)"] - end - - APP -->|"metrics + logs"| OTEL - MCP -->|"metrics + logs"| OTEL - - OTEL -->|"OTLP (gRPC)"| CX["Coralogix Platform"] - - subgraph "Coralogix" - CX --> LOGS["Log Analytics
DataPrime Queries"] - CX --> MET["Metrics
PromQL + Recording Rules"] - CX --> TRACE["Distributed Tracing"] - CX --> ALERT["Alert Engine"] - CX --> DASH["Custom Dashboards"] - CX --> SLO["SLO Management"] - end - - ALERT -->|"Critical"| PD["PagerDuty"] - ALERT -->|"Warning"| SLACK["Slack"] - - style OTEL fill:#4f46e5,color:#fff - style CX fill:#1a1a2e,color:#fff - style LOGS fill:#7c3aed,color:#fff - style MET fill:#e6522c,color:#fff - style TRACE fill:#059669,color:#fff - style ALERT fill:#dc2626,color:#fff - style DASH fill:#f46800,color:#fff - style SLO fill:#0ea5e9,color:#fff -``` - -## Files - -| File | Purpose | -|------|---------| -| `values.yaml` | Helm values for Coralogix OpenTelemetry Collector | -| `alerts.yaml` | Alert definitions (mirrors Prometheus/Alertmanager rules) | -| `dashboards.yaml` | Custom dashboard with 6 rows, 18 panels, SLO tracking | -| `coralogix-terraform.tf` | Terraform-managed alerts, parsing rules, recording rules | - -## Quick Start - -### 1. Add the Helm Repository - -```bash -helm repo add coralogix https://cgx.jfrog.io/artifactory/coralogix-charts-virtual -helm repo update -``` - -### 2. Create the API Key Secret - -```bash -kubectl create secret generic coralogix-keys \ - --namespace agent-monitor \ - --from-literal=PRIVATE_KEY= -``` - -### 3. Deploy the OTel Collector - -```bash -helm install coralogix-otel coralogix/opentelemetry \ - --namespace agent-monitor \ - -f deployments/monitoring/coralogix/values.yaml -``` - -### 4. Import the Dashboard - -Upload `dashboards.yaml` via the Coralogix UI: - -**Dashboards → Custom Dashboards → Import** - -### 5. (Optional) Terraform-managed Alerts - -```bash -cd deployments/monitoring/coralogix -export CORALOGIX_API_KEY="" -export CORALOGIX_ENV="coralogix.com" -terraform init -terraform apply -``` - -## What Gets Collected - -| Signal | Source | Destination | -|--------|--------|-------------| -| **Logs** | Pod stdout/stderr (JSON structured) | Coralogix Log Analytics | -| **Metrics** | Prometheus scrape (`/api/health`) | Coralogix Metrics | -| **K8s Metrics** | kubelet, cAdvisor, host metrics | Coralogix Metrics | -| **Traces** | OTLP from application (if instrumented) | Coralogix Tracing | - -## Alert Parity - -All 10 Prometheus/Alertmanager rules are replicated in Coralogix: - -| Alert | Severity | Prometheus | Coralogix | -|-------|----------|:----------:|:---------:| -| Instance Down | Critical | ✓ | ✓ | -| High Error Rate | Critical | ✓ | ✓ | -| Pod Restart Loop | Critical | ✓ | ✓ | -| PV Nearly Full | Critical | ✓ | ✓ | -| High Latency | Warning | ✓ | ✓ | -| WebSocket Spike | Warning | ✓ | ✓ | -| High Memory | Warning | ✓ | ✓ | -| High CPU | Warning | ✓ | ✓ | -| HPA Maxed Out | Warning | ✓ | ✓ | -| Slow DB Queries | Warning | ✓ | ✓ | - -## Dashboard Panels - -The custom dashboard provides 18 panels across 6 rows: - -1. **Overview** — Active sessions, request rate, WebSocket connections -2. **HTTP Performance** — Latency distribution, error rate, status codes -3. **Application Logs** — Error log stream (DataPrime), log volume by severity, hook throughput -4. **Infrastructure** — CPU, memory, pod status -5. **Database & Storage** — SQLite query duration, PV usage, network I/O -6. **SLO Tracking** — Availability SLO (99.9%), latency SLO (P95 < 500ms), error budget burn - -## Coralogix Regions - -Set `global.domain` in `values.yaml` to match your Coralogix region: - -| Region | Domain | -|--------|--------| -| US1 | `coralogix.us` | -| US2 | `cx498.coralogix.com` | -| EU1 | `coralogix.com` | -| EU2 | `eu2.coralogix.com` | -| AP1 (India) | `coralogix.in` | -| AP2 (Singapore) | `coralogix.sg` | diff --git a/deployments/monitoring/coralogix/alerts.yaml b/deployments/monitoring/coralogix/alerts.yaml deleted file mode 100644 index b24c92f..0000000 --- a/deployments/monitoring/coralogix/alerts.yaml +++ /dev/null @@ -1,194 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Coralogix Alert Definitions for Claude Code Agent Monitor -# -# These alerts can be imported via the Coralogix Alerts API or Terraform -# provider (coralogix/coralogix). They mirror the Prometheus/Alertmanager -# rules in ../prometheus/rules/ for consistency across observability stacks. -# -# API import: -# curl -X POST "https://api.coralogix.com/api/v1/external/alerts" \ -# -H "Authorization: Bearer $CORALOGIX_API_KEY" \ -# -H "Content-Type: application/json" \ -# -d @deployments/monitoring/coralogix/alerts.yaml -# -# Terraform: -# See the coralogix_alert resources in coralogix-terraform.tf -# ───────────────────────────────────────────────────────────────────────────── - -alerts: - # ── Critical ─────────────────────────────────────────────────────────────── - - - name: "Agent Monitor Down" - description: "No metrics received from agent-monitor pods for > 2 minutes" - severity: critical - type: metric - condition: - metric_name: "up" - filter: - job: "agent-monitor" - threshold: 1 - comparison: less_than - for_duration: "2m" - of_last: "5m" - notifications: - - integration: pagerduty - - integration: slack - channel: "#agent-monitor-critical" - labels: - service: agent-monitor - team: platform - - - name: "High Error Rate" - description: "5xx error rate exceeds 5% of total requests for 5 minutes" - severity: critical - type: ratio - condition: - numerator: - query: 'http_requests_total{job="agent-monitor", status=~"5.."}' - denominator: - query: 'http_requests_total{job="agent-monitor"}' - threshold: 0.05 - comparison: greater_than - for_duration: "5m" - notifications: - - integration: pagerduty - - integration: slack - channel: "#agent-monitor-critical" - labels: - service: agent-monitor - - - name: "Pod Restart Loop" - description: "Agent Monitor pod has restarted > 5 times in 15 minutes" - severity: critical - type: metric - condition: - query: 'increase(kube_pod_container_status_restarts_total{namespace=~"agent-monitor.*", container="agent-monitor"}[15m])' - threshold: 5 - comparison: greater_than - for_duration: "1m" - notifications: - - integration: pagerduty - - integration: slack - channel: "#agent-monitor-critical" - labels: - service: agent-monitor - - - name: "Persistent Volume Nearly Full" - description: "SQLite persistent volume is > 90% full" - severity: critical - type: metric - condition: - query: '(kubelet_volume_stats_used_bytes{namespace=~"agent-monitor.*"} / kubelet_volume_stats_capacity_bytes{namespace=~"agent-monitor.*"}) * 100' - threshold: 90 - comparison: greater_than - for_duration: "5m" - notifications: - - integration: pagerduty - - integration: slack - channel: "#agent-monitor-critical" - labels: - service: agent-monitor - - # ── Warning ──────────────────────────────────────────────────────────────── - - - name: "High Latency" - description: "P95 request latency exceeds 2 seconds for 5 minutes" - severity: warning - type: metric - condition: - query: 'histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m]))' - threshold: 2 - comparison: greater_than - for_duration: "5m" - notifications: - - integration: slack - channel: "#agent-monitor-alerts" - labels: - service: agent-monitor - - - name: "WebSocket Connection Spike" - description: "Active WebSocket connections exceed 1000" - severity: warning - type: metric - condition: - metric_name: "websocket_connections_active" - filter: - job: "agent-monitor" - threshold: 1000 - comparison: greater_than - for_duration: "2m" - notifications: - - integration: slack - channel: "#agent-monitor-alerts" - labels: - service: agent-monitor - - - name: "High Memory Usage" - description: "Container memory usage exceeds 85% of limit" - severity: warning - type: metric - condition: - query: '(container_memory_working_set_bytes{namespace=~"agent-monitor.*", container="agent-monitor"} / container_spec_memory_limit_bytes{namespace=~"agent-monitor.*", container="agent-monitor"}) * 100' - threshold: 85 - comparison: greater_than - for_duration: "5m" - notifications: - - integration: slack - channel: "#agent-monitor-alerts" - labels: - service: agent-monitor - - - name: "High CPU Usage" - description: "Container CPU usage exceeds 80% for 10 minutes" - severity: warning - type: metric - condition: - query: '(rate(container_cpu_usage_seconds_total{namespace=~"agent-monitor.*", container="agent-monitor"}[5m]) / container_spec_cpu_quota{namespace=~"agent-monitor.*", container="agent-monitor"} * 100000)' - threshold: 80 - comparison: greater_than - for_duration: "10m" - notifications: - - integration: slack - channel: "#agent-monitor-alerts" - labels: - service: agent-monitor - - - name: "HPA Maxed Out" - description: "HPA replicas at max for 15 minutes — may need capacity increase" - severity: warning - type: metric - condition: - query: 'kube_horizontalpodautoscaler_status_current_replicas{namespace=~"agent-monitor.*"} == kube_horizontalpodautoscaler_spec_max_replicas{namespace=~"agent-monitor.*"}' - threshold: 1 - comparison: greater_than_or_equal - for_duration: "15m" - notifications: - - integration: slack - channel: "#agent-monitor-alerts" - labels: - service: agent-monitor - - - name: "Slow Database Queries" - description: "SQLite query duration exceeds 1 second" - severity: warning - type: metric - condition: - metric_name: "sqlite_query_duration_seconds" - filter: - job: "agent-monitor" - threshold: 1 - comparison: greater_than - for_duration: "5m" - notifications: - - integration: slack - channel: "#agent-monitor-alerts" - labels: - service: agent-monitor - -# ── Notification integrations ──────────────────────────────────────────────── -# Configure these in Coralogix UI: Settings → Integrations → Outbound Webhooks -# -# Required integrations: -# - pagerduty: PagerDuty Events API v2 routing key -# - slack: Slack webhook for #agent-monitor-critical and #agent-monitor-alerts -# - email: (optional) Email notification group diff --git a/deployments/monitoring/coralogix/coralogix-terraform.tf b/deployments/monitoring/coralogix/coralogix-terraform.tf deleted file mode 100644 index e3e98ab..0000000 --- a/deployments/monitoring/coralogix/coralogix-terraform.tf +++ /dev/null @@ -1,353 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Coralogix Terraform Integration for Claude Code Agent Monitor -# -# Provisions Coralogix resources via the official Terraform provider: -# - Alert rules (mirroring Prometheus/Alertmanager rules) -# - Log parsing rules for structured JSON ingestion -# - Recording rules for pre-aggregated SLO metrics -# - Dashboard provisioning -# -# Usage: -# export CORALOGIX_API_KEY="" -# export CORALOGIX_ENV="" # e.g. coralogix.com -# terraform init -# terraform plan -# terraform apply -# -# Requires: hashicorp/terraform >= 1.5, coralogix/coralogix >= 1.10 -# ───────────────────────────────────────────────────────────────────────────── - -terraform { - required_version = ">= 1.5" - required_providers { - coralogix = { - source = "coralogix/coralogix" - version = "~> 1.10" - } - } -} - -provider "coralogix" { - # API key and environment are sourced from: - # CORALOGIX_API_KEY – Send-Your-Data API key - # CORALOGIX_ENV – Domain (e.g. coralogix.com, eu2.coralogix.com) -} - -# ── Variables ──────────────────────────────────────────────────────────────── - -variable "environment" { - description = "Deployment environment (dev, staging, production)" - type = string - default = "production" - validation { - condition = contains(["dev", "staging", "production"], var.environment) - error_message = "environment must be one of: dev, staging, production." - } -} - -variable "notification_group_id" { - description = "Coralogix notification group ID for alert routing" - type = string - default = "" -} - -variable "pagerduty_webhook_id" { - description = "Coralogix outbound webhook ID for PagerDuty integration" - type = string - default = "" -} - -variable "slack_webhook_id" { - description = "Coralogix outbound webhook ID for Slack integration" - type = string - default = "" -} - -locals { - app_name = "agent-monitor" - subsystem = "kubernetes" - alert_prefix = "[Agent Monitor]" -} - -# ── Parsing Rules ──────────────────────────────────────────────────────────── -# Structured JSON log parsing for agent-monitor application logs - -resource "coralogix_rules_group" "agent_monitor_parsing" { - name = "${local.alert_prefix} Log Parsing" - description = "Parse structured JSON logs from Agent Monitor pods" - enabled = true - order = 1 - - rule_subgroups { - rules { - name = "JSON Extract" - description = "Extract structured fields from JSON application logs" - source_field = "text" - enabled = true - - parse_json_field { - destination_field = "json" - keep_source_field = false - keep_destination_field = true - } - } - } - - rule_subgroups { - rules { - name = "Severity Mapping" - description = "Map log level field to Coralogix severity" - source_field = "json.level" - enabled = true - - extract { - regexp = "(?Pdebug|info|warn|error|fatal)" - } - } - } -} - -# ── Recording Rules ────────────────────────────────────────────────────────── -# Pre-aggregate SLO metrics for efficient dashboard queries - -resource "coralogix_recording_rule_group_set" "slo_metrics" { - name = "${local.alert_prefix} SLO Recording Rules" - - groups { - name = "agent_monitor_slo" - interval = 60 # seconds - - rules { - record = "agent_monitor:http_availability:ratio_rate5m" - expr = <<-EOT - 1 - ( - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[5m])) - / - sum(rate(http_requests_total{job="agent-monitor"}[5m])) - ) - EOT - labels = { - service = local.app_name - environment = var.environment - } - } - - rules { - record = "agent_monitor:http_latency_p95:seconds_rate5m" - expr = <<-EOT - histogram_quantile(0.95, - sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m])) by (le) - ) - EOT - labels = { - service = local.app_name - environment = var.environment - } - } - - rules { - record = "agent_monitor:websocket_connections:total" - expr = <<-EOT - sum(websocket_connections_active{job="agent-monitor"}) - EOT - labels = { - service = local.app_name - environment = var.environment - } - } - } -} - -# ── Alert Rules ────────────────────────────────────────────────────────────── - -resource "coralogix_alert" "instance_down" { - name = "${local.alert_prefix} Instance Down" - description = "No metrics received from agent-monitor pods for > 2 minutes" - severity = "Critical" - enabled = true - - metric { - promql { - text = "up{job=\"agent-monitor\"} == 0" - condition = "more_than" - threshold = 0 - } - duration = "2m" - } - - notifications_group { - dynamic "notification" { - for_each = var.pagerduty_webhook_id != "" ? [1] : [] - content { - integration_id = var.pagerduty_webhook_id - } - } - dynamic "notification" { - for_each = var.slack_webhook_id != "" ? [1] : [] - content { - integration_id = var.slack_webhook_id - } - } - } - - labels = { - service = local.app_name - environment = var.environment - team = "platform" - } -} - -resource "coralogix_alert" "high_error_rate" { - name = "${local.alert_prefix} High Error Rate" - description = "5xx error rate exceeds 5% of total requests for 5 minutes" - severity = "Critical" - enabled = true - - metric { - promql { - text = <<-EOT - ( - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[5m])) - / - sum(rate(http_requests_total{job="agent-monitor"}[5m])) - ) * 100 > 5 - EOT - condition = "more_than" - threshold = 5 - } - duration = "5m" - } - - notifications_group { - dynamic "notification" { - for_each = var.pagerduty_webhook_id != "" ? [1] : [] - content { - integration_id = var.pagerduty_webhook_id - } - } - } - - labels = { - service = local.app_name - environment = var.environment - } -} - -resource "coralogix_alert" "high_latency" { - name = "${local.alert_prefix} High Latency" - description = "P95 request latency exceeds 2 seconds for 5 minutes" - severity = "Warning" - enabled = true - - metric { - promql { - text = "histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{job=\"agent-monitor\"}[5m])) by (le)) > 2" - condition = "more_than" - threshold = 2 - } - duration = "5m" - } - - notifications_group { - dynamic "notification" { - for_each = var.slack_webhook_id != "" ? [1] : [] - content { - integration_id = var.slack_webhook_id - } - } - } - - labels = { - service = local.app_name - environment = var.environment - } -} - -resource "coralogix_alert" "high_memory" { - name = "${local.alert_prefix} High Memory Usage" - description = "Container memory usage exceeds 85% of limit" - severity = "Warning" - enabled = true - - metric { - promql { - text = <<-EOT - ( - container_memory_working_set_bytes{namespace=~"agent-monitor.*", container="agent-monitor"} - / - container_spec_memory_limit_bytes{namespace=~"agent-monitor.*", container="agent-monitor"} - ) * 100 > 85 - EOT - condition = "more_than" - threshold = 85 - } - duration = "5m" - } - - notifications_group { - dynamic "notification" { - for_each = var.slack_webhook_id != "" ? [1] : [] - content { - integration_id = var.slack_webhook_id - } - } - } - - labels = { - service = local.app_name - environment = var.environment - } -} - -resource "coralogix_alert" "pod_restart_loop" { - name = "${local.alert_prefix} Pod Restart Loop" - description = "Agent Monitor pod has restarted > 5 times in 15 minutes" - severity = "Critical" - enabled = true - - metric { - promql { - text = "increase(kube_pod_container_status_restarts_total{namespace=~\"agent-monitor.*\", container=\"agent-monitor\"}[15m]) > 5" - condition = "more_than" - threshold = 5 - } - duration = "1m" - } - - notifications_group { - dynamic "notification" { - for_each = var.pagerduty_webhook_id != "" ? [1] : [] - content { - integration_id = var.pagerduty_webhook_id - } - } - } - - labels = { - service = local.app_name - environment = var.environment - } -} - -# ── Outputs ────────────────────────────────────────────────────────────────── - -output "parsing_rule_group_id" { - description = "ID of the Coralogix parsing rule group" - value = coralogix_rules_group.agent_monitor_parsing.id -} - -output "recording_rule_set_id" { - description = "ID of the Coralogix recording rule group set" - value = coralogix_recording_rule_group_set.slo_metrics.id -} - -output "alert_ids" { - description = "IDs of all provisioned Coralogix alerts" - value = { - instance_down = coralogix_alert.instance_down.id - high_error_rate = coralogix_alert.high_error_rate.id - high_latency = coralogix_alert.high_latency.id - high_memory = coralogix_alert.high_memory.id - pod_restart = coralogix_alert.pod_restart_loop.id - } -} diff --git a/deployments/monitoring/coralogix/dashboards.yaml b/deployments/monitoring/coralogix/dashboards.yaml deleted file mode 100644 index ec52ee1..0000000 --- a/deployments/monitoring/coralogix/dashboards.yaml +++ /dev/null @@ -1,245 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Coralogix Custom Dashboard – Agent Monitor -# -# Import via Coralogix UI: Dashboards → Custom Dashboards → Import -# Or via API: -# curl -X POST "https://api.coralogix.com/api/v1/external/grafana/api/dashboards/db" \ -# -H "Authorization: Bearer $CORALOGIX_API_KEY" \ -# -H "Content-Type: application/json" \ -# -d @dashboards.yaml -# -# This dashboard mirrors the Grafana dashboard (../grafana/dashboards/) while -# leveraging Coralogix-native features: DataPrime queries, log correlation, -# distributed tracing waterfall, and Apdex scoring. -# ───────────────────────────────────────────────────────────────────────────── - -dashboard: - name: "Agent Monitor – Operations" - description: "Claude Code Agent Monitor: real-time operations, SLOs, and infrastructure health" - folder: "Agent Monitor" - tags: - - agent-monitor - - operations - - sre - - # ── Row 1: Overview ────────────────────────────────────────────────────── - rows: - - name: "Overview" - panels: - - title: "Active Sessions" - type: line-chart - query: - type: metrics - promql: 'agent_monitor_active_sessions' - legend: "{{namespace}}" - span: 4 - - - title: "Request Rate (req/s)" - type: line-chart - query: - type: metrics - promql: 'sum(rate(http_requests_total{job="agent-monitor"}[5m]))' - legend: "Requests/sec" - span: 4 - - - title: "WebSocket Connections" - type: line-chart - query: - type: metrics - promql: 'websocket_connections_active{job="agent-monitor"}' - legend: "{{pod}}" - span: 4 - - # ── Row 2: HTTP Performance ──────────────────────────────────────────── - - name: "HTTP Performance" - panels: - - title: "Latency Distribution (P50 / P95 / P99)" - type: line-chart - query: - type: metrics - promql: | - histogram_quantile(0.50, sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m])) by (le)) - histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m])) by (le)) - histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m])) by (le)) - span: 6 - - - title: "Error Rate (%)" - type: line-chart - query: - type: metrics - promql: | - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[5m])) - / - sum(rate(http_requests_total{job="agent-monitor"}[5m])) * 100 - legend: "5xx %" - thresholds: - - value: 1 - color: yellow - - value: 5 - color: red - span: 3 - - - title: "Status Code Distribution" - type: bar-chart - query: - type: metrics - promql: 'sum by (status) (increase(http_requests_total{job="agent-monitor"}[1h]))' - span: 3 - - # ── Row 3: Logs (DataPrime) ──────────────────────────────────────────── - - name: "Application Logs" - panels: - - title: "Error Logs" - type: dataprime - query: | - source logs - | filter $d.cx.application.name == 'agent-monitor' - | filter $d.severity == 'ERROR' || $d.severity == 'FATAL' - | select $m.timestamp, $d.k8s.pod.name, $d.message - | order by $m.timestamp desc - | limit 100 - span: 6 - - - title: "Log Volume by Severity" - type: bar-chart - query: - type: dataprime - expression: | - source logs - | filter $d.cx.application.name == 'agent-monitor' - | count_group_by $d.severity as count - span: 3 - - - title: "Hook Event Throughput" - type: line-chart - query: - type: dataprime - expression: | - source logs - | filter $d.cx.application.name == 'agent-monitor' - | filter $d.message matches 'hook.*event' - | count_per_time 1m as throughput - span: 3 - - # ── Row 4: Infrastructure ────────────────────────────────────────────── - - name: "Infrastructure" - panels: - - title: "CPU Usage (%)" - type: line-chart - query: - type: metrics - promql: | - rate(container_cpu_usage_seconds_total{ - namespace=~"agent-monitor.*", - container="agent-monitor" - }[5m]) * 100 - legend: "{{pod}}" - span: 4 - - - title: "Memory Usage (MiB)" - type: line-chart - query: - type: metrics - promql: | - container_memory_working_set_bytes{ - namespace=~"agent-monitor.*", - container="agent-monitor" - } / 1024 / 1024 - legend: "{{pod}}" - span: 4 - - - title: "Pod Status" - type: gauge - query: - type: metrics - promql: | - count by (phase) ( - kube_pod_status_phase{namespace=~"agent-monitor.*"} - ) - span: 4 - - # ── Row 5: Database & Storage ────────────────────────────────────────── - - name: "Database & Storage" - panels: - - title: "SQLite Query Duration (ms)" - type: line-chart - query: - type: metrics - promql: 'sqlite_query_duration_seconds{job="agent-monitor"} * 1000' - span: 4 - - - title: "PV Usage (%)" - type: gauge - query: - type: metrics - promql: | - (kubelet_volume_stats_used_bytes{namespace=~"agent-monitor.*"} - / kubelet_volume_stats_capacity_bytes{namespace=~"agent-monitor.*"}) * 100 - thresholds: - - value: 70 - color: yellow - - value: 90 - color: red - span: 4 - - - title: "Network I/O (bytes/s)" - type: line-chart - query: - type: metrics - promql: | - sum by (pod) (rate(container_network_receive_bytes_total{namespace=~"agent-monitor.*"}[5m])) - sum by (pod) (rate(container_network_transmit_bytes_total{namespace=~"agent-monitor.*"}[5m])) - span: 4 - - # ── Row 6: SLO Tracking ──────────────────────────────────────────────── - - name: "SLO Tracking" - panels: - - title: "Availability SLO (99.9% target)" - type: gauge - query: - type: metrics - promql: | - (1 - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[30d])) - / sum(rate(http_requests_total{job="agent-monitor"}[30d]))) * 100 - thresholds: - - value: 99.9 - color: green - - value: 99.5 - color: yellow - - value: 99.0 - color: red - span: 4 - - - title: "Latency SLO (P95 < 500ms)" - type: gauge - query: - type: metrics - promql: | - histogram_quantile(0.95, - sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[30d])) by (le) - ) * 1000 - thresholds: - - value: 300 - color: green - - value: 500 - color: yellow - - value: 1000 - color: red - span: 4 - - - title: "Error Budget Remaining" - type: gauge - query: - type: metrics - promql: | - (0.001 - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[30d])) - / sum(rate(http_requests_total{job="agent-monitor"}[30d]))) - / 0.001 * 100 - thresholds: - - value: 50 - color: green - - value: 25 - color: yellow - - value: 0 - color: red - span: 4 diff --git a/deployments/monitoring/coralogix/values.yaml b/deployments/monitoring/coralogix/values.yaml deleted file mode 100644 index d22ea5f..0000000 --- a/deployments/monitoring/coralogix/values.yaml +++ /dev/null @@ -1,180 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Coralogix OpenTelemetry Collector – Helm Values -# -# Deploys the Coralogix OTel collector as a DaemonSet + Gateway for shipping -# logs, metrics, and traces from the Agent Monitor cluster. -# -# Prerequisites: -# 1. Add Coralogix Helm repo: -# helm repo add coralogix https://cgx.jfrog.io/artifactory/coralogix-charts-virtual -# helm repo update -# 2. Create the API key secret: -# kubectl create secret generic coralogix-keys \ -# --namespace agent-monitor \ -# --from-literal=PRIVATE_KEY= -# -# Install: -# helm install coralogix-otel coralogix/opentelemetry \ -# --namespace agent-monitor \ -# -f deployments/monitoring/coralogix/values.yaml -# ───────────────────────────────────────────────────────────────────────────── - -global: - # Coralogix domain – set to your region's endpoint - # Options: coralogix.com | eu2.coralogix.com | coralogix.in | coralogix.us | - # cx498.coralogix.com | coralogix.eu | coralogix.sg - domain: "coralogix.com" - - # Reference the API key from the pre-created K8s secret - clusterName: "agent-monitor" - -# ── Secret reference ───────────────────────────────────────────────────────── -secret: - enabled: true - name: "coralogix-keys" - # Key in the secret containing the Coralogix Send-Your-Data API key - privateKeySecretRef: - key: "PRIVATE_KEY" - -# ── Collector – DaemonSet mode (node-level collection) ─────────────────────── -opentelemetry-collector: - mode: daemonset - - presets: - # Collect Kubernetes pod/container logs - logsCollection: - enabled: true - includeCollectorLogs: false - - # Enrich telemetry with Kubernetes metadata - kubernetesAttributes: - enabled: true - extractAllPodLabels: true - extractAllPodAnnotations: false - - # Collect host-level metrics (CPU, memory, disk, network) - hostMetrics: - enabled: true - - # Collect kubelet/cAdvisor metrics - kubeletMetrics: - enabled: true - - config: - receivers: - # Scrape Prometheus metrics from agent-monitor pods - prometheus: - config: - scrape_configs: - - job_name: "agent-monitor" - scrape_interval: 15s - kubernetes_sd_configs: - - role: pod - namespaces: - names: - - agent-monitor - - agent-monitor-staging - - agent-monitor-production - relabel_configs: - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] - action: keep - regex: "true" - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $$1:$$2 - target_label: __address__ - - # Receive OTLP from in-cluster services (gRPC + HTTP) - otlp: - protocols: - grpc: - endpoint: "0.0.0.0:4317" - http: - endpoint: "0.0.0.0:4318" - - processors: - # Batch telemetry for efficient export - batch: - send_batch_size: 1024 - send_batch_max_size: 2048 - timeout: 5s - - # Enrich with resource attributes - resource: - attributes: - - key: cx.application.name - value: "agent-monitor" - action: upsert - - key: cx.subsystem.name - from_attribute: k8s.container.name - action: upsert - - key: k8s.cluster.name - value: "agent-monitor" - action: upsert - - # Memory limiter to prevent OOM - memory_limiter: - check_interval: 5s - limit_percentage: 80 - spike_limit_percentage: 25 - - # Filter out noisy internal logs - filter/drop-internal: - logs: - exclude: - match_type: regexp - bodies: - - ".*kube-probe.*" - - ".*healthz.*" - - exporters: - coralogix: - domain: "${CORALOGIX_DOMAIN}" - private_key: "${PRIVATE_KEY}" - application_name: "agent-monitor" - subsystem_name: "kubernetes" - timeout: 30s - - service: - pipelines: - logs: - receivers: [otlp] - processors: [memory_limiter, resource, filter/drop-internal, batch] - exporters: [coralogix] - metrics: - receivers: [otlp, prometheus] - processors: [memory_limiter, resource, batch] - exporters: [coralogix] - traces: - receivers: [otlp] - processors: [memory_limiter, resource, batch] - exporters: [coralogix] - - resources: - requests: - cpu: 100m - memory: 256Mi - limits: - cpu: 500m - memory: 512Mi - - tolerations: - - operator: Exists - effect: NoSchedule - -# ── Gateway mode (optional – for centralized export) ───────────────────────── -opentelemetry-gateway: - enabled: false - replicaCount: 2 - resources: - requests: - cpu: 250m - memory: 512Mi - limits: - cpu: "1" - memory: "1Gi" diff --git a/deployments/monitoring/grafana/dashboards/agent-monitor.json b/deployments/monitoring/grafana/dashboards/agent-monitor.json deleted file mode 100644 index 99eb1e3..0000000 --- a/deployments/monitoring/grafana/dashboards/agent-monitor.json +++ /dev/null @@ -1,707 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { "type": "grafana", "uid": "-- Grafana --" }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "enable": true, - "expr": "changes(kube_deployment_status_observed_generation{namespace=~\"$namespace\", deployment=~\"agent-monitor.*\"}[2m]) > 0", - "iconColor": "#6ED0E0", - "name": "Deployments", - "titleFormat": "Deployment updated" - } - ] - }, - "description": "Comprehensive monitoring dashboard for Claude Code Agent Monitor", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 1, - "id": null, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, - "id": 100, - "title": "Overview", - "type": "row" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "mappings": [ - { - "options": { - "0": { "color": "red", "text": "DOWN" }, - "1": { "color": "green", "text": "UP" } - }, - "type": "value" - } - ], - "thresholds": { - "steps": [ - { "color": "red", "value": null }, - { "color": "green", "value": 1 } - ] - } - } - }, - "gridPos": { "h": 4, "w": 4, "x": 0, "y": 1 }, - "id": 1, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "center", - "textMode": "value", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "title": "Uptime Status", - "type": "stat", - "targets": [ - { - "expr": "up{job=\"agent-monitor\", namespace=~\"$namespace\"}", - "legendFormat": "{{instance}}", - "refId": "A" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "unit": "dtdurations", - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "gridPos": { "h": 4, "w": 4, "x": 4, "y": 1 }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", - "textMode": "value", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "title": "Uptime Duration", - "type": "stat", - "targets": [ - { - "expr": "time() - process_start_time_seconds{job=\"agent-monitor\", namespace=~\"$namespace\"}", - "legendFormat": "", - "refId": "A" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "unit": "short", - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 2 }, - { "color": "red", "value": 0 } - ] - } - } - }, - "gridPos": { "h": 4, "w": 4, "x": 8, "y": 1 }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "center", - "textMode": "value", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "title": "Pod Count", - "type": "stat", - "targets": [ - { - "expr": "count(kube_pod_status_ready{namespace=~\"$namespace\", condition=\"true\"} == 1)", - "legendFormat": "Ready", - "refId": "A" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "unit": "short", - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 1 }, - { "color": "red", "value": 3 } - ] - } - } - }, - "gridPos": { "h": 4, "w": 4, "x": 12, "y": 1 }, - "id": 4, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "center", - "textMode": "value", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "title": "Pod Restarts (1h)", - "type": "stat", - "targets": [ - { - "expr": "sum(increase(kube_pod_container_status_restarts_total{namespace=~\"$namespace\", container=\"agent-monitor\"}[1h]))", - "legendFormat": "", - "refId": "A" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "unit": "short", - "thresholds": { "steps": [{ "color": "blue", "value": null }] } - } - }, - "gridPos": { "h": 4, "w": 4, "x": 16, "y": 1 }, - "id": 5, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "center", - "textMode": "value", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "title": "Active WebSocket Connections", - "type": "stat", - "targets": [ - { - "expr": "sum(websocket_connections_active{job=\"agent-monitor\", namespace=~\"$namespace\"})", - "legendFormat": "", - "refId": "A" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "unit": "decbytes", - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 5368709120 }, - { "color": "red", "value": 8589934592 } - ] - } - } - }, - "gridPos": { "h": 4, "w": 4, "x": 20, "y": 1 }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "center", - "textMode": "value", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "title": "SQLite DB Size", - "type": "stat", - "targets": [ - { - "expr": "kubelet_volume_stats_used_bytes{namespace=~\"$namespace\", persistentvolumeclaim=~\"agent-monitor.*\"}", - "legendFormat": "", - "refId": "A" - } - ] - }, - { - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, - "id": 101, - "title": "HTTP Traffic", - "type": "row" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "axisLabel": "req/s", - "drawStyle": "line", - "fillOpacity": 15, - "lineWidth": 2, - "pointSize": 5, - "spanNulls": false, - "stacking": { "mode": "none" } - }, - "unit": "reqps" - }, - "overrides": [ - { - "matcher": { "id": "byRegexp", "options": "5.." }, - "properties": [{ "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } }] - }, - { - "matcher": { "id": "byRegexp", "options": "4.." }, - "properties": [{ "id": "color", "value": { "fixedColor": "yellow", "mode": "fixed" } }] - }, - { - "matcher": { "id": "byRegexp", "options": "2.." }, - "properties": [{ "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }] - } - ] - }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 }, - "id": 10, - "options": { - "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi", "sort": "desc" } - }, - "title": "Request Rate (RPS)", - "type": "timeseries", - "targets": [ - { - "expr": "sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m])) by (status)", - "legendFormat": "{{ status }}", - "refId": "A" - }, - { - "expr": "sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m]))", - "legendFormat": "Total", - "refId": "B" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "axisLabel": "%", - "drawStyle": "line", - "fillOpacity": 20, - "lineWidth": 2, - "thresholdsStyle": { "mode": "line" } - }, - "max": 100, - "min": 0, - "unit": "percent", - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 2 }, - { "color": "red", "value": 5 } - ] - } - } - }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 }, - "id": 11, - "options": { - "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "title": "Error Rate (%)", - "type": "timeseries", - "targets": [ - { - "expr": "100 * sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\", status=~\"5..\"}[5m])) / sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m]))", - "legendFormat": "5xx Error Rate", - "refId": "A" - }, - { - "expr": "100 * sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\", status=~\"4..\"}[5m])) / sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m]))", - "legendFormat": "4xx Error Rate", - "refId": "B" - } - ] - }, - { - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 14 }, - "id": 102, - "title": "Latency", - "type": "row" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "axisLabel": "seconds", - "drawStyle": "line", - "fillOpacity": 10, - "lineWidth": 2, - "spanNulls": false - }, - "unit": "s", - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 0.5 }, - { "color": "red", "value": 1 } - ] - } - } - }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 15 }, - "id": 20, - "options": { - "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi", "sort": "desc" } - }, - "title": "Response Latency (p50 / p90 / p99)", - "type": "timeseries", - "targets": [ - { - "expr": "histogram_quantile(0.50, sum(rate(http_request_duration_seconds_bucket{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m])) by (le))", - "legendFormat": "p50", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.90, sum(rate(http_request_duration_seconds_bucket{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m])) by (le))", - "legendFormat": "p90", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m])) by (le))", - "legendFormat": "p99", - "refId": "C" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "bars", - "fillOpacity": 80, - "lineWidth": 1, - "stacking": { "mode": "normal" } - }, - "unit": "reqps" - } - }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 15 }, - "id": 21, - "options": { - "legend": { "calcs": ["mean"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "title": "Request Rate by Endpoint", - "type": "timeseries", - "targets": [ - { - "expr": "sum(rate(http_requests_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m])) by (handler)", - "legendFormat": "{{ handler }}", - "refId": "A" - } - ] - }, - { - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 23 }, - "id": 103, - "title": "WebSocket & Connections", - "type": "row" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { "drawStyle": "line", "fillOpacity": 25, "lineWidth": 2, "spanNulls": false }, - "unit": "short" - } - }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 24 }, - "id": 30, - "options": { - "legend": { - "calcs": ["mean", "max", "last"], - "displayMode": "table", - "placement": "bottom" - }, - "tooltip": { "mode": "multi" } - }, - "title": "Active WebSocket Connections", - "type": "timeseries", - "targets": [ - { - "expr": "websocket_connections_active{job=\"agent-monitor\", namespace=~\"$namespace\"}", - "legendFormat": "{{ pod }}", - "refId": "A" - }, - { - "expr": "sum(websocket_connections_active{job=\"agent-monitor\", namespace=~\"$namespace\"})", - "legendFormat": "Total", - "refId": "B" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }, - "unit": "short" - } - }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 24 }, - "id": 31, - "options": { - "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "title": "WebSocket Messages (rate/s)", - "type": "timeseries", - "targets": [ - { - "expr": "sum(rate(websocket_messages_sent_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m]))", - "legendFormat": "Sent", - "refId": "A" - }, - { - "expr": "sum(rate(websocket_messages_received_total{job=\"agent-monitor\", namespace=~\"$namespace\"}[5m]))", - "legendFormat": "Received", - "refId": "B" - } - ] - }, - { - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 32 }, - "id": 104, - "title": "Resource Usage", - "type": "row" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "fillOpacity": 20, - "lineWidth": 2, - "thresholdsStyle": { "mode": "line+area" } - }, - "unit": "bytes", - "thresholds": { - "steps": [ - { "color": "transparent", "value": null }, - { "color": "red", "value": 536870912 } - ] - } - } - }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 33 }, - "id": 40, - "options": { - "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "title": "Memory Usage", - "type": "timeseries", - "targets": [ - { - "expr": "container_memory_working_set_bytes{namespace=~\"$namespace\", container=\"agent-monitor\"}", - "legendFormat": "{{ pod }} (working set)", - "refId": "A" - }, - { - "expr": "container_spec_memory_limit_bytes{namespace=~\"$namespace\", container=\"agent-monitor\"}", - "legendFormat": "{{ pod }} (limit)", - "refId": "B" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "fillOpacity": 20, - "lineWidth": 2, - "thresholdsStyle": { "mode": "line" } - }, - "unit": "percentunit", - "max": 1, - "min": 0, - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 0.7 }, - { "color": "red", "value": 0.9 } - ] - } - } - }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 33 }, - "id": 41, - "options": { - "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "title": "CPU Usage", - "type": "timeseries", - "targets": [ - { - "expr": "rate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", container=\"agent-monitor\"}[5m])", - "legendFormat": "{{ pod }}", - "refId": "A" - } - ] - }, - { - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 41 }, - "id": 105, - "title": "Storage", - "type": "row" - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "fillOpacity": 20, - "lineWidth": 2, - "thresholdsStyle": { "mode": "line+area" } - }, - "unit": "decbytes", - "thresholds": { - "steps": [ - { "color": "transparent", "value": null }, - { "color": "yellow", "value": 8589934592 }, - { "color": "red", "value": 9663676416 } - ] - } - } - }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 42 }, - "id": 50, - "options": { - "legend": { "calcs": ["last", "max"], "displayMode": "table", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "title": "SQLite DB Size (PV Usage)", - "type": "timeseries", - "targets": [ - { - "expr": "kubelet_volume_stats_used_bytes{namespace=~\"$namespace\", persistentvolumeclaim=~\"agent-monitor.*\"}", - "legendFormat": "Used ({{ persistentvolumeclaim }})", - "refId": "A" - }, - { - "expr": "kubelet_volume_stats_capacity_bytes{namespace=~\"$namespace\", persistentvolumeclaim=~\"agent-monitor.*\"}", - "legendFormat": "Capacity ({{ persistentvolumeclaim }})", - "refId": "B" - } - ] - }, - { - "datasource": { "type": "prometheus", "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "thresholds" }, - "max": 100, - "min": 0, - "unit": "percent", - "thresholds": { - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 75 }, - { "color": "red", "value": 90 } - ] - } - } - }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 42 }, - "id": 51, - "options": { - "orientation": "horizontal", - "reduceOptions": { "calcs": ["lastNotNull"] }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "title": "PV Usage (%)", - "type": "gauge", - "targets": [ - { - "expr": "100 * kubelet_volume_stats_used_bytes{namespace=~\"$namespace\", persistentvolumeclaim=~\"agent-monitor.*\"} / kubelet_volume_stats_capacity_bytes{namespace=~\"$namespace\", persistentvolumeclaim=~\"agent-monitor.*\"}", - "legendFormat": "{{ persistentvolumeclaim }}", - "refId": "A" - } - ] - } - ], - "refresh": "30s", - "schemaVersion": 39, - "tags": ["agent-monitor", "nodejs", "websocket"], - "templating": { - "list": [ - { - "current": { "selected": false, "text": "Prometheus", "value": "prometheus" }, - "hide": 0, - "includeAll": false, - "label": "Data Source", - "name": "datasource", - "options": [], - "query": "prometheus", - "type": "datasource" - }, - { - "current": {}, - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "definition": "label_values(up{job=\"agent-monitor\"}, namespace)", - "hide": 0, - "includeAll": true, - "label": "Namespace", - "multi": false, - "name": "namespace", - "query": { "qryType": 1, "query": "label_values(up{job=\"agent-monitor\"}, namespace)" }, - "refresh": 2, - "type": "query" - } - ] - }, - "time": { "from": "now-6h", "to": "now" }, - "timepicker": { - "refresh_intervals": ["10s", "30s", "1m", "5m", "15m"], - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "browser", - "title": "Claude Code Agent Monitor", - "uid": "agent-monitor-main", - "version": 1 -} diff --git a/deployments/monitoring/grafana/datasources.yaml b/deployments/monitoring/grafana/datasources.yaml deleted file mode 100644 index 9dc7b87..0000000 --- a/deployments/monitoring/grafana/datasources.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Grafana datasource provisioning for Claude Code Agent Monitor -# ───────────────────────────────────────────────────────────────────────────── -apiVersion: 1 - -# Prevent users from deleting provisioned data sources in the UI -deleteDatasources: - - name: Prometheus - orgId: 1 - -datasources: - # ── Primary Prometheus datasource ───────────────────────────────────────── - - name: Prometheus - type: prometheus - uid: prometheus - access: proxy - url: http://prometheus-server:9090 - isDefault: true - editable: false - jsonData: - # Scrape interval matches prometheus.yaml global setting - timeInterval: "15s" - # Query timeout - queryTimeout: "30s" - # HTTP method for queries - httpMethod: POST - # Manage alerts via Prometheus - manageAlerts: true - # Alerting rule settings - prometheusType: Prometheus - prometheusVersion: ">=2.45.0" - # Incremental querying for better performance - incrementalQuerying: true - incrementalQueryOverlapWindow: "10m" - # Exemplar trace support (uncomment if using tracing) - # exemplarTraceIdDestinations: - # - name: traceId - # datasourceUid: tempo - version: 1 - - # ── Alertmanager datasource ─────────────────────────────────────────────── - - name: Alertmanager - type: alertmanager - uid: alertmanager - access: proxy - url: http://alertmanager:9093 - editable: false - jsonData: - implementation: prometheus - handleGrafanaManagedAlerts: false - version: 1 diff --git a/deployments/monitoring/prometheus/prometheus.yaml b/deployments/monitoring/prometheus/prometheus.yaml deleted file mode 100644 index 68deafc..0000000 --- a/deployments/monitoring/prometheus/prometheus.yaml +++ /dev/null @@ -1,226 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Prometheus configuration for Claude Code Agent Monitor -# ───────────────────────────────────────────────────────────────────────────── -global: - scrape_interval: 15s - scrape_timeout: 10s - evaluation_interval: 15s - - external_labels: - cluster: "${CLUSTER_NAME:agent-monitor}" - environment: "${ENVIRONMENT:production}" - -# ── Rule files ────────────────────────────────────────────────────────────── -rule_files: - - /etc/prometheus/rules/*.rules.yaml - -# ── Alertmanager ──────────────────────────────────────────────────────────── -alerting: - alertmanagers: - - static_configs: - - targets: - - alertmanager:9093 - scheme: http - timeout: 10s - api_version: v2 - -# ── Scrape configs ────────────────────────────────────────────────────────── -scrape_configs: - # ── Agent Monitor application ───────────────────────────────────────────── - - job_name: "agent-monitor" - metrics_path: /api/health - scrape_interval: 15s - scrape_timeout: 5s - scheme: http - - # Static target for standalone deployments - static_configs: - - targets: - - "agent-monitor:4820" - labels: - app: agent-monitor - component: server - - # Relabeling to add standard labels - relabel_configs: - - source_labels: [__address__] - target_label: instance - - target_label: __metrics_path__ - replacement: /api/health - - metric_relabel_configs: - - source_labels: [__name__] - regex: "go_.*" - action: drop - - # ── Agent Monitor MCP sidecar ───────────────────────────────────────────── - - job_name: "agent-monitor-mcp" - scrape_interval: 30s - static_configs: - - targets: - - "agent-monitor-mcp:8819" - labels: - app: agent-monitor - component: mcp - - # ── Kubernetes service discovery (pods) ─────────────────────────────────── - - job_name: "kubernetes-pods" - scrape_interval: 15s - - kubernetes_sd_configs: - - role: pod - namespaces: - own_namespace: false - names: - - agent-monitor - - agent-monitor-dev - - agent-monitor-staging - - agent-monitor-production - - relabel_configs: - # Only scrape pods with annotation prometheus.io/scrape=true - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] - action: keep - regex: true - - # Use custom metrics path if annotated - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - # Use custom port if annotated - - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - target_label: __address__ - - # Use custom scheme if annotated - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (.+) - - # Map pod labels to Prometheus labels - - action: labelmap - regex: __meta_kubernetes_pod_label_(.+) - - # Add namespace label - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: namespace - - # Add pod name label - - source_labels: [__meta_kubernetes_pod_name] - action: replace - target_label: pod - - # Add node name label - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: node - - # ── Kubernetes service discovery (services) ────────────────────────────── - - job_name: "kubernetes-services" - scrape_interval: 15s - - kubernetes_sd_configs: - - role: service - namespaces: - names: - - agent-monitor - - agent-monitor-dev - - agent-monitor-staging - - agent-monitor-production - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] - action: keep - regex: true - - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] - action: replace - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - target_label: __address__ - - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: namespace - - - source_labels: [__meta_kubernetes_service_name] - action: replace - target_label: service - - # ── Kubernetes nodes ────────────────────────────────────────────────────── - - job_name: "kubernetes-nodes" - scrape_interval: 30s - scheme: https - - kubernetes_sd_configs: - - role: node - - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecure_skip_verify: false - - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics - - # ── Kubernetes cadvisor (container metrics) ─────────────────────────────── - - job_name: "kubernetes-cadvisor" - scrape_interval: 15s - scheme: https - - kubernetes_sd_configs: - - role: node - - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - insecure_skip_verify: false - - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor - - metric_relabel_configs: - # Keep only container metrics for agent-monitor pods - - source_labels: [container] - regex: "agent-monitor.*" - action: keep - - # ── Prometheus self-monitoring ──────────────────────────────────────────── - - job_name: "prometheus" - static_configs: - - targets: - - "localhost:9090" diff --git a/deployments/monitoring/prometheus/rules/agent-monitor.rules.yaml b/deployments/monitoring/prometheus/rules/agent-monitor.rules.yaml deleted file mode 100644 index a9b2e9b..0000000 --- a/deployments/monitoring/prometheus/rules/agent-monitor.rules.yaml +++ /dev/null @@ -1,310 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Prometheus alerting rules for Claude Code Agent Monitor -# ───────────────────────────────────────────────────────────────────────────── -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: agent-monitor-alerts - namespace: agent-monitor - labels: - app.kubernetes.io/name: agent-monitor - app.kubernetes.io/component: monitoring - prometheus: kube-prometheus - role: alert-rules -spec: - groups: - # ── Availability alerts ───────────────────────────────────────────────── - - name: agent-monitor.availability - rules: - - alert: AgentMonitorDown - expr: up{job="agent-monitor"} == 0 - for: 2m - labels: - severity: critical - service: agent-monitor - team: platform - annotations: - summary: "Agent Monitor is down" - description: >- - The Agent Monitor instance {{ $labels.instance }} has been - unreachable for more than 2 minutes. Immediate investigation - required. - runbook_url: "https://wiki.example.com/runbooks/agent-monitor-down" - dashboard_url: "https://grafana.example.com/d/agent-monitor" - - - alert: AgentMonitorHighAvailabilityDegraded - expr: | - count(up{job="agent-monitor"} == 1) - < count(up{job="agent-monitor"}) - for: 5m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "Agent Monitor partial outage" - description: >- - Not all Agent Monitor replicas are healthy. Only - {{ $value }} of expected replicas are up. - - # ── Error rate alerts ─────────────────────────────────────────────────── - - name: agent-monitor.errors - rules: - - alert: HighErrorRate - expr: | - ( - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[5m])) - / - sum(rate(http_requests_total{job="agent-monitor"}[5m])) - ) > 0.05 - for: 5m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "High HTTP error rate (>5%)" - description: >- - The Agent Monitor is returning 5xx errors at a rate of - {{ $value | humanizePercentage }} over the last 5 minutes. - dashboard_url: "https://grafana.example.com/d/agent-monitor?tab=errors" - - - alert: CriticalErrorRate - expr: | - ( - sum(rate(http_requests_total{job="agent-monitor", status=~"5.."}[5m])) - / - sum(rate(http_requests_total{job="agent-monitor"}[5m])) - ) > 0.25 - for: 2m - labels: - severity: critical - service: agent-monitor - annotations: - summary: "Critical HTTP error rate (>25%)" - description: >- - The Agent Monitor is returning 5xx errors at a rate of - {{ $value | humanizePercentage }}. Service may be severely degraded. - - # ── Latency alerts ────────────────────────────────────────────────────── - - name: agent-monitor.latency - rules: - - alert: HighLatency - expr: | - histogram_quantile(0.99, - sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m])) by (le) - ) > 1 - for: 5m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "High p99 response latency (>1s)" - description: >- - The 99th percentile response time for Agent Monitor is - {{ $value | humanizeDuration }}. Users may experience slow page loads. - - - alert: HighMedianLatency - expr: | - histogram_quantile(0.50, - sum(rate(http_request_duration_seconds_bucket{job="agent-monitor"}[5m])) by (le) - ) > 0.5 - for: 5m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "High median response latency (>500ms)" - description: >- - The median response time is {{ $value | humanizeDuration }}. - This affects the majority of requests. - - # ── Resource alerts ───────────────────────────────────────────────────── - - name: agent-monitor.resources - rules: - - alert: HighMemoryUsage - expr: | - ( - container_memory_working_set_bytes{ - namespace=~"agent-monitor.*", - container="agent-monitor" - } - / - container_spec_memory_limit_bytes{ - namespace=~"agent-monitor.*", - container="agent-monitor" - } - ) > 0.90 - for: 10m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "High memory usage (>90% of limit)" - description: >- - Pod {{ $labels.pod }} is using {{ $value | humanizePercentage }} - of its memory limit. OOMKill risk is elevated. - - - alert: HighCPUUsage - expr: | - ( - rate(container_cpu_usage_seconds_total{ - namespace=~"agent-monitor.*", - container="agent-monitor" - }[5m]) - / - container_spec_cpu_quota{ - namespace=~"agent-monitor.*", - container="agent-monitor" - } - * 100000 - ) > 0.85 - for: 10m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "High CPU usage (>85% of limit)" - description: >- - Pod {{ $labels.pod }} is using {{ $value | humanizePercentage }} - of its CPU limit. Consider scaling up. - - - alert: PersistentVolumeNearlyFull - expr: | - ( - kubelet_volume_stats_used_bytes{ - namespace=~"agent-monitor.*", - persistentvolumeclaim=~"agent-monitor.*" - } - / - kubelet_volume_stats_capacity_bytes{ - namespace=~"agent-monitor.*", - persistentvolumeclaim=~"agent-monitor.*" - } - ) > 0.85 - for: 15m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "Persistent volume nearly full (>85%)" - description: >- - PVC {{ $labels.persistentvolumeclaim }} in namespace - {{ $labels.namespace }} is {{ $value | humanizePercentage }} - full. SQLite writes may fail when volume is exhausted. - - - alert: PersistentVolumeCriticallyFull - expr: | - ( - kubelet_volume_stats_used_bytes{ - namespace=~"agent-monitor.*", - persistentvolumeclaim=~"agent-monitor.*" - } - / - kubelet_volume_stats_capacity_bytes{ - namespace=~"agent-monitor.*", - persistentvolumeclaim=~"agent-monitor.*" - } - ) > 0.95 - for: 5m - labels: - severity: critical - service: agent-monitor - annotations: - summary: "Persistent volume critically full (>95%)" - description: >- - PVC {{ $labels.persistentvolumeclaim }} is at - {{ $value | humanizePercentage }} capacity. - Immediate action required to prevent data loss. - - # ── WebSocket alerts ──────────────────────────────────────────────────── - - name: agent-monitor.websocket - rules: - - alert: WebSocketConnectionsDrop - expr: | - ( - max_over_time(websocket_connections_active{job="agent-monitor"}[10m]) - - websocket_connections_active{job="agent-monitor"} - ) - / - max_over_time(websocket_connections_active{job="agent-monitor"}[10m]) - > 0.50 - for: 5m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "WebSocket connections dropped >50%" - description: >- - Active WebSocket connections have dropped by more than 50% - in the last 5 minutes (from - {{ with printf `max_over_time(websocket_connections_active{instance="%s"}[10m])` .Labels.instance | query }}{{ . | first | value }}{{ end }} - to {{ $value }}). This may indicate connectivity issues. - - - alert: NoWebSocketConnections - expr: | - websocket_connections_active{job="agent-monitor"} == 0 - and on() hour() >= 8 <= 20 - for: 15m - labels: - severity: info - service: agent-monitor - annotations: - summary: "No active WebSocket connections during business hours" - description: >- - There are no active WebSocket connections to Agent Monitor - during expected business hours. - - # ── Pod stability alerts ──────────────────────────────────────────────── - - name: agent-monitor.stability - rules: - - alert: PodRestarting - expr: | - increase( - kube_pod_container_status_restarts_total{ - namespace=~"agent-monitor.*", - container="agent-monitor" - }[15m] - ) > 3 - for: 0m - labels: - severity: critical - service: agent-monitor - annotations: - summary: "Pod restarting frequently (>3 in 15m)" - description: >- - Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} - has restarted {{ $value }} times in the last 15 minutes. - Check logs: kubectl logs {{ $labels.pod }} -n {{ $labels.namespace }} --previous - - - alert: PodNotReady - expr: | - kube_pod_status_ready{ - namespace=~"agent-monitor.*", - condition="true" - } == 0 - for: 5m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "Pod not ready for >5 minutes" - description: >- - Pod {{ $labels.pod }} has been in a not-ready state for - more than 5 minutes. - - - alert: DeploymentReplicasMismatch - expr: | - kube_deployment_spec_replicas{namespace=~"agent-monitor.*"} - != - kube_deployment_status_ready_replicas{namespace=~"agent-monitor.*"} - for: 10m - labels: - severity: warning - service: agent-monitor - annotations: - summary: "Deployment replicas mismatch" - description: >- - Deployment {{ $labels.deployment }} has - {{ with printf `kube_deployment_status_ready_replicas{deployment="%s",namespace="%s"}` .Labels.deployment .Labels.namespace | query }}{{ . | first | value }}{{ end }} - ready replicas but - {{ with printf `kube_deployment_spec_replicas{deployment="%s",namespace="%s"}` .Labels.deployment .Labels.namespace | query }}{{ . | first | value }}{{ end }} - desired. diff --git a/deployments/scripts/blue-green-switch.sh b/deployments/scripts/blue-green-switch.sh deleted file mode 100755 index 73404ac..0000000 --- a/deployments/scripts/blue-green-switch.sh +++ /dev/null @@ -1,294 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# blue-green-switch.sh – Switch traffic between blue/green deployment slots -# -# Usage: -# ./blue-green-switch.sh --env production --target green -# ./blue-green-switch.sh --env production --target blue --skip-health -# ./blue-green-switch.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly APP_NAME="agent-monitor" -readonly APP_PORT=4820 - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } -fatal() { err "$@"; exit 1; } - -# ── Defaults ──────────────────────────────────────────────────────────────── -ENVIRONMENT="" -TARGET="" -NAMESPACE="" -SERVICE_NAME="${APP_NAME}" -SKIP_HEALTH_CHECK=false -DRY_RUN=false - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < --target [options] - -${BOLD}Required:${NC} - --env, -e Environment: dev, staging, production - --target, -t Target slot: blue, green - -${BOLD}Options:${NC} - --namespace, -n Kubernetes namespace (default: agent-monitor-) - --service Service name (default: ${APP_NAME}) - --skip-health Skip health check on target before switching - --dry-run Show what would change without applying - --help, -h Show this help message - -${BOLD}Examples:${NC} - $(basename "$0") --env production --target green - $(basename "$0") --env production --target blue # instant rollback - -EOF - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --env|-e) ENVIRONMENT="$2"; shift 2 ;; - --target|-t) TARGET="$2"; shift 2 ;; - --namespace|-n) NAMESPACE="$2"; shift 2 ;; - --service) SERVICE_NAME="$2"; shift 2 ;; - --skip-health) SKIP_HEALTH_CHECK=true; shift ;; - --dry-run) DRY_RUN=true; shift ;; - --help|-h) usage ;; - *) fatal "Unknown option: $1" ;; - esac - done - - [[ -z "$ENVIRONMENT" ]] && fatal "Missing required argument: --env" - [[ -z "$TARGET" ]] && fatal "Missing required argument: --target" - [[ -z "$NAMESPACE" ]] && NAMESPACE="agent-monitor-${ENVIRONMENT}" - - case "$TARGET" in - blue|green) ;; - *) fatal "Invalid target: $TARGET. Must be 'blue' or 'green'." ;; - esac -} - -# ── Detect current active slot ────────────────────────────────────────────── -detect_current_slot() { - local current - current=$(kubectl get svc "${SERVICE_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.spec.selector.slot}' 2>/dev/null || echo "") - - if [[ -z "$current" ]]; then - # Try alternative label names - current=$(kubectl get svc "${SERVICE_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.spec.selector.deployment-slot}' 2>/dev/null || echo "") - fi - - if [[ -z "$current" ]]; then - current=$(kubectl get svc "${SERVICE_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.spec.selector.color}' 2>/dev/null || echo "unknown") - fi - - echo "$current" -} - -# ── Check target slot is healthy ──────────────────────────────────────────── -check_target_health() { - if [[ "$SKIP_HEALTH_CHECK" == true ]]; then - info "Skipping target health check (--skip-health)" - return 0 - fi - - info "Checking health of ${BOLD}${TARGET}${NC} slot..." - - # Verify pods exist and are ready - local ready_pods - ready_pods=$(kubectl get pods -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME},slot=${TARGET}" \ - --field-selector=status.phase=Running \ - -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "") - - if [[ -z "$ready_pods" ]]; then - # Try with 'color' label - ready_pods=$(kubectl get pods -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME},color=${TARGET}" \ - --field-selector=status.phase=Running \ - -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "") - fi - - if [[ -z "$ready_pods" ]]; then - # Try with 'deployment-slot' label - ready_pods=$(kubectl get pods -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME},deployment-slot=${TARGET}" \ - --field-selector=status.phase=Running \ - -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "") - fi - - if [[ -z "$ready_pods" ]]; then - fatal "No running pods found for ${TARGET} slot. Deploy first." - fi - - info "Found running pods in ${TARGET} slot: ${ready_pods}" - - # Health check via port-forward to first pod - local first_pod - first_pod=$(echo "$ready_pods" | awk '{print $1}') - local local_port=14821 - - kubectl port-forward "pod/${first_pod}" "${local_port}:${APP_PORT}" -n "${NAMESPACE}" & - local pf_pid=$! - sleep 3 - - local healthy=false - for attempt in 1 2 3 4 5; do - if curl -sf --max-time 5 "http://localhost:${local_port}/api/health" | grep -q '"status":"ok"'; then - healthy=true - break - fi - info "Health check attempt ${attempt}/5..." - sleep 2 - done - - kill "$pf_pid" 2>/dev/null || true - - if [[ "$healthy" != true ]]; then - fatal "${TARGET} slot is NOT healthy. Aborting traffic switch." - fi - - ok "${TARGET} slot is healthy" -} - -# ── Switch traffic ────────────────────────────────────────────────────────── -switch_traffic() { - local current_slot - current_slot=$(detect_current_slot) - - info "Current active slot: ${BOLD}${current_slot}${NC}" - info "Switching to: ${BOLD}${TARGET}${NC}" - - if [[ "$current_slot" == "$TARGET" ]]; then - warn "Traffic is already pointing to ${TARGET}. Nothing to do." - return 0 - fi - - if [[ "$ENVIRONMENT" == "production" ]] && [[ "$DRY_RUN" == false ]]; then - echo "" - warn "Switching ${BOLD}PRODUCTION${NC} traffic from ${current_slot} → ${TARGET}" - read -r -p "$(echo -e "${YELLOW}Type 'yes' to confirm:${NC} ")" confirm - [[ "$confirm" == "yes" ]] || fatal "Switch cancelled." - fi - - # Build the patch – try common label conventions - local label_key="slot" - local current_labels - current_labels=$(kubectl get svc "${SERVICE_NAME}" -n "${NAMESPACE}" -o json 2>/dev/null) - - if echo "$current_labels" | grep -q '"color"'; then - label_key="color" - elif echo "$current_labels" | grep -q '"deployment-slot"'; then - label_key="deployment-slot" - fi - - local patch="{\"spec\":{\"selector\":{\"${label_key}\":\"${TARGET}\"}}}" - - if [[ "$DRY_RUN" == true ]]; then - info "[DRY-RUN] Would patch service '${SERVICE_NAME}' with:" - echo " ${patch}" - return - fi - - if ! kubectl patch svc "${SERVICE_NAME}" -n "${NAMESPACE}" -p "${patch}"; then - fatal "Failed to patch service selector!" - fi - - ok "Service '${SERVICE_NAME}' now routing to ${TARGET} slot" - - # Verify the switch - local new_slot - new_slot=$(detect_current_slot) - if [[ "$new_slot" != "$TARGET" ]]; then - err "Verification failed! Service selector shows: ${new_slot}" - warn "Attempting to revert to ${current_slot}..." - kubectl patch svc "${SERVICE_NAME}" -n "${NAMESPACE}" \ - -p "{\"spec\":{\"selector\":{\"${label_key}\":\"${current_slot}\"}}}" \ - && ok "Reverted to ${current_slot}" \ - || fatal "Revert failed! Manual intervention needed." - exit 1 - fi - - ok "Verified: traffic now routes to ${TARGET}" -} - -# ── Post-switch health check ─────────────────────────────────────────────── -post_switch_health() { - if [[ "$DRY_RUN" == true ]] || [[ "$SKIP_HEALTH_CHECK" == true ]]; then - return - fi - - info "Running post-switch health check via service..." - sleep 5 # Let connections drain - - if [[ -x "${SCRIPT_DIR}/health-check.sh" ]]; then - local local_port=14822 - kubectl port-forward "svc/${SERVICE_NAME}" "${local_port}:${APP_PORT}" -n "${NAMESPACE}" & - local pf_pid=$! - sleep 3 - - if "${SCRIPT_DIR}/health-check.sh" --url "http://localhost:${local_port}" --retries 5 --interval 3; then - ok "Post-switch health check passed" - else - warn "Post-switch health check failed – consider switching back!" - fi - - kill "$pf_pid" 2>/dev/null || true - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - echo "" - echo -e "${BOLD}${BLUE}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${BLUE}║ Claude Code Agent Monitor – Blue/Green Switch ║${NC}" - echo -e "${BOLD}${BLUE}╚══════════════════════════════════════════════════╝${NC}" - echo "" - - parse_args "$@" - - info "Configuration:" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Target slot:${NC} ${TARGET}" - echo -e " ${BOLD}Namespace:${NC} ${NAMESPACE}" - echo -e " ${BOLD}Service:${NC} ${SERVICE_NAME}" - echo "" - - check_target_health - switch_traffic - post_switch_health - - echo "" - ok "${BOLD}Blue-green switch complete!${NC}" - echo -e " ${BOLD}Active slot:${NC} ${TARGET}" - echo -e " ${BOLD}Timestamp:${NC} $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo -e " ${BOLD}Rollback:${NC} $(basename "$0") --env ${ENVIRONMENT} --target $([ "$TARGET" = "blue" ] && echo "green" || echo "blue")" - echo "" -} - -main "$@" diff --git a/deployments/scripts/db-backup.sh b/deployments/scripts/db-backup.sh deleted file mode 100755 index 720b513..0000000 --- a/deployments/scripts/db-backup.sh +++ /dev/null @@ -1,298 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# db-backup.sh – SQLite database backup for Claude Code Agent Monitor -# -# Usage: -# ./db-backup.sh --env production --output ./backups/ -# ./db-backup.sh --env production --output ./backups/ --upload s3://bucket/path -# ./db-backup.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly APP_NAME="agent-monitor" -readonly DB_PATH_IN_CONTAINER="/app/data" - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } -fatal() { err "$@"; exit 1; } - -# ── Defaults ──────────────────────────────────────────────────────────────── -ENVIRONMENT="" -OUTPUT_DIR="" -NAMESPACE="" -UPLOAD_DEST="" -POD_NAME="" -DB_FILENAME="" -COMPRESS=true - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < --output [options] - -${BOLD}Required:${NC} - --env, -e Environment: dev, staging, production - --output, -o Local directory for the backup file - -${BOLD}Options:${NC} - --namespace, -n Kubernetes namespace (default: agent-monitor-) - --pod Specific pod name to copy from (auto-detected if omitted) - --upload Upload backup to S3/GCS (e.g., s3://bucket/backups/) - --no-compress Skip gzip compression - --help, -h Show this help message - -${BOLD}Examples:${NC} - $(basename "$0") --env production --output ./backups/ - $(basename "$0") --env staging --output /tmp/backups --upload s3://my-bucket/db-backups/ - -EOF - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --env|-e) ENVIRONMENT="$2"; shift 2 ;; - --output|-o) OUTPUT_DIR="$2"; shift 2 ;; - --namespace|-n) NAMESPACE="$2"; shift 2 ;; - --pod) POD_NAME="$2"; shift 2 ;; - --upload) UPLOAD_DEST="$2"; shift 2 ;; - --no-compress) COMPRESS=false; shift ;; - --help|-h) usage ;; - *) fatal "Unknown option: $1" ;; - esac - done - - [[ -z "$ENVIRONMENT" ]] && fatal "Missing required argument: --env" - [[ -z "$OUTPUT_DIR" ]] && fatal "Missing required argument: --output" - [[ -z "$NAMESPACE" ]] && NAMESPACE="agent-monitor-${ENVIRONMENT}" -} - -# ── Find target pod ──────────────────────────────────────────────────────── -find_pod() { - if [[ -n "$POD_NAME" ]]; then - info "Using specified pod: ${POD_NAME}" - return - fi - - info "Finding running pod in namespace '${NAMESPACE}'..." - - POD_NAME=$(kubectl get pods -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME}" \ - --field-selector=status.phase=Running \ - -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "") - - if [[ -z "$POD_NAME" ]]; then - fatal "No running pods found for ${APP_NAME} in ${NAMESPACE}" - fi - - info "Selected pod: ${POD_NAME}" -} - -# ── Create backup ────────────────────────────────────────────────────────── -create_backup() { - local timestamp - timestamp=$(date -u +%Y%m%d_%H%M%S) - DB_FILENAME="${APP_NAME}_${ENVIRONMENT}_${timestamp}.db" - - # Create output directory - mkdir -p "${OUTPUT_DIR}" - - info "Creating backup..." - - # Use sqlite3 .backup inside the pod for a consistent snapshot - # This avoids copying a potentially locked/in-flight database - local remote_backup_path="/tmp/${DB_FILENAME}" - - info "Running SQLite backup inside pod (consistent snapshot)..." - if kubectl exec "${POD_NAME}" -n "${NAMESPACE}" -- \ - sh -c " - if command -v sqlite3 >/dev/null 2>&1; then - sqlite3 '${DB_PATH_IN_CONTAINER}/dashboard.db' '.backup ${remote_backup_path}' - else - cp '${DB_PATH_IN_CONTAINER}/dashboard.db' '${remote_backup_path}' - fi - " 2>/dev/null; then - ok "In-pod backup created at ${remote_backup_path}" - else - # Fallback: also copy WAL files if present - warn "sqlite3 not available in pod, falling back to file copy" - kubectl exec "${POD_NAME}" -n "${NAMESPACE}" -- \ - sh -c "cp '${DB_PATH_IN_CONTAINER}/dashboard.db' '${remote_backup_path}'" \ - || fatal "Failed to copy database file" - - # Try to also get WAL and SHM files - kubectl exec "${POD_NAME}" -n "${NAMESPACE}" -- \ - sh -c "cp '${DB_PATH_IN_CONTAINER}/dashboard.db-wal' '${remote_backup_path}-wal' 2>/dev/null || true" - kubectl exec "${POD_NAME}" -n "${NAMESPACE}" -- \ - sh -c "cp '${DB_PATH_IN_CONTAINER}/dashboard.db-shm' '${remote_backup_path}-shm' 2>/dev/null || true" - fi - - # Copy backup from pod to local - info "Copying backup to local filesystem..." - kubectl cp "${NAMESPACE}/${POD_NAME}:${remote_backup_path}" "${OUTPUT_DIR}/${DB_FILENAME}" \ - || fatal "Failed to copy backup from pod" - - # Copy WAL if it exists - kubectl cp "${NAMESPACE}/${POD_NAME}:${remote_backup_path}-wal" "${OUTPUT_DIR}/${DB_FILENAME}-wal" 2>/dev/null || true - - # Cleanup remote temp file - kubectl exec "${POD_NAME}" -n "${NAMESPACE}" -- \ - sh -c "rm -f '${remote_backup_path}' '${remote_backup_path}-wal' '${remote_backup_path}-shm'" 2>/dev/null || true - - local file_size - file_size=$(du -sh "${OUTPUT_DIR}/${DB_FILENAME}" 2>/dev/null | awk '{print $1}') - ok "Backup saved: ${OUTPUT_DIR}/${DB_FILENAME} (${file_size})" -} - -# ── Validate backup integrity ────────────────────────────────────────────── -validate_backup() { - info "Validating backup integrity..." - - local db_file="${OUTPUT_DIR}/${DB_FILENAME}" - - if ! command -v sqlite3 &>/dev/null; then - warn "sqlite3 not found locally – skipping integrity check" - return - fi - - # Check integrity - local integrity - integrity=$(sqlite3 "${db_file}" "PRAGMA integrity_check;" 2>/dev/null || echo "error") - - if [[ "$integrity" == "ok" ]]; then - ok "SQLite integrity check: OK" - else - err "SQLite integrity check failed: ${integrity}" - warn "Backup may be corrupted – consider re-running the backup" - return 1 - fi - - # Show basic stats - local table_count - table_count=$(sqlite3 "${db_file}" "SELECT count(*) FROM sqlite_master WHERE type='table';" 2>/dev/null || echo "?") - local page_count - page_count=$(sqlite3 "${db_file}" "PRAGMA page_count;" 2>/dev/null || echo "?") - local page_size - page_size=$(sqlite3 "${db_file}" "PRAGMA page_size;" 2>/dev/null || echo "?") - - info "Database stats: ${table_count} tables, ${page_count} pages × ${page_size} bytes" -} - -# ── Compress backup ──────────────────────────────────────────────────────── -compress_backup() { - if [[ "$COMPRESS" == false ]]; then - info "Compression skipped" - return - fi - - local db_file="${OUTPUT_DIR}/${DB_FILENAME}" - - if ! command -v gzip &>/dev/null; then - warn "gzip not available – skipping compression" - return - fi - - info "Compressing backup..." - gzip -k "${db_file}" - DB_FILENAME="${DB_FILENAME}.gz" - - local compressed_size - compressed_size=$(du -sh "${OUTPUT_DIR}/${DB_FILENAME}" 2>/dev/null | awk '{print $1}') - ok "Compressed: ${OUTPUT_DIR}/${DB_FILENAME} (${compressed_size})" -} - -# ── Upload to cloud storage ──────────────────────────────────────────────── -upload_backup() { - if [[ -z "$UPLOAD_DEST" ]]; then - return - fi - - local backup_file="${OUTPUT_DIR}/${DB_FILENAME}" - - info "Uploading backup to ${UPLOAD_DEST}..." - - if [[ "$UPLOAD_DEST" == s3://* ]]; then - if ! command -v aws &>/dev/null; then - fatal "AWS CLI not found. Install it to upload to S3." - fi - aws s3 cp "${backup_file}" "${UPLOAD_DEST}${DB_FILENAME}" \ - --storage-class STANDARD_IA \ - || fatal "S3 upload failed" - ok "Uploaded to ${UPLOAD_DEST}${DB_FILENAME}" - - elif [[ "$UPLOAD_DEST" == gs://* ]]; then - if ! command -v gsutil &>/dev/null; then - fatal "gsutil not found. Install Google Cloud SDK to upload to GCS." - fi - gsutil cp "${backup_file}" "${UPLOAD_DEST}${DB_FILENAME}" \ - || fatal "GCS upload failed" - ok "Uploaded to ${UPLOAD_DEST}${DB_FILENAME}" - - elif [[ "$UPLOAD_DEST" == az://* ]] || [[ "$UPLOAD_DEST" == https://*.blob.core.windows.net/* ]]; then - if ! command -v az &>/dev/null; then - fatal "Azure CLI not found. Install it to upload to Azure Blob." - fi - local container_url="${UPLOAD_DEST}" - az storage blob upload \ - --file "${backup_file}" \ - --name "${DB_FILENAME}" \ - --overwrite \ - || fatal "Azure Blob upload failed" - ok "Uploaded to Azure Blob Storage" - - else - warn "Unknown upload destination scheme: ${UPLOAD_DEST}" - warn "Supported: s3://, gs://, az://" - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - echo "" - echo -e "${BOLD}${BLUE}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${BLUE}║ Claude Code Agent Monitor – DB Backup ║${NC}" - echo -e "${BOLD}${BLUE}╚══════════════════════════════════════════════════╝${NC}" - echo "" - - parse_args "$@" - - info "Configuration:" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Namespace:${NC} ${NAMESPACE}" - echo -e " ${BOLD}Output:${NC} ${OUTPUT_DIR}" - [[ -n "$UPLOAD_DEST" ]] && echo -e " ${BOLD}Upload:${NC} ${UPLOAD_DEST}" - echo "" - - find_pod - create_backup - validate_backup - compress_backup - upload_backup - - echo "" - ok "${BOLD}Backup complete!${NC}" - echo -e " ${BOLD}File:${NC} ${OUTPUT_DIR}/${DB_FILENAME}" - echo -e " ${BOLD}Timestamp:${NC} $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "" -} - -main "$@" diff --git a/deployments/scripts/db-restore.sh b/deployments/scripts/db-restore.sh deleted file mode 100755 index 8948a39..0000000 --- a/deployments/scripts/db-restore.sh +++ /dev/null @@ -1,396 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# db-restore.sh – SQLite database restore for Claude Code Agent Monitor -# -# Usage: -# ./db-restore.sh --env production --input ./backups/agent-monitor_production_20240101_120000.db -# ./db-restore.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly APP_NAME="agent-monitor" -readonly APP_PORT=4820 -readonly DB_PATH_IN_CONTAINER="/app/data" - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } -fatal() { err "$@"; exit 1; } - -# ── Defaults ──────────────────────────────────────────────────────────────── -ENVIRONMENT="" -INPUT_FILE="" -NAMESPACE="" -SKIP_HEALTH_CHECK=false -FORCE=false -BACKUP_BEFORE_RESTORE=true - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < --input [options] - -${BOLD}Required:${NC} - --env, -e Environment: dev, staging, production - --input, -i Path to backup file (.db or .db.gz) - -${BOLD}Options:${NC} - --namespace, -n Kubernetes namespace (default: agent-monitor-) - --no-backup Skip backing up current DB before restore - --skip-health Skip post-restore health check - --force Skip confirmation prompt - --help, -h Show this help message - -${BOLD}Examples:${NC} - $(basename "$0") --env production --input ./backups/agent-monitor_production_20240101_120000.db - $(basename "$0") --env staging --input ./backups/backup.db.gz --force - -EOF - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --env|-e) ENVIRONMENT="$2"; shift 2 ;; - --input|-i) INPUT_FILE="$2"; shift 2 ;; - --namespace|-n) NAMESPACE="$2"; shift 2 ;; - --no-backup) BACKUP_BEFORE_RESTORE=false; shift ;; - --skip-health) SKIP_HEALTH_CHECK=true; shift ;; - --force) FORCE=true; shift ;; - --help|-h) usage ;; - *) fatal "Unknown option: $1" ;; - esac - done - - [[ -z "$ENVIRONMENT" ]] && fatal "Missing required argument: --env" - [[ -z "$INPUT_FILE" ]] && fatal "Missing required argument: --input" - [[ -z "$NAMESPACE" ]] && NAMESPACE="agent-monitor-${ENVIRONMENT}" - - # Validate input file exists - [[ -f "$INPUT_FILE" ]] || fatal "Input file not found: ${INPUT_FILE}" -} - -# ── Validate backup file ─────────────────────────────────────────────────── -validate_input() { - info "Validating input file: ${INPUT_FILE}" - - local restore_file="${INPUT_FILE}" - - # Decompress if needed - if [[ "$INPUT_FILE" == *.gz ]]; then - info "Decompressing gzipped backup..." - restore_file="${INPUT_FILE%.gz}" - if [[ -f "$restore_file" ]]; then - warn "Decompressed file already exists: ${restore_file}" - else - gzip -dk "${INPUT_FILE}" || fatal "Failed to decompress ${INPUT_FILE}" - fi - fi - - RESTORE_FILE="$restore_file" - - # Validate with sqlite3 if available - if command -v sqlite3 &>/dev/null; then - local integrity - integrity=$(sqlite3 "${RESTORE_FILE}" "PRAGMA integrity_check;" 2>/dev/null || echo "error") - if [[ "$integrity" == "ok" ]]; then - ok "SQLite integrity check passed" - else - fatal "Input file failed integrity check: ${integrity}" - fi - - local table_count - table_count=$(sqlite3 "${RESTORE_FILE}" "SELECT count(*) FROM sqlite_master WHERE type='table';" 2>/dev/null || echo "?") - info "Backup contains ${table_count} tables" - else - warn "sqlite3 not available – skipping integrity check" - # Basic file header check - local header - header=$(head -c 16 "${RESTORE_FILE}" | strings 2>/dev/null || echo "") - if echo "$header" | grep -q "SQLite format"; then - ok "File appears to be a valid SQLite database" - else - fatal "File does not appear to be a SQLite database" - fi - fi - - local file_size - file_size=$(du -sh "${RESTORE_FILE}" 2>/dev/null | awk '{print $1}') - info "Restore file size: ${file_size}" -} - -# ── Safety confirmation ───────────────────────────────────────────────────── -confirm_restore() { - if [[ "$FORCE" == true ]]; then - return - fi - - echo "" - warn "${BOLD}⚠ DATABASE RESTORE WARNING ⚠${NC}" - echo "" - echo -e " This will ${RED}${BOLD}REPLACE${NC} the current database in ${BOLD}${ENVIRONMENT}${NC}" - echo -e " with the contents of: ${INPUT_FILE}" - echo "" - echo -e " The deployment will be ${BOLD}scaled down${NC} during restore." - echo "" - - if [[ "$ENVIRONMENT" == "production" ]]; then - echo -e " ${RED}${BOLD}THIS IS A PRODUCTION ENVIRONMENT!${NC}" - echo "" - read -r -p "$(echo -e "${YELLOW}Type the environment name to confirm:${NC} ")" confirm - [[ "$confirm" == "$ENVIRONMENT" ]] || fatal "Restore cancelled. You typed '${confirm}', expected '${ENVIRONMENT}'." - else - read -r -p "$(echo -e "${YELLOW}Type 'yes' to confirm:${NC} ")" confirm - [[ "$confirm" == "yes" ]] || fatal "Restore cancelled." - fi -} - -# ── Get deployment info ───────────────────────────────────────────────────── -get_deployment_info() { - info "Getting deployment info..." - - DEPLOYMENT_NAME=$(kubectl get deployment -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME}" \ - -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "") - - if [[ -z "$DEPLOYMENT_NAME" ]]; then - fatal "No deployment found for ${APP_NAME} in ${NAMESPACE}" - fi - - ORIGINAL_REPLICAS=$(kubectl get deployment "${DEPLOYMENT_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.spec.replicas}' 2>/dev/null || echo "1") - - info "Deployment: ${DEPLOYMENT_NAME} (${ORIGINAL_REPLICAS} replicas)" -} - -# ── Backup current DB before restore ─────────────────────────────────────── -backup_current() { - if [[ "$BACKUP_BEFORE_RESTORE" == false ]]; then - info "Skipping pre-restore backup (--no-backup)" - return - fi - - info "Backing up current database before restore..." - - if [[ -x "${SCRIPT_DIR}/db-backup.sh" ]]; then - local backup_dir="${SCRIPT_DIR}/../../data/pre-restore-backups" - "${SCRIPT_DIR}/db-backup.sh" \ - --env "${ENVIRONMENT}" \ - --output "${backup_dir}" \ - --namespace "${NAMESPACE}" \ - --no-compress \ - && ok "Pre-restore backup created in ${backup_dir}" \ - || warn "Pre-restore backup failed – proceeding anyway" - else - warn "db-backup.sh not found – skipping pre-restore backup" - fi -} - -# ── Scale down deployment ─────────────────────────────────────────────────── -scale_down() { - info "Scaling down deployment to 0 replicas..." - - kubectl scale deployment "${DEPLOYMENT_NAME}" \ - --replicas=0 \ - -n "${NAMESPACE}" \ - || fatal "Failed to scale down deployment" - - # Wait for all pods to terminate - info "Waiting for pods to terminate..." - local wait_count=0 - while [[ $wait_count -lt 60 ]]; do - local running - running=$(kubectl get pods -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME}" \ - --field-selector=status.phase=Running \ - --no-headers 2>/dev/null | wc -l | tr -d ' ') - - if [[ "$running" == "0" ]]; then - ok "All pods terminated" - return - fi - - wait_count=$((wait_count + 1)) - sleep 2 - done - - warn "Pods did not terminate within timeout" -} - -# ── Restore database ─────────────────────────────────────────────────────── -restore_database() { - info "Restoring database..." - - # We need a temporary pod to access the PVC - # Create a helper pod that mounts the PVC - local helper_pod="${APP_NAME}-db-restore-helper" - - # Get PVC name - local pvc_name - pvc_name=$(kubectl get pvc -n "${NAMESPACE}" \ - -l "app.kubernetes.io/name=${APP_NAME}" \ - -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || echo "agent-monitor-data") - - info "Creating helper pod to access PVC: ${pvc_name}" - - kubectl apply -n "${NAMESPACE}" -f - </dev/null; then - fatal "Pods did not become ready after restore!" - fi - - if [[ -x "${SCRIPT_DIR}/health-check.sh" ]]; then - local local_port=14823 - kubectl port-forward "svc/${APP_NAME}" "${local_port}:${APP_PORT}" -n "${NAMESPACE}" & - local pf_pid=$! - sleep 3 - - if "${SCRIPT_DIR}/health-check.sh" --url "http://localhost:${local_port}" --retries 10 --interval 3; then - ok "Post-restore health check passed" - else - err "Post-restore health check failed!" - warn "The application may need manual investigation" - fi - - kill "$pf_pid" 2>/dev/null || true - else - ok "Pods are ready" - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - echo "" - echo -e "${BOLD}${YELLOW}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${YELLOW}║ Claude Code Agent Monitor – DB Restore ║${NC}" - echo -e "${BOLD}${YELLOW}╚══════════════════════════════════════════════════╝${NC}" - echo "" - - parse_args "$@" - validate_input - confirm_restore - get_deployment_info - backup_current - scale_down - restore_database - scale_up - run_health_check - - echo "" - ok "${BOLD}Database restore complete!${NC}" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Source:${NC} ${INPUT_FILE}" - echo -e " ${BOLD}Timestamp:${NC} $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "" -} - -main "$@" diff --git a/deployments/scripts/deploy.sh b/deployments/scripts/deploy.sh deleted file mode 100755 index a47049c..0000000 --- a/deployments/scripts/deploy.sh +++ /dev/null @@ -1,572 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# deploy.sh – Main deployment orchestrator for Claude Code Agent Monitor -# -# Usage: -# ./deploy.sh --env dev|staging|production --method helm|kustomize|terraform -# ./deploy.sh --env production --method helm --strategy blue-green|canary|rolling -# ./deploy.sh --env staging --method helm --dry-run -# ./deploy.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -# ── Constants ─────────────────────────────────────────────────────────────── -readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" -readonly DEPLOY_DIR="${PROJECT_ROOT}/deployments" -readonly APP_NAME="agent-monitor" -readonly APP_PORT=4820 -readonly DEFAULT_REGISTRY="ghcr.io" -readonly DEFAULT_IMAGE_NAME="claude-code-agent-monitor" - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } -fatal() { err "$@"; exit 1; } - -banner() { - echo "" - echo -e "${BOLD}${BLUE}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${BLUE}║ Claude Code Agent Monitor – Deploy ║${NC}" - echo -e "${BOLD}${BLUE}╚══════════════════════════════════════════════════╝${NC}" - echo "" -} - -# ── Default parameter values ──────────────────────────────────────────────── -ENVIRONMENT="" -METHOD="" -STRATEGY="rolling" -DRY_RUN=false -IMAGE_TAG="" -REGISTRY="${DOCKER_REGISTRY:-$DEFAULT_REGISTRY}" -IMAGE_NAME="${DOCKER_IMAGE_NAME:-$DEFAULT_IMAGE_NAME}" -NAMESPACE="" -HELM_RELEASE="${APP_NAME}" -HELM_CHART_DIR="${DEPLOY_DIR}/helm/agent-monitor" -KUBE_CONTEXT="" -SKIP_BUILD=false -SKIP_HEALTH_CHECK=false -HEALTH_CHECK_RETRIES=30 -HEALTH_CHECK_INTERVAL=5 -VALUES_FILE="" - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < --method [options] - -${BOLD}Required:${NC} - --env, -e Environment: dev, staging, production - --method, -m Deployment method: helm, kustomize, terraform - -${BOLD}Options:${NC} - --strategy, -s Deployment strategy: rolling (default), blue-green, canary - --tag, -t Docker image tag (default: git SHA) - --registry Container registry (default: ${DEFAULT_REGISTRY}) - --image Image name (default: ${DEFAULT_IMAGE_NAME}) - --namespace, -n Kubernetes namespace (default: agent-monitor-) - --release Helm release name (default: ${APP_NAME}) - --context Kubernetes context to use - --values Additional Helm values file - --skip-build Skip container image build/push - --skip-health Skip post-deploy health check - --dry-run Preview changes without applying - --help, -h Show this help message - -${BOLD}Examples:${NC} - $(basename "$0") --env dev --method helm - $(basename "$0") --env production --method helm --strategy blue-green --tag v1.2.3 - $(basename "$0") --env staging --method kustomize --dry-run - $(basename "$0") --env production --method terraform - -EOF - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --env|-e) ENVIRONMENT="$2"; shift 2 ;; - --method|-m) METHOD="$2"; shift 2 ;; - --strategy|-s) STRATEGY="$2"; shift 2 ;; - --tag|-t) IMAGE_TAG="$2"; shift 2 ;; - --registry) REGISTRY="$2"; shift 2 ;; - --image) IMAGE_NAME="$2"; shift 2 ;; - --namespace|-n) NAMESPACE="$2"; shift 2 ;; - --release) HELM_RELEASE="$2"; shift 2 ;; - --context) KUBE_CONTEXT="$2"; shift 2 ;; - --values) VALUES_FILE="$2"; shift 2 ;; - --skip-build) SKIP_BUILD=true; shift ;; - --skip-health) SKIP_HEALTH_CHECK=true; shift ;; - --dry-run) DRY_RUN=true; shift ;; - --help|-h) usage ;; - *) fatal "Unknown option: $1. Use --help for usage." ;; - esac - done -} - -# ── Validation ────────────────────────────────────────────────────────────── -validate_args() { - [[ -z "$ENVIRONMENT" ]] && fatal "Missing required argument: --env" - [[ -z "$METHOD" ]] && fatal "Missing required argument: --method" - - case "$ENVIRONMENT" in - dev|staging|production) ;; - *) fatal "Invalid environment: $ENVIRONMENT. Must be dev, staging, or production." ;; - esac - - case "$METHOD" in - helm|kustomize|terraform) ;; - *) fatal "Invalid method: $METHOD. Must be helm, kustomize, or terraform." ;; - esac - - case "$STRATEGY" in - rolling|blue-green|canary) ;; - *) fatal "Invalid strategy: $STRATEGY. Must be rolling, blue-green, or canary." ;; - esac - - # Default namespace - [[ -z "$NAMESPACE" ]] && NAMESPACE="agent-monitor-${ENVIRONMENT}" - - # Default image tag from git - if [[ -z "$IMAGE_TAG" ]]; then - IMAGE_TAG="$(git -C "$PROJECT_ROOT" rev-parse --short HEAD 2>/dev/null || echo 'latest')" - fi - - readonly FULL_IMAGE="${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}" - readonly MCP_IMAGE="${REGISTRY}/${IMAGE_NAME}-mcp:${IMAGE_TAG}" -} - -# ── Prerequisite checks ──────────────────────────────────────────────────── -check_prerequisites() { - info "Checking prerequisites..." - - local missing=() - - # Always need docker for building - if [[ "$SKIP_BUILD" == false ]]; then - command -v docker &>/dev/null || missing+=("docker") - fi - - case "$METHOD" in - helm) - command -v kubectl &>/dev/null || missing+=("kubectl") - command -v helm &>/dev/null || missing+=("helm") - ;; - kustomize) - command -v kubectl &>/dev/null || missing+=("kubectl") - command -v kustomize &>/dev/null || missing+=("kustomize") - ;; - terraform) - command -v terraform &>/dev/null || missing+=("terraform") - ;; - esac - - if [[ ${#missing[@]} -gt 0 ]]; then - fatal "Missing required tools: ${missing[*]}. Please install them and retry." - fi - - # Validate kube context if specified - if [[ -n "$KUBE_CONTEXT" ]] && [[ "$METHOD" != "terraform" ]]; then - if ! kubectl config get-contexts "$KUBE_CONTEXT" &>/dev/null; then - fatal "Kubernetes context '$KUBE_CONTEXT' not found." - fi - kubectl config use-context "$KUBE_CONTEXT" - fi - - # Validate Helm chart exists - if [[ "$METHOD" == "helm" ]] && [[ ! -f "${HELM_CHART_DIR}/Chart.yaml" ]]; then - fatal "Helm chart not found at ${HELM_CHART_DIR}" - fi - - ok "All prerequisites satisfied" -} - -# ── Build & push container images ─────────────────────────────────────────── -build_and_push() { - if [[ "$SKIP_BUILD" == true ]]; then - info "Skipping image build (--skip-build)" - return - fi - - info "Building container images..." - - local docker_cmd="docker build" - local push_cmd="docker push" - - if [[ "$DRY_RUN" == true ]]; then - info "[DRY-RUN] Would build: ${FULL_IMAGE}" - info "[DRY-RUN] Would build: ${MCP_IMAGE}" - return - fi - - # Build main application image - log "Building main app image: ${FULL_IMAGE}" - docker build \ - --file "${PROJECT_ROOT}/Dockerfile" \ - --tag "${FULL_IMAGE}" \ - --label "org.opencontainers.image.revision=$(git -C "$PROJECT_ROOT" rev-parse HEAD 2>/dev/null || echo 'unknown')" \ - --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ - "${PROJECT_ROOT}" - ok "Main app image built: ${FULL_IMAGE}" - - # Build MCP sidecar image - log "Building MCP sidecar image: ${MCP_IMAGE}" - docker build \ - --file "${PROJECT_ROOT}/mcp/Dockerfile" \ - --tag "${MCP_IMAGE}" \ - "${PROJECT_ROOT}" - ok "MCP sidecar image built: ${MCP_IMAGE}" - - # Push images - log "Pushing images to registry..." - docker push "${FULL_IMAGE}" - docker push "${MCP_IMAGE}" - ok "Images pushed to ${REGISTRY}" -} - -# ── Helm deployment ───────────────────────────────────────────────────────── -deploy_helm() { - info "Deploying via Helm (strategy: ${STRATEGY})..." - - local helm_args=( - upgrade --install "${HELM_RELEASE}" "${HELM_CHART_DIR}" - --namespace "${NAMESPACE}" - --create-namespace - --set "image.repository=${REGISTRY}/${IMAGE_NAME}" - --set "image.tag=${IMAGE_TAG}" - --set "environment=${ENVIRONMENT}" - --set "mcp.image.repository=${REGISTRY}/${IMAGE_NAME}-mcp" - --set "mcp.image.tag=${IMAGE_TAG}" - --timeout 600s - --wait - --atomic - ) - - # Environment-specific values - local env_values="${HELM_CHART_DIR}/values-${ENVIRONMENT}.yaml" - if [[ -f "$env_values" ]]; then - helm_args+=(--values "$env_values") - fi - - # User-provided values file - if [[ -n "$VALUES_FILE" ]] && [[ -f "$VALUES_FILE" ]]; then - helm_args+=(--values "$VALUES_FILE") - fi - - # Strategy-specific settings - case "$STRATEGY" in - blue-green) - helm_args+=(--set "strategy.type=blue-green") - ;; - canary) - helm_args+=(--set "strategy.type=canary") - helm_args+=(--set "strategy.canary.weight=10") - ;; - rolling) - helm_args+=(--set "strategy.type=rolling") - helm_args+=(--set "strategy.rolling.maxUnavailable=25%") - helm_args+=(--set "strategy.rolling.maxSurge=25%") - ;; - esac - - if [[ "$DRY_RUN" == true ]]; then - helm_args+=(--dry-run --debug) - info "[DRY-RUN] Helm command:" - echo " helm ${helm_args[*]}" - helm "${helm_args[@]}" 2>&1 | head -100 - return - fi - - # Store current revision for rollback - local current_revision - current_revision=$(helm history "${HELM_RELEASE}" -n "${NAMESPACE}" --max 1 -o json 2>/dev/null \ - | grep -o '"revision":[0-9]*' | head -1 | cut -d: -f2 || echo "0") - info "Current Helm revision: ${current_revision}" - - # Execute deployment - if ! helm "${helm_args[@]}"; then - err "Helm deployment failed!" - if [[ "$current_revision" != "0" ]]; then - warn "Attempting auto-rollback to revision ${current_revision}..." - helm rollback "${HELM_RELEASE}" "${current_revision}" -n "${NAMESPACE}" --wait --timeout 300s \ - && ok "Auto-rollback to revision ${current_revision} succeeded" \ - || fatal "Auto-rollback also failed! Manual intervention required." - fi - exit 1 - fi - - ok "Helm deployment succeeded" -} - -# ── Kustomize deployment ─────────────────────────────────────────────────── -deploy_kustomize() { - info "Deploying via Kustomize (overlay: ${ENVIRONMENT})..." - - local overlay_dir="${DEPLOY_DIR}/kubernetes/overlays/${ENVIRONMENT}" - if [[ ! -d "$overlay_dir" ]]; then - fatal "Kustomize overlay not found at ${overlay_dir}" - fi - - # Set image in kustomization - local kustomize_cmd="kubectl apply -k ${overlay_dir}" - if [[ "$DRY_RUN" == true ]]; then - info "[DRY-RUN] Kustomize output:" - kubectl kustomize "${overlay_dir}" | head -100 - return - fi - - # Update image reference using kustomize edit - pushd "${overlay_dir}" > /dev/null - kustomize edit set image "${APP_NAME}=${FULL_IMAGE}" 2>/dev/null || true - popd > /dev/null - - # Apply with server-side apply for safety - if ! kubectl apply -k "${overlay_dir}" --server-side --force-conflicts; then - err "Kustomize deployment failed!" - warn "Run: kubectl rollout undo deployment/${APP_NAME} -n ${NAMESPACE}" - exit 1 - fi - - # Wait for rollout - info "Waiting for rollout to complete..." - if ! kubectl rollout status "deployment/${APP_NAME}" -n "${NAMESPACE}" --timeout=600s; then - err "Rollout did not complete in time!" - warn "Attempting auto-rollback..." - kubectl rollout undo "deployment/${APP_NAME}" -n "${NAMESPACE}" \ - && ok "Auto-rollback succeeded" \ - || fatal "Auto-rollback failed! Manual intervention required." - exit 1 - fi - - ok "Kustomize deployment succeeded" -} - -# ── Terraform deployment ─────────────────────────────────────────────────── -deploy_terraform() { - info "Deploying via Terraform (environment: ${ENVIRONMENT})..." - - local tf_dir="${DEPLOY_DIR}/terraform" - local env_vars_file="${tf_dir}/environments/${ENVIRONMENT}/terraform.tfvars" - - if [[ ! -d "$tf_dir" ]]; then - fatal "Terraform directory not found at ${tf_dir}" - fi - - pushd "${tf_dir}" > /dev/null - - # Initialize - info "Running terraform init..." - terraform init -input=false - - # Plan - local plan_args=(-input=false -out=tfplan) - if [[ -f "$env_vars_file" ]]; then - plan_args+=(-var-file="$env_vars_file") - fi - plan_args+=(-var "app_container_image=${FULL_IMAGE}") - plan_args+=(-var "environment=${ENVIRONMENT}") - - info "Running terraform plan..." - terraform plan "${plan_args[@]}" - - if [[ "$DRY_RUN" == true ]]; then - info "[DRY-RUN] Terraform plan complete. Skipping apply." - rm -f tfplan - popd > /dev/null - return - fi - - # Apply - info "Applying terraform plan..." - if ! terraform apply -input=false tfplan; then - err "Terraform apply failed!" - fatal "Review state and run 'terraform plan' to diagnose." - fi - - rm -f tfplan - popd > /dev/null - - ok "Terraform deployment succeeded" -} - -# ── Post-deployment health check ─────────────────────────────────────────── -run_health_check() { - if [[ "$SKIP_HEALTH_CHECK" == true ]] || [[ "$DRY_RUN" == true ]]; then - info "Skipping health check" - return - fi - - info "Running post-deployment health check..." - - # Determine health check URL - local health_url="" - - if [[ "$METHOD" == "terraform" ]]; then - info "For Terraform deployments, verify health via the load balancer URL in terraform output." - return - fi - - # Try to get service URL from cluster - local svc_type - svc_type=$(kubectl get svc "${APP_NAME}" -n "${NAMESPACE}" -o jsonpath='{.spec.type}' 2>/dev/null || echo "") - - case "$svc_type" in - LoadBalancer) - local lb_host - lb_host=$(kubectl get svc "${APP_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' 2>/dev/null || echo "") - [[ -z "$lb_host" ]] && lb_host=$(kubectl get svc "${APP_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null || echo "") - [[ -n "$lb_host" ]] && health_url="http://${lb_host}:${APP_PORT}/api/health" - ;; - NodePort) - local node_port - node_port=$(kubectl get svc "${APP_NAME}" -n "${NAMESPACE}" \ - -o jsonpath='{.spec.ports[0].nodePort}' 2>/dev/null || echo "") - [[ -n "$node_port" ]] && health_url="http://localhost:${node_port}/api/health" - ;; - *) - # Use port-forward for ClusterIP - info "Service type is ClusterIP – using kubectl port-forward for health check" - local local_port=14820 - kubectl port-forward "svc/${APP_NAME}" "${local_port}:${APP_PORT}" -n "${NAMESPACE}" & - local pf_pid=$! - sleep 3 - health_url="http://localhost:${local_port}/api/health" - ;; - esac - - if [[ -z "$health_url" ]]; then - warn "Could not determine health check URL. Checking pod readiness instead." - if kubectl wait --for=condition=ready pod -l "app.kubernetes.io/name=${APP_NAME}" \ - -n "${NAMESPACE}" --timeout=120s; then - ok "Pods are ready" - else - err "Pods did not become ready" - trigger_auto_rollback - fi - return - fi - - # Run health check script - if [[ -x "${SCRIPT_DIR}/health-check.sh" ]]; then - if ! "${SCRIPT_DIR}/health-check.sh" \ - --url "${health_url}" \ - --retries "${HEALTH_CHECK_RETRIES}" \ - --interval "${HEALTH_CHECK_INTERVAL}"; then - err "Health check failed after deployment!" - # Kill port-forward if running - [[ -n "${pf_pid:-}" ]] && kill "$pf_pid" 2>/dev/null || true - trigger_auto_rollback - fi - else - # Inline health check - local attempt=0 - while [[ $attempt -lt $HEALTH_CHECK_RETRIES ]]; do - if curl -sf --max-time 5 "${health_url}" | grep -q '"status":"ok"'; then - ok "Health check passed" - [[ -n "${pf_pid:-}" ]] && kill "$pf_pid" 2>/dev/null || true - return - fi - attempt=$((attempt + 1)) - info "Health check attempt ${attempt}/${HEALTH_CHECK_RETRIES}..." - sleep "${HEALTH_CHECK_INTERVAL}" - done - err "Health check failed after ${HEALTH_CHECK_RETRIES} attempts!" - [[ -n "${pf_pid:-}" ]] && kill "$pf_pid" 2>/dev/null || true - trigger_auto_rollback - fi - - # Cleanup port-forward - [[ -n "${pf_pid:-}" ]] && kill "$pf_pid" 2>/dev/null || true -} - -trigger_auto_rollback() { - warn "Triggering auto-rollback..." - case "$METHOD" in - helm) - helm rollback "${HELM_RELEASE}" -n "${NAMESPACE}" --wait --timeout 300s \ - && ok "Auto-rollback succeeded" \ - || fatal "Auto-rollback failed! Manual intervention required." - ;; - kustomize) - kubectl rollout undo "deployment/${APP_NAME}" -n "${NAMESPACE}" \ - && ok "Auto-rollback succeeded" \ - || fatal "Auto-rollback failed! Manual intervention required." - ;; - terraform) - warn "Terraform auto-rollback not supported. Review state manually." - ;; - esac - exit 1 -} - -# ── Production safety gate ────────────────────────────────────────────────── -confirm_production() { - if [[ "$ENVIRONMENT" == "production" ]] && [[ "$DRY_RUN" == false ]]; then - echo "" - warn "You are about to deploy to ${BOLD}PRODUCTION${NC}" - echo -e " ${BOLD}Method:${NC} ${METHOD}" - echo -e " ${BOLD}Strategy:${NC} ${STRATEGY}" - echo -e " ${BOLD}Image:${NC} ${FULL_IMAGE}" - echo -e " ${BOLD}Namespace:${NC} ${NAMESPACE}" - echo "" - read -r -p "$(echo -e "${YELLOW}Type 'yes' to confirm:${NC} ")" confirm - [[ "$confirm" == "yes" ]] || fatal "Deployment cancelled." - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - banner - parse_args "$@" - validate_args - - info "Deployment configuration:" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Method:${NC} ${METHOD}" - echo -e " ${BOLD}Strategy:${NC} ${STRATEGY}" - echo -e " ${BOLD}Image:${NC} ${FULL_IMAGE}" - echo -e " ${BOLD}Namespace:${NC} ${NAMESPACE}" - echo -e " ${BOLD}Dry run:${NC} ${DRY_RUN}" - echo "" - - check_prerequisites - confirm_production - build_and_push - - case "$METHOD" in - helm) deploy_helm ;; - kustomize) deploy_kustomize ;; - terraform) deploy_terraform ;; - esac - - run_health_check - - echo "" - ok "${BOLD}Deployment complete!${NC}" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Image:${NC} ${FULL_IMAGE}" - echo -e " ${BOLD}Namespace:${NC} ${NAMESPACE}" - echo -e " ${BOLD}Timestamp:${NC} $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "" -} - -main "$@" diff --git a/deployments/scripts/health-check.sh b/deployments/scripts/health-check.sh deleted file mode 100755 index 03e04b2..0000000 --- a/deployments/scripts/health-check.sh +++ /dev/null @@ -1,342 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# health-check.sh – Comprehensive health check for Claude Code Agent Monitor -# -# Usage: -# ./health-check.sh --url http://localhost:4820 -# ./health-check.sh --url http://host:port --retries 30 --interval 5 -# ./health-check.sh --url http://host:port --json -# ./health-check.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { [[ "$JSON_OUTPUT" == true ]] && return; echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { [[ "$JSON_OUTPUT" == true ]] && return; echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { [[ "$JSON_OUTPUT" == true ]] && return; echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { [[ "$JSON_OUTPUT" == true ]] && return; echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { [[ "$JSON_OUTPUT" == true ]] && return; echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } - -# ── Defaults ──────────────────────────────────────────────────────────────── -BASE_URL="" -RETRIES=30 -INTERVAL=5 -TIMEOUT=5 -RESPONSE_THRESHOLD=2000 # milliseconds -JSON_OUTPUT=false -CHECK_WEBSOCKET=true -HEALTH_PATH="/api/health" - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < [options] - -${BOLD}Required:${NC} - --url, -u Base URL (e.g., http://localhost:4820) - -${BOLD}Options:${NC} - --retries, -r Max retry attempts (default: 30) - --interval, -i Seconds between retries (default: 5) - --timeout HTTP request timeout in seconds (default: 5) - --threshold Max response time in ms (default: 2000) - --path Health endpoint path (default: /api/health) - --no-websocket Skip WebSocket connectivity check - --json Output results as JSON - --help, -h Show this help message - -${BOLD}Exit codes:${NC} - 0 All checks passed - 1 One or more checks failed - -${BOLD}Examples:${NC} - $(basename "$0") --url http://localhost:4820 - $(basename "$0") --url https://monitor.example.com --retries 10 --json - $(basename "$0") --url http://10.0.1.5:4820 --threshold 500 --no-websocket - -HELP - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --url|-u) BASE_URL="$2"; shift 2 ;; - --retries|-r) RETRIES="$2"; shift 2 ;; - --interval|-i) INTERVAL="$2"; shift 2 ;; - --timeout) TIMEOUT="$2"; shift 2 ;; - --threshold) RESPONSE_THRESHOLD="$2"; shift 2 ;; - --path) HEALTH_PATH="$2"; shift 2 ;; - --no-websocket) CHECK_WEBSOCKET=false; shift ;; - --json) JSON_OUTPUT=true; shift ;; - --help|-h) usage ;; - *) echo "Unknown option: $1" >&2; exit 1 ;; - esac - done - - [[ -z "$BASE_URL" ]] && { echo "Missing required argument: --url" >&2; exit 1; } - - # Strip trailing slash - BASE_URL="${BASE_URL%/}" -} - -# ── HTTP health check ────────────────────────────────────────────────────── -check_http_health() { - local url="${BASE_URL}${HEALTH_PATH}" - local attempt=0 - local http_ok=false - local status_code="" - local response_body="" - local response_time_ms=0 - - info "Checking HTTP health: ${url}" - - while [[ $attempt -lt $RETRIES ]]; do - attempt=$((attempt + 1)) - - # Measure response time and capture output - local start_ns - start_ns=$(date +%s%N 2>/dev/null || echo "0") - - local http_response - http_response=$(curl -sf \ - --max-time "${TIMEOUT}" \ - --write-out "\n%{http_code}\n%{time_total}" \ - "${url}" 2>/dev/null) || true - - local end_ns - end_ns=$(date +%s%N 2>/dev/null || echo "0") - - if [[ -n "$http_response" ]]; then - response_body=$(echo "$http_response" | head -n -2) - status_code=$(echo "$http_response" | tail -2 | head -1) - local time_total - time_total=$(echo "$http_response" | tail -1) - # Convert seconds to milliseconds - response_time_ms=$(echo "$time_total" | awk '{printf "%.0f", $1 * 1000}' 2>/dev/null || echo "0") - - if [[ "$status_code" == "200" ]] && echo "$response_body" | grep -q '"status":"ok"'; then - http_ok=true - break - fi - fi - - if [[ $attempt -lt $RETRIES ]]; then - info "Attempt ${attempt}/${RETRIES} – waiting ${INTERVAL}s..." - sleep "${INTERVAL}" - fi - done - - # Results - HTTP_OK="$http_ok" - HTTP_STATUS="$status_code" - HTTP_BODY="$response_body" - HTTP_RESPONSE_TIME_MS="$response_time_ms" - HTTP_ATTEMPTS="$attempt" - - if [[ "$http_ok" == true ]]; then - ok "HTTP health check passed (${response_time_ms}ms, ${attempt} attempt(s))" - else - err "HTTP health check failed after ${attempt} attempts" - fi -} - -# ── Response time check ──────────────────────────────────────────────────── -check_response_time() { - if [[ "$HTTP_OK" != true ]]; then - LATENCY_OK=false - return - fi - - if [[ "$HTTP_RESPONSE_TIME_MS" -le "$RESPONSE_THRESHOLD" ]]; then - LATENCY_OK=true - ok "Response time ${HTTP_RESPONSE_TIME_MS}ms within threshold (${RESPONSE_THRESHOLD}ms)" - else - LATENCY_OK=false - warn "Response time ${HTTP_RESPONSE_TIME_MS}ms exceeds threshold (${RESPONSE_THRESHOLD}ms)" - fi -} - -# ── WebSocket connectivity check ─────────────────────────────────────────── -check_websocket() { - WS_OK=false - - if [[ "$CHECK_WEBSOCKET" == false ]]; then - info "WebSocket check skipped" - WS_OK=true # treat as pass when skipped - return - fi - - # Construct WebSocket URL - local ws_url="${BASE_URL}" - ws_url="${ws_url/http:/ws:}" - ws_url="${ws_url/https:/wss:}" - ws_url="${ws_url}/ws" - - info "Checking WebSocket: ${ws_url}" - - # Check if we have a WebSocket testing tool - if command -v websocat &>/dev/null; then - if echo "" | websocat --one-message -t "${ws_url}" 2>/dev/null; then - WS_OK=true - ok "WebSocket connection succeeded (websocat)" - return - fi - fi - - # Fallback: use curl with upgrade headers to test the handshake - local ws_status - ws_status=$(curl -sf \ - --max-time "${TIMEOUT}" \ - -o /dev/null \ - -w "%{http_code}" \ - -H "Upgrade: websocket" \ - -H "Connection: Upgrade" \ - -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \ - -H "Sec-WebSocket-Version: 13" \ - "${BASE_URL}/ws" 2>/dev/null) || ws_status="000" - - # 101 = Switching Protocols (WebSocket upgrade success) - # 400 = Bad Request (server recognized WS but rejected – still proves WS is available) - case "$ws_status" in - 101) - WS_OK=true - ok "WebSocket handshake succeeded (HTTP 101)" - ;; - 400|426) - WS_OK=true - ok "WebSocket endpoint reachable (HTTP ${ws_status} – server recognized upgrade)" - ;; - *) - # Try Node.js one-liner as last resort - if command -v node &>/dev/null; then - local node_result - node_result=$(node -e " - const ws = new (require('ws'))('${ws_url}'); - const t = setTimeout(() => { process.stdout.write('timeout'); process.exit(1); }, 5000); - ws.on('open', () => { clearTimeout(t); process.stdout.write('ok'); ws.close(); process.exit(0); }); - ws.on('error', (e) => { clearTimeout(t); process.stdout.write('error:' + e.message); process.exit(1); }); - " 2>/dev/null) || node_result="error" - - if [[ "$node_result" == "ok" ]]; then - WS_OK=true - ok "WebSocket connection verified (node)" - else - WS_OK=false - warn "WebSocket check failed: ${node_result}" - fi - else - warn "WebSocket check inconclusive (no ws testing tool available, HTTP status: ${ws_status})" - WS_OK=true # Don't fail the whole check for this - fi - ;; - esac -} - -# ── Output results ────────────────────────────────────────────────────────── -output_results() { - local overall_healthy=true - [[ "$HTTP_OK" != true ]] && overall_healthy=false - [[ "$LATENCY_OK" != true ]] && overall_healthy=false - [[ "$WS_OK" != true ]] && overall_healthy=false - - if [[ "$JSON_OUTPUT" == true ]]; then - cat </dev/null || echo '"null"') - }, - "latency": { - "passed": ${LATENCY_OK}, - "response_time_ms": ${HTTP_RESPONSE_TIME_MS:-0}, - "threshold_ms": ${RESPONSE_THRESHOLD} - }, - "websocket": { - "passed": ${WS_OK}, - "checked": ${CHECK_WEBSOCKET} - } - } -} -JSON - else - echo "" - echo -e "${BOLD}Health Check Summary${NC}" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - - local http_icon=$([[ "$HTTP_OK" == true ]] && echo "${GREEN}✔${NC}" || echo "${RED}✖${NC}") - local latency_icon=$([[ "$LATENCY_OK" == true ]] && echo "${GREEN}✔${NC}" || echo "${YELLOW}⚠${NC}") - local ws_icon=$([[ "$WS_OK" == true ]] && echo "${GREEN}✔${NC}" || echo "${RED}✖${NC}") - - echo -e " ${http_icon} HTTP /api/health (${HTTP_STATUS:-???}, ${HTTP_RESPONSE_TIME_MS:-?}ms, ${HTTP_ATTEMPTS:-?} attempts)" - echo -e " ${latency_icon} Response time (${HTTP_RESPONSE_TIME_MS:-?}ms / ${RESPONSE_THRESHOLD}ms threshold)" - echo -e " ${ws_icon} WebSocket (checked: ${CHECK_WEBSOCKET})" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - - if [[ "$overall_healthy" == true ]]; then - echo -e " ${GREEN}${BOLD}Overall: HEALTHY${NC}" - else - echo -e " ${RED}${BOLD}Overall: UNHEALTHY${NC}" - fi - echo "" - fi - - if [[ "$overall_healthy" == true ]]; then - return 0 - else - return 1 - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - parse_args "$@" - - # Initialize result variables - HTTP_OK=false - HTTP_STATUS="" - HTTP_BODY="" - HTTP_RESPONSE_TIME_MS=0 - HTTP_ATTEMPTS=0 - LATENCY_OK=false - WS_OK=false - - [[ "$JSON_OUTPUT" != true ]] && { - echo "" - echo -e "${BOLD}${GREEN}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${GREEN}║ Claude Code Agent Monitor – Health Check ║${NC}" - echo -e "${BOLD}${GREEN}╚══════════════════════════════════════════════════╝${NC}" - echo "" - info "Target: ${BASE_URL}" - info "Config: retries=${RETRIES}, interval=${INTERVAL}s, threshold=${RESPONSE_THRESHOLD}ms" - echo "" - } - - check_http_health - check_response_time - check_websocket - - output_results -} - -main "$@" diff --git a/deployments/scripts/rollback.sh b/deployments/scripts/rollback.sh deleted file mode 100755 index cfe59ca..0000000 --- a/deployments/scripts/rollback.sh +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# rollback.sh – Rollback deployments for Claude Code Agent Monitor -# -# Usage: -# ./rollback.sh --env production --method helm --revision 5 -# ./rollback.sh --env staging --method kustomize -# ./rollback.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly APP_NAME="agent-monitor" -readonly APP_PORT=4820 - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } -fatal() { err "$@"; exit 1; } - -# ── Defaults ──────────────────────────────────────────────────────────────── -ENVIRONMENT="" -METHOD="" -REVISION="" -NAMESPACE="" -HELM_RELEASE="${APP_NAME}" -SKIP_HEALTH_CHECK=false - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < --method [options] - -${BOLD}Required:${NC} - --env, -e Environment: dev, staging, production - --method, -m Method: helm, kustomize - -${BOLD}Options:${NC} - --revision, -r Helm revision or rollout history number to roll back to - --namespace, -n Kubernetes namespace (default: agent-monitor-) - --release Helm release name (default: ${APP_NAME}) - --skip-health Skip post-rollback health check - --help, -h Show this help message - -${BOLD}Examples:${NC} - $(basename "$0") --env production --method helm --revision 5 - $(basename "$0") --env staging --method kustomize - $(basename "$0") --env production --method helm # rolls back to previous - -EOF - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --env|-e) ENVIRONMENT="$2"; shift 2 ;; - --method|-m) METHOD="$2"; shift 2 ;; - --revision|-r) REVISION="$2"; shift 2 ;; - --namespace|-n) NAMESPACE="$2"; shift 2 ;; - --release) HELM_RELEASE="$2"; shift 2 ;; - --skip-health) SKIP_HEALTH_CHECK=true; shift ;; - --help|-h) usage ;; - *) fatal "Unknown option: $1" ;; - esac - done - - [[ -z "$ENVIRONMENT" ]] && fatal "Missing required argument: --env" - [[ -z "$METHOD" ]] && fatal "Missing required argument: --method" - [[ -z "$NAMESPACE" ]] && NAMESPACE="agent-monitor-${ENVIRONMENT}" -} - -# ── Show release history ─────────────────────────────────────────────────── -show_history() { - info "Release history:" - case "$METHOD" in - helm) - helm history "${HELM_RELEASE}" -n "${NAMESPACE}" --max 10 2>/dev/null || warn "No history found" - ;; - kustomize) - kubectl rollout history "deployment/${APP_NAME}" -n "${NAMESPACE}" 2>/dev/null || warn "No history found" - ;; - esac - echo "" -} - -# ── Confirm rollback ─────────────────────────────────────────────────────── -confirm_rollback() { - if [[ "$ENVIRONMENT" == "production" ]]; then - local target_msg="previous revision" - [[ -n "$REVISION" ]] && target_msg="revision ${REVISION}" - - warn "Rolling back ${BOLD}PRODUCTION${NC} to ${target_msg}" - read -r -p "$(echo -e "${YELLOW}Type 'yes' to confirm:${NC} ")" confirm - [[ "$confirm" == "yes" ]] || fatal "Rollback cancelled." - fi -} - -# ── Helm rollback ─────────────────────────────────────────────────────────── -rollback_helm() { - info "Rolling back Helm release '${HELM_RELEASE}' in namespace '${NAMESPACE}'..." - - local rollback_args=(rollback "${HELM_RELEASE}") - [[ -n "$REVISION" ]] && rollback_args+=("${REVISION}") - rollback_args+=(-n "${NAMESPACE}" --wait --timeout 300s) - - if ! helm "${rollback_args[@]}"; then - fatal "Helm rollback failed! Manual intervention required." - fi - - ok "Helm rollback completed" - - # Show current status - info "Current release status:" - helm status "${HELM_RELEASE}" -n "${NAMESPACE}" 2>/dev/null || true -} - -# ── Kustomize rollback ───────────────────────────────────────────────────── -rollback_kustomize() { - info "Rolling back deployment '${APP_NAME}' in namespace '${NAMESPACE}'..." - - local undo_args=(rollout undo "deployment/${APP_NAME}" -n "${NAMESPACE}") - if [[ -n "$REVISION" ]]; then - undo_args+=(--to-revision="${REVISION}") - fi - - if ! kubectl "${undo_args[@]}"; then - fatal "Kubectl rollback failed! Manual intervention required." - fi - - # Wait for rollout - info "Waiting for rollout to complete..." - if ! kubectl rollout status "deployment/${APP_NAME}" -n "${NAMESPACE}" --timeout=300s; then - fatal "Rollout did not complete in time!" - fi - - ok "Kustomize rollback completed" -} - -# ── Post-rollback health check ───────────────────────────────────────────── -run_health_check() { - if [[ "$SKIP_HEALTH_CHECK" == true ]]; then - info "Skipping health check" - return - fi - - info "Running post-rollback health check..." - - # Wait for pods to be ready - if ! kubectl wait --for=condition=ready pod \ - -l "app.kubernetes.io/name=${APP_NAME}" \ - -n "${NAMESPACE}" --timeout=120s 2>/dev/null; then - fatal "Pods did not become ready after rollback!" - fi - - # Use health-check.sh if available - if [[ -x "${SCRIPT_DIR}/health-check.sh" ]]; then - # Port forward for check - local local_port=14820 - kubectl port-forward "svc/${APP_NAME}" "${local_port}:${APP_PORT}" -n "${NAMESPACE}" & - local pf_pid=$! - sleep 3 - - if "${SCRIPT_DIR}/health-check.sh" --url "http://localhost:${local_port}" --retries 10 --interval 3; then - ok "Health check passed after rollback" - else - err "Health check failed after rollback!" - fi - - kill "$pf_pid" 2>/dev/null || true - else - ok "Pods are ready" - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - echo "" - echo -e "${BOLD}${YELLOW}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${YELLOW}║ Claude Code Agent Monitor – Rollback ║${NC}" - echo -e "${BOLD}${YELLOW}╚══════════════════════════════════════════════════╝${NC}" - echo "" - - parse_args "$@" - show_history - confirm_rollback - - case "$METHOD" in - helm) rollback_helm ;; - kustomize) rollback_kustomize ;; - *) fatal "Rollback not supported for method: ${METHOD}" ;; - esac - - run_health_check - - echo "" - ok "${BOLD}Rollback complete!${NC}" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Method:${NC} ${METHOD}" - echo -e " ${BOLD}Revision:${NC} ${REVISION:-previous}" - echo -e " ${BOLD}Timestamp:${NC} $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "" -} - -main "$@" diff --git a/deployments/scripts/teardown.sh b/deployments/scripts/teardown.sh deleted file mode 100755 index 1da410e..0000000 --- a/deployments/scripts/teardown.sh +++ /dev/null @@ -1,335 +0,0 @@ -#!/usr/bin/env bash -# ───────────────────────────────────────────────────────────────────────────── -# teardown.sh – Clean removal of Claude Code Agent Monitor infrastructure -# -# Usage: -# ./teardown.sh --env dev --method helm -# ./teardown.sh --env production --method terraform -# ./teardown.sh --help -# ───────────────────────────────────────────────────────────────────────────── -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" -readonly DEPLOY_DIR="${PROJECT_ROOT}/deployments" -readonly APP_NAME="agent-monitor" - -# ── Colors & logging ─────────────────────────────────────────────────────── -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -BOLD='\033[1m' -NC='\033[0m' - -log() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $*"; } -info() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${BLUE}ℹ${NC} $*"; } -ok() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${GREEN}✔${NC} $*"; } -warn() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${YELLOW}⚠${NC} $*" >&2; } -err() { echo -e "${CYAN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} ${RED}✖${NC} $*" >&2; } -fatal() { err "$@"; exit 1; } - -# ── Defaults ──────────────────────────────────────────────────────────────── -ENVIRONMENT="" -METHOD="" -NAMESPACE="" -HELM_RELEASE="${APP_NAME}" -SKIP_BACKUP=false -FORCE=false -DELETE_NAMESPACE=false -DELETE_PVC=false - -# ── Usage ─────────────────────────────────────────────────────────────────── -usage() { - cat < --method [options] - -${BOLD}Required:${NC} - --env, -e Environment: dev, staging, production - --method, -m Method: helm, kustomize, terraform - -${BOLD}Options:${NC} - --namespace, -n Kubernetes namespace (default: agent-monitor-) - --release Helm release name (default: ${APP_NAME}) - --delete-namespace Also delete the Kubernetes namespace - --delete-pvc Also delete PersistentVolumeClaims (data loss!) - --skip-backup Skip data backup before teardown - --force Skip all confirmation prompts - --help, -h Show this help message - -${BOLD}Examples:${NC} - $(basename "$0") --env dev --method helm - $(basename "$0") --env staging --method kustomize --delete-namespace - $(basename "$0") --env production --method terraform - -EOF - exit 0 -} - -# ── Argument parsing ──────────────────────────────────────────────────────── -parse_args() { - [[ $# -eq 0 ]] && usage - - while [[ $# -gt 0 ]]; do - case "$1" in - --env|-e) ENVIRONMENT="$2"; shift 2 ;; - --method|-m) METHOD="$2"; shift 2 ;; - --namespace|-n) NAMESPACE="$2"; shift 2 ;; - --release) HELM_RELEASE="$2"; shift 2 ;; - --delete-namespace) DELETE_NAMESPACE=true; shift ;; - --delete-pvc) DELETE_PVC=true; shift ;; - --skip-backup) SKIP_BACKUP=true; shift ;; - --force) FORCE=true; shift ;; - --help|-h) usage ;; - *) fatal "Unknown option: $1" ;; - esac - done - - [[ -z "$ENVIRONMENT" ]] && fatal "Missing required argument: --env" - [[ -z "$METHOD" ]] && fatal "Missing required argument: --method" - [[ -z "$NAMESPACE" ]] && NAMESPACE="agent-monitor-${ENVIRONMENT}" -} - -# ── Confirm teardown ─────────────────────────────────────────────────────── -confirm_teardown() { - if [[ "$FORCE" == true ]]; then - return - fi - - echo "" - echo -e " ${RED}${BOLD}╔══════════════════════════════════════════╗${NC}" - echo -e " ${RED}${BOLD}║ ⚠ TEARDOWN WARNING ⚠ ║${NC}" - echo -e " ${RED}${BOLD}╚══════════════════════════════════════════╝${NC}" - echo "" - echo -e " This will ${RED}${BOLD}DESTROY${NC} the following resources:" - echo -e " • Environment: ${BOLD}${ENVIRONMENT}${NC}" - echo -e " • Method: ${BOLD}${METHOD}${NC}" - echo -e " • Namespace: ${BOLD}${NAMESPACE}${NC}" - [[ "$DELETE_NAMESPACE" == true ]] && echo -e " • ${RED}Namespace will be deleted${NC}" - [[ "$DELETE_PVC" == true ]] && echo -e " • ${RED}PVCs will be deleted (DATA LOSS!)${NC}" - echo "" - - if [[ "$ENVIRONMENT" == "production" ]]; then - echo -e " ${RED}${BOLD}THIS IS A PRODUCTION ENVIRONMENT!${NC}" - echo "" - read -r -p "$(echo -e "${RED}Type 'destroy ${ENVIRONMENT}' to confirm:${NC} ")" confirm - [[ "$confirm" == "destroy ${ENVIRONMENT}" ]] || fatal "Teardown cancelled." - - # Second confirmation for production - echo "" - read -r -p "$(echo -e "${RED}Are you absolutely sure? Type 'YES' in caps:${NC} ")" confirm2 - [[ "$confirm2" == "YES" ]] || fatal "Teardown cancelled." - else - read -r -p "$(echo -e "${YELLOW}Type 'yes' to confirm:${NC} ")" confirm - [[ "$confirm" == "yes" ]] || fatal "Teardown cancelled." - fi -} - -# ── Pre-teardown backup ──────────────────────────────────────────────────── -backup_data() { - if [[ "$SKIP_BACKUP" == true ]]; then - info "Skipping pre-teardown backup (--skip-backup)" - return - fi - - info "Creating backup before teardown..." - - if [[ -x "${SCRIPT_DIR}/db-backup.sh" ]]; then - local backup_dir="${PROJECT_ROOT}/data/pre-teardown-backups" - "${SCRIPT_DIR}/db-backup.sh" \ - --env "${ENVIRONMENT}" \ - --output "${backup_dir}" \ - --namespace "${NAMESPACE}" \ - && ok "Pre-teardown backup created" \ - || warn "Backup failed – continuing with teardown" - else - warn "db-backup.sh not found – skipping backup" - fi -} - -# ── Show current resources ────────────────────────────────────────────────── -show_resources() { - info "Current resources in namespace '${NAMESPACE}':" - echo "" - - kubectl get all -n "${NAMESPACE}" 2>/dev/null || warn "Could not list resources" - - if [[ "$METHOD" != "terraform" ]]; then - echo "" - info "PersistentVolumeClaims:" - kubectl get pvc -n "${NAMESPACE}" 2>/dev/null || warn "No PVCs found" - fi - echo "" -} - -# ── Helm teardown ────────────────────────────────────────────────────────── -teardown_helm() { - info "Uninstalling Helm release '${HELM_RELEASE}'..." - - if helm status "${HELM_RELEASE}" -n "${NAMESPACE}" &>/dev/null; then - helm uninstall "${HELM_RELEASE}" -n "${NAMESPACE}" --wait --timeout 300s \ - || fatal "Helm uninstall failed" - ok "Helm release '${HELM_RELEASE}' uninstalled" - else - warn "Helm release '${HELM_RELEASE}' not found in namespace '${NAMESPACE}'" - fi - - # Also try uninstalling blue/green releases - for color in blue green; do - if helm status "${HELM_RELEASE}-${color}" -n "${NAMESPACE}" &>/dev/null; then - info "Uninstalling ${color} slot release..." - helm uninstall "${HELM_RELEASE}-${color}" -n "${NAMESPACE}" --wait --timeout 300s \ - && ok "Release '${HELM_RELEASE}-${color}' uninstalled" \ - || warn "Failed to uninstall ${color} release" - fi - done -} - -# ── Kustomize teardown ───────────────────────────────────────────────────── -teardown_kustomize() { - local overlay_dir="${DEPLOY_DIR}/kubernetes/overlays/${ENVIRONMENT}" - - if [[ -d "$overlay_dir" ]]; then - info "Deleting Kustomize resources..." - kubectl delete -k "${overlay_dir}" --ignore-not-found=true --wait=true --timeout=300s \ - && ok "Kustomize resources deleted" \ - || warn "Some resources may not have been deleted" - else - warn "Kustomize overlay not found at ${overlay_dir}" - info "Deleting resources by label..." - kubectl delete all -l "app.kubernetes.io/name=${APP_NAME}" -n "${NAMESPACE}" --wait=true \ - || warn "Could not delete resources by label" - fi -} - -# ── Terraform teardown ───────────────────────────────────────────────────── -teardown_terraform() { - local tf_dir="${DEPLOY_DIR}/terraform" - local env_vars_file="${tf_dir}/environments/${ENVIRONMENT}/terraform.tfvars" - - info "Destroying Terraform-managed infrastructure..." - - pushd "${tf_dir}" > /dev/null - - terraform init -input=false - - local destroy_args=(-input=false -auto-approve) - if [[ -f "$env_vars_file" ]]; then - destroy_args+=(-var-file="$env_vars_file") - fi - # Need to provide required variables that may not have defaults - destroy_args+=(-var "environment=${ENVIRONMENT}") - - if ! terraform destroy "${destroy_args[@]}"; then - popd > /dev/null - fatal "Terraform destroy failed! Review state manually." - fi - - popd > /dev/null - ok "Terraform infrastructure destroyed" -} - -# ── Cleanup PVCs ──────────────────────────────────────────────────────────── -cleanup_pvcs() { - if [[ "$DELETE_PVC" != true ]]; then - local pvc_count - pvc_count=$(kubectl get pvc -n "${NAMESPACE}" --no-headers 2>/dev/null | wc -l | tr -d ' ') - if [[ "$pvc_count" -gt 0 ]]; then - warn "PersistentVolumeClaims still exist. Use --delete-pvc to remove them." - kubectl get pvc -n "${NAMESPACE}" 2>/dev/null - fi - return - fi - - info "Deleting PersistentVolumeClaims..." - kubectl delete pvc --all -n "${NAMESPACE}" --wait=true \ - && ok "PVCs deleted" \ - || warn "Some PVCs could not be deleted" -} - -# ── Cleanup namespace ────────────────────────────────────────────────────── -cleanup_namespace() { - if [[ "$DELETE_NAMESPACE" != true ]]; then - return - fi - - if [[ "$ENVIRONMENT" == "production" ]]; then - warn "Refusing to delete production namespace automatically." - warn "Delete manually: kubectl delete namespace ${NAMESPACE}" - return - fi - - info "Deleting namespace '${NAMESPACE}'..." - kubectl delete namespace "${NAMESPACE}" --ignore-not-found=true --wait=true --timeout=120s \ - && ok "Namespace '${NAMESPACE}' deleted" \ - || warn "Namespace deletion may be stuck. Check: kubectl get namespace ${NAMESPACE}" -} - -# ── Verify teardown ──────────────────────────────────────────────────────── -verify_teardown() { - info "Verifying teardown..." - - if [[ "$METHOD" == "terraform" ]]; then - ok "Terraform state should reflect no resources" - return - fi - - local remaining - remaining=$(kubectl get all -n "${NAMESPACE}" --no-headers 2>/dev/null | wc -l | tr -d ' ') - - if [[ "$remaining" -eq 0 ]]; then - ok "No resources remaining in namespace '${NAMESPACE}'" - else - warn "${remaining} resources still exist in namespace '${NAMESPACE}':" - kubectl get all -n "${NAMESPACE}" 2>/dev/null - fi -} - -# ── Main ──────────────────────────────────────────────────────────────────── -main() { - echo "" - echo -e "${BOLD}${RED}╔══════════════════════════════════════════════════╗${NC}" - echo -e "${BOLD}${RED}║ Claude Code Agent Monitor – Teardown ║${NC}" - echo -e "${BOLD}${RED}╚══════════════════════════════════════════════════╝${NC}" - echo "" - - parse_args "$@" - - info "Teardown configuration:" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Method:${NC} ${METHOD}" - echo -e " ${BOLD}Namespace:${NC} ${NAMESPACE}" - echo "" - - if [[ "$METHOD" != "terraform" ]]; then - show_resources - fi - - confirm_teardown - backup_data - - case "$METHOD" in - helm) teardown_helm ;; - kustomize) teardown_kustomize ;; - terraform) teardown_terraform ;; - *) fatal "Invalid method: ${METHOD}" ;; - esac - - if [[ "$METHOD" != "terraform" ]]; then - cleanup_pvcs - cleanup_namespace - verify_teardown - fi - - echo "" - ok "${BOLD}Teardown complete!${NC}" - echo -e " ${BOLD}Environment:${NC} ${ENVIRONMENT}" - echo -e " ${BOLD}Method:${NC} ${METHOD}" - echo -e " ${BOLD}Timestamp:${NC} $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "" -} - -main "$@" diff --git a/deployments/terraform/README.md b/deployments/terraform/README.md deleted file mode 100644 index e3bcab7..0000000 --- a/deployments/terraform/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# Terraform Infrastructure - -Cloud-agnostic infrastructure modules for deploying the Claude Code Agent Monitor to AWS, GCP, Azure, or OCI. - -## Architecture - -```mermaid -graph TD - subgraph Modules["Reusable Modules"] - NET["networking"] - COMP["compute"] - DB["database"] - LB["loadbalancer"] - MON["monitoring"] - SEC["secrets"] - end - - subgraph Providers["Provider Implementations"] - AWS["aws/"] - GCP["gcp/"] - AZ["azure/"] - OCI["oci/"] - end - - subgraph Envs["Environments"] - DEV["dev/terraform.tfvars"] - STG["staging/terraform.tfvars"] - PRD["production/terraform.tfvars"] - end - - AWS --> NET & COMP & DB & LB & MON & SEC - GCP --> NET & COMP & DB & LB & MON & SEC - AZ --> NET & COMP & DB & LB & MON & SEC - OCI --> NET & COMP & DB & LB & MON & SEC - Envs -.->|var-file| Providers -``` - -## Usage - -```bash -# 1. Choose your provider -cd providers/aws # or gcp, azure, oci - -# 2. Initialize -terraform init - -# 3. Plan with environment -terraform plan -var-file=../../environments/production/terraform.tfvars - -# 4. Apply -terraform apply -var-file=../../environments/production/terraform.tfvars - -# 5. Get outputs -terraform output -``` - -## Module Reference - -| Module | Purpose | Key Resources | -|---|---|---| -| `networking` | VPC/VNet, subnets, NAT, security groups | VPC, public/private subnets, NAT gateway, firewall rules | -| `compute` | Container orchestration with blue-green slots | ECS tasks / Cloud Run / ACI / OKE deployments | -| `database` | Persistent storage for SQLite | EFS / Filestore / Azure Files / FSS with encryption | -| `loadbalancer` | Application LB with WebSocket + traffic splitting | ALB / GCLB / App Gateway / LBaaS, health checks | -| `monitoring` | Metrics, logs, alerts, dashboards | CloudWatch / Cloud Monitoring / Azure Monitor / OCI Monitoring | -| `secrets` | Secret management | Secrets Manager / Secret Manager / Key Vault / Vault | - -## Remote State - -Each provider is configured to use cloud-native remote state: - -| Provider | Backend | Bucket | -|---|---|---| -| AWS | S3 + DynamoDB locking | `agent-monitor-tfstate-{account_id}` | -| GCP | GCS | `agent-monitor-tfstate-{project_id}` | -| Azure | Azure Blob Storage | `agentmonitortfstate` | -| OCI | OCI Object Storage | `agent-monitor-tfstate` | - -## Environment Sizing - -| Resource | Dev | Staging | Production | -|---|---|---|---| -| Replicas | 1 | 2 | 3 (auto-scale to 10) | -| CPU | 256 | 512 | 1024 | -| Memory | 512 MB | 1 GB | 2 GB | -| Storage | 5 GB | 10 GB | 50 GB (encrypted) | -| Multi-AZ | No | Yes | Yes | -| Monitoring | Basic | Standard | Full + alerts | diff --git a/deployments/terraform/backend.tf b/deployments/terraform/backend.tf deleted file mode 100644 index bd0d165..0000000 --- a/deployments/terraform/backend.tf +++ /dev/null @@ -1,47 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Remote state backend – uncomment the block matching your cloud provider. -# Only ONE backend may be active at a time. -# ───────────────────────────────────────────────────────────────────────────── - -# ── AWS S3 ────────────────────────────────────────────────────────────────── -# terraform { -# backend "s3" { -# bucket = "ccam-terraform-state" -# key = "claude-agent-monitor/terraform.tfstate" -# region = "us-east-1" -# encrypt = true -# dynamodb_table = "ccam-terraform-locks" -# } -# } - -# ── GCP Cloud Storage ────────────────────────────────────────────────────── -# terraform { -# backend "gcs" { -# bucket = "ccam-terraform-state" -# prefix = "claude-agent-monitor" -# } -# } - -# ── Azure Blob Storage ───────────────────────────────────────────────────── -# terraform { -# backend "azurerm" { -# resource_group_name = "ccam-terraform-state-rg" -# storage_account_name = "ccamtfstate" -# container_name = "tfstate" -# key = "claude-agent-monitor.tfstate" -# } -# } - -# ── OCI Object Storage ───────────────────────────────────────────────────── -# terraform { -# backend "s3" { -# bucket = "ccam-terraform-state" -# key = "claude-agent-monitor/terraform.tfstate" -# region = "us-ashburn-1" -# endpoint = "https://.compat.objectstorage..oraclecloud.com" -# skip_region_validation = true -# skip_credentials_validation = true -# skip_metadata_api_check = true -# force_path_style = true -# } -# } diff --git a/deployments/terraform/environments/dev/terraform.tfvars b/deployments/terraform/environments/dev/terraform.tfvars deleted file mode 100644 index f53f1fd..0000000 --- a/deployments/terraform/environments/dev/terraform.tfvars +++ /dev/null @@ -1,67 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Development environment – terraform.tfvars -# -# Minimal resources for development/testing. Single replica, small compute, -# monitoring disabled to reduce cost. -# ───────────────────────────────────────────────────────────────────────────── - -# ── Provider ──────────────────────────────────────────────────────────────── -cloud_provider = "aws" -region = "us-east-1" - -# ── Project ───────────────────────────────────────────────────────────────── -project_name = "claude-agent-monitor" -environment = "dev" - -tags = { - team = "platform" - cost_center = "engineering" -} - -# ── Networking ────────────────────────────────────────────────────────────── -vpc_cidr = "10.0.0.0/16" -public_subnet_cidrs = ["10.0.1.0/24", "10.0.2.0/24"] -private_subnet_cidrs = ["10.0.11.0/24", "10.0.12.0/24"] - -# ── Compute (small) ──────────────────────────────────────────────────────── -app_container_image = "ghcr.io/anthropics/claude-agent-monitor:latest" -mcp_container_image = "" # MCP sidecar disabled in dev -cpu = 256 # 0.25 vCPU -memory = 512 # 512 MiB - -min_replicas = 1 -max_replicas = 1 -desired_replicas = 1 - -environment_variables = { - NODE_ENV = "development" - DASHBOARD_PORT = "4820" - LOG_LEVEL = "debug" -} - -# ── Deployment ────────────────────────────────────────────────────────────── -deployment_strategy = "rolling" -active_deployment_slot = "blue" -blue_weight = 100 -green_weight = 0 - -# ── TLS (disabled in dev) ────────────────────────────────────────────────── -domain_name = "" -tls_certificate_arn = "" - -# ── Storage ───────────────────────────────────────────────────────────────── -storage_size_gb = 10 -enable_storage_backup = false - -# ── Health check ──────────────────────────────────────────────────────────── -health_check_path = "/api/health" -health_check_interval = 60 # Less frequent in dev - -# ── Auto-scaling (disabled – single replica) ──────────────────────────────── -autoscaling_cpu_target = 80 -autoscaling_memory_target = 90 - -# ── Monitoring (minimal) ─────────────────────────────────────────────────── -enable_monitoring = false -alert_email = "" -log_retention_days = 7 diff --git a/deployments/terraform/environments/production/terraform.tfvars b/deployments/terraform/environments/production/terraform.tfvars deleted file mode 100644 index e1ad7d4..0000000 --- a/deployments/terraform/environments/production/terraform.tfvars +++ /dev/null @@ -1,80 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Production environment – terraform.tfvars -# -# Full production configuration. 3+ replicas with auto-scaling, large -# compute, comprehensive monitoring, TLS, blue-green deployment ready. -# ───────────────────────────────────────────────────────────────────────────── - -# ── Provider ──────────────────────────────────────────────────────────────── -cloud_provider = "aws" -region = "us-east-1" - -# ── Project ───────────────────────────────────────────────────────────────── -project_name = "claude-agent-monitor" -environment = "production" - -tags = { - team = "platform" - cost_center = "engineering" - criticality = "high" - compliance = "soc2" -} - -# ── Networking (3 AZs for high availability) ─────────────────────────────── -vpc_cidr = "10.2.0.0/16" -public_subnet_cidrs = ["10.2.1.0/24", "10.2.2.0/24", "10.2.3.0/24"] -private_subnet_cidrs = ["10.2.11.0/24", "10.2.12.0/24", "10.2.13.0/24"] - -# ── Compute (large) ──────────────────────────────────────────────────────── -app_container_image = "ghcr.io/anthropics/claude-agent-monitor:latest" -mcp_container_image = "ghcr.io/anthropics/claude-agent-monitor-mcp:latest" -cpu = 1024 # 1 vCPU -memory = 2048 # 2 GiB - -min_replicas = 3 -max_replicas = 10 -desired_replicas = 3 - -environment_variables = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - LOG_LEVEL = "warn" -} - -# ── Deployment (blue-green with canary support) ──────────────────────────── -deployment_strategy = "blue-green" -active_deployment_slot = "blue" -blue_weight = 100 -green_weight = 0 - -# During canary deployment, adjust weights: -# blue_weight = 90 -# green_weight = 10 -# Then gradually shift to: -# blue_weight = 0 -# green_weight = 100 -# Finally, flip active_deployment_slot = "green" - -# ── TLS ───────────────────────────────────────────────────────────────────── -domain_name = "" # Set to production FQDN (e.g. "monitor.example.com") -tls_certificate_arn = "" # Set to existing ACM cert ARN or leave empty for auto - -# ── Storage ───────────────────────────────────────────────────────────────── -storage_size_gb = 50 -enable_storage_backup = true - -# ── Health check (strict thresholds) ─────────────────────────────────────── -health_check_path = "/api/health" -health_check_interval = 15 -health_check_timeout = 5 -health_check_healthy_threshold = 2 -health_check_unhealthy_threshold = 2 - -# ── Auto-scaling (aggressive) ────────────────────────────────────────────── -autoscaling_cpu_target = 60 -autoscaling_memory_target = 70 - -# ── Monitoring (comprehensive) ───────────────────────────────────────────── -enable_monitoring = true -alert_email = "" # REQUIRED: Set to ops team email for production alerts -log_retention_days = 90 diff --git a/deployments/terraform/environments/staging/terraform.tfvars b/deployments/terraform/environments/staging/terraform.tfvars deleted file mode 100644 index 028724f..0000000 --- a/deployments/terraform/environments/staging/terraform.tfvars +++ /dev/null @@ -1,70 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Staging environment – terraform.tfvars -# -# Production-like configuration with moderate resources. Two replicas, -# medium compute, monitoring enabled with relaxed thresholds. -# ───────────────────────────────────────────────────────────────────────────── - -# ── Provider ──────────────────────────────────────────────────────────────── -cloud_provider = "aws" -region = "us-east-1" - -# ── Project ───────────────────────────────────────────────────────────────── -project_name = "claude-agent-monitor" -environment = "staging" - -tags = { - team = "platform" - cost_center = "engineering" -} - -# ── Networking ────────────────────────────────────────────────────────────── -vpc_cidr = "10.1.0.0/16" -public_subnet_cidrs = ["10.1.1.0/24", "10.1.2.0/24", "10.1.3.0/24"] -private_subnet_cidrs = ["10.1.11.0/24", "10.1.12.0/24", "10.1.13.0/24"] - -# ── Compute (medium) ─────────────────────────────────────────────────────── -app_container_image = "ghcr.io/anthropics/claude-agent-monitor:staging" -mcp_container_image = "ghcr.io/anthropics/claude-agent-monitor-mcp:staging" -cpu = 512 # 0.5 vCPU -memory = 1024 # 1 GiB - -min_replicas = 1 -max_replicas = 3 -desired_replicas = 2 - -environment_variables = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - LOG_LEVEL = "info" -} - -# ── Deployment (blue-green ready) ────────────────────────────────────────── -deployment_strategy = "blue-green" -active_deployment_slot = "blue" -blue_weight = 100 -green_weight = 0 - -# ── TLS ───────────────────────────────────────────────────────────────────── -domain_name = "" # Set to staging FQDN when available -tls_certificate_arn = "" # Auto-created if domain_name is set - -# ── Storage ───────────────────────────────────────────────────────────────── -storage_size_gb = 20 -enable_storage_backup = true - -# ── Health check ──────────────────────────────────────────────────────────── -health_check_path = "/api/health" -health_check_interval = 30 -health_check_timeout = 5 -health_check_healthy_threshold = 2 -health_check_unhealthy_threshold = 3 - -# ── Auto-scaling ──────────────────────────────────────────────────────────── -autoscaling_cpu_target = 70 -autoscaling_memory_target = 80 - -# ── Monitoring ────────────────────────────────────────────────────────────── -enable_monitoring = true -alert_email = "" # Set to team email for staging alerts -log_retention_days = 14 diff --git a/deployments/terraform/main.tf b/deployments/terraform/main.tf deleted file mode 100644 index e78818c..0000000 --- a/deployments/terraform/main.tf +++ /dev/null @@ -1,185 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Claude Code Agent Monitor – Root orchestration module -# -# Selects the cloud provider implementation via var.cloud_provider and wires -# the generic modules together. Each provider directory contains a full, -# opinionated implementation that composes the child modules. -# ───────────────────────────────────────────────────────────────────────────── - -locals { - common_tags = merge( - { - project = var.project_name - environment = var.environment - managed_by = "terraform" - repository = "Claude-Code-Agent-Monitor" - }, - var.tags, - ) - - # Normalise resource name prefix (lowercase, hyphens) - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) -} - -# ── Networking ────────────────────────────────────────────────────────────── - -module "networking" { - source = "./modules/networking" - - project_name = var.project_name - environment = var.environment - cloud_provider = var.cloud_provider - region = var.region - vpc_cidr = var.vpc_cidr - availability_zones = var.availability_zones - public_subnet_cidrs = var.public_subnet_cidrs - private_subnet_cidrs = var.private_subnet_cidrs - app_port = var.app_port - mcp_port = var.mcp_port - tags = local.common_tags -} - -# ── Persistent storage (SQLite DB) ───────────────────────────────────────── - -module "database" { - source = "./modules/database" - - project_name = var.project_name - environment = var.environment - cloud_provider = var.cloud_provider - region = var.region - storage_size_gb = var.storage_size_gb - enable_backup = var.enable_storage_backup - private_subnet_ids = module.networking.private_subnet_ids - vpc_id = module.networking.vpc_id - allowed_security_group_ids = module.networking.storage_security_group_ids - tags = local.common_tags -} - -# ── Compute (Blue slot) ──────────────────────────────────────────────────── - -module "compute_blue" { - source = "./modules/compute" - - project_name = var.project_name - environment = var.environment - cloud_provider = var.cloud_provider - region = var.region - deployment_slot = "blue" - container_image = var.app_container_image - mcp_container_image = var.mcp_container_image - app_port = var.app_port - mcp_port = var.mcp_port - cpu = var.cpu - memory = var.memory - desired_count = var.active_deployment_slot == "blue" ? var.desired_replicas : 0 - min_count = var.active_deployment_slot == "blue" ? var.min_replicas : 0 - max_count = var.active_deployment_slot == "blue" ? var.max_replicas : 0 - environment_variables = var.environment_variables - health_check_path = var.health_check_path - vpc_id = module.networking.vpc_id - private_subnet_ids = module.networking.private_subnet_ids - security_group_ids = module.networking.private_security_group_ids - storage_filesystem_id = module.database.filesystem_id - storage_mount_targets = module.database.mount_target_ids - autoscaling_cpu_target = var.autoscaling_cpu_target - autoscaling_memory_target = var.autoscaling_memory_target - tags = local.common_tags -} - -# ── Compute (Green slot) ─────────────────────────────────────────────────── - -module "compute_green" { - source = "./modules/compute" - - project_name = var.project_name - environment = var.environment - cloud_provider = var.cloud_provider - region = var.region - deployment_slot = "green" - container_image = var.app_container_image - mcp_container_image = var.mcp_container_image - app_port = var.app_port - mcp_port = var.mcp_port - cpu = var.cpu - memory = var.memory - desired_count = var.active_deployment_slot == "green" ? var.desired_replicas : 0 - min_count = var.active_deployment_slot == "green" ? var.min_replicas : 0 - max_count = var.active_deployment_slot == "green" ? var.max_replicas : 0 - environment_variables = var.environment_variables - health_check_path = var.health_check_path - vpc_id = module.networking.vpc_id - private_subnet_ids = module.networking.private_subnet_ids - security_group_ids = module.networking.private_security_group_ids - storage_filesystem_id = module.database.filesystem_id - storage_mount_targets = module.database.mount_target_ids - autoscaling_cpu_target = var.autoscaling_cpu_target - autoscaling_memory_target = var.autoscaling_memory_target - tags = local.common_tags -} - -# ── Load balancer ─────────────────────────────────────────────────────────── - -module "loadbalancer" { - source = "./modules/loadbalancer" - - project_name = var.project_name - environment = var.environment - cloud_provider = var.cloud_provider - region = var.region - vpc_id = module.networking.vpc_id - public_subnet_ids = module.networking.public_subnet_ids - security_group_ids = module.networking.public_security_group_ids - app_port = var.app_port - mcp_port = var.mcp_port - tls_certificate_arn = var.tls_certificate_arn - domain_name = var.domain_name - - blue_target_group_arn = module.compute_blue.target_group_arn - green_target_group_arn = module.compute_green.target_group_arn - blue_weight = var.blue_weight - green_weight = var.green_weight - - health_check_path = var.health_check_path - health_check_interval = var.health_check_interval - health_check_timeout = var.health_check_timeout - health_check_healthy_threshold = var.health_check_healthy_threshold - health_check_unhealthy_threshold = var.health_check_unhealthy_threshold - - enable_deletion_protection = var.environment == "production" - - tags = local.common_tags -} - -# ── Weight sum validation ─────────────────────────────────────────────────── - -check "blue_green_weight_sum" { - assert { - condition = var.blue_weight + var.green_weight == 100 - error_message = "blue_weight (${var.blue_weight}) + green_weight (${var.green_weight}) must sum to 100." - } -} - -# ── Monitoring ────────────────────────────────────────────────────────────── - -module "monitoring" { - source = "./modules/monitoring" - count = var.enable_monitoring ? 1 : 0 - - project_name = var.project_name - environment = var.environment - cloud_provider = var.cloud_provider - region = var.region - alert_email = var.alert_email - log_retention_days = var.log_retention_days - - loadbalancer_arn = module.loadbalancer.loadbalancer_arn - target_group_arns = [ - module.compute_blue.target_group_arn, - module.compute_green.target_group_arn, - ] - compute_cluster_name = module.compute_blue.cluster_name - filesystem_id = module.database.filesystem_id - - tags = local.common_tags -} diff --git a/deployments/terraform/modules/compute/main.tf b/deployments/terraform/modules/compute/main.tf deleted file mode 100644 index 29b8c4f..0000000 --- a/deployments/terraform/modules/compute/main.tf +++ /dev/null @@ -1,396 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Compute module – Container orchestration with blue/green slot support -# -# Provisions an ECS Fargate service with: -# - Main application container (Express + React) -# - MCP sidecar container -# - EFS persistent volume for SQLite -# - Auto-scaling policies -# - Blue/green deployment slot via variable -# ───────────────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - slot_name = "${local.name_prefix}-${var.deployment_slot}" - - common_tags = merge( - { - module = "compute" - deployment_slot = var.deployment_slot - }, - var.tags, - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# ECS Cluster (shared across slots) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_ecs_cluster" "main" { - name = "${local.name_prefix}-cluster" - - setting { - name = "containerInsights" - value = "enabled" - } - - configuration { - execute_command_configuration { - logging = "DEFAULT" - } - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-cluster" - }) - - lifecycle { - prevent_destroy = false - } -} - -resource "aws_ecs_cluster_capacity_providers" "main" { - cluster_name = aws_ecs_cluster.main.name - - capacity_providers = ["FARGATE", "FARGATE_SPOT"] - - default_capacity_provider_strategy { - base = 1 - weight = 1 - capacity_provider = "FARGATE" - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# IAM roles -# ───────────────────────────────────────────────────────────────────────────── - -data "aws_region" "current" {} -data "aws_caller_identity" "current" {} - -resource "aws_iam_role" "task_execution" { - name = "${local.slot_name}-task-exec" - - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [{ - Action = "sts:AssumeRole" - Effect = "Allow" - Principal = { - Service = "ecs-tasks.amazonaws.com" - } - }] - }) - - tags = local.common_tags -} - -resource "aws_iam_role_policy_attachment" "task_execution" { - role = aws_iam_role.task_execution.name - policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" -} - -resource "aws_iam_role" "task" { - name = "${local.slot_name}-task" - - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [{ - Action = "sts:AssumeRole" - Effect = "Allow" - Principal = { - Service = "ecs-tasks.amazonaws.com" - } - }] - }) - - tags = local.common_tags -} - -# EFS access policy for the task role -resource "aws_iam_role_policy" "task_efs" { - name = "${local.slot_name}-efs-access" - role = aws_iam_role.task.id - - policy = jsonencode({ - Version = "2012-10-17" - Statement = [{ - Effect = "Allow" - Action = [ - "elasticfilesystem:ClientMount", - "elasticfilesystem:ClientWrite", - "elasticfilesystem:ClientRootAccess", - ] - Resource = "arn:aws:elasticfilesystem:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:file-system/${var.storage_filesystem_id}" - }] - }) -} - -# ───────────────────────────────────────────────────────────────────────────── -# CloudWatch log group -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_cloudwatch_log_group" "app" { - name = "/ecs/${local.slot_name}" - retention_in_days = 30 - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Task definition -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_ecs_task_definition" "app" { - family = local.slot_name - network_mode = "awsvpc" - requires_compatibilities = ["FARGATE"] - cpu = tostring(var.cpu) - memory = tostring(var.memory) - execution_role_arn = aws_iam_role.task_execution.arn - task_role_arn = aws_iam_role.task.arn - - container_definitions = jsonencode(concat( - [ - { - name = "app" - image = var.container_image - essential = true - cpu = var.mcp_container_image != "" ? floor(var.cpu * 0.75) : var.cpu - memory = var.mcp_container_image != "" ? floor(var.memory * 0.75) : var.memory - - portMappings = [ - { - containerPort = var.app_port - protocol = "tcp" - } - ] - - environment = [ - for k, v in var.environment_variables : { - name = k - value = v - } - ] - - mountPoints = [ - { - sourceVolume = "app-data" - containerPath = "/app/data" - readOnly = false - } - ] - - healthCheck = { - command = ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:${var.app_port}${var.health_check_path} || exit 1"] - interval = 30 - timeout = 5 - retries = 3 - startPeriod = 60 - } - - logConfiguration = { - logDriver = "awslogs" - options = { - "awslogs-group" = aws_cloudwatch_log_group.app.name - "awslogs-region" = data.aws_region.current.name - "awslogs-stream-prefix" = "app" - } - } - } - ], - var.mcp_container_image != "" ? [ - { - name = "mcp-sidecar" - image = var.mcp_container_image - essential = false - cpu = floor(var.cpu * 0.25) - memory = floor(var.memory * 0.25) - - portMappings = [ - { - containerPort = var.mcp_port - protocol = "tcp" - } - ] - - environment = [ - { - name = "NODE_ENV" - value = "production" - }, - { - name = "MCP_PORT" - value = tostring(var.mcp_port) - } - ] - - logConfiguration = { - logDriver = "awslogs" - options = { - "awslogs-group" = aws_cloudwatch_log_group.app.name - "awslogs-region" = data.aws_region.current.name - "awslogs-stream-prefix" = "mcp" - } - } - } - ] : [] - )) - - volume { - name = "app-data" - - efs_volume_configuration { - file_system_id = var.storage_filesystem_id - root_directory = "/" - transit_encryption = "ENABLED" - - authorization_config { - iam = "ENABLED" - } - } - } - - tags = local.common_tags - - lifecycle { - create_before_destroy = true - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Target group (registered with LB by the loadbalancer module) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_lb_target_group" "app" { - name_prefix = substr(var.deployment_slot, 0, 5) - port = var.app_port - protocol = "HTTP" - vpc_id = var.vpc_id - target_type = "ip" - - health_check { - enabled = true - path = var.health_check_path - port = "traffic-port" - protocol = "HTTP" - healthy_threshold = 2 - unhealthy_threshold = 3 - timeout = 5 - interval = 30 - matcher = "200" - } - - stickiness { - type = "lb_cookie" - cookie_duration = 86400 - enabled = true - } - - deregistration_delay = 60 - - tags = merge(local.common_tags, { - Name = "${local.slot_name}-tg" - }) - - lifecycle { - create_before_destroy = true - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# ECS Service -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_ecs_service" "app" { - name = local.slot_name - cluster = aws_ecs_cluster.main.id - task_definition = aws_ecs_task_definition.app.arn - desired_count = var.desired_count - launch_type = "FARGATE" - platform_version = "LATEST" - health_check_grace_period_seconds = 120 - enable_execute_command = var.environment != "production" - - network_configuration { - subnets = var.private_subnet_ids - security_groups = var.security_group_ids - assign_public_ip = false - } - - load_balancer { - target_group_arn = aws_lb_target_group.app.arn - container_name = "app" - container_port = var.app_port - } - - deployment_configuration { - maximum_percent = 200 - minimum_healthy_percent = 100 - } - - deployment_circuit_breaker { - enable = true - rollback = true - } - - tags = local.common_tags - - lifecycle { - ignore_changes = [desired_count] - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Auto-scaling -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_appautoscaling_target" "ecs" { - count = var.max_count > 0 ? 1 : 0 - - max_capacity = var.max_count - min_capacity = var.min_count - resource_id = "service/${aws_ecs_cluster.main.name}/${aws_ecs_service.app.name}" - scalable_dimension = "ecs:service:DesiredCount" - service_namespace = "ecs" - - tags = local.common_tags -} - -resource "aws_appautoscaling_policy" "cpu" { - count = var.max_count > 0 ? 1 : 0 - - name = "${local.slot_name}-cpu-scaling" - policy_type = "TargetTrackingScaling" - resource_id = aws_appautoscaling_target.ecs[0].resource_id - scalable_dimension = aws_appautoscaling_target.ecs[0].scalable_dimension - service_namespace = aws_appautoscaling_target.ecs[0].service_namespace - - target_tracking_scaling_policy_configuration { - predefined_metric_specification { - predefined_metric_type = "ECSServiceAverageCPUUtilization" - } - target_value = var.autoscaling_cpu_target - scale_in_cooldown = 300 - scale_out_cooldown = 60 - } -} - -resource "aws_appautoscaling_policy" "memory" { - count = var.max_count > 0 ? 1 : 0 - - name = "${local.slot_name}-memory-scaling" - policy_type = "TargetTrackingScaling" - resource_id = aws_appautoscaling_target.ecs[0].resource_id - scalable_dimension = aws_appautoscaling_target.ecs[0].scalable_dimension - service_namespace = aws_appautoscaling_target.ecs[0].service_namespace - - target_tracking_scaling_policy_configuration { - predefined_metric_specification { - predefined_metric_type = "ECSServiceAverageMemoryUtilization" - } - target_value = var.autoscaling_memory_target - scale_in_cooldown = 300 - scale_out_cooldown = 60 - } -} diff --git a/deployments/terraform/modules/compute/outputs.tf b/deployments/terraform/modules/compute/outputs.tf deleted file mode 100644 index 269df04..0000000 --- a/deployments/terraform/modules/compute/outputs.tf +++ /dev/null @@ -1,53 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Compute module outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "cluster_name" { - description = "Name of the ECS cluster" - value = aws_ecs_cluster.main.name -} - -output "cluster_arn" { - description = "ARN of the ECS cluster" - value = aws_ecs_cluster.main.arn -} - -output "service_name" { - description = "Name of the ECS service for this slot" - value = aws_ecs_service.app.name -} - -output "service_arn" { - description = "ARN of the ECS service for this slot" - value = aws_ecs_service.app.id -} - -output "task_definition_arn" { - description = "ARN of the current task definition" - value = aws_ecs_task_definition.app.arn -} - -output "target_group_arn" { - description = "ARN of the target group for LB registration" - value = aws_lb_target_group.app.arn -} - -output "target_group_name" { - description = "Name of the target group" - value = aws_lb_target_group.app.name -} - -output "log_group_name" { - description = "CloudWatch log group name" - value = aws_cloudwatch_log_group.app.name -} - -output "task_execution_role_arn" { - description = "ARN of the task execution IAM role" - value = aws_iam_role.task_execution.arn -} - -output "task_role_arn" { - description = "ARN of the task IAM role" - value = aws_iam_role.task.arn -} diff --git a/deployments/terraform/modules/compute/variables.tf b/deployments/terraform/modules/compute/variables.tf deleted file mode 100644 index 986f127..0000000 --- a/deployments/terraform/modules/compute/variables.tf +++ /dev/null @@ -1,146 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Compute module variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string -} - -variable "environment" { - description = "Deployment environment (dev, staging, production)" - type = string -} - -variable "cloud_provider" { - description = "Target cloud provider (aws, gcp, azure, oci)" - type = string -} - -variable "region" { - description = "Cloud region for deployment" - type = string -} - -variable "deployment_slot" { - description = "Deployment slot identifier for blue-green: blue or green" - type = string - default = "blue" - validation { - condition = contains(["blue", "green"], var.deployment_slot) - error_message = "deployment_slot must be blue or green." - } -} - -variable "container_image" { - description = "Container image URI for the main application" - type = string -} - -variable "mcp_container_image" { - description = "Container image URI for the MCP sidecar (empty to disable)" - type = string - default = "" -} - -variable "app_port" { - description = "Port the application container listens on" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "Port the MCP sidecar container listens on" - type = number - default = 8819 -} - -variable "cpu" { - description = "CPU units for the task (256, 512, 1024, 2048, 4096)" - type = number - default = 512 - validation { - condition = contains([256, 512, 1024, 2048, 4096], var.cpu) - error_message = "cpu must be one of: 256, 512, 1024, 2048, 4096." - } -} - -variable "memory" { - description = "Memory in MiB for the task" - type = number - default = 1024 -} - -variable "desired_count" { - description = "Desired number of running task instances" - type = number - default = 1 -} - -variable "min_count" { - description = "Minimum number of task instances for auto-scaling" - type = number - default = 1 -} - -variable "max_count" { - description = "Maximum number of task instances for auto-scaling" - type = number - default = 3 -} - -variable "environment_variables" { - description = "Map of environment variables for the application container" - type = map(string) - default = {} -} - -variable "health_check_path" { - description = "HTTP path for container health checks" - type = string - default = "/api/health" -} - -variable "vpc_id" { - description = "VPC ID for target group and networking" - type = string -} - -variable "private_subnet_ids" { - description = "Subnet IDs where tasks will be placed" - type = list(string) -} - -variable "security_group_ids" { - description = "Security group IDs attached to task ENIs" - type = list(string) -} - -variable "storage_filesystem_id" { - description = "EFS file system ID for persistent SQLite storage" - type = string -} - -variable "storage_mount_targets" { - description = "EFS mount target IDs (ensures mount targets exist before service)" - type = list(string) - default = [] -} - -variable "autoscaling_cpu_target" { - description = "Target CPU utilization percentage for auto-scaling" - type = number - default = 70 -} - -variable "autoscaling_memory_target" { - description = "Target memory utilization percentage for auto-scaling" - type = number - default = 80 -} - -variable "tags" { - description = "Resource tags" - type = map(string) - default = {} -} diff --git a/deployments/terraform/modules/database/main.tf b/deployments/terraform/modules/database/main.tf deleted file mode 100644 index 99a2683..0000000 --- a/deployments/terraform/modules/database/main.tf +++ /dev/null @@ -1,142 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Database module – Persistent storage for SQLite -# -# Creates a managed network file system (EFS on AWS) with: -# - Encryption at rest and in transit -# - Automated backup policy -# - Mount targets in each private subnet -# - Performance mode optimised for SQLite workloads -# ───────────────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - common_tags = merge( - { - module = "database" - }, - var.tags, - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# EFS file system -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_efs_file_system" "main" { - creation_token = "${local.name_prefix}-data" - encrypted = true - - # General Purpose is optimal for SQLite (latency-sensitive small I/O) - performance_mode = "generalPurpose" - throughput_mode = "elastic" - - lifecycle_policy { - transition_to_ia = "AFTER_30_DAYS" - } - - lifecycle_policy { - transition_to_primary_storage_class = "AFTER_1_ACCESS" - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-efs" - }) - - lifecycle { - prevent_destroy = true - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# EFS backup policy -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_efs_backup_policy" "main" { - file_system_id = aws_efs_file_system.main.id - - backup_policy { - status = var.enable_backup ? "ENABLED" : "DISABLED" - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# EFS mount targets (one per private subnet / AZ) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_efs_mount_target" "main" { - count = length(var.private_subnet_ids) - - file_system_id = aws_efs_file_system.main.id - subnet_id = var.private_subnet_ids[count.index] - security_groups = var.allowed_security_group_ids -} - -# ───────────────────────────────────────────────────────────────────────────── -# EFS access point – scoped to /app/data for the container workload -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_efs_access_point" "app_data" { - file_system_id = aws_efs_file_system.main.id - - posix_user { - uid = 1000 - gid = 1000 - } - - root_directory { - path = "/app-data" - - creation_info { - owner_uid = 1000 - owner_gid = 1000 - permissions = "0755" - } - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-app-data-ap" - }) -} - -# ───────────────────────────────────────────────────────────────────────────── -# EFS file system policy – enforce encryption in transit -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_efs_file_system_policy" "main" { - file_system_id = aws_efs_file_system.main.id - - policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Sid = "EnforceEncryptInTransit" - Effect = "Deny" - Principal = { AWS = "*" } - Action = "*" - Resource = aws_efs_file_system.main.arn - Condition = { - Bool = { - "aws:SecureTransport" = "false" - } - } - }, - { - Sid = "AllowMountViaAccessPoint" - Effect = "Allow" - Principal = { AWS = "*" } - Action = [ - "elasticfilesystem:ClientMount", - "elasticfilesystem:ClientWrite", - "elasticfilesystem:ClientRootAccess", - ] - Resource = aws_efs_file_system.main.arn - Condition = { - Bool = { - "elasticfilesystem:AccessedViaMountTarget" = "true" - } - } - } - ] - }) -} diff --git a/deployments/terraform/modules/database/outputs.tf b/deployments/terraform/modules/database/outputs.tf deleted file mode 100644 index 64f6091..0000000 --- a/deployments/terraform/modules/database/outputs.tf +++ /dev/null @@ -1,38 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Database module outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "filesystem_id" { - description = "ID of the EFS file system" - value = aws_efs_file_system.main.id -} - -output "filesystem_arn" { - description = "ARN of the EFS file system" - value = aws_efs_file_system.main.arn -} - -output "filesystem_dns_name" { - description = "DNS name of the EFS file system" - value = aws_efs_file_system.main.dns_name -} - -output "mount_target_ids" { - description = "IDs of the EFS mount targets" - value = aws_efs_mount_target.main[*].id -} - -output "mount_target_ips" { - description = "IP addresses of the EFS mount targets" - value = aws_efs_mount_target.main[*].ip_address -} - -output "access_point_id" { - description = "ID of the EFS access point for /app/data" - value = aws_efs_access_point.app_data.id -} - -output "access_point_arn" { - description = "ARN of the EFS access point" - value = aws_efs_access_point.app_data.arn -} diff --git a/deployments/terraform/modules/database/variables.tf b/deployments/terraform/modules/database/variables.tf deleted file mode 100644 index 99b153e..0000000 --- a/deployments/terraform/modules/database/variables.tf +++ /dev/null @@ -1,60 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Database module variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string -} - -variable "environment" { - description = "Deployment environment (dev, staging, production)" - type = string -} - -variable "cloud_provider" { - description = "Target cloud provider (aws, gcp, azure, oci)" - type = string -} - -variable "region" { - description = "Cloud region for deployment" - type = string -} - -variable "storage_size_gb" { - description = "Storage allocation in GiB (used by providers with provisioned capacity)" - type = number - default = 20 - validation { - condition = var.storage_size_gb >= 1 - error_message = "storage_size_gb must be at least 1 GiB." - } -} - -variable "enable_backup" { - description = "Enable automated backup of the file system" - type = bool - default = true -} - -variable "private_subnet_ids" { - description = "Private subnet IDs for mount targets" - type = list(string) -} - -variable "vpc_id" { - description = "VPC ID for security group association" - type = string -} - -variable "allowed_security_group_ids" { - description = "Security group IDs allowed to mount the file system" - type = list(string) -} - -variable "tags" { - description = "Resource tags" - type = map(string) - default = {} -} diff --git a/deployments/terraform/modules/loadbalancer/main.tf b/deployments/terraform/modules/loadbalancer/main.tf deleted file mode 100644 index 5b0036c..0000000 --- a/deployments/terraform/modules/loadbalancer/main.tf +++ /dev/null @@ -1,247 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Load Balancer module – Application load balancer with WebSocket support -# -# Provisions: -# - ALB in public subnets -# - HTTPS listener with TLS termination -# - HTTP → HTTPS redirect -# - Weighted target groups for blue/green and canary deployments -# - Sticky sessions for WebSocket connections -# - Path-based routing for MCP sidecar (/mcp/*) -# - Health checks at /api/health -# ───────────────────────────────────────────────────────────────────────────── - -# Production TLS enforcement — prevents deploying production without encryption -check "production_tls_required" { - assert { - condition = var.environment != "production" || var.tls_certificate_arn != "" - error_message = "Production deployments require TLS. Set tls_certificate_arn and domain_name." - } -} - -check "production_domain_required" { - assert { - condition = var.environment != "production" || var.domain_name != "" - error_message = "Production deployments require a domain name. Set domain_name." - } -} - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - # Determine whether TLS is configured - has_tls = var.tls_certificate_arn != "" - - common_tags = merge( - { - module = "loadbalancer" - }, - var.tags, - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Application Load Balancer -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_lb" "main" { - name = "${local.name_prefix}-alb" - internal = false - load_balancer_type = "application" - security_groups = var.security_group_ids - subnets = var.public_subnet_ids - - enable_deletion_protection = var.environment == "production" ? true : var.enable_deletion_protection - enable_http2 = true - idle_timeout = 300 # WebSocket connections may be long-lived - - drop_invalid_header_fields = true - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-alb" - }) - - lifecycle { - prevent_destroy = false - # For production, set enable_deletion_protection = true above (enforced automatically) - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# HTTPS listener (primary – with weighted target groups for blue/green) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_lb_listener" "https" { - count = local.has_tls ? 1 : 0 - - load_balancer_arn = aws_lb.main.arn - port = 443 - protocol = "HTTPS" - ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" - certificate_arn = var.tls_certificate_arn - - default_action { - type = "forward" - - forward { - target_group { - arn = var.blue_target_group_arn - weight = var.blue_weight - } - - target_group { - arn = var.green_target_group_arn - weight = var.green_weight - } - - stickiness { - enabled = true - duration = 86400 - } - } - } - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# HTTP listener – redirect to HTTPS when TLS is configured, else forward -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_lb_listener" "http_redirect" { - count = local.has_tls ? 1 : 0 - - load_balancer_arn = aws_lb.main.arn - port = 80 - protocol = "HTTP" - - default_action { - type = "redirect" - - redirect { - port = "443" - protocol = "HTTPS" - status_code = "HTTP_301" - } - } - - tags = local.common_tags -} - -resource "aws_lb_listener" "http_forward" { - count = local.has_tls ? 0 : 1 - - load_balancer_arn = aws_lb.main.arn - port = 80 - protocol = "HTTP" - - default_action { - type = "forward" - - forward { - target_group { - arn = var.blue_target_group_arn - weight = var.blue_weight - } - - target_group { - arn = var.green_target_group_arn - weight = var.green_weight - } - - stickiness { - enabled = true - duration = 86400 - } - } - } - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# MCP sidecar target group -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_lb_target_group" "mcp" { - name_prefix = "mcp-" - port = var.mcp_port - protocol = "HTTP" - vpc_id = var.vpc_id - target_type = "ip" - - health_check { - enabled = true - path = "/" - port = tostring(var.mcp_port) - protocol = "HTTP" - healthy_threshold = var.health_check_healthy_threshold - unhealthy_threshold = var.health_check_unhealthy_threshold - timeout = var.health_check_timeout - interval = var.health_check_interval - matcher = "200-404" - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-mcp-tg" - }) - - lifecycle { - create_before_destroy = true - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Path-based routing rule for MCP sidecar (/mcp/*) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_lb_listener_rule" "mcp_https" { - count = local.has_tls ? 1 : 0 - - listener_arn = aws_lb_listener.https[0].arn - priority = 10 - - action { - type = "forward" - target_group_arn = aws_lb_target_group.mcp.arn - } - - condition { - path_pattern { - values = ["/mcp", "/mcp/*"] - } - } - - tags = local.common_tags -} - -resource "aws_lb_listener_rule" "mcp_http" { - count = local.has_tls ? 0 : 1 - - listener_arn = aws_lb_listener.http_forward[0].arn - priority = 10 - - action { - type = "forward" - target_group_arn = aws_lb_target_group.mcp.arn - } - - condition { - path_pattern { - values = ["/mcp", "/mcp/*"] - } - } - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Weight sum validation -# ───────────────────────────────────────────────────────────────────────────── - -check "lb_weight_sum" { - assert { - condition = var.blue_weight + var.green_weight == 100 - error_message = "blue_weight (${var.blue_weight}) + green_weight (${var.green_weight}) must sum to 100 for correct traffic routing." - } -} diff --git a/deployments/terraform/modules/loadbalancer/outputs.tf b/deployments/terraform/modules/loadbalancer/outputs.tf deleted file mode 100644 index b16efdb..0000000 --- a/deployments/terraform/modules/loadbalancer/outputs.tf +++ /dev/null @@ -1,43 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Load Balancer module outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "loadbalancer_arn" { - description = "ARN of the application load balancer" - value = aws_lb.main.arn -} - -output "loadbalancer_id" { - description = "ID of the application load balancer" - value = aws_lb.main.id -} - -output "dns_name" { - description = "DNS name of the application load balancer" - value = aws_lb.main.dns_name -} - -output "zone_id" { - description = "Route53 zone ID for the load balancer (alias records)" - value = aws_lb.main.zone_id -} - -output "application_url" { - description = "Full URL to access the application" - value = local.has_tls ? "https://${var.domain_name != "" ? var.domain_name : aws_lb.main.dns_name}" : "http://${aws_lb.main.dns_name}" -} - -output "https_listener_arn" { - description = "ARN of the HTTPS listener (empty if TLS not configured)" - value = local.has_tls ? aws_lb_listener.https[0].arn : "" -} - -output "http_listener_arn" { - description = "ARN of the HTTP listener" - value = local.has_tls ? aws_lb_listener.http_redirect[0].arn : aws_lb_listener.http_forward[0].arn -} - -output "mcp_target_group_arn" { - description = "ARN of the MCP sidecar target group" - value = aws_lb_target_group.mcp.arn -} diff --git a/deployments/terraform/modules/loadbalancer/variables.tf b/deployments/terraform/modules/loadbalancer/variables.tf deleted file mode 100644 index 449fe23..0000000 --- a/deployments/terraform/modules/loadbalancer/variables.tf +++ /dev/null @@ -1,134 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Load Balancer module variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string -} - -variable "environment" { - description = "Deployment environment (dev, staging, production)" - type = string -} - -variable "cloud_provider" { - description = "Target cloud provider (aws, gcp, azure, oci)" - type = string -} - -variable "region" { - description = "Cloud region for deployment" - type = string -} - -variable "vpc_id" { - description = "VPC ID for target group association" - type = string -} - -variable "public_subnet_ids" { - description = "Public subnet IDs for load balancer placement" - type = list(string) -} - -variable "security_group_ids" { - description = "Security group IDs attached to the load balancer" - type = list(string) -} - -variable "app_port" { - description = "Application container port" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "MCP sidecar container port" - type = number - default = 8819 -} - -variable "tls_certificate_arn" { - description = "ARN of the TLS certificate for HTTPS (required for production)" - type = string - default = "" -} - -variable "domain_name" { - description = "Fully qualified domain name for the application (required for production)" - type = string - default = "" -} - -variable "blue_target_group_arn" { - description = "ARN of the blue deployment target group" - type = string -} - -variable "green_target_group_arn" { - description = "ARN of the green deployment target group" - type = string -} - -variable "blue_weight" { - description = "Traffic weight for blue target group (0-100)" - type = number - default = 100 - validation { - condition = var.blue_weight >= 0 && var.blue_weight <= 100 - error_message = "blue_weight must be between 0 and 100." - } -} - -variable "green_weight" { - description = "Traffic weight for green target group (0-100)" - type = number - default = 0 - validation { - condition = var.green_weight >= 0 && var.green_weight <= 100 - error_message = "green_weight must be between 0 and 100." - } -} - -variable "health_check_path" { - description = "HTTP path for health checks" - type = string - default = "/api/health" -} - -variable "health_check_interval" { - description = "Seconds between health checks" - type = number - default = 30 -} - -variable "health_check_timeout" { - description = "Seconds before a health check times out" - type = number - default = 5 -} - -variable "health_check_healthy_threshold" { - description = "Consecutive successes to mark healthy" - type = number - default = 2 -} - -variable "health_check_unhealthy_threshold" { - description = "Consecutive failures to mark unhealthy" - type = number - default = 3 -} - -variable "tags" { - description = "Resource tags" - type = map(string) - default = {} -} - -variable "enable_deletion_protection" { - description = "Enable deletion protection on the load balancer (recommended for production)" - type = bool - default = false -} diff --git a/deployments/terraform/modules/monitoring/main.tf b/deployments/terraform/modules/monitoring/main.tf deleted file mode 100644 index 2ccc9af..0000000 --- a/deployments/terraform/modules/monitoring/main.tf +++ /dev/null @@ -1,312 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Monitoring module – Observability, alerting, and dashboards -# -# Provisions: -# - CloudWatch log groups for centralized log aggregation -# - Metric alarms for error rate, latency, disk, unhealthy hosts -# - SNS topic for alert notifications -# - CloudWatch dashboard with key operational metrics -# ───────────────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - common_tags = merge( - { - module = "monitoring" - }, - var.tags, - ) - - # Parse ALB ARN suffix for CloudWatch metric dimensions - alb_arn_suffix = try( - regex("app/.*$", var.loadbalancer_arn), - "" - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# SNS topic for alert notifications -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_sns_topic" "alerts" { - name = "${local.name_prefix}-alerts" - - tags = local.common_tags -} - -resource "aws_sns_topic_subscription" "email" { - count = var.alert_email != "" ? 1 : 0 - - topic_arn = aws_sns_topic.alerts.arn - protocol = "email" - endpoint = var.alert_email -} - -# ───────────────────────────────────────────────────────────────────────────── -# CloudWatch log group (application-level) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_cloudwatch_log_group" "application" { - name = "/ccam/${local.name_prefix}" - retention_in_days = var.log_retention_days - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Metric alarms -# ───────────────────────────────────────────────────────────────────────────── - -# High 5xx error rate from ALB -resource "aws_cloudwatch_metric_alarm" "high_5xx_rate" { - alarm_name = "${local.name_prefix}-high-5xx-error-rate" - comparison_operator = "GreaterThanThreshold" - evaluation_periods = 3 - metric_name = "HTTPCode_Target_5XX_Count" - namespace = "AWS/ApplicationELB" - period = 60 - statistic = "Sum" - threshold = 10 - alarm_description = "High 5XX error rate detected on ${local.name_prefix} ALB" - treat_missing_data = "notBreaching" - - dimensions = { - LoadBalancer = local.alb_arn_suffix - } - - alarm_actions = [aws_sns_topic.alerts.arn] - ok_actions = [aws_sns_topic.alerts.arn] - - tags = local.common_tags -} - -# High target response time (latency) -resource "aws_cloudwatch_metric_alarm" "high_latency" { - alarm_name = "${local.name_prefix}-high-latency" - comparison_operator = "GreaterThanThreshold" - evaluation_periods = 3 - metric_name = "TargetResponseTime" - namespace = "AWS/ApplicationELB" - period = 60 - statistic = "Average" - threshold = 2.0 # seconds - alarm_description = "High average latency (>2s) on ${local.name_prefix} ALB" - treat_missing_data = "notBreaching" - - dimensions = { - LoadBalancer = local.alb_arn_suffix - } - - alarm_actions = [aws_sns_topic.alerts.arn] - ok_actions = [aws_sns_topic.alerts.arn] - - tags = local.common_tags -} - -# Unhealthy host count -resource "aws_cloudwatch_metric_alarm" "unhealthy_hosts" { - count = length(var.target_group_arns) - - alarm_name = "${local.name_prefix}-unhealthy-hosts-${count.index}" - comparison_operator = "GreaterThanThreshold" - evaluation_periods = 2 - metric_name = "UnHealthyHostCount" - namespace = "AWS/ApplicationELB" - period = 60 - statistic = "Maximum" - threshold = 0 - alarm_description = "Unhealthy targets detected in target group ${count.index}" - treat_missing_data = "notBreaching" - - dimensions = { - LoadBalancer = local.alb_arn_suffix - TargetGroup = try(regex("targetgroup/.*$", var.target_group_arns[count.index]), "") - } - - alarm_actions = [aws_sns_topic.alerts.arn] - ok_actions = [aws_sns_topic.alerts.arn] - - tags = local.common_tags -} - -# EFS burst credit balance (low disk throughput) -resource "aws_cloudwatch_metric_alarm" "efs_burst_credits" { - alarm_name = "${local.name_prefix}-efs-low-burst-credits" - comparison_operator = "LessThanThreshold" - evaluation_periods = 3 - metric_name = "BurstCreditBalance" - namespace = "AWS/EFS" - period = 300 - statistic = "Average" - threshold = 1000000000 # 1 GiB in bytes - alarm_description = "EFS burst credits running low for ${local.name_prefix}" - treat_missing_data = "notBreaching" - - dimensions = { - FileSystemId = var.filesystem_id - } - - alarm_actions = [aws_sns_topic.alerts.arn] - - tags = local.common_tags -} - -# ECS CPU utilisation (cluster-level) -resource "aws_cloudwatch_metric_alarm" "ecs_high_cpu" { - alarm_name = "${local.name_prefix}-ecs-high-cpu" - comparison_operator = "GreaterThanThreshold" - evaluation_periods = 3 - metric_name = "CPUUtilization" - namespace = "AWS/ECS" - period = 300 - statistic = "Average" - threshold = 85 - alarm_description = "High ECS CPU utilisation (>85%) for cluster ${var.compute_cluster_name}" - treat_missing_data = "notBreaching" - - dimensions = { - ClusterName = var.compute_cluster_name - } - - alarm_actions = [aws_sns_topic.alerts.arn] - ok_actions = [aws_sns_topic.alerts.arn] - - tags = local.common_tags -} - -# ECS Memory utilisation -resource "aws_cloudwatch_metric_alarm" "ecs_high_memory" { - alarm_name = "${local.name_prefix}-ecs-high-memory" - comparison_operator = "GreaterThanThreshold" - evaluation_periods = 3 - metric_name = "MemoryUtilization" - namespace = "AWS/ECS" - period = 300 - statistic = "Average" - threshold = 85 - alarm_description = "High ECS memory utilisation (>85%) for cluster ${var.compute_cluster_name}" - treat_missing_data = "notBreaching" - - dimensions = { - ClusterName = var.compute_cluster_name - } - - alarm_actions = [aws_sns_topic.alerts.arn] - ok_actions = [aws_sns_topic.alerts.arn] - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# CloudWatch Dashboard -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_cloudwatch_dashboard" "main" { - dashboard_name = local.name_prefix - dashboard_body = jsonencode({ - widgets = [ - { - type = "metric" - x = 0 - y = 0 - width = 12 - height = 6 - properties = { - title = "ALB Request Count" - region = var.region - metrics = [ - ["AWS/ApplicationELB", "RequestCount", "LoadBalancer", local.alb_arn_suffix, { stat = "Sum", period = 60 }] - ] - view = "timeSeries" - stacked = false - } - }, - { - type = "metric" - x = 12 - y = 0 - width = 12 - height = 6 - properties = { - title = "ALB Response Time" - region = var.region - metrics = [ - ["AWS/ApplicationELB", "TargetResponseTime", "LoadBalancer", local.alb_arn_suffix, { stat = "Average", period = 60 }], - ["AWS/ApplicationELB", "TargetResponseTime", "LoadBalancer", local.alb_arn_suffix, { stat = "p99", period = 60 }], - ] - view = "timeSeries" - stacked = false - } - }, - { - type = "metric" - x = 0 - y = 6 - width = 12 - height = 6 - properties = { - title = "HTTP Error Rates" - region = var.region - metrics = [ - ["AWS/ApplicationELB", "HTTPCode_Target_4XX_Count", "LoadBalancer", local.alb_arn_suffix, { stat = "Sum", period = 60 }], - ["AWS/ApplicationELB", "HTTPCode_Target_5XX_Count", "LoadBalancer", local.alb_arn_suffix, { stat = "Sum", period = 60 }], - ] - view = "timeSeries" - stacked = false - } - }, - { - type = "metric" - x = 12 - y = 6 - width = 12 - height = 6 - properties = { - title = "ECS CPU & Memory" - region = var.region - metrics = [ - ["AWS/ECS", "CPUUtilization", "ClusterName", var.compute_cluster_name, { stat = "Average", period = 60 }], - ["AWS/ECS", "MemoryUtilization", "ClusterName", var.compute_cluster_name, { stat = "Average", period = 60 }], - ] - view = "timeSeries" - stacked = false - } - }, - { - type = "metric" - x = 0 - y = 12 - width = 12 - height = 6 - properties = { - title = "EFS I/O" - region = var.region - metrics = [ - ["AWS/EFS", "DataReadIOBytes", "FileSystemId", var.filesystem_id, { stat = "Sum", period = 60 }], - ["AWS/EFS", "DataWriteIOBytes", "FileSystemId", var.filesystem_id, { stat = "Sum", period = 60 }], - ] - view = "timeSeries" - stacked = false - } - }, - { - type = "metric" - x = 12 - y = 12 - width = 12 - height = 6 - properties = { - title = "Healthy vs Unhealthy Hosts" - region = var.region - metrics = [ - ["AWS/ApplicationELB", "HealthyHostCount", "LoadBalancer", local.alb_arn_suffix, { stat = "Average", period = 60 }], - ["AWS/ApplicationELB", "UnHealthyHostCount", "LoadBalancer", local.alb_arn_suffix, { stat = "Average", period = 60 }], - ] - view = "timeSeries" - stacked = false - } - }, - ] - }) -} diff --git a/deployments/terraform/modules/monitoring/outputs.tf b/deployments/terraform/modules/monitoring/outputs.tf deleted file mode 100644 index 7761a64..0000000 --- a/deployments/terraform/modules/monitoring/outputs.tf +++ /dev/null @@ -1,40 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Monitoring module outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "sns_topic_arn" { - description = "ARN of the SNS alert topic" - value = aws_sns_topic.alerts.arn -} - -output "log_group_name" { - description = "Name of the CloudWatch log group" - value = aws_cloudwatch_log_group.application.name -} - -output "log_group_arn" { - description = "ARN of the CloudWatch log group" - value = aws_cloudwatch_log_group.application.arn -} - -output "dashboard_name" { - description = "Name of the CloudWatch dashboard" - value = aws_cloudwatch_dashboard.main.dashboard_name -} - -output "dashboard_url" { - description = "URL to the CloudWatch dashboard in the AWS console" - value = "https://${var.region}.console.aws.amazon.com/cloudwatch/home?region=${var.region}#dashboards:name=${aws_cloudwatch_dashboard.main.dashboard_name}" -} - -output "alarm_arns" { - description = "ARNs of all configured CloudWatch alarms" - value = concat( - [aws_cloudwatch_metric_alarm.high_5xx_rate.arn], - [aws_cloudwatch_metric_alarm.high_latency.arn], - [aws_cloudwatch_metric_alarm.efs_burst_credits.arn], - [aws_cloudwatch_metric_alarm.ecs_high_cpu.arn], - [aws_cloudwatch_metric_alarm.ecs_high_memory.arn], - aws_cloudwatch_metric_alarm.unhealthy_hosts[*].arn, - ) -} diff --git a/deployments/terraform/modules/monitoring/variables.tf b/deployments/terraform/modules/monitoring/variables.tf deleted file mode 100644 index 1ef4a11..0000000 --- a/deployments/terraform/modules/monitoring/variables.tf +++ /dev/null @@ -1,66 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Monitoring module variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string -} - -variable "environment" { - description = "Deployment environment (dev, staging, production)" - type = string -} - -variable "cloud_provider" { - description = "Target cloud provider (aws, gcp, azure, oci)" - type = string -} - -variable "region" { - description = "Cloud region for deployment" - type = string -} - -variable "alert_email" { - description = "Email address for alert notifications (empty to skip)" - type = string - default = "" -} - -variable "log_retention_days" { - description = "Number of days to retain application logs" - type = number - default = 30 - validation { - condition = contains([1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653], var.log_retention_days) - error_message = "log_retention_days must be a valid CloudWatch retention period." - } -} - -variable "loadbalancer_arn" { - description = "ARN of the application load balancer to monitor" - type = string -} - -variable "target_group_arns" { - description = "ARNs of target groups to monitor for unhealthy hosts" - type = list(string) - default = [] -} - -variable "compute_cluster_name" { - description = "Name of the ECS cluster for compute metrics" - type = string -} - -variable "filesystem_id" { - description = "EFS file system ID for storage metrics" - type = string -} - -variable "tags" { - description = "Resource tags" - type = map(string) - default = {} -} diff --git a/deployments/terraform/modules/networking/main.tf b/deployments/terraform/modules/networking/main.tf deleted file mode 100644 index 53b81b1..0000000 --- a/deployments/terraform/modules/networking/main.tf +++ /dev/null @@ -1,279 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Networking module – Cloud-agnostic VPC / VNet / VCN abstraction -# -# Creates the foundational network topology: virtual network, public and -# private subnets across availability zones, NAT gateway, internet gateway, -# route tables, and security groups / firewall rules. -# ───────────────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - # Default AZs when none provided – derive from region - default_azs = [ - "${var.region}a", - "${var.region}b", - "${var.region}c", - ] - - availability_zones = length(var.availability_zones) > 0 ? var.availability_zones : local.default_azs - - # Number of AZs determines subnet count - az_count = min(length(local.availability_zones), length(var.public_subnet_cidrs), length(var.private_subnet_cidrs)) - - common_tags = merge( - { - module = "networking" - }, - var.tags, - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# VPC -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_vpc" "main" { - cidr_block = var.vpc_cidr - enable_dns_support = true - enable_dns_hostnames = true - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-vpc" - }) - - lifecycle { - prevent_destroy = false - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Internet gateway -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_internet_gateway" "main" { - vpc_id = aws_vpc.main.id - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-igw" - }) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Public subnets -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_subnet" "public" { - count = local.az_count - - vpc_id = aws_vpc.main.id - cidr_block = var.public_subnet_cidrs[count.index] - availability_zone = local.availability_zones[count.index] - map_public_ip_on_launch = true - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-public-${local.availability_zones[count.index]}" - tier = "public" - }) -} - -resource "aws_route_table" "public" { - vpc_id = aws_vpc.main.id - - route { - cidr_block = "0.0.0.0/0" - gateway_id = aws_internet_gateway.main.id - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-public-rt" - }) -} - -resource "aws_route_table_association" "public" { - count = local.az_count - - subnet_id = aws_subnet.public[count.index].id - route_table_id = aws_route_table.public.id -} - -# ───────────────────────────────────────────────────────────────────────────── -# NAT gateway (single, in first public subnet – cost-conscious default) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_eip" "nat" { - domain = "vpc" - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-nat-eip" - }) -} - -resource "aws_nat_gateway" "main" { - allocation_id = aws_eip.nat.id - subnet_id = aws_subnet.public[0].id - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-nat" - }) - - depends_on = [aws_internet_gateway.main] -} - -# ───────────────────────────────────────────────────────────────────────────── -# Private subnets -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_subnet" "private" { - count = local.az_count - - vpc_id = aws_vpc.main.id - cidr_block = var.private_subnet_cidrs[count.index] - availability_zone = local.availability_zones[count.index] - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-private-${local.availability_zones[count.index]}" - tier = "private" - }) -} - -resource "aws_route_table" "private" { - vpc_id = aws_vpc.main.id - - route { - cidr_block = "0.0.0.0/0" - nat_gateway_id = aws_nat_gateway.main.id - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-private-rt" - }) -} - -resource "aws_route_table_association" "private" { - count = local.az_count - - subnet_id = aws_subnet.private[count.index].id - route_table_id = aws_route_table.private.id -} - -# ───────────────────────────────────────────────────────────────────────────── -# Security groups -# ───────────────────────────────────────────────────────────────────────────── - -# Public (load-balancer-facing) -resource "aws_security_group" "public" { - name_prefix = "${local.name_prefix}-public-" - description = "Allow HTTPS/HTTP inbound and all outbound" - vpc_id = aws_vpc.main.id - - ingress { - description = "HTTPS" - from_port = 443 - to_port = 443 - protocol = "tcp" - cidr_blocks = ["0.0.0.0/0"] - } - - ingress { - description = "HTTP (redirect)" - from_port = 80 - to_port = 80 - protocol = "tcp" - cidr_blocks = ["0.0.0.0/0"] - } - - egress { - description = "All outbound" - from_port = 0 - to_port = 0 - protocol = "-1" - cidr_blocks = ["0.0.0.0/0"] - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-public-sg" - }) - - lifecycle { - create_before_destroy = true - } -} - -# Private (container-facing) -resource "aws_security_group" "private" { - name_prefix = "${local.name_prefix}-private-" - description = "Allow traffic from public SG to app and MCP ports" - vpc_id = aws_vpc.main.id - - ingress { - description = "Application port from LB" - from_port = var.app_port - to_port = var.app_port - protocol = "tcp" - security_groups = [aws_security_group.public.id] - } - - ingress { - description = "MCP sidecar port from LB" - from_port = var.mcp_port - to_port = var.mcp_port - protocol = "tcp" - security_groups = [aws_security_group.public.id] - } - - ingress { - description = "NFS (EFS) within VPC" - from_port = 2049 - to_port = 2049 - protocol = "tcp" - self = true - } - - egress { - description = "All outbound" - from_port = 0 - to_port = 0 - protocol = "-1" - cidr_blocks = ["0.0.0.0/0"] - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-private-sg" - }) - - lifecycle { - create_before_destroy = true - } -} - -# EFS security group -resource "aws_security_group" "storage" { - name_prefix = "${local.name_prefix}-storage-" - description = "Allow NFS access from private security group" - vpc_id = aws_vpc.main.id - - ingress { - description = "NFS from private subnets" - from_port = 2049 - to_port = 2049 - protocol = "tcp" - security_groups = [aws_security_group.private.id] - } - - egress { - description = "All outbound" - from_port = 0 - to_port = 0 - protocol = "-1" - cidr_blocks = ["0.0.0.0/0"] - } - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-storage-sg" - }) - - lifecycle { - create_before_destroy = true - } -} diff --git a/deployments/terraform/modules/networking/outputs.tf b/deployments/terraform/modules/networking/outputs.tf deleted file mode 100644 index e17841e..0000000 --- a/deployments/terraform/modules/networking/outputs.tf +++ /dev/null @@ -1,53 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Networking module outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "vpc_id" { - description = "ID of the provisioned VPC" - value = aws_vpc.main.id -} - -output "vpc_cidr" { - description = "CIDR block of the VPC" - value = aws_vpc.main.cidr_block -} - -output "public_subnet_ids" { - description = "IDs of the public subnets" - value = aws_subnet.public[*].id -} - -output "private_subnet_ids" { - description = "IDs of the private subnets" - value = aws_subnet.private[*].id -} - -output "public_security_group_ids" { - description = "Security group IDs for public-facing resources (LB)" - value = [aws_security_group.public.id] -} - -output "private_security_group_ids" { - description = "Security group IDs for private resources (containers)" - value = [aws_security_group.private.id] -} - -output "storage_security_group_ids" { - description = "Security group IDs for persistent storage" - value = [aws_security_group.storage.id] -} - -output "nat_gateway_ip" { - description = "Public IP of the NAT gateway" - value = aws_eip.nat.public_ip -} - -output "internet_gateway_id" { - description = "ID of the internet gateway" - value = aws_internet_gateway.main.id -} - -output "availability_zones" { - description = "Availability zones used for deployment" - value = local.availability_zones -} diff --git a/deployments/terraform/modules/networking/variables.tf b/deployments/terraform/modules/networking/variables.tf deleted file mode 100644 index 2c2af7a..0000000 --- a/deployments/terraform/modules/networking/variables.tf +++ /dev/null @@ -1,69 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Networking module variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string -} - -variable "environment" { - description = "Deployment environment (dev, staging, production)" - type = string -} - -variable "cloud_provider" { - description = "Target cloud provider (aws, gcp, azure, oci)" - type = string -} - -variable "region" { - description = "Cloud region for deployment" - type = string -} - -variable "vpc_cidr" { - description = "CIDR block for the virtual network" - type = string - default = "10.0.0.0/16" - validation { - condition = can(cidrhost(var.vpc_cidr, 0)) - error_message = "vpc_cidr must be a valid CIDR block." - } -} - -variable "availability_zones" { - description = "List of availability zones for multi-AZ deployment" - type = list(string) - default = [] -} - -variable "public_subnet_cidrs" { - description = "CIDR blocks for public subnets (one per AZ)" - type = list(string) - default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] -} - -variable "private_subnet_cidrs" { - description = "CIDR blocks for private subnets (one per AZ)" - type = list(string) - default = ["10.0.11.0/24", "10.0.12.0/24", "10.0.13.0/24"] -} - -variable "app_port" { - description = "Application container port" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "MCP sidecar container port" - type = number - default = 8819 -} - -variable "tags" { - description = "Resource tags" - type = map(string) - default = {} -} diff --git a/deployments/terraform/outputs.tf b/deployments/terraform/outputs.tf deleted file mode 100644 index 14759a3..0000000 --- a/deployments/terraform/outputs.tf +++ /dev/null @@ -1,53 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Root module outputs – Claude Code Agent Monitor -# ───────────────────────────────────────────────────────────────────────────── - -output "application_url" { - description = "Public URL of the Claude Code Agent Monitor dashboard" - value = module.loadbalancer.application_url -} - -output "loadbalancer_dns" { - description = "DNS name of the application load balancer" - value = module.loadbalancer.dns_name -} - -output "vpc_id" { - description = "ID of the provisioned VPC / VNet / VCN" - value = module.networking.vpc_id -} - -output "private_subnet_ids" { - description = "IDs of the private subnets hosting compute workloads" - value = module.networking.private_subnet_ids -} - -output "public_subnet_ids" { - description = "IDs of the public subnets hosting the load balancer" - value = module.networking.public_subnet_ids -} - -output "filesystem_id" { - description = "ID of the persistent file system for SQLite storage" - value = module.database.filesystem_id -} - -output "blue_service_name" { - description = "Name of the blue deployment compute service" - value = module.compute_blue.service_name -} - -output "green_service_name" { - description = "Name of the green deployment compute service" - value = module.compute_green.service_name -} - -output "active_slot" { - description = "Currently active deployment slot" - value = var.active_deployment_slot -} - -output "monitoring_dashboard_url" { - description = "URL of the monitoring dashboard (if enabled)" - value = var.enable_monitoring ? module.monitoring[0].dashboard_url : "monitoring disabled" -} diff --git a/deployments/terraform/providers/aws/main.tf b/deployments/terraform/providers/aws/main.tf deleted file mode 100644 index 7343103..0000000 --- a/deployments/terraform/providers/aws/main.tf +++ /dev/null @@ -1,264 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# AWS Provider – Full implementation for Claude Code Agent Monitor -# -# Composes the generic modules into a production-ready AWS stack: -# VPC → ECS Fargate → EFS → ALB → CloudWatch → ACM -# -# Features: -# - Multi-AZ deployment -# - Blue/green deployment slots -# - EFS for persistent SQLite storage -# - ALB with WebSocket support and sticky sessions -# - Auto-scaling with CPU/memory targets -# - CloudWatch monitoring, alarms, and dashboards -# - IAM least-privilege roles -# ───────────────────────────────────────────────────────────────────────────── - -provider "aws" { - region = var.region - - default_tags { - tags = local.common_tags - } -} - -# ── Data sources ──────────────────────────────────────────────────────────── - -data "aws_caller_identity" "current" {} -data "aws_region" "current" {} - -data "aws_availability_zones" "available" { - state = "available" -} - -# ── Locals ────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - common_tags = merge( - { - project = var.project_name - environment = var.environment - managed_by = "terraform" - cloud_provider = "aws" - repository = "Claude-Code-Agent-Monitor" - }, - var.tags, - ) - - # Use first 3 available AZs when none specified - availability_zones = length(var.availability_zones) > 0 ? var.availability_zones : slice(data.aws_availability_zones.available.names, 0, min(3, length(data.aws_availability_zones.available.names))) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Networking -# ───────────────────────────────────────────────────────────────────────────── - -module "networking" { - source = "../../modules/networking" - - project_name = var.project_name - environment = var.environment - cloud_provider = "aws" - region = var.region - vpc_cidr = var.vpc_cidr - availability_zones = local.availability_zones - public_subnet_cidrs = var.public_subnet_cidrs - private_subnet_cidrs = var.private_subnet_cidrs - app_port = var.app_port - mcp_port = var.mcp_port - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Database (EFS for SQLite persistence) -# ───────────────────────────────────────────────────────────────────────────── - -module "database" { - source = "../../modules/database" - - project_name = var.project_name - environment = var.environment - cloud_provider = "aws" - region = var.region - storage_size_gb = var.storage_size_gb - enable_backup = var.enable_storage_backup - private_subnet_ids = module.networking.private_subnet_ids - vpc_id = module.networking.vpc_id - allowed_security_group_ids = module.networking.storage_security_group_ids - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Compute – Blue slot -# ───────────────────────────────────────────────────────────────────────────── - -module "compute_blue" { - source = "../../modules/compute" - - project_name = var.project_name - environment = var.environment - cloud_provider = "aws" - region = var.region - deployment_slot = "blue" - container_image = var.app_container_image - mcp_container_image = var.mcp_container_image - app_port = var.app_port - mcp_port = var.mcp_port - cpu = var.cpu - memory = var.memory - desired_count = var.active_deployment_slot == "blue" ? var.desired_replicas : 0 - min_count = var.active_deployment_slot == "blue" ? var.min_replicas : 0 - max_count = var.active_deployment_slot == "blue" ? var.max_replicas : 0 - environment_variables = var.environment_variables - health_check_path = var.health_check_path - vpc_id = module.networking.vpc_id - private_subnet_ids = module.networking.private_subnet_ids - security_group_ids = module.networking.private_security_group_ids - storage_filesystem_id = module.database.filesystem_id - storage_mount_targets = module.database.mount_target_ids - autoscaling_cpu_target = var.autoscaling_cpu_target - autoscaling_memory_target = var.autoscaling_memory_target - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Compute – Green slot -# ───────────────────────────────────────────────────────────────────────────── - -module "compute_green" { - source = "../../modules/compute" - - project_name = var.project_name - environment = var.environment - cloud_provider = "aws" - region = var.region - deployment_slot = "green" - container_image = var.app_container_image - mcp_container_image = var.mcp_container_image - app_port = var.app_port - mcp_port = var.mcp_port - cpu = var.cpu - memory = var.memory - desired_count = var.active_deployment_slot == "green" ? var.desired_replicas : 0 - min_count = var.active_deployment_slot == "green" ? var.min_replicas : 0 - max_count = var.active_deployment_slot == "green" ? var.max_replicas : 0 - environment_variables = var.environment_variables - health_check_path = var.health_check_path - vpc_id = module.networking.vpc_id - private_subnet_ids = module.networking.private_subnet_ids - security_group_ids = module.networking.private_security_group_ids - storage_filesystem_id = module.database.filesystem_id - storage_mount_targets = module.database.mount_target_ids - autoscaling_cpu_target = var.autoscaling_cpu_target - autoscaling_memory_target = var.autoscaling_memory_target - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# ACM Certificate (optional – when domain_name is specified) -# ───────────────────────────────────────────────────────────────────────────── - -resource "aws_acm_certificate" "main" { - count = var.domain_name != "" && var.tls_certificate_arn == "" ? 1 : 0 - - domain_name = var.domain_name - validation_method = "DNS" - - tags = merge(local.common_tags, { - Name = "${local.name_prefix}-cert" - }) - - lifecycle { - create_before_destroy = true - } -} - -locals { - tls_cert_arn = var.tls_certificate_arn != "" ? var.tls_certificate_arn : ( - length(aws_acm_certificate.main) > 0 ? aws_acm_certificate.main[0].arn : "" - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Load Balancer -# ───────────────────────────────────────────────────────────────────────────── - -module "loadbalancer" { - source = "../../modules/loadbalancer" - - project_name = var.project_name - environment = var.environment - cloud_provider = "aws" - region = var.region - vpc_id = module.networking.vpc_id - public_subnet_ids = module.networking.public_subnet_ids - security_group_ids = module.networking.public_security_group_ids - app_port = var.app_port - mcp_port = var.mcp_port - tls_certificate_arn = local.tls_cert_arn - domain_name = var.domain_name - - blue_target_group_arn = module.compute_blue.target_group_arn - green_target_group_arn = module.compute_green.target_group_arn - blue_weight = var.blue_weight - green_weight = var.green_weight - - health_check_path = var.health_check_path - health_check_interval = var.health_check_interval - health_check_timeout = var.health_check_timeout - health_check_healthy_threshold = var.health_check_healthy_threshold - health_check_unhealthy_threshold = var.health_check_unhealthy_threshold - - enable_deletion_protection = var.environment == "production" - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Monitoring -# ───────────────────────────────────────────────────────────────────────────── - -module "monitoring" { - source = "../../modules/monitoring" - count = var.enable_monitoring ? 1 : 0 - - project_name = var.project_name - environment = var.environment - cloud_provider = "aws" - region = var.region - alert_email = var.alert_email - log_retention_days = var.log_retention_days - - loadbalancer_arn = module.loadbalancer.loadbalancer_arn - target_group_arns = [module.compute_blue.target_group_arn, module.compute_green.target_group_arn] - compute_cluster_name = module.compute_blue.cluster_name - filesystem_id = module.database.filesystem_id - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Route53 DNS record (optional) -# ───────────────────────────────────────────────────────────────────────────── - -data "aws_route53_zone" "main" { - count = var.domain_name != "" && var.route53_zone_id != "" ? 1 : 0 - - zone_id = var.route53_zone_id -} - -resource "aws_route53_record" "app" { - count = var.domain_name != "" && var.route53_zone_id != "" ? 1 : 0 - - zone_id = data.aws_route53_zone.main[0].zone_id - name = var.domain_name - type = "A" - - alias { - name = module.loadbalancer.dns_name - zone_id = module.loadbalancer.zone_id - evaluate_target_health = true - } -} diff --git a/deployments/terraform/providers/aws/outputs.tf b/deployments/terraform/providers/aws/outputs.tf deleted file mode 100644 index 059feed..0000000 --- a/deployments/terraform/providers/aws/outputs.tf +++ /dev/null @@ -1,58 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# AWS provider outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "application_url" { - description = "Public URL of the Claude Code Agent Monitor dashboard" - value = module.loadbalancer.application_url -} - -output "alb_dns_name" { - description = "DNS name of the Application Load Balancer" - value = module.loadbalancer.dns_name -} - -output "vpc_id" { - description = "ID of the VPC" - value = module.networking.vpc_id -} - -output "ecs_cluster_name" { - description = "Name of the ECS cluster" - value = module.compute_blue.cluster_name -} - -output "blue_service_name" { - description = "Name of the blue ECS service" - value = module.compute_blue.service_name -} - -output "green_service_name" { - description = "Name of the green ECS service" - value = module.compute_green.service_name -} - -output "efs_filesystem_id" { - description = "ID of the EFS file system" - value = module.database.filesystem_id -} - -output "acm_certificate_arn" { - description = "ARN of the ACM certificate (if auto-created)" - value = length(aws_acm_certificate.main) > 0 ? aws_acm_certificate.main[0].arn : var.tls_certificate_arn -} - -output "monitoring_dashboard_url" { - description = "CloudWatch dashboard URL" - value = var.enable_monitoring ? module.monitoring[0].dashboard_url : "monitoring disabled" -} - -output "account_id" { - description = "AWS account ID" - value = data.aws_caller_identity.current.account_id -} - -output "region" { - description = "AWS region" - value = data.aws_region.current.name -} diff --git a/deployments/terraform/providers/aws/terraform.tf b/deployments/terraform/providers/aws/terraform.tf deleted file mode 100644 index c850ca3..0000000 --- a/deployments/terraform/providers/aws/terraform.tf +++ /dev/null @@ -1,14 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# AWS provider – Terraform and provider constraints -# ───────────────────────────────────────────────────────────────────────────── - -terraform { - required_version = ">= 1.5.0" - - required_providers { - aws = { - source = "hashicorp/aws" - version = "~> 5.0" - } - } -} diff --git a/deployments/terraform/providers/aws/variables.tf b/deployments/terraform/providers/aws/variables.tf deleted file mode 100644 index 1f67ff1..0000000 --- a/deployments/terraform/providers/aws/variables.tf +++ /dev/null @@ -1,254 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# AWS provider variables -# ───────────────────────────────────────────────────────────────────────────── - -# ── Core ──────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming and tagging" - type = string - default = "claude-agent-monitor" -} - -variable "environment" { - description = "Deployment environment: dev, staging, or production" - type = string - validation { - condition = contains(["dev", "staging", "production"], var.environment) - error_message = "environment must be one of: dev, staging, production." - } -} - -variable "region" { - description = "AWS region for resource deployment" - type = string - default = "us-east-1" -} - -variable "tags" { - description = "Additional tags to apply to all resources" - type = map(string) - default = {} -} - -# ── Networking ────────────────────────────────────────────────────────────── - -variable "vpc_cidr" { - description = "CIDR block for the VPC" - type = string - default = "10.0.0.0/16" -} - -variable "availability_zones" { - description = "List of AZs (auto-detected if empty)" - type = list(string) - default = [] -} - -variable "public_subnet_cidrs" { - description = "CIDR blocks for public subnets" - type = list(string) - default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] -} - -variable "private_subnet_cidrs" { - description = "CIDR blocks for private subnets" - type = list(string) - default = ["10.0.11.0/24", "10.0.12.0/24", "10.0.13.0/24"] -} - -# ── Compute ───────────────────────────────────────────────────────────────── - -variable "app_container_image" { - description = "Docker image URI for the main application" - type = string -} - -variable "mcp_container_image" { - description = "Docker image URI for the MCP sidecar (empty to disable)" - type = string - default = "" -} - -variable "app_port" { - description = "Application container port" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "MCP sidecar container port" - type = number - default = 8819 -} - -variable "cpu" { - description = "CPU units for Fargate tasks (256, 512, 1024, 2048, 4096)" - type = number - default = 512 -} - -variable "memory" { - description = "Memory in MiB for Fargate tasks" - type = number - default = 1024 -} - -variable "min_replicas" { - description = "Minimum number of ECS tasks" - type = number - default = 1 -} - -variable "max_replicas" { - description = "Maximum number of ECS tasks for auto-scaling" - type = number - default = 3 -} - -variable "desired_replicas" { - description = "Desired number of ECS tasks at steady state" - type = number - default = 1 -} - -variable "environment_variables" { - description = "Environment variables for the application container" - type = map(string) - default = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - } -} - -# ── Deployment ────────────────────────────────────────────────────────────── - -variable "active_deployment_slot" { - description = "Active deployment slot: blue or green" - type = string - default = "blue" - validation { - condition = contains(["blue", "green"], var.active_deployment_slot) - error_message = "active_deployment_slot must be blue or green." - } -} - -variable "blue_weight" { - description = "Traffic weight for blue target group (0-100)" - type = number - default = 100 - validation { - condition = var.blue_weight >= 0 && var.blue_weight <= 100 - error_message = "blue_weight must be between 0 and 100." - } -} - -variable "green_weight" { - description = "Traffic weight for green target group (0-100)" - type = number - default = 0 - validation { - condition = var.green_weight >= 0 && var.green_weight <= 100 - error_message = "green_weight must be between 0 and 100." - } -} - -# ── TLS / Domain ──────────────────────────────────────────────────────────── - -variable "domain_name" { - description = "FQDN for the application (empty to skip DNS/TLS)" - type = string - default = "" -} - -variable "tls_certificate_arn" { - description = "ARN of an existing ACM certificate (auto-created if domain_name set)" - type = string - default = "" -} - -variable "route53_zone_id" { - description = "Route53 hosted zone ID for DNS records (empty to skip)" - type = string - default = "" -} - -# ── Storage ───────────────────────────────────────────────────────────────── - -variable "storage_size_gb" { - description = "EFS storage does not require pre-provisioning; kept for interface compatibility" - type = number - default = 20 -} - -variable "enable_storage_backup" { - description = "Enable AWS Backup for EFS" - type = bool - default = true -} - -# ── Health check ──────────────────────────────────────────────────────────── - -variable "health_check_path" { - description = "HTTP path for health checks" - type = string - default = "/api/health" -} - -variable "health_check_interval" { - description = "Seconds between health checks" - type = number - default = 30 -} - -variable "health_check_timeout" { - description = "Seconds before a health check request times out" - type = number - default = 5 -} - -variable "health_check_healthy_threshold" { - description = "Consecutive successes to mark target healthy" - type = number - default = 2 -} - -variable "health_check_unhealthy_threshold" { - description = "Consecutive failures to mark target unhealthy" - type = number - default = 3 -} - -# ── Auto-scaling ──────────────────────────────────────────────────────────── - -variable "autoscaling_cpu_target" { - description = "Target CPU utilization percentage for auto-scaling" - type = number - default = 70 -} - -variable "autoscaling_memory_target" { - description = "Target memory utilization percentage for auto-scaling" - type = number - default = 80 -} - -# ── Monitoring ────────────────────────────────────────────────────────────── - -variable "enable_monitoring" { - description = "Enable CloudWatch monitoring, alarms, and dashboards" - type = bool - default = true -} - -variable "alert_email" { - description = "Email address for SNS alert notifications" - type = string - default = "" -} - -variable "log_retention_days" { - description = "CloudWatch log retention in days" - type = number - default = 30 -} diff --git a/deployments/terraform/providers/azure/main.tf b/deployments/terraform/providers/azure/main.tf deleted file mode 100644 index 5952842..0000000 --- a/deployments/terraform/providers/azure/main.tf +++ /dev/null @@ -1,615 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Azure Provider – Full implementation for Claude Code Agent Monitor -# -# Architecture: -# VNet → ACI (Container Instances) or AKS → Azure Files → Application -# Gateway → Azure Monitor → Key Vault -# -# Azure Container Instances is chosen for simplicity; for production at -# scale, AKS is recommended. Application Gateway provides L7 LB with -# WebSocket support and SSL termination. -# ───────────────────────────────────────────────────────────────────────────── - -provider "azurerm" { - features { - resource_group { - prevent_deletion_if_contains_resources = true - } - key_vault { - purge_soft_delete_on_destroy = false - } - } -} - -# ── Data sources ──────────────────────────────────────────────────────────── - -data "azurerm_client_config" "current" {} - -# ── Locals ────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - # Azure resource names (alphanumeric for storage accounts) - storage_account_name = lower(replace(substr("ccam${var.environment}${substr(md5(var.project_name), 0, 8)}", 0, 24), "-", "")) - - common_tags = merge( - { - project = var.project_name - environment = var.environment - managed_by = "terraform" - cloud_provider = "azure" - repository = "Claude-Code-Agent-Monitor" - }, - var.tags, - ) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Resource Group -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_resource_group" "main" { - name = "${local.name_prefix}-rg" - location = var.region - - tags = local.common_tags - - lifecycle { - prevent_destroy = false - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Virtual Network -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_virtual_network" "main" { - name = "${local.name_prefix}-vnet" - resource_group_name = azurerm_resource_group.main.name - location = azurerm_resource_group.main.location - address_space = [var.vpc_cidr] - - tags = local.common_tags -} - -resource "azurerm_subnet" "public" { - name = "${local.name_prefix}-public" - resource_group_name = azurerm_resource_group.main.name - virtual_network_name = azurerm_virtual_network.main.name - address_prefixes = [var.public_subnet_cidrs[0]] -} - -resource "azurerm_subnet" "private" { - name = "${local.name_prefix}-private" - resource_group_name = azurerm_resource_group.main.name - virtual_network_name = azurerm_virtual_network.main.name - address_prefixes = [var.private_subnet_cidrs[0]] - - delegation { - name = "aci-delegation" - service_delegation { - name = "Microsoft.ContainerInstance/containerGroups" - actions = ["Microsoft.Network/virtualNetworks/subnets/action"] - } - } -} - -resource "azurerm_subnet" "appgw" { - name = "${local.name_prefix}-appgw" - resource_group_name = azurerm_resource_group.main.name - virtual_network_name = azurerm_virtual_network.main.name - address_prefixes = ["10.0.100.0/24"] -} - -# NSG for private subnet -resource "azurerm_network_security_group" "private" { - name = "${local.name_prefix}-private-nsg" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - - security_rule { - name = "allow-app-port" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = tostring(var.app_port) - source_address_prefix = var.vpc_cidr - destination_address_prefix = "*" - } - - security_rule { - name = "allow-mcp-port" - priority = 110 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = tostring(var.mcp_port) - source_address_prefix = var.vpc_cidr - destination_address_prefix = "*" - } - - security_rule { - name = "allow-smb" - priority = 120 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "445" - source_address_prefix = var.vpc_cidr - destination_address_prefix = "*" - } - - tags = local.common_tags -} - -resource "azurerm_subnet_network_security_group_association" "private" { - subnet_id = azurerm_subnet.private.id - network_security_group_id = azurerm_network_security_group.private.id -} - -# ───────────────────────────────────────────────────────────────────────────── -# Azure Files (persistent storage for SQLite) -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_storage_account" "main" { - name = local.storage_account_name - resource_group_name = azurerm_resource_group.main.name - location = azurerm_resource_group.main.location - account_tier = var.environment == "production" ? "Premium" : "Standard" - account_replication_type = var.environment == "production" ? "ZRS" : "LRS" - account_kind = var.environment == "production" ? "FileStorage" : "StorageV2" - - min_tls_version = "TLS1_2" - - network_rules { - default_action = "Deny" - virtual_network_subnet_ids = [azurerm_subnet.private.id] - } - - tags = local.common_tags - - lifecycle { - prevent_destroy = true - } -} - -resource "azurerm_storage_share" "appdata" { - name = "appdata" - storage_account_name = azurerm_storage_account.main.name - quota = var.storage_size_gb - access_tier = var.environment == "production" ? "Premium" : "Hot" -} - -# ───────────────────────────────────────────────────────────────────────────── -# Key Vault (for secrets management) -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_key_vault" "main" { - name = substr("${local.name_prefix}-kv", 0, 24) - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - tenant_id = data.azurerm_client_config.current.tenant_id - sku_name = "standard" - purge_protection_enabled = var.environment == "production" - - access_policy { - tenant_id = data.azurerm_client_config.current.tenant_id - object_id = data.azurerm_client_config.current.object_id - - secret_permissions = [ - "Get", "List", "Set", "Delete", "Purge", - ] - } - - tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# Container Instances (Blue / Green) -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_container_group" "blue" { - name = "${local.name_prefix}-blue" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - os_type = "Linux" - ip_address_type = "Private" - subnet_ids = [azurerm_subnet.private.id] - restart_policy = "Always" - - container { - name = "app" - image = var.app_container_image - cpu = var.cpu / 1000.0 - memory = var.memory / 1024.0 - - ports { - port = var.app_port - protocol = "TCP" - } - - dynamic "environment_variables" { - for_each = var.environment_variables - content { - name = environment_variables.key - value = environment_variables.value - } - } - - volume { - name = "app-data" - mount_path = "/app/data" - read_only = false - storage_account_name = azurerm_storage_account.main.name - storage_account_key = azurerm_storage_account.main.primary_access_key - share_name = azurerm_storage_share.appdata.name - } - - liveness_probe { - http_get { - path = var.health_check_path - port = var.app_port - scheme = "Http" - } - initial_delay_seconds = 30 - period_seconds = 30 - failure_threshold = 3 - } - - readiness_probe { - http_get { - path = var.health_check_path - port = var.app_port - scheme = "Http" - } - initial_delay_seconds = 10 - period_seconds = 10 - failure_threshold = 3 - } - } - - dynamic "container" { - for_each = var.mcp_container_image != "" ? [1] : [] - content { - name = "mcp-sidecar" - image = var.mcp_container_image - cpu = 0.25 - memory = 0.25 - - ports { - port = var.mcp_port - protocol = "TCP" - } - - environment_variables = { - NODE_ENV = "production" - MCP_PORT = tostring(var.mcp_port) - } - } - } - - tags = merge(local.common_tags, { - deployment_slot = "blue" - }) - - lifecycle { - ignore_changes = [ - tags["last_deployed"], - ] - } -} - -resource "azurerm_container_group" "green" { - count = var.active_deployment_slot == "green" || var.green_weight > 0 ? 1 : 0 - - name = "${local.name_prefix}-green" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - os_type = "Linux" - ip_address_type = "Private" - subnet_ids = [azurerm_subnet.private.id] - restart_policy = "Always" - - container { - name = "app" - image = var.app_container_image - cpu = var.cpu / 1000.0 - memory = var.memory / 1024.0 - - ports { - port = var.app_port - protocol = "TCP" - } - - dynamic "environment_variables" { - for_each = var.environment_variables - content { - name = environment_variables.key - value = environment_variables.value - } - } - - volume { - name = "app-data" - mount_path = "/app/data" - read_only = false - storage_account_name = azurerm_storage_account.main.name - storage_account_key = azurerm_storage_account.main.primary_access_key - share_name = azurerm_storage_share.appdata.name - } - - liveness_probe { - http_get { - path = var.health_check_path - port = var.app_port - scheme = "Http" - } - initial_delay_seconds = 30 - period_seconds = 30 - failure_threshold = 3 - } - } - - tags = merge(local.common_tags, { - deployment_slot = "green" - }) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Application Gateway (L7 load balancer with WebSocket + SSL) -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_public_ip" "appgw" { - name = "${local.name_prefix}-appgw-pip" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - allocation_method = "Static" - sku = "Standard" - - tags = local.common_tags -} - -resource "azurerm_application_gateway" "main" { - name = "${local.name_prefix}-appgw" - resource_group_name = azurerm_resource_group.main.name - location = azurerm_resource_group.main.location - enable_http2 = true - - sku { - name = var.environment == "production" ? "WAF_v2" : "Standard_v2" - tier = var.environment == "production" ? "WAF_v2" : "Standard_v2" - capacity = var.environment == "production" ? 2 : 1 - } - - gateway_ip_configuration { - name = "gateway-ip" - subnet_id = azurerm_subnet.appgw.id - } - - frontend_ip_configuration { - name = "frontend-ip" - public_ip_address_id = azurerm_public_ip.appgw.id - } - - frontend_port { - name = "http" - port = 80 - } - - frontend_port { - name = "https" - port = 443 - } - - # Blue backend pool - backend_address_pool { - name = "blue-pool" - ip_addresses = [azurerm_container_group.blue.ip_address] - } - - # Green backend pool - dynamic "backend_address_pool" { - for_each = length(azurerm_container_group.green) > 0 ? [1] : [] - content { - name = "green-pool" - ip_addresses = [azurerm_container_group.green[0].ip_address] - } - } - - backend_http_settings { - name = "app-settings" - cookie_based_affinity = "Enabled" - port = var.app_port - protocol = "Http" - request_timeout = 300 # WebSocket support - pick_host_name_from_backend_address = false - - connection_draining { - enabled = true - drain_timeout_sec = 60 - } - - probe_name = "app-health" - } - - probe { - name = "app-health" - protocol = "Http" - path = var.health_check_path - host = "127.0.0.1" - interval = var.health_check_interval - timeout = var.health_check_timeout - unhealthy_threshold = var.health_check_unhealthy_threshold - - match { - status_code = ["200"] - } - } - - # HTTP listener - http_listener { - name = "http-listener" - frontend_ip_configuration_name = "frontend-ip" - frontend_port_name = "http" - protocol = "Http" - } - - # Routing rule – HTTP to blue pool - request_routing_rule { - name = "http-routing" - priority = 100 - rule_type = "Basic" - http_listener_name = "http-listener" - backend_address_pool_name = var.active_deployment_slot == "blue" ? "blue-pool" : "green-pool" - backend_http_settings_name = "app-settings" - } - - tags = local.common_tags - - lifecycle { - prevent_destroy = false - ignore_changes = [ - tags["last_deployed"], - ] - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Azure Monitor (alerts and diagnostics) -# ───────────────────────────────────────────────────────────────────────────── - -resource "azurerm_monitor_action_group" "main" { - count = var.enable_monitoring ? 1 : 0 - - name = "${local.name_prefix}-alerts" - resource_group_name = azurerm_resource_group.main.name - short_name = substr(local.name_prefix, 0, 12) - - dynamic "email_receiver" { - for_each = var.alert_email != "" ? [1] : [] - content { - name = "email-alert" - email_address = var.alert_email - } - } - - tags = local.common_tags -} - -resource "azurerm_monitor_metric_alert" "appgw_unhealthy" { - count = var.enable_monitoring ? 1 : 0 - - name = "${local.name_prefix}-unhealthy-backend" - resource_group_name = azurerm_resource_group.main.name - scopes = [azurerm_application_gateway.main.id] - description = "Alert when backend health drops below threshold" - severity = 1 - - criteria { - metric_namespace = "Microsoft.Network/applicationGateways" - metric_name = "UnhealthyHostCount" - aggregation = "Average" - operator = "GreaterThan" - threshold = 0 - } - - action { - action_group_id = azurerm_monitor_action_group.main[0].id - } - - tags = local.common_tags -} - -resource "azurerm_monitor_metric_alert" "appgw_5xx" { - count = var.enable_monitoring ? 1 : 0 - - name = "${local.name_prefix}-high-5xx" - resource_group_name = azurerm_resource_group.main.name - scopes = [azurerm_application_gateway.main.id] - description = "High 5xx error rate on Application Gateway" - severity = 2 - - criteria { - metric_namespace = "Microsoft.Network/applicationGateways" - metric_name = "ResponseStatus" - aggregation = "Count" - operator = "GreaterThan" - threshold = 10 - - dimension { - name = "HttpStatusGroup" - operator = "Include" - values = ["5xx"] - } - } - - action { - action_group_id = azurerm_monitor_action_group.main[0].id - } - - tags = local.common_tags -} - -resource "azurerm_monitor_metric_alert" "appgw_latency" { - count = var.enable_monitoring ? 1 : 0 - - name = "${local.name_prefix}-high-latency" - resource_group_name = azurerm_resource_group.main.name - scopes = [azurerm_application_gateway.main.id] - description = "High backend response latency" - severity = 2 - - criteria { - metric_namespace = "Microsoft.Network/applicationGateways" - metric_name = "BackendLastByteResponseTime" - aggregation = "Average" - operator = "GreaterThan" - threshold = 2000 # ms - } - - action { - action_group_id = azurerm_monitor_action_group.main[0].id - } - - tags = local.common_tags -} - -# Log Analytics Workspace -resource "azurerm_log_analytics_workspace" "main" { - count = var.enable_monitoring ? 1 : 0 - - name = "${local.name_prefix}-logs" - location = azurerm_resource_group.main.location - resource_group_name = azurerm_resource_group.main.name - sku = "PerGB2018" - retention_in_days = var.log_retention_days - - tags = local.common_tags -} - -# Diagnostic settings for App Gateway -resource "azurerm_monitor_diagnostic_setting" "appgw" { - count = var.enable_monitoring ? 1 : 0 - - name = "${local.name_prefix}-appgw-diag" - target_resource_id = azurerm_application_gateway.main.id - log_analytics_workspace_id = azurerm_log_analytics_workspace.main[0].id - - enabled_log { - category = "ApplicationGatewayAccessLog" - } - - enabled_log { - category = "ApplicationGatewayPerformanceLog" - } - - metric { - category = "AllMetrics" - enabled = true - } -} diff --git a/deployments/terraform/providers/azure/outputs.tf b/deployments/terraform/providers/azure/outputs.tf deleted file mode 100644 index 2f6a835..0000000 --- a/deployments/terraform/providers/azure/outputs.tf +++ /dev/null @@ -1,58 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Azure provider outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "application_url" { - description = "Public URL of the Claude Code Agent Monitor dashboard" - value = "http://${azurerm_public_ip.appgw.ip_address}" -} - -output "public_ip" { - description = "Public IP address of the Application Gateway" - value = azurerm_public_ip.appgw.ip_address -} - -output "resource_group_name" { - description = "Name of the Azure resource group" - value = azurerm_resource_group.main.name -} - -output "vnet_id" { - description = "ID of the Virtual Network" - value = azurerm_virtual_network.main.id -} - -output "blue_container_group_id" { - description = "ID of the blue container group" - value = azurerm_container_group.blue.id -} - -output "green_container_group_id" { - description = "ID of the green container group (if deployed)" - value = length(azurerm_container_group.green) > 0 ? azurerm_container_group.green[0].id : "" -} - -output "storage_account_name" { - description = "Name of the Azure Storage Account" - value = azurerm_storage_account.main.name -} - -output "key_vault_uri" { - description = "URI of the Azure Key Vault" - value = azurerm_key_vault.main.vault_uri -} - -output "app_gateway_id" { - description = "ID of the Application Gateway" - value = azurerm_application_gateway.main.id -} - -output "log_analytics_workspace_id" { - description = "ID of the Log Analytics workspace (if monitoring enabled)" - value = var.enable_monitoring ? azurerm_log_analytics_workspace.main[0].id : "" -} - -output "region" { - description = "Azure region" - value = var.region -} diff --git a/deployments/terraform/providers/azure/terraform.tf b/deployments/terraform/providers/azure/terraform.tf deleted file mode 100644 index 01f06b5..0000000 --- a/deployments/terraform/providers/azure/terraform.tf +++ /dev/null @@ -1,14 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Azure provider – Terraform and provider constraints -# ───────────────────────────────────────────────────────────────────────────── - -terraform { - required_version = ">= 1.5.0" - - required_providers { - azurerm = { - source = "hashicorp/azurerm" - version = "~> 3.80" - } - } -} diff --git a/deployments/terraform/providers/azure/variables.tf b/deployments/terraform/providers/azure/variables.tf deleted file mode 100644 index 9bfe597..0000000 --- a/deployments/terraform/providers/azure/variables.tf +++ /dev/null @@ -1,190 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Azure provider variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string - default = "claude-agent-monitor" -} - -variable "environment" { - description = "Deployment environment: dev, staging, or production" - type = string - validation { - condition = contains(["dev", "staging", "production"], var.environment) - error_message = "environment must be one of: dev, staging, production." - } -} - -variable "region" { - description = "Azure region for resource deployment" - type = string - default = "eastus" -} - -variable "tags" { - description = "Additional tags to apply to all resources" - type = map(string) - default = {} -} - -# ── Networking ────────────────────────────────────────────────────────────── - -variable "vpc_cidr" { - description = "Address space for the Virtual Network" - type = string - default = "10.0.0.0/16" -} - -variable "public_subnet_cidrs" { - description = "Address prefixes for the public subnet" - type = list(string) - default = ["10.0.1.0/24"] -} - -variable "private_subnet_cidrs" { - description = "Address prefixes for the private subnet" - type = list(string) - default = ["10.0.11.0/24"] -} - -# ── Compute ───────────────────────────────────────────────────────────────── - -variable "app_container_image" { - description = "Container image URI for the main application" - type = string -} - -variable "mcp_container_image" { - description = "Container image URI for the MCP sidecar (empty to disable)" - type = string - default = "" -} - -variable "app_port" { - description = "Application container port" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "MCP sidecar container port" - type = number - default = 8819 -} - -variable "cpu" { - description = "CPU millicores for container instances" - type = number - default = 512 -} - -variable "memory" { - description = "Memory in MiB for container instances" - type = number - default = 1024 -} - -variable "environment_variables" { - description = "Environment variables for the application container" - type = map(string) - default = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - } -} - -# ── Deployment ────────────────────────────────────────────────────────────── - -variable "active_deployment_slot" { - description = "Active deployment slot: blue or green" - type = string - default = "blue" - validation { - condition = contains(["blue", "green"], var.active_deployment_slot) - error_message = "active_deployment_slot must be blue or green." - } -} - -variable "blue_weight" { - description = "Traffic weight for blue backend (0-100)" - type = number - default = 100 - validation { - condition = var.blue_weight >= 0 && var.blue_weight <= 100 - error_message = "blue_weight must be between 0 and 100." - } -} - -variable "green_weight" { - description = "Traffic weight for green backend (0-100)" - type = number - default = 0 - validation { - condition = var.green_weight >= 0 && var.green_weight <= 100 - error_message = "green_weight must be between 0 and 100." - } -} - -# ── TLS / Domain ──────────────────────────────────────────────────────────── - -variable "domain_name" { - description = "FQDN for the application (empty to skip)" - type = string - default = "" -} - -# ── Storage ───────────────────────────────────────────────────────────────── - -variable "storage_size_gb" { - description = "Azure Files share quota in GiB" - type = number - default = 20 -} - -# ── Health check ──────────────────────────────────────────────────────────── - -variable "health_check_path" { - description = "HTTP path for health checks" - type = string - default = "/api/health" -} - -variable "health_check_interval" { - description = "Seconds between health checks" - type = number - default = 30 -} - -variable "health_check_timeout" { - description = "Seconds before a health check times out" - type = number - default = 5 -} - -variable "health_check_unhealthy_threshold" { - description = "Consecutive failures to mark unhealthy" - type = number - default = 3 -} - -# ── Monitoring ────────────────────────────────────────────────────────────── - -variable "enable_monitoring" { - description = "Enable Azure Monitor alerts and diagnostics" - type = bool - default = true -} - -variable "alert_email" { - description = "Email address for Azure Monitor alerts" - type = string - default = "" -} - -variable "log_retention_days" { - description = "Log Analytics workspace retention in days" - type = number - default = 30 -} diff --git a/deployments/terraform/providers/gcp/main.tf b/deployments/terraform/providers/gcp/main.tf deleted file mode 100644 index 12e4cd1..0000000 --- a/deployments/terraform/providers/gcp/main.tf +++ /dev/null @@ -1,678 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GCP Provider – Full implementation for Claude Code Agent Monitor -# -# Architecture: -# VPC → Cloud Run (blue/green) → Filestore → Cloud Load Balancer -# → Cloud Monitoring → Managed SSL Certificate -# -# Cloud Run is chosen over GKE for cost efficiency and operational simplicity -# for this containerised workload. Filestore provides NFS for SQLite. -# ───────────────────────────────────────────────────────────────────────────── - -provider "google" { - project = var.gcp_project_id - region = var.region -} - -provider "google-beta" { - project = var.gcp_project_id - region = var.region -} - -# ── Locals ────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - - common_labels = merge( - { - project = replace(var.project_name, "-", "_") - environment = var.environment - managed_by = "terraform" - cloud_provider = "gcp" - }, - { for k, v in var.tags : replace(k, "-", "_") => replace(v, "-", "_") }, - ) -} - -# ── Enable required APIs ─────────────────────────────────────────────────── - -resource "google_project_service" "apis" { - for_each = toset([ - "run.googleapis.com", - "compute.googleapis.com", - "file.googleapis.com", - "vpcaccess.googleapis.com", - "monitoring.googleapis.com", - "logging.googleapis.com", - "certificatemanager.googleapis.com", - ]) - - service = each.value - disable_on_destroy = false -} - -# ───────────────────────────────────────────────────────────────────────────── -# VPC Network -# ───────────────────────────────────────────────────────────────────────────── - -resource "google_compute_network" "main" { - name = "${local.name_prefix}-vpc" - auto_create_subnetworks = false - - depends_on = [google_project_service.apis] -} - -resource "google_compute_subnetwork" "private" { - name = "${local.name_prefix}-private" - ip_cidr_range = var.private_subnet_cidrs[0] - region = var.region - network = google_compute_network.main.id - - private_ip_google_access = true - - log_config { - aggregation_interval = "INTERVAL_5_SEC" - flow_sampling = 0.5 - } -} - -resource "google_compute_subnetwork" "proxy" { - name = "${local.name_prefix}-proxy" - ip_cidr_range = "10.0.100.0/24" - region = var.region - network = google_compute_network.main.id - purpose = "REGIONAL_MANAGED_PROXY" - role = "ACTIVE" -} - -# Cloud NAT for outbound internet -resource "google_compute_router" "main" { - name = "${local.name_prefix}-router" - region = var.region - network = google_compute_network.main.id -} - -resource "google_compute_router_nat" "main" { - name = "${local.name_prefix}-nat" - router = google_compute_router.main.name - region = var.region - nat_ip_allocate_option = "AUTO_ONLY" - source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES" - - log_config { - enable = true - filter = "ERRORS_ONLY" - } -} - -# VPC Connector for Cloud Run → Filestore -resource "google_vpc_access_connector" "main" { - name = "${local.name_prefix}-conn" - region = var.region - network = google_compute_network.main.id - ip_cidr_range = "10.0.200.0/28" - min_instances = 2 - max_instances = var.environment == "production" ? 10 : 3 - - depends_on = [google_project_service.apis] -} - -# Firewall rules -resource "google_compute_firewall" "allow_health_checks" { - name = "${local.name_prefix}-allow-health-checks" - network = google_compute_network.main.id - - allow { - protocol = "tcp" - ports = [tostring(var.app_port), tostring(var.mcp_port)] - } - - source_ranges = ["130.211.0.0/22", "35.191.0.0/16"] # GCP health check ranges - target_tags = ["${local.name_prefix}-app"] -} - -resource "google_compute_firewall" "allow_internal" { - name = "${local.name_prefix}-allow-internal" - network = google_compute_network.main.id - - allow { - protocol = "tcp" - ports = [tostring(var.app_port), tostring(var.mcp_port), "2049"] - } - - source_ranges = [var.vpc_cidr] -} - -# ───────────────────────────────────────────────────────────────────────────── -# Filestore (NFS for SQLite persistence) -# ───────────────────────────────────────────────────────────────────────────── - -resource "google_filestore_instance" "main" { - name = "${local.name_prefix}-data" - location = "${var.region}-b" - tier = var.environment == "production" ? "BASIC_SSD" : "BASIC_HDD" - - file_shares { - name = "appdata" - capacity_gb = var.storage_size_gb - } - - networks { - network = google_compute_network.main.name - modes = ["MODE_IPV4"] - } - - labels = local.common_labels - - depends_on = [google_project_service.apis] - - lifecycle { - prevent_destroy = true - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Cloud Run services (Blue / Green) -# ───────────────────────────────────────────────────────────────────────────── - -resource "google_cloud_run_v2_service" "blue" { - name = "${local.name_prefix}-blue" - location = var.region - ingress = "INGRESS_TRAFFIC_INTERNAL_LOAD_BALANCER" - - template { - scaling { - min_instance_count = var.active_deployment_slot == "blue" ? var.min_replicas : 0 - max_instance_count = var.active_deployment_slot == "blue" ? var.max_replicas : 1 - } - - vpc_access { - connector = google_vpc_access_connector.main.id - egress = "ALL_TRAFFIC" - } - - containers { - image = var.app_container_image - name = "app" - - ports { - container_port = var.app_port - } - - resources { - limits = { - cpu = "${var.cpu}m" - memory = "${var.memory}Mi" - } - } - - dynamic "env" { - for_each = var.environment_variables - content { - name = env.key - value = env.value - } - } - - env { - name = "FILESTORE_IP" - value = google_filestore_instance.main.networks[0].ip_addresses[0] - } - - startup_probe { - http_get { - path = var.health_check_path - port = var.app_port - } - initial_delay_seconds = 10 - period_seconds = 10 - failure_threshold = 5 - } - - liveness_probe { - http_get { - path = var.health_check_path - port = var.app_port - } - period_seconds = 30 - failure_threshold = 3 - } - - volume_mounts { - name = "app-data" - mount_path = "/app/data" - } - } - - dynamic "containers" { - for_each = var.mcp_container_image != "" ? [1] : [] - content { - image = var.mcp_container_image - name = "mcp-sidecar" - - ports { - container_port = var.mcp_port - } - - resources { - limits = { - cpu = "250m" - memory = "256Mi" - } - } - - env { - name = "NODE_ENV" - value = "production" - } - } - } - - volumes { - name = "app-data" - nfs { - server = google_filestore_instance.main.networks[0].ip_addresses[0] - path = "/appdata" - read_only = false - } - } - - session_affinity = true - timeout = "300s" - } - - labels = local.common_labels - - depends_on = [google_project_service.apis] - - lifecycle { - ignore_changes = [ - client, - client_version, - ] - } -} - -resource "google_cloud_run_v2_service" "green" { - name = "${local.name_prefix}-green" - location = var.region - ingress = "INGRESS_TRAFFIC_INTERNAL_LOAD_BALANCER" - - template { - scaling { - min_instance_count = var.active_deployment_slot == "green" ? var.min_replicas : 0 - max_instance_count = var.active_deployment_slot == "green" ? var.max_replicas : 1 - } - - vpc_access { - connector = google_vpc_access_connector.main.id - egress = "ALL_TRAFFIC" - } - - containers { - image = var.app_container_image - name = "app" - - ports { - container_port = var.app_port - } - - resources { - limits = { - cpu = "${var.cpu}m" - memory = "${var.memory}Mi" - } - } - - dynamic "env" { - for_each = var.environment_variables - content { - name = env.key - value = env.value - } - } - - env { - name = "FILESTORE_IP" - value = google_filestore_instance.main.networks[0].ip_addresses[0] - } - - startup_probe { - http_get { - path = var.health_check_path - port = var.app_port - } - initial_delay_seconds = 10 - period_seconds = 10 - failure_threshold = 5 - } - - liveness_probe { - http_get { - path = var.health_check_path - port = var.app_port - } - period_seconds = 30 - failure_threshold = 3 - } - - volume_mounts { - name = "app-data" - mount_path = "/app/data" - } - } - - volumes { - name = "app-data" - nfs { - server = google_filestore_instance.main.networks[0].ip_addresses[0] - path = "/appdata" - read_only = false - } - } - - session_affinity = true - timeout = "300s" - } - - labels = local.common_labels - - depends_on = [google_project_service.apis] - - lifecycle { - ignore_changes = [ - client, - client_version, - ] - } -} - -# IAM – restrict access to load balancer service account only -# Cloud Run ingress is set to INGRESS_TRAFFIC_INTERNAL_LOAD_BALANCER, -# so public IAM bindings are not needed. The LB routes traffic internally. -# To grant specific service account access, replace with: -# member = "serviceAccount:@.iam.gserviceaccount.com" -# -# resource "google_cloud_run_v2_service_iam_member" "blue_invoker" { -# name = google_cloud_run_v2_service.blue.name -# location = var.region -# role = "roles/run.invoker" -# member = "serviceAccount:${var.project_id}-compute@developer.gserviceaccount.com" -# } -# -# resource "google_cloud_run_v2_service_iam_member" "green_invoker" { -# name = google_cloud_run_v2_service.green.name -# location = var.region -# role = "roles/run.invoker" -# member = "serviceAccount:${var.project_id}-compute@developer.gserviceaccount.com" -# } - -# ───────────────────────────────────────────────────────────────────────────── -# External Application Load Balancer -# ───────────────────────────────────────────────────────────────────────────── - -# Serverless NEGs for Cloud Run -resource "google_compute_region_network_endpoint_group" "blue" { - name = "${local.name_prefix}-blue-neg" - region = var.region - network_endpoint_type = "SERVERLESS" - - cloud_run { - service = google_cloud_run_v2_service.blue.name - } -} - -resource "google_compute_region_network_endpoint_group" "green" { - name = "${local.name_prefix}-green-neg" - region = var.region - network_endpoint_type = "SERVERLESS" - - cloud_run { - service = google_cloud_run_v2_service.green.name - } -} - -# Backend service with weighted backends for blue/green -resource "google_compute_backend_service" "main" { - name = "${local.name_prefix}-backend" - protocol = "HTTP" - load_balancing_scheme = "EXTERNAL_MANAGED" - timeout_sec = 300 # WebSocket support - - session_affinity = "GENERATED_COOKIE" - - backend { - group = google_compute_region_network_endpoint_group.blue.id - capacity_scaler = var.blue_weight / 100 - } - - backend { - group = google_compute_region_network_endpoint_group.green.id - capacity_scaler = var.green_weight / 100 - } - - health_checks = [google_compute_health_check.main.id] - - log_config { - enable = true - sample_rate = 1.0 - } -} - -resource "google_compute_health_check" "main" { - name = "${local.name_prefix}-hc" - - http_health_check { - port = var.app_port - request_path = var.health_check_path - } - - check_interval_sec = var.health_check_interval - timeout_sec = var.health_check_timeout - healthy_threshold = var.health_check_healthy_threshold - unhealthy_threshold = var.health_check_unhealthy_threshold -} - -# URL map -resource "google_compute_url_map" "main" { - name = "${local.name_prefix}-urlmap" - default_service = google_compute_backend_service.main.id -} - -# Managed SSL certificate (optional) -resource "google_compute_managed_ssl_certificate" "main" { - count = var.domain_name != "" ? 1 : 0 - - name = "${local.name_prefix}-cert" - - managed { - domains = [var.domain_name] - } -} - -# HTTPS proxy -resource "google_compute_target_https_proxy" "main" { - count = var.domain_name != "" ? 1 : 0 - - name = "${local.name_prefix}-https-proxy" - url_map = google_compute_url_map.main.id - ssl_certificates = [google_compute_managed_ssl_certificate.main[0].id] -} - -# HTTP proxy (for redirect or direct access) -resource "google_compute_target_http_proxy" "main" { - name = "${local.name_prefix}-http-proxy" - url_map = google_compute_url_map.main.id -} - -# Global forwarding rules -resource "google_compute_global_forwarding_rule" "https" { - count = var.domain_name != "" ? 1 : 0 - - name = "${local.name_prefix}-https" - target = google_compute_target_https_proxy.main[0].id - port_range = "443" - ip_protocol = "TCP" - load_balancing_scheme = "EXTERNAL_MANAGED" -} - -resource "google_compute_global_forwarding_rule" "http" { - name = "${local.name_prefix}-http" - target = google_compute_target_http_proxy.main.id - port_range = "80" - ip_protocol = "TCP" - load_balancing_scheme = "EXTERNAL_MANAGED" -} - -# ───────────────────────────────────────────────────────────────────────────── -# Cloud Monitoring – Alert policies -# ───────────────────────────────────────────────────────────────────────────── - -resource "google_monitoring_notification_channel" "email" { - count = var.alert_email != "" ? 1 : 0 - - display_name = "${local.name_prefix}-email" - type = "email" - - labels = { - email_address = var.alert_email - } -} - -resource "google_monitoring_alert_policy" "high_latency" { - count = var.enable_monitoring ? 1 : 0 - - display_name = "${local.name_prefix}-high-latency" - combiner = "OR" - - conditions { - display_name = "Cloud Run request latency > 2s" - - condition_threshold { - filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/request_latencies\"" - comparison = "COMPARISON_GT" - duration = "300s" - - threshold_value = 2000 # ms - - aggregations { - alignment_period = "60s" - per_series_aligner = "ALIGN_PERCENTILE_99" - } - } - } - - notification_channels = var.alert_email != "" ? [google_monitoring_notification_channel.email[0].id] : [] - - alert_strategy { - auto_close = "604800s" - } -} - -resource "google_monitoring_alert_policy" "high_error_rate" { - count = var.enable_monitoring ? 1 : 0 - - display_name = "${local.name_prefix}-high-error-rate" - combiner = "OR" - - conditions { - display_name = "Cloud Run 5xx error rate" - - condition_threshold { - filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/request_count\" AND metric.labels.response_code_class=\"5xx\"" - comparison = "COMPARISON_GT" - duration = "300s" - - threshold_value = 10 - - aggregations { - alignment_period = "60s" - per_series_aligner = "ALIGN_RATE" - } - } - } - - notification_channels = var.alert_email != "" ? [google_monitoring_notification_channel.email[0].id] : [] -} - -# ───────────────────────────────────────────────────────────────────────────── -# Cloud Monitoring Dashboard -# ───────────────────────────────────────────────────────────────────────────── - -resource "google_monitoring_dashboard" "main" { - count = var.enable_monitoring ? 1 : 0 - - dashboard_json = jsonencode({ - displayName = "${local.name_prefix} Dashboard" - gridLayout = { - columns = 2 - widgets = [ - { - title = "Request Count" - xyChart = { - dataSets = [{ - timeSeriesQuery = { - timeSeriesFilter = { - filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/request_count\"" - aggregation = { - alignmentPeriod = "60s" - perSeriesAligner = "ALIGN_RATE" - } - } - } - }] - } - }, - { - title = "Request Latency (p99)" - xyChart = { - dataSets = [{ - timeSeriesQuery = { - timeSeriesFilter = { - filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/request_latencies\"" - aggregation = { - alignmentPeriod = "60s" - perSeriesAligner = "ALIGN_PERCENTILE_99" - } - } - } - }] - } - }, - { - title = "Instance Count" - xyChart = { - dataSets = [{ - timeSeriesQuery = { - timeSeriesFilter = { - filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/container/instance_count\"" - aggregation = { - alignmentPeriod = "60s" - perSeriesAligner = "ALIGN_MEAN" - } - } - } - }] - } - }, - { - title = "CPU Utilization" - xyChart = { - dataSets = [{ - timeSeriesQuery = { - timeSeriesFilter = { - filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/container/cpu/utilizations\"" - aggregation = { - alignmentPeriod = "60s" - perSeriesAligner = "ALIGN_PERCENTILE_99" - } - } - } - }] - } - }, - ] - } - }) -} diff --git a/deployments/terraform/providers/gcp/outputs.tf b/deployments/terraform/providers/gcp/outputs.tf deleted file mode 100644 index b8a2b45..0000000 --- a/deployments/terraform/providers/gcp/outputs.tf +++ /dev/null @@ -1,53 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GCP provider outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "application_url" { - description = "Public URL of the Claude Code Agent Monitor dashboard" - value = var.domain_name != "" ? "https://${var.domain_name}" : "http://${google_compute_global_forwarding_rule.http.ip_address}" -} - -output "load_balancer_ip" { - description = "External IP address of the load balancer" - value = google_compute_global_forwarding_rule.http.ip_address -} - -output "blue_service_url" { - description = "URL of the blue Cloud Run service" - value = google_cloud_run_v2_service.blue.uri -} - -output "green_service_url" { - description = "URL of the green Cloud Run service" - value = google_cloud_run_v2_service.green.uri -} - -output "vpc_id" { - description = "Self-link of the VPC network" - value = google_compute_network.main.self_link -} - -output "filestore_ip" { - description = "IP address of the Filestore instance" - value = google_filestore_instance.main.networks[0].ip_addresses[0] -} - -output "filestore_share" { - description = "Filestore share name" - value = google_filestore_instance.main.file_shares[0].name -} - -output "monitoring_dashboard_url" { - description = "Cloud Monitoring dashboard URL" - value = var.enable_monitoring ? "https://console.cloud.google.com/monitoring/dashboards?project=${var.gcp_project_id}" : "monitoring disabled" -} - -output "project_id" { - description = "GCP project ID" - value = var.gcp_project_id -} - -output "region" { - description = "GCP region" - value = var.region -} diff --git a/deployments/terraform/providers/gcp/terraform.tf b/deployments/terraform/providers/gcp/terraform.tf deleted file mode 100644 index 0ed4b64..0000000 --- a/deployments/terraform/providers/gcp/terraform.tf +++ /dev/null @@ -1,18 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GCP provider – Terraform and provider constraints -# ───────────────────────────────────────────────────────────────────────────── - -terraform { - required_version = ">= 1.5.0" - - required_providers { - google = { - source = "hashicorp/google" - version = "~> 5.0" - } - google-beta = { - source = "hashicorp/google-beta" - version = "~> 5.0" - } - } -} diff --git a/deployments/terraform/providers/gcp/variables.tf b/deployments/terraform/providers/gcp/variables.tf deleted file mode 100644 index 427b88e..0000000 --- a/deployments/terraform/providers/gcp/variables.tf +++ /dev/null @@ -1,201 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# GCP provider variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string - default = "claude-agent-monitor" -} - -variable "environment" { - description = "Deployment environment: dev, staging, or production" - type = string - validation { - condition = contains(["dev", "staging", "production"], var.environment) - error_message = "environment must be one of: dev, staging, production." - } -} - -variable "gcp_project_id" { - description = "GCP project ID for resource deployment" - type = string -} - -variable "region" { - description = "GCP region for resource deployment" - type = string - default = "us-central1" -} - -variable "tags" { - description = "Additional labels to apply to all resources" - type = map(string) - default = {} -} - -# ── Networking ────────────────────────────────────────────────────────────── - -variable "vpc_cidr" { - description = "CIDR block for the VPC (used for firewall rules)" - type = string - default = "10.0.0.0/16" -} - -variable "private_subnet_cidrs" { - description = "CIDR blocks for private subnets" - type = list(string) - default = ["10.0.11.0/24"] -} - -# ── Compute ───────────────────────────────────────────────────────────────── - -variable "app_container_image" { - description = "Container image URI for the main application" - type = string -} - -variable "mcp_container_image" { - description = "Container image URI for the MCP sidecar (empty to disable)" - type = string - default = "" -} - -variable "app_port" { - description = "Application container port" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "MCP sidecar container port" - type = number - default = 8819 -} - -variable "cpu" { - description = "CPU millicores for each Cloud Run instance" - type = number - default = 512 -} - -variable "memory" { - description = "Memory in MiB for each Cloud Run instance" - type = number - default = 1024 -} - -variable "min_replicas" { - description = "Minimum number of Cloud Run instances" - type = number - default = 0 -} - -variable "max_replicas" { - description = "Maximum number of Cloud Run instances" - type = number - default = 3 -} - -variable "environment_variables" { - description = "Environment variables for the application container" - type = map(string) - default = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - } -} - -# ── Deployment ────────────────────────────────────────────────────────────── - -variable "active_deployment_slot" { - description = "Active deployment slot: blue or green" - type = string - default = "blue" - validation { - condition = contains(["blue", "green"], var.active_deployment_slot) - error_message = "active_deployment_slot must be blue or green." - } -} - -variable "blue_weight" { - description = "Traffic weight for blue service (0-100)" - type = number - default = 100 - validation { - condition = var.blue_weight >= 0 && var.blue_weight <= 100 - error_message = "blue_weight must be between 0 and 100." - } -} - -variable "green_weight" { - description = "Traffic weight for green service (0-100)" - type = number - default = 0 - validation { - condition = var.green_weight >= 0 && var.green_weight <= 100 - error_message = "green_weight must be between 0 and 100." - } -} - -# ── TLS / Domain ──────────────────────────────────────────────────────────── - -variable "domain_name" { - description = "FQDN for managed SSL certificate (empty for HTTP only)" - type = string - default = "" -} - -# ── Storage ───────────────────────────────────────────────────────────────── - -variable "storage_size_gb" { - description = "Filestore capacity in GiB" - type = number - default = 1024 # Filestore minimum for BASIC_HDD -} - -# ── Health check ──────────────────────────────────────────────────────────── - -variable "health_check_path" { - description = "HTTP path for health checks" - type = string - default = "/api/health" -} - -variable "health_check_interval" { - description = "Seconds between health checks" - type = number - default = 30 -} - -variable "health_check_timeout" { - description = "Seconds before a health check times out" - type = number - default = 5 -} - -variable "health_check_healthy_threshold" { - description = "Consecutive successes to mark healthy" - type = number - default = 2 -} - -variable "health_check_unhealthy_threshold" { - description = "Consecutive failures to mark unhealthy" - type = number - default = 3 -} - -# ── Monitoring ────────────────────────────────────────────────────────────── - -variable "enable_monitoring" { - description = "Enable Cloud Monitoring alerts and dashboard" - type = bool - default = true -} - -variable "alert_email" { - description = "Email for monitoring notifications" - type = string - default = "" -} diff --git a/deployments/terraform/providers/oci/main.tf b/deployments/terraform/providers/oci/main.tf deleted file mode 100644 index 63f3bca..0000000 --- a/deployments/terraform/providers/oci/main.tf +++ /dev/null @@ -1,602 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# OCI Provider – Full implementation for Claude Code Agent Monitor -# -# Architecture: -# VCN → Container Instances (blue/green) → File Storage Service -# → Flexible Load Balancer → OCI Monitoring & Notifications -# -# OCI Container Instances provide a serverless container runtime. -# File Storage Service (FSS) delivers NFS for SQLite persistence. -# Flexible Load Balancer supports WebSocket, SSL, and weighted backends. -# ───────────────────────────────────────────────────────────────────────────── - -provider "oci" { - region = var.region -} - -# ── Data sources ──────────────────────────────────────────────────────────── - -data "oci_identity_availability_domains" "ads" { - compartment_id = var.compartment_id -} - -data "oci_identity_tenancy" "current" { - tenancy_id = var.tenancy_id -} - -# ── Locals ────────────────────────────────────────────────────────────────── - -locals { - name_prefix = lower(replace("${var.project_name}-${var.environment}", "_", "-")) - ad_name = data.oci_identity_availability_domains.ads.availability_domains[0].name - - common_tags = { - "project" = var.project_name - "environment" = var.environment - "managed_by" = "terraform" - "cloud_provider" = "oci" - "repository" = "Claude-Code-Agent-Monitor" - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# VCN (Virtual Cloud Network) -# ───────────────────────────────────────────────────────────────────────────── - -resource "oci_core_vcn" "main" { - compartment_id = var.compartment_id - cidr_blocks = [var.vpc_cidr] - display_name = "${local.name_prefix}-vcn" - dns_label = replace(substr(local.name_prefix, 0, 15), "-", "") - - freeform_tags = local.common_tags - - lifecycle { - prevent_destroy = false - } -} - -# Internet Gateway -resource "oci_core_internet_gateway" "main" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-igw" - enabled = true - - freeform_tags = local.common_tags -} - -# NAT Gateway -resource "oci_core_nat_gateway" "main" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-nat" - - freeform_tags = local.common_tags -} - -# Service Gateway -resource "oci_core_service_gateway" "main" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-sgw" - - services { - service_id = data.oci_core_services.all.services[0].id - } - - freeform_tags = local.common_tags -} - -data "oci_core_services" "all" { - filter { - name = "name" - values = ["All .* Services In Oracle Services Network"] - regex = true - } -} - -# ── Route tables ──────────────────────────────────────────────────────────── - -resource "oci_core_route_table" "public" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-public-rt" - - route_rules { - network_entity_id = oci_core_internet_gateway.main.id - destination = "0.0.0.0/0" - destination_type = "CIDR_BLOCK" - } - - freeform_tags = local.common_tags -} - -resource "oci_core_route_table" "private" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-private-rt" - - route_rules { - network_entity_id = oci_core_nat_gateway.main.id - destination = "0.0.0.0/0" - destination_type = "CIDR_BLOCK" - } - - route_rules { - network_entity_id = oci_core_service_gateway.main.id - destination = data.oci_core_services.all.services[0].cidr_block - destination_type = "SERVICE_CIDR_BLOCK" - } - - freeform_tags = local.common_tags -} - -# ── Security lists ────────────────────────────────────────────────────────── - -resource "oci_core_security_list" "public" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-public-sl" - - ingress_security_rules { - protocol = "6" # TCP - source = "0.0.0.0/0" - source_type = "CIDR_BLOCK" - tcp_options { - min = 443 - max = 443 - } - } - - ingress_security_rules { - protocol = "6" - source = "0.0.0.0/0" - source_type = "CIDR_BLOCK" - tcp_options { - min = 80 - max = 80 - } - } - - egress_security_rules { - protocol = "all" - destination = "0.0.0.0/0" - destination_type = "CIDR_BLOCK" - } - - freeform_tags = local.common_tags -} - -resource "oci_core_security_list" "private" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - display_name = "${local.name_prefix}-private-sl" - - ingress_security_rules { - protocol = "6" - source = var.vpc_cidr - source_type = "CIDR_BLOCK" - tcp_options { - min = var.app_port - max = var.app_port - } - } - - ingress_security_rules { - protocol = "6" - source = var.vpc_cidr - source_type = "CIDR_BLOCK" - tcp_options { - min = var.mcp_port - max = var.mcp_port - } - } - - # NFS (FSS) - ingress_security_rules { - protocol = "6" - source = var.vpc_cidr - source_type = "CIDR_BLOCK" - tcp_options { - min = 2048 - max = 2050 - } - } - - ingress_security_rules { - protocol = "6" - source = var.vpc_cidr - source_type = "CIDR_BLOCK" - tcp_options { - min = 111 - max = 111 - } - } - - ingress_security_rules { - protocol = "17" # UDP - source = var.vpc_cidr - source_type = "CIDR_BLOCK" - udp_options { - min = 111 - max = 111 - } - } - - egress_security_rules { - protocol = "all" - destination = "0.0.0.0/0" - destination_type = "CIDR_BLOCK" - } - - freeform_tags = local.common_tags -} - -# ── Subnets ───────────────────────────────────────────────────────────────── - -resource "oci_core_subnet" "public" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - cidr_block = var.public_subnet_cidrs[0] - display_name = "${local.name_prefix}-public" - dns_label = "pub" - route_table_id = oci_core_route_table.public.id - security_list_ids = [oci_core_security_list.public.id] - - freeform_tags = local.common_tags -} - -resource "oci_core_subnet" "private" { - compartment_id = var.compartment_id - vcn_id = oci_core_vcn.main.id - cidr_block = var.private_subnet_cidrs[0] - display_name = "${local.name_prefix}-private" - dns_label = "priv" - route_table_id = oci_core_route_table.private.id - security_list_ids = [oci_core_security_list.private.id] - prohibit_public_ip_on_vnic = true - - freeform_tags = local.common_tags -} - -# ───────────────────────────────────────────────────────────────────────────── -# File Storage Service (FSS) – NFS for SQLite -# ───────────────────────────────────────────────────────────────────────────── - -resource "oci_file_storage_file_system" "main" { - compartment_id = var.compartment_id - availability_domain = local.ad_name - display_name = "${local.name_prefix}-data" - - freeform_tags = local.common_tags - - lifecycle { - prevent_destroy = true - } -} - -resource "oci_file_storage_mount_target" "main" { - compartment_id = var.compartment_id - availability_domain = local.ad_name - subnet_id = oci_core_subnet.private.id - display_name = "${local.name_prefix}-mt" - - freeform_tags = local.common_tags -} - -resource "oci_file_storage_export_set" "main" { - mount_target_id = oci_file_storage_mount_target.main.id - display_name = "${local.name_prefix}-exports" - max_fs_stat_bytes = var.storage_size_gb * 1073741824 # GiB → bytes -} - -resource "oci_file_storage_export" "main" { - export_set_id = oci_file_storage_export_set.main.id - file_system_id = oci_file_storage_file_system.main.id - path = "/appdata" - - export_options { - source = var.private_subnet_cidrs[0] - access = "READ_WRITE" - identity_squash = "NONE" - require_privileged_source_port = false - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# Container Instances (Blue / Green) -# ───────────────────────────────────────────────────────────────────────────── - -resource "oci_container_instances_container_instance" "blue" { - compartment_id = var.compartment_id - availability_domain = local.ad_name - display_name = "${local.name_prefix}-blue" - - shape = "CI.Standard.E4.Flex" - shape_config { - ocpus = var.cpu / 1000.0 - memory_in_gbs = var.memory / 1024.0 - } - - vnics { - subnet_id = oci_core_subnet.private.id - is_public_ip_assigned = false - } - - containers { - display_name = "app" - image_url = var.app_container_image - - environment_variables = var.environment_variables - - health_checks { - health_check_type = "HTTP" - port = var.app_port - path = var.health_check_path - interval_in_seconds = 30 - timeout_in_seconds = 5 - } - - resource_config { - vcpus_limit = var.cpu / 1000.0 - memory_limit_in_gbs = var.memory / 1024.0 - } - - volume_mounts { - mount_path = "/app/data" - volume_name = "app-data" - is_read_only = false - } - } - - dynamic "containers" { - for_each = var.mcp_container_image != "" ? [1] : [] - content { - display_name = "mcp-sidecar" - image_url = var.mcp_container_image - - environment_variables = { - NODE_ENV = "production" - MCP_PORT = tostring(var.mcp_port) - } - - resource_config { - vcpus_limit = 0.25 - memory_limit_in_gbs = 0.25 - } - } - } - - # NOTE: OCI Container Instances only support EMPTYDIR and CONFIGFILE volume - # types. For persistent NFS (FSS) storage, mount via the container entrypoint - # using the mount target IP from oci_file_storage_mount_target.main, or - # migrate to OCI Kubernetes Engine (OKE) which supports NFS PersistentVolumes. - volumes { - name = "app-data" - volume_type = "EMPTYDIR" - backing_store = "EPHEMERAL_STORAGE" - } - - freeform_tags = merge(local.common_tags, { - deployment_slot = "blue" - }) - - lifecycle { - ignore_changes = [ - freeform_tags["last_deployed"], - ] - } -} - -resource "oci_container_instances_container_instance" "green" { - count = var.active_deployment_slot == "green" || var.green_weight > 0 ? 1 : 0 - - compartment_id = var.compartment_id - availability_domain = local.ad_name - display_name = "${local.name_prefix}-green" - - shape = "CI.Standard.E4.Flex" - shape_config { - ocpus = var.cpu / 1000.0 - memory_in_gbs = var.memory / 1024.0 - } - - vnics { - subnet_id = oci_core_subnet.private.id - is_public_ip_assigned = false - } - - containers { - display_name = "app" - image_url = var.app_container_image - - environment_variables = var.environment_variables - - health_checks { - health_check_type = "HTTP" - port = var.app_port - path = var.health_check_path - interval_in_seconds = 30 - timeout_in_seconds = 5 - } - - resource_config { - vcpus_limit = var.cpu / 1000.0 - memory_limit_in_gbs = var.memory / 1024.0 - } - - volume_mounts { - mount_path = "/app/data" - volume_name = "app-data" - is_read_only = false - } - } - - # NOTE: OCI Container Instances only support EMPTYDIR and CONFIGFILE volume - # types. See blue instance comment for FSS mounting guidance. - volumes { - name = "app-data" - volume_type = "EMPTYDIR" - backing_store = "EPHEMERAL_STORAGE" - } - - freeform_tags = merge(local.common_tags, { - deployment_slot = "green" - }) -} - -# ───────────────────────────────────────────────────────────────────────────── -# Flexible Load Balancer -# ───────────────────────────────────────────────────────────────────────────── - -resource "oci_load_balancer_load_balancer" "main" { - compartment_id = var.compartment_id - display_name = "${local.name_prefix}-lb" - shape = "flexible" - - shape_details { - minimum_bandwidth_in_mbps = var.environment == "production" ? 100 : 10 - maximum_bandwidth_in_mbps = var.environment == "production" ? 1000 : 100 - } - - subnet_ids = [oci_core_subnet.public.id] - - is_private = false - - freeform_tags = local.common_tags - - lifecycle { - prevent_destroy = false - } -} - -# Backend set with health check -resource "oci_load_balancer_backend_set" "app" { - load_balancer_id = oci_load_balancer_load_balancer.main.id - name = "${local.name_prefix}-app-bs" - policy = "ROUND_ROBIN" - - session_persistence_configuration { - cookie_name = "CCAM_SESSION" - is_secure = true - } - - health_checker { - protocol = "HTTP" - port = var.app_port - url_path = var.health_check_path - return_code = 200 - interval_ms = var.health_check_interval * 1000 - timeout_in_millis = var.health_check_timeout * 1000 - retries = var.health_check_unhealthy_threshold - } -} - -# Blue backend -resource "oci_load_balancer_backend" "blue" { - load_balancer_id = oci_load_balancer_load_balancer.main.id - backendset_name = oci_load_balancer_backend_set.app.name - ip_address = oci_container_instances_container_instance.blue.vnics[0].private_ip - port = var.app_port - weight = var.blue_weight -} - -# Green backend -resource "oci_load_balancer_backend" "green" { - count = length(oci_container_instances_container_instance.green) > 0 ? 1 : 0 - - load_balancer_id = oci_load_balancer_load_balancer.main.id - backendset_name = oci_load_balancer_backend_set.app.name - ip_address = oci_container_instances_container_instance.green[0].vnics[0].private_ip - port = var.app_port - weight = var.green_weight -} - -# HTTP listener -resource "oci_load_balancer_listener" "http" { - load_balancer_id = oci_load_balancer_load_balancer.main.id - name = "${local.name_prefix}-http" - default_backend_set_name = oci_load_balancer_backend_set.app.name - port = 80 - protocol = "HTTP" - - connection_configuration { - idle_timeout_in_seconds = 300 # WebSocket support - } -} - -# ───────────────────────────────────────────────────────────────────────────── -# OCI Monitoring – Alarms and Notifications -# ───────────────────────────────────────────────────────────────────────────── - -resource "oci_ons_notification_topic" "alerts" { - count = var.enable_monitoring ? 1 : 0 - - compartment_id = var.compartment_id - name = "${local.name_prefix}-alerts" - - freeform_tags = local.common_tags -} - -resource "oci_ons_subscription" "email" { - count = var.enable_monitoring && var.alert_email != "" ? 1 : 0 - - compartment_id = var.compartment_id - topic_id = oci_ons_notification_topic.alerts[0].id - protocol = "EMAIL" - endpoint = var.alert_email - - freeform_tags = local.common_tags -} - -resource "oci_monitoring_alarm" "lb_unhealthy" { - count = var.enable_monitoring ? 1 : 0 - - compartment_id = var.compartment_id - display_name = "${local.name_prefix}-unhealthy-backends" - namespace = "oci_lbaas" - query = "UnHealthyBackendCount[1m]{resourceId = \"${oci_load_balancer_load_balancer.main.id}\"}.max() > 0" - severity = "CRITICAL" - is_enabled = true - pending_duration = "PT5M" - - destinations = var.alert_email != "" ? [oci_ons_notification_topic.alerts[0].id] : [] - - message_format = "ONS_OPTIMIZED" - body = "Unhealthy backends detected for ${local.name_prefix} load balancer" - - freeform_tags = local.common_tags -} - -resource "oci_monitoring_alarm" "lb_5xx" { - count = var.enable_monitoring ? 1 : 0 - - compartment_id = var.compartment_id - display_name = "${local.name_prefix}-high-5xx" - namespace = "oci_lbaas" - query = "HttpResponses5xx[1m]{resourceId = \"${oci_load_balancer_load_balancer.main.id}\"}.sum() > 10" - severity = "WARNING" - is_enabled = true - pending_duration = "PT5M" - - destinations = var.alert_email != "" ? [oci_ons_notification_topic.alerts[0].id] : [] - - freeform_tags = local.common_tags -} - -resource "oci_monitoring_alarm" "high_latency" { - count = var.enable_monitoring ? 1 : 0 - - compartment_id = var.compartment_id - display_name = "${local.name_prefix}-high-latency" - namespace = "oci_lbaas" - query = "BackendTimeFirstByte[1m]{resourceId = \"${oci_load_balancer_load_balancer.main.id}\"}.percentile(0.99) > 2000" - severity = "WARNING" - is_enabled = true - pending_duration = "PT5M" - - destinations = var.alert_email != "" ? [oci_ons_notification_topic.alerts[0].id] : [] - - freeform_tags = local.common_tags -} diff --git a/deployments/terraform/providers/oci/outputs.tf b/deployments/terraform/providers/oci/outputs.tf deleted file mode 100644 index ebc954a..0000000 --- a/deployments/terraform/providers/oci/outputs.tf +++ /dev/null @@ -1,53 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# OCI provider outputs -# ───────────────────────────────────────────────────────────────────────────── - -output "application_url" { - description = "Public URL of the Claude Code Agent Monitor dashboard" - value = "http://${oci_load_balancer_load_balancer.main.ip_address_details[0].ip_address}" -} - -output "load_balancer_ip" { - description = "Public IP address of the load balancer" - value = oci_load_balancer_load_balancer.main.ip_address_details[0].ip_address -} - -output "vcn_id" { - description = "OCID of the VCN" - value = oci_core_vcn.main.id -} - -output "blue_instance_id" { - description = "OCID of the blue container instance" - value = oci_container_instances_container_instance.blue.id -} - -output "green_instance_id" { - description = "OCID of the green container instance (if deployed)" - value = length(oci_container_instances_container_instance.green) > 0 ? oci_container_instances_container_instance.green[0].id : "" -} - -output "file_system_id" { - description = "OCID of the File Storage file system" - value = oci_file_storage_file_system.main.id -} - -output "mount_target_ip" { - description = "IP address of the FSS mount target" - value = oci_file_storage_mount_target.main.ip_address -} - -output "load_balancer_id" { - description = "OCID of the load balancer" - value = oci_load_balancer_load_balancer.main.id -} - -output "compartment_id" { - description = "OCI compartment OCID" - value = var.compartment_id -} - -output "region" { - description = "OCI region" - value = var.region -} diff --git a/deployments/terraform/providers/oci/terraform.tf b/deployments/terraform/providers/oci/terraform.tf deleted file mode 100644 index 2d2db36..0000000 --- a/deployments/terraform/providers/oci/terraform.tf +++ /dev/null @@ -1,14 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# OCI provider – Terraform and provider constraints -# ───────────────────────────────────────────────────────────────────────────── - -terraform { - required_version = ">= 1.5.0" - - required_providers { - oci = { - source = "oracle/oci" - version = "~> 5.0" - } - } -} diff --git a/deployments/terraform/providers/oci/variables.tf b/deployments/terraform/providers/oci/variables.tf deleted file mode 100644 index ab25b42..0000000 --- a/deployments/terraform/providers/oci/variables.tf +++ /dev/null @@ -1,186 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# OCI provider variables -# ───────────────────────────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming" - type = string - default = "claude-agent-monitor" -} - -variable "environment" { - description = "Deployment environment: dev, staging, or production" - type = string - validation { - condition = contains(["dev", "staging", "production"], var.environment) - error_message = "environment must be one of: dev, staging, production." - } -} - -variable "region" { - description = "OCI region for resource deployment" - type = string - default = "us-ashburn-1" -} - -variable "tenancy_id" { - description = "OCI tenancy OCID" - type = string -} - -variable "compartment_id" { - description = "OCI compartment OCID for resource deployment" - type = string -} - -variable "tags" { - description = "Additional freeform tags to apply to all resources" - type = map(string) - default = {} -} - -# ── Networking ────────────────────────────────────────────────────────────── - -variable "vpc_cidr" { - description = "CIDR block for the VCN" - type = string - default = "10.0.0.0/16" -} - -variable "public_subnet_cidrs" { - description = "CIDR blocks for public subnets" - type = list(string) - default = ["10.0.1.0/24"] -} - -variable "private_subnet_cidrs" { - description = "CIDR blocks for private subnets" - type = list(string) - default = ["10.0.11.0/24"] -} - -# ── Compute ───────────────────────────────────────────────────────────────── - -variable "app_container_image" { - description = "Container image URI for the main application" - type = string -} - -variable "mcp_container_image" { - description = "Container image URI for the MCP sidecar (empty to disable)" - type = string - default = "" -} - -variable "app_port" { - description = "Application container port" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "MCP sidecar container port" - type = number - default = 8819 -} - -variable "cpu" { - description = "CPU millicores (converted to OCPUs: 1000m = 1 OCPU)" - type = number - default = 512 -} - -variable "memory" { - description = "Memory in MiB (converted to GiB for OCI)" - type = number - default = 1024 -} - -variable "environment_variables" { - description = "Environment variables for the application container" - type = map(string) - default = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - } -} - -# ── Deployment ────────────────────────────────────────────────────────────── - -variable "active_deployment_slot" { - description = "Active deployment slot: blue or green" - type = string - default = "blue" - validation { - condition = contains(["blue", "green"], var.active_deployment_slot) - error_message = "active_deployment_slot must be blue or green." - } -} - -variable "blue_weight" { - description = "Traffic weight for blue backend (0-100)" - type = number - default = 100 - validation { - condition = var.blue_weight >= 0 && var.blue_weight <= 100 - error_message = "blue_weight must be between 0 and 100." - } -} - -variable "green_weight" { - description = "Traffic weight for green backend (0-100)" - type = number - default = 0 - validation { - condition = var.green_weight >= 0 && var.green_weight <= 100 - error_message = "green_weight must be between 0 and 100." - } -} - -# ── Storage ───────────────────────────────────────────────────────────────── - -variable "storage_size_gb" { - description = "FSS export size limit in GiB" - type = number - default = 50 -} - -# ── Health check ──────────────────────────────────────────────────────────── - -variable "health_check_path" { - description = "HTTP path for health checks" - type = string - default = "/api/health" -} - -variable "health_check_interval" { - description = "Seconds between health checks" - type = number - default = 30 -} - -variable "health_check_timeout" { - description = "Seconds before a health check times out" - type = number - default = 5 -} - -variable "health_check_unhealthy_threshold" { - description = "Consecutive failures to mark unhealthy" - type = number - default = 3 -} - -# ── Monitoring ────────────────────────────────────────────────────────────── - -variable "enable_monitoring" { - description = "Enable OCI Monitoring alarms and notifications" - type = bool - default = true -} - -variable "alert_email" { - description = "Email address for alarm notifications" - type = string - default = "" -} diff --git a/deployments/terraform/variables.tf b/deployments/terraform/variables.tf deleted file mode 100644 index 4c4d141..0000000 --- a/deployments/terraform/variables.tf +++ /dev/null @@ -1,280 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Root module variables – Claude Code Agent Monitor -# ───────────────────────────────────────────────────────────────────────────── - -# ── Provider selection ────────────────────────────────────────────────────── - -variable "cloud_provider" { - description = "Target cloud provider: aws, gcp, azure, or oci" - type = string - validation { - condition = contains(["aws", "gcp", "azure", "oci"], var.cloud_provider) - error_message = "cloud_provider must be one of: aws, gcp, azure, oci." - } -} - -variable "region" { - description = "Cloud provider region for resource deployment" - type = string -} - -# ── Project metadata ──────────────────────────────────────────────────────── - -variable "project_name" { - description = "Project identifier used in resource naming and tagging" - type = string - default = "claude-agent-monitor" -} - -variable "environment" { - description = "Deployment environment: dev, staging, or production" - type = string - validation { - condition = contains(["dev", "staging", "production"], var.environment) - error_message = "environment must be one of: dev, staging, production." - } -} - -variable "tags" { - description = "Additional tags to apply to all resources" - type = map(string) - default = {} -} - -# ── Networking ────────────────────────────────────────────────────────────── - -variable "vpc_cidr" { - description = "CIDR block for the VPC / VNet / VCN" - type = string - default = "10.0.0.0/16" - validation { - condition = can(cidrhost(var.vpc_cidr, 0)) - error_message = "vpc_cidr must be a valid CIDR block." - } -} - -variable "availability_zones" { - description = "List of availability zones for multi-AZ deployment" - type = list(string) - default = [] -} - -variable "public_subnet_cidrs" { - description = "CIDR blocks for public subnets (one per AZ)" - type = list(string) - default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] -} - -variable "private_subnet_cidrs" { - description = "CIDR blocks for private subnets (one per AZ)" - type = list(string) - default = ["10.0.11.0/24", "10.0.12.0/24", "10.0.13.0/24"] -} - -# ── Compute ───────────────────────────────────────────────────────────────── - -variable "app_container_image" { - description = "Container image URI for the main application" - type = string -} - -variable "mcp_container_image" { - description = "Container image URI for the MCP sidecar" - type = string - default = "" -} - -variable "app_port" { - description = "Port the application container listens on" - type = number - default = 4820 -} - -variable "mcp_port" { - description = "Port the MCP sidecar container listens on" - type = number - default = 8819 -} - -variable "cpu" { - description = "CPU units for each container instance (e.g. 256, 512, 1024)" - type = number - default = 512 - validation { - condition = contains([256, 512, 1024, 2048, 4096], var.cpu) - error_message = "cpu must be one of: 256, 512, 1024, 2048, 4096 (valid Fargate CPU values)." - } -} - -variable "memory" { - description = "Memory in MiB for each container instance" - type = number - default = 1024 -} - -variable "min_replicas" { - description = "Minimum number of container replicas" - type = number - default = 1 -} - -variable "max_replicas" { - description = "Maximum number of container replicas for auto-scaling" - type = number - default = 3 -} - -variable "desired_replicas" { - description = "Desired number of container replicas at steady state" - type = number - default = 1 -} - -variable "environment_variables" { - description = "Environment variables passed to the application container" - type = map(string) - default = { - NODE_ENV = "production" - DASHBOARD_PORT = "4820" - } -} - -# ── Deployment strategy ───────────────────────────────────────────────────── - -variable "deployment_strategy" { - description = "Deployment strategy: rolling, blue-green, or canary" - type = string - default = "rolling" - validation { - condition = contains(["rolling", "blue-green", "canary"], var.deployment_strategy) - error_message = "deployment_strategy must be one of: rolling, blue-green, canary." - } -} - -variable "active_deployment_slot" { - description = "Active deployment slot for blue-green: blue or green" - type = string - default = "blue" - validation { - condition = contains(["blue", "green"], var.active_deployment_slot) - error_message = "active_deployment_slot must be blue or green." - } -} - -variable "blue_weight" { - description = "Traffic weight percentage for the blue deployment slot (0-100)" - type = number - default = 100 - validation { - condition = var.blue_weight >= 0 && var.blue_weight <= 100 - error_message = "blue_weight must be between 0 and 100." - } -} - -variable "green_weight" { - description = "Traffic weight percentage for the green deployment slot (0-100)" - type = number - default = 0 - validation { - condition = var.green_weight >= 0 && var.green_weight <= 100 - error_message = "green_weight must be between 0 and 100." - } -} - -# ── TLS / Domain ──────────────────────────────────────────────────────────── - -variable "domain_name" { - description = "Fully qualified domain name for the application" - type = string - default = "" -} - -variable "tls_certificate_arn" { - description = "ARN / ID of the TLS certificate for HTTPS termination" - type = string - default = "" -} - -# ── Monitoring ────────────────────────────────────────────────────────────── - -variable "enable_monitoring" { - description = "Enable monitoring, alerting, and log aggregation" - type = bool - default = true -} - -variable "alert_email" { - description = "Email address for monitoring alert notifications" - type = string - default = "" -} - -variable "log_retention_days" { - description = "Number of days to retain application logs" - type = number - default = 30 - validation { - condition = contains([1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653], var.log_retention_days) - error_message = "log_retention_days must be a valid CloudWatch retention period (1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, or 3653)." - } -} - -# ── Storage ───────────────────────────────────────────────────────────────── - -variable "storage_size_gb" { - description = "Persistent storage size in GiB for the SQLite database" - type = number - default = 20 -} - -variable "enable_storage_backup" { - description = "Enable automated backup of persistent storage" - type = bool - default = true -} - -# ── Auto-scaling ──────────────────────────────────────────────────────────── - -variable "autoscaling_cpu_target" { - description = "Target CPU utilization percentage for auto-scaling" - type = number - default = 70 -} - -variable "autoscaling_memory_target" { - description = "Target memory utilization percentage for auto-scaling" - type = number - default = 80 -} - -# ── Health check ──────────────────────────────────────────────────────────── - -variable "health_check_path" { - description = "HTTP path for application health checks" - type = string - default = "/api/health" -} - -variable "health_check_interval" { - description = "Interval in seconds between health checks" - type = number - default = 30 -} - -variable "health_check_timeout" { - description = "Timeout in seconds for each health check request" - type = number - default = 5 -} - -variable "health_check_healthy_threshold" { - description = "Consecutive successes required to mark target healthy" - type = number - default = 2 -} - -variable "health_check_unhealthy_threshold" { - description = "Consecutive failures required to mark target unhealthy" - type = number - default = 3 -} diff --git a/deployments/terraform/versions.tf b/deployments/terraform/versions.tf deleted file mode 100644 index 586bef6..0000000 --- a/deployments/terraform/versions.tf +++ /dev/null @@ -1,26 +0,0 @@ -# ───────────────────────────────────────────────────────────────────────────── -# Claude Code Agent Monitor – Terraform version constraints -# ───────────────────────────────────────────────────────────────────────────── - -terraform { - required_version = ">= 1.5.0" - - required_providers { - aws = { - source = "hashicorp/aws" - version = "~> 5.0" - } - google = { - source = "hashicorp/google" - version = "~> 5.0" - } - azurerm = { - source = "hashicorp/azurerm" - version = "~> 3.80" - } - oci = { - source = "oracle/oci" - version = "~> 5.0" - } - } -} diff --git a/desktop/.gitignore b/desktop/.gitignore deleted file mode 100644 index edae83c..0000000 --- a/desktop/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -node_modules/ -out/ -release/ -*.log -.DS_Store - -# Generated icon binaries — regenerable from assets/icon.svg via scripts/build-icons.sh. -# Committed copies live alongside the SVG so users without iconutil can still build. -# Local rebuilds are ignored. -assets/icon.iconset/ diff --git a/desktop/README.md b/desktop/README.md deleted file mode 100644 index 9c2a4dd..0000000 --- a/desktop/README.md +++ /dev/null @@ -1,833 +0,0 @@ -# `desktop/` — Native macOS App (Electron) - -The **desktop workspace** ships the Claude Code Agent Monitor dashboard as a -native macOS `.app` (distributed as a `.dmg`). It is an Electron shell that -**embeds the existing Express server in-process** and renders the already-built -React client in a `BrowserWindow`. - -> **One-line mental model:** *Electron is a window onto the same code.* The -> desktop app does not reimplement the dashboard — it `require()`s -> `server/index.js` directly, in the same Node runtime as the Electron main -> process, and points a Chromium window at it. - -For the **user-facing** guide (download, install, Gatekeeper, tray menu, -auto-start) see [`../DESKTOP.md`](../DESKTOP.md). This file is the -**contributor / architecture** reference. - ---- - -## Table of contents - -- [TL;DR](#tldr) -- [Where the desktop app sits](#where-the-desktop-app-sits) -- [Process model](#process-model) -- [Boot lifecycle](#boot-lifecycle) -- [Server hosting & port discovery](#server-hosting--port-discovery) -- [`better-sqlite3` native-module handling](#better-sqlite3-native-module-handling) -- [Background services & hook bootstrap](#background-services--hook-bootstrap) -- [Window, tray & menu](#window-tray--menu) -- [Auto-start (Login Items)](#auto-start-login-items) -- [Source tree](#source-tree) -- [Packaged app layout](#packaged-app-layout) -- [Build pipeline](#build-pipeline) -- [Commands](#commands) -- [Build performance — read this](#build-performance--read-this) -- [Code signing & notarization](#code-signing--notarization) -- [Continuous integration](#continuous-integration) -- [Smoke test](#smoke-test) -- [Environment variables](#environment-variables) -- [Logs & troubleshooting](#logs--troubleshooting) -- [What this workspace does *not* touch](#what-this-workspace-does-not-touch) - ---- - -## TL;DR - -```bash -# From the repo root: -npm run setup # install root + client deps, build client, install hooks -npm run build # build client/dist (the SPA the Electron window loads) -npm run desktop:install # install Electron, electron-builder, types into desktop/ -npm run desktop:dev # tsc → launch Electron pointing at out/main.js -npm run desktop:test # smoke test (spawn Electron + probe /api/health) - -# Build a DMG (macOS): -npm run desktop:dmg # both per-arch DMGs (arm64 + x64) — correct for release, SLOWER -npm run desktop:dmg:arm64 # Apple Silicon only — fast, for your own machine -npm run desktop:dmg:x64 # Intel only — fast - -# Build a Windows .exe (run on Windows x64): -npm run desktop:win # NSIS installer → release/ClaudeCodeMonitor-Setup--x64.exe -npm run desktop:win:portable # no-install portable → release/ClaudeCodeMonitor--x64-portable.exe -``` - -> ⚠️ `desktop:dmg` is slower because it builds the app **twice** — once per -> architecture — and emits **two** per-arch DMGs (`arm64` + `x64`). It does not -> merge them into a universal binary. For running on your own Mac, use the -> arch-specific command. See [Build performance](#build-performance--read-this). - -> 🪟 **Windows builds run on Windows** (DMGs build on macOS). `desktop:win` -> produces an **unsigned** installer — fine to run; SmartScreen may show a -> "More info → Run anyway" prompt on first launch. The icon (`assets/icon.ico`) -> is generated from `assets/icon.png` by `npm run build:win-icon` -> (PowerShell + .NET, no extra tooling). `better-sqlite3` is fetched as a -> prebuilt Electron binary by `npm run desktop:install`, so no Visual Studio -> C++ toolchain is required for the common case. If that fetch/rebuild *does* -> fail (no C++ toolchain, or a Node version with no prebuilt binary), -> `npm run desktop:install` — and any `desktop:*` build, gated by `prebuild.js` — -> prints the exact per-OS prerequisite (Windows: Visual Studio Build Tools with -> the "Desktop development with C++" workload; macOS: `xcode-select --install`; -> Linux: build-essential + python3) plus a no-toolchain alternative, then exits -> non-zero rather than crashing at runtime: -> -> ```bash -> cd desktop -> npm install --ignore-scripts -> node node_modules/electron/install.js -> npx electron-builder install-app-deps -> ``` -> -> A Node LTS (20/22) ships prebuilt binaries and avoids the compile entirely. - ---- - -## Where the desktop app sits - -`desktop/` is a **sibling workspace** — not a npm-workspaces conversion. It has -its own `package.json`, its own `node_modules`, and its own toolchain. It -consumes the rest of the repo as plain files. - -```mermaid -flowchart TD - subgraph repo["Claude-Code-Agent-Monitor (repo root)"] - server["server/
Express API · SQLite · WebSocket"] - client["client/
React + Vite SPA"] - scripts["scripts/
hook installer/handler, import, seed"] - mcp["mcp/
local MCP server"] - vscode["vscode-extension/"] - desktop["desktop/
★ Electron shell (this workspace)"] - end - - desktop -- "require() in-process" --> server - desktop -- "loads built SPA from" --> client - desktop -- "auto-installs hooks via" --> scripts - server -- "serves static" --> client - - style desktop fill:#1f6feb,stroke:#1158c7,color:#fff - style server fill:#238636,stroke:#196c2e,color:#fff -``` - -The desktop app touches **no other workspace's runtime behavior**. The only -change outside `desktop/` is a behavior-preserving refactor of -`server/index.js` (see [the last section](#what-this-workspace-does-not-touch)). - ---- - -## Process model - -Electron runs a **main process** (Node.js) and one or more **renderer -processes** (Chromium). In this app: - -- The **main process** hosts the embedded Express server *and* manages the - window, tray, and menus. There is **no child process and no IPC** for the - server — it runs inside the main process's own event loop. -- The **renderer** is just Chromium loading `http://127.0.0.1:` — exactly - the same origin a normal browser would. The `preload.ts` is intentionally - empty, so the renderer has zero privileged surface. - -```mermaid -flowchart LR - subgraph main["Electron Main Process (Node 22 / Electron 35)"] - boot["main.ts
lifecycle"] - host["server-host.ts
embedded server"] - express["server/index.js
Express + WS + SQLite"] - tray["tray.ts"] - menu["menu.ts"] - host --> express - boot --> host - boot --> tray - boot --> menu - end - - subgraph renderer["Renderer Process (Chromium)"] - win["BrowserWindow
React dashboard"] - preload["preload.ts
(empty — no bridge)"] - end - - express -- "http + ws on 127.0.0.1:port" --> win - win -.->|loads| preload - - hooks["Claude Code hooks
(separate node processes)"] -- "POST /api/hooks/event" --> express - - style main fill:#0d1117,stroke:#30363d,color:#e6edf3 - style renderer fill:#161b22,stroke:#30363d,color:#e6edf3 -``` - ---- - -## Boot lifecycle - -```mermaid -sequenceDiagram - autonumber - participant OS as macOS - participant Main as main.ts - participant Host as server-host.ts - participant Srv as server/index.js - participant UI as BrowserWindow - - OS->>Main: launch app - Main->>Main: requestSingleInstanceLock() - alt lock not acquired - Main->>OS: exit(0) — focus existing instance - end - Main->>Host: startEmbeddedServer() - Host->>Host: probe port 4820 — adopt if a healthy server answers - alt no server to adopt - Host->>Host: pickFreePort() · patch better-sqlite3 ABI - Host->>Srv: require() · createApp() · startServer(port) - Host->>Srv: waitForHealthy() — poll /api/health - Host->>Srv: bootstrapOwnedServer() — schedulers, cc-watcher, install hooks - end - Host-->>Main: ServerHandle { url, port, ownedByUs, stop } - Main->>Main: installApplicationMenu() · createTray() - alt launched at login - Main->>OS: stay tray-only, hide dock - else normal launch - Main->>UI: createDashboardWindow(url) - UI->>Srv: GET http://127.0.0.1:port - end - Note over Main: window "close" → hide (server keeps running) - Note over Main: before-quit → stop server + closeEmbeddedDatabase() -``` - -Key behaviors: - -| Event | Behavior | -|---|---| -| Second launch | `requestSingleInstanceLock()` fails → the new process exits and the existing window is focused. | -| Window close | Intercepted — the window **hides**, the server and tray keep running. | -| `window-all-closed` | App stays alive (tray-only mode). | -| Launched at login | The dashboard window is **not** shown — only the tray icon. | -| `before-quit` | If we own the server: stop the HTTP server, then `closeEmbeddedDatabase()` for a clean WAL checkpoint, then `app.exit(0)`. | - ---- - -## Server hosting & port discovery - -`server-host.ts` is the **only file** that imports `server/index.js`. It picks -a port, boots the server, and returns a `ServerHandle`. - -```mermaid -flowchart TD - start["startEmbeddedServer()"] --> forced{"CCAM_DESKTOP_BIND_PORT set?"} - forced -->|yes| bind["bind exactly that port
(no adoption, no fallback)"] - forced -->|no| adopt{"healthy server
already on :4820?"} - adopt -->|yes| reuse["adopt it
ownedByUs = false"] - adopt -->|no| pick["pickFreePort()"] - - pick --> p1{":4820 free?"} - p1 -->|yes| use4820["use 4820"] - p1 -->|no| p2{"any of
:4821–:4829 free?"} - p2 -->|yes| usefb["use that"] - p2 -->|no| p3{"any of
:49152–:49500 free?"} - p3 -->|yes| userand["use that"] - p3 -->|no| fail["throw — no free port"] - - bind --> boot["createApp() + startServer()"] - use4820 --> boot - usefb --> boot - userand --> boot - boot --> healthy["waitForHealthy()
poll /api/health ≤ 30s"] - healthy --> bg["bootstrapOwnedServer()"] - bg --> handle["ServerHandle ownedByUs = true"] - reuse --> handleR["ServerHandle ownedByUs = false"] - - style reuse fill:#9e6a03,stroke:#7d5300,color:#fff - style fail fill:#da3633,stroke:#b62324,color:#fff -``` - -**Adoption** — `probePort()` connects, then checks that the listener answers -`GET /api/health` with `{ status: "ok" }`. If a healthy dashboard server is -already on `:4820` (e.g. you ran `npm start` in a terminal), the desktop app -**adopts** it rather than double-binding. An adopted server is *not* owned by -the app — quitting the app leaves it running. - -**`ServerHandle`:** - -```ts -interface ServerHandle { - url: string; // e.g. "http://127.0.0.1:4820" - port: number; - ownedByUs: boolean; // false when adopted - stop: () => Promise; -} -``` - -**Hook port discovery** — because the embedded server may bind a fallback port -(4821+) when 4820 is taken, the Claude Code hook handler must not assume 4820. -On startup the server writes its live port to `~/.claude/.agent-dashboard.json` -(`server/lib/server-info.js`); `scripts/hook-handler.js` reads that file to -target the running server. Without this, hook events would be POSTed to 4820 — -nothing would receive them and the dashboard would stay empty. - ---- - -## `better-sqlite3` native-module handling - -`better-sqlite3` is the only **native** module in the dependency tree, and a -native module must be compiled against the exact Node ABI it runs on. The repo -root's copy is built for the **system Node** (so `npm run test:server` works); -Electron ships its **own Node ABI**. - -The desktop workspace solves this without disturbing the root install: - -```mermaid -flowchart TD - subgraph desk["desktop/node_modules"] - d1["better-sqlite3
rebuilt for Electron's ABI
(by electron-builder install-app-deps)"] - end - subgraph root["node_modules (repo root)"] - r1["better-sqlite3
built for system Node
(used by npm run test:server)"] - end - - patch["ensureNativeModulesPatched()
overrides Module._resolveFilename"] - srv["server/db.js
require('better-sqlite3')"] - - srv -->|"request intercepted"| patch - patch -->|"redirected to"| d1 - patch -.->|"everything else
passes through"| root - - style d1 fill:#238636,stroke:#196c2e,color:#fff - style patch fill:#1f6feb,stroke:#1158c7,color:#fff -``` - -- The patch is **process-local** and installed exactly once, before - `server/index.js` is `require()`d. -- It rewrites *only* `require("better-sqlite3")`; every other module resolves - normally. -- `electron-builder.yml` therefore **excludes** the root `better-sqlite3` from - the bundle (it would trip `@electron/universal`'s identical-file detector) - and `asarUnpack`s the desktop copy (native `.node` files cannot live inside - an `asar` archive). -- PR #37's `compat-sqlite` (`node:sqlite`) fallback remains as a safety net — - one reason the desktop app pins **Electron 35** (its bundled Node 22.16 has - `node:sqlite`; Electron 31's Node 20 did not). -- **No toolchain needed in the common case** — `npm run desktop:install` runs - `scripts/install.js`, which wraps `npm install` (whose `postinstall` runs - `electron-builder install-app-deps`). On success it behaves like a bare - `npm install`. On failure — or if the native binary is missing afterward — it - prints actionable help (`scripts/preflight.js`'s `printNativeDepHelp()`) and - exits non-zero, never leaving a half-set-up `node_modules`. The help lists the - per-OS C++ prerequisite (Windows: Visual Studio Build Tools with the "Desktop - development with C++" workload; macOS: `xcode-select --install`; Linux: - build-essential + python3), notes that a Node LTS (20/22) ships prebuilt - binaries (avoiding the compile), and gives a no-toolchain alternative: - - ```bash - cd desktop - npm install --ignore-scripts - node node_modules/electron/install.js - npx electron-builder install-app-deps - ``` - - `prebuild.js` runs the same check (`hasBetterSqliteBinary()`) before **every** - `desktop:*` build/dev script and fails fast with the same help if the binary - is missing — turning what was a runtime fatal-dialog crash into a build-time, - copy-pasteable error. - ---- - -## Background services & hook bootstrap - -`node server/index.js` runs its production bootstrap from an -`if (require.main === module)` block. Because the desktop app **`require()`s** -that module, the block never fires — so the bootstrap was extracted into an -exported `startBackgroundServices()` that both paths call. - -```mermaid -flowchart LR - subgraph standalone["node server/index.js"] - s1["require.main === module"] --> s2["startBackgroundServices()"] - end - subgraph desktopapp["desktop app"] - d1["server-host.ts
bootstrapOwnedServer()"] --> d2["startBackgroundServices()"] - d1 --> d3["installHooks()"] - end - - d2 --> svc - s2 --> svc - subgraph svc["Background services"] - u["update scheduler"] - w["cc-watcher (Claude config watcher)"] - r["orphaned-run reconciliation"] - end - - style d1 fill:#1f6feb,stroke:#1158c7,color:#fff -``` - -`bootstrapOwnedServer()` runs **once** (guarded by a module-level flag so a -*Restart Server* does not double-register schedulers/watchers) and: - -1. Calls `startBackgroundServices()` — the update scheduler, the `cc-watcher` - config watcher, and one-time orphaned-run reconciliation. -2. Calls `installHooks()` — writes the Claude Code hook configuration to - `~/.claude/settings.json`, so a **DMG-only user gets events flowing** - without ever running `npm run install-hooks` from a checkout. - -It runs only when the server is **owned** by the app — an adopted server has -already done its own bootstrap. - ---- - -## Window, tray & menu - -```mermaid -flowchart TD - tray["Menu-bar (tray) icon"] - tray -->|left-click| toggle["toggle dashboard window"] - tray -->|right-click| menu["context menu (built fresh)"] - - menu --> m1["Open Dashboard"] - menu --> m2["Open in Browser…"] - menu --> m3["Restart Server"] - menu --> m4["Show Logs"] - menu --> m5["Open at Login ☑"] - menu --> m6["Quit"] - - win["BrowserWindow"] - win -->|"close"| hide["hide() — server stays up"] - win -->|"resize / move"| persist["debounced save →
userData/window-state.json"] - win -->|"external link"| ext["shell.openExternal()"] - - style tray fill:#1f6feb,stroke:#1158c7,color:#fff -``` - -- **Tray** — the always-on surface. Left-click toggles the window; right-click - pops the context menu. The menu is rebuilt on each open so the port label and - *Open at Login* checkbox are always current. (The tray deliberately does - **not** use `setContextMenu`, which on macOS would make a left-click open the - menu and collide with the toggle behavior.) -- **Window** — `BrowserWindow` with `contextIsolation: true`, - `nodeIntegration: false`, an empty preload, and `webSecurity: true`. Geometry - is persisted to `window-state.json` under `app.getPath('userData')`. External - links open in the system browser, never inside Electron. Its `icon` is set to - the colored app logo via `appIconPath()` (`icon.ico` on Windows, `icon.png` - elsewhere — the same logo as the macOS Dock, rendered from `assets/icon.svg`), - resolving dev vs packaged asset paths, so an unpackaged `desktop:dev` run shows - the real logo in the title bar / taskbar instead of the generic Electron icon. - macOS ignores `BrowserWindow#icon` (the dev Dock icon is set separately in - `main.ts`; packaged apps get theirs from the bundle `.icns`/`.exe`). -- **Application menu** — standard menu (`About`, `Open at Login`, `File`, - `Edit`, `View`, `Window`, `Help`). `⌘R` / `Ctrl+R` is owned by `View ▸ reload`. - The `File ▸ Open Dashboard` item (`⌘1`) is gated behind `isMac`: macOS keeps a - global menu bar after the window hides so it can reopen it, but on - Windows/Linux the menu is attached to the window and a menu accelerator can't - fire while it's hidden — reopening there is the tray's *Open Dashboard*, and - `focusOrCreateWindow` calls `show()` unconditionally so it reliably raises a - backgrounded/minimized window (a bare `focus()` on Windows often only flashes - the taskbar button). - ---- - -## Auto-start (Login Items) - -Auto-start uses Electron's first-party `app.setLoginItemSettings` — which wraps -the modern macOS `SMAppService` / `ServiceManagement` framework — **not** a -`LaunchAgent` plist. The toggle therefore appears in -**System Settings → General → Login Items** where users expect to manage it. - -```mermaid -stateDiagram-v2 - [*] --> Disabled - Disabled --> Enabled: tray / menu "Open at Login" - Enabled --> Disabled: toggle again - Enabled --> LaunchedAtLogin: macOS login - LaunchedAtLogin --> TrayOnly: window hidden,
dock hidden - TrayOnly --> WindowShown: user clicks tray -``` - -When macOS launches the app at login (`wasOpenedAtLogin`), it starts -**tray-only** with `openAsHidden: true` — no window jumps into the user's face. - ---- - -## Source tree - -``` -desktop/ -├── src/ -│ ├── main.ts # main process entry — lifecycle, dialogs, wiring -│ ├── server-host.ts # ★ in-process Express boot, port discovery, adoption, -│ │ # better-sqlite3 ABI patch, DB + discovery-file close, -│ │ # /api/stats snapshot poller for the tray dropdown -│ ├── window.ts # BrowserWindow + persisted geometry; native macOS -│ │ # titleBarStyle: 'default' (clear traffic-light row) -│ ├── menu.ts # native application menu -│ ├── tray.ts # menu-bar icon + single-click dropdown w/ live -│ │ # {sessions, agents, events-today} snapshot -│ ├── login-item.ts # macOS Login Items (SMAppService) -│ ├── shell-path.ts # recover the user's shell PATH (so `claude` is found) -│ ├── logger.ts # file logger → app.getPath('logs')/desktop.log -│ ├── constants.ts # APP_NAME, ports, timeouts, window size -│ └── preload.ts # intentionally empty (zero renderer privilege) -├── scripts/ -│ ├── install.js # desktop:install wrapper: npm install + actionable -│ │ # native-dep help on failure (exits non-zero) -│ ├── preflight.js # shared hasBetterSqliteBinary() + printNativeDepHelp() -│ ├── prebuild.js # ensures client/dist + root node_modules exist; fails -│ │ # fast with setup help if better-sqlite3 binary missing -│ ├── notarize.js # electron-builder afterSign hook (opt-in) -│ └── build-icons.sh # regenerate icon.icns + tray PNGs from SVG -├── assets/ # icon.icns, icon.png, tray-icon-Template*.png, SVGs -├── tests/ -│ └── smoke.test.mjs # spawn Electron + probe /api/health -├── electron-builder.yml # DMG packaging config -├── tsconfig.json # strict; src/ → out/ -└── package.json -``` - -Compiled output lands in `desktop/out/` (git-ignored); packaged artifacts in -`desktop/release/` (git-ignored). - ---- - -## Packaged app layout - -`electron-builder` produces `Claude Code Monitor.app`. The Electron main -process code is packed into `app.asar`; the rest of the repo is shipped as -**`extraResources`** (plain files under `Resources/app/`): - -```mermaid -flowchart TD - app["Claude Code Monitor.app"] - app --> contents["Contents/"] - contents --> macos["MacOS/ — Electron binary"] - contents --> res["Resources/"] - res --> asar["app.asar
(compiled out/**, package.json)"] - res --> unpacked["app.asar.unpacked/
node_modules/better-sqlite3 (.node)"] - res --> appdir["app/"] - appdir --> a1["server/ — Express server (no tests)"] - appdir --> a2["client/dist/ — built React SPA"] - appdir --> a3["scripts/ — hook-handler, install-hooks"] - appdir --> a4["node_modules/ — server runtime deps"] - appdir --> a5["package.json"] - - style asar fill:#1f6feb,stroke:#1158c7,color:#fff - style appdir fill:#238636,stroke:#196c2e,color:#fff -``` - -At runtime `server-host.ts` resolves this root: `process.resourcesPath/app` -when packaged, or the repo root in development. - ---- - -## Build pipeline - -```mermaid -flowchart LR - src["src/*.ts"] -->|prebuild guard| pre["scripts/prebuild.js
verify client/dist + node_modules"] - pre --> tsc["tsc → out/*.js"] - tsc --> eb["electron-builder"] - eb --> dl["download Electron runtime"] - eb --> rebuild["@electron/rebuild
better-sqlite3 per arch"] - eb --> asar["pack out/** → app.asar"] - eb --> extra["copy server/ client/dist/ scripts/ node_modules/
→ Resources/app/"] - asar --> appbundle[".app bundle"] - extra --> appbundle - rebuild --> appbundle - appbundle --> sign["codesign (ad-hoc by default)"] - sign --> notarize["notarize (opt-in, afterSign hook)"] - notarize --> dmg["hdiutil → .dmg"] - - style tsc fill:#1f6feb,stroke:#1158c7,color:#fff - style dmg fill:#238636,stroke:#196c2e,color:#fff -``` - -`desktop:dmg` runs the *packaging → rebuild → sign → DMG* steps **twice** -(once per architecture) and emits two separate DMGs (`…-arm64.dmg` + -`…-x64.dmg`). There is no `@electron/universal` merge step — the release ships -the two per-arch DMGs rather than one fat universal binary. - ---- - -## Commands - -All commands are runnable from the **repo root** (`desktop:*`) or from inside -`desktop/`. Every script that packages first runs `npm run build`, so you never -need to invoke `electron-builder` bare (doing so skips the TypeScript compile -and fails with *"entry file out/main.js does not exist"*). - -| Repo-root command | `desktop/` command | What it does | -|---|---|---| -| `npm run desktop:install` | `node scripts/install.js` | Install Electron, electron-builder, types; rebuild `better-sqlite3` for Electron's ABI (`postinstall`). Preflights native deps — on failure (or a missing binary) prints per-OS setup help + a no-toolchain alternative and exits non-zero. | -| `npm run desktop:build` | `npm run build` | Prebuild guard + `tsc` → `out/`. | -| `npm run desktop:dev` | `npm run dev` | Build, then launch Electron against `out/main.js`. | -| `npm run desktop:test` | `npm test` | Build, then run the smoke test. | -| `npm run desktop:dmg` | `npm run dmg` | **macOS:** both per-arch DMGs (arm64 + x64). Correct for release. **Slower.** | -| `npm run desktop:dmg:arm64` | `npm run dmg:arm64` | **macOS:** Apple-Silicon-only DMG. **Fast.** | -| `npm run desktop:dmg:x64` | `npm run dmg:x64` | **macOS:** Intel-only DMG. **Fast.** | -| `npm run desktop:dmg:universal` | `npm run dmg:universal` | **macOS:** one merged universal DMG (arm64 + x86_64 via `@electron/universal`). Optional — not what the release ships. **Slowest.** | -| `npm run desktop:win` | `npm run win` | **Windows:** NSIS installer `.exe` (x64). | -| `npm run desktop:win:portable` | `npm run win:portable` | **Windows:** no-install portable `.exe` (x64). | -| — | `npm run build:icons` | **macOS:** regenerate `icon.icns` + tray PNGs from the SVGs. | -| — | `npm run build:win-icon` | **Windows:** regenerate `icon.ico` from `icon.png` (PowerShell + .NET). | -| — | `npm run clean` | Remove `out/` and `release/`. | - -> **After `npm run clean`** you must `npm run build` again before packaging — -> `clean` deletes `out/`, and `electron-builder` only *packages*, it does not -> compile. The `dmg*` scripts chain the build for you; a bare -> `electron-builder` call does not. - ---- - -## Build performance — read this - -**`desktop:dmg` is slower than a single-arch build.** This is expected — it is -the standard Electron packaging cost, paid **once per architecture**: - -```mermaid -flowchart TD - u["npm run desktop:dmg (both arches)"] --> b1["build x64 app tree → sign → …-x64.dmg"] - u --> b2["build arm64 app tree → sign → …-arm64.dmg"] - - a["npm run desktop:dmg:arm64 (single arch)"] --> sb["build one app tree"] - sb --> ssign["sign"] - ssign --> sdmg["hdiutil → …-arm64.dmg"] - - style u fill:#9e6a03,stroke:#7d5300,color:#fff - style a fill:#238636,stroke:#196c2e,color:#fff -``` - -Why `desktop:dmg` is slow: - -1. **Everything happens twice** — electron-builder builds a full x64 app tree - *and* a full arm64 app tree, rebuilding `better-sqlite3` and packaging a DMG - for each. (There is no universal merge; each arch produces its own DMG.) -2. **The app tree is large** — the server's entire production dependency tree - (`express`, `swagger-ui-express`, `ws`, …) ships as `extraResources`; that's - tens of thousands of files, walked and copied for each architecture. -3. **Per-binary code signing** runs over each architecture's bundle. - -Net effect: a ~250 MB app is built, copied, and signed once per architecture — -gigabytes of disk I/O. The Electron runtime downloads (~110 MB each) are *not* -the bottleneck; packaging two architectures back-to-back is. - -**Guidance:** - -- Building for **your own Mac** → use `desktop:dmg:arm64` (Apple Silicon) or - `desktop:dmg:x64` (Intel). One architecture — finishes in roughly a minute - instead of two. -- Building the **release artifacts for everyone** → use `desktop:dmg` (builds - both arches) and expect it to take about twice as long. CI runs `desktop:dmg` - and uploads both DMGs as the `ClaudeCodeMonitor-dmg` artifact, so you rarely - need to build them locally. -- Each DMG is **~80 MB / ~250 MB on disk** — the standard Electron tax. - ---- - -## Code signing & notarization - -The DMG is **ad-hoc signed by default** so anyone can build a working `.dmg` -without a paid Apple Developer account. - -- The `package` script sets **`CSC_IDENTITY_AUTO_DISCOVERY=false`** so a - code-signing certificate already in the contributor's macOS keychain is - **never** picked up. (Without this, electron-builder auto-discovers such a - cert and attempts `type=distribution` signing, which fails on a non–Developer - ID cert with *"Application … could not be found"*.) -- **Real Developer ID signing** activates when `CSC_LINK` (a base64-encoded - `.p12`) and `CSC_KEY_PASSWORD` are provided — `CSC_LINK` is an *explicit* - certificate and is unaffected by the auto-discovery flag. -- **Notarization** is opt-in: `desktop/scripts/notarize.js` (an - `electron-builder` `afterSign` hook) runs only when `APPLE_ID`, - `APPLE_TEAM_ID`, and `APPLE_APP_SPECIFIC_PASSWORD` are all set. Otherwise it - is a no-op. - -```mermaid -flowchart TD - build["DMG build"] --> q{"CSC_LINK set?"} - q -->|yes| real["sign with Developer ID cert"] - q -->|no| adhoc["ad-hoc sign
(keychain scan disabled)"] - real --> n{"APPLE_ID + TEAM_ID + PASSWORD set?"} - adhoc --> n - n -->|yes| notar["notarize via notarytool"] - n -->|no| skip["skip notarization"] - notar --> out[".dmg"] - skip --> out - - style adhoc fill:#9e6a03,stroke:#7d5300,color:#fff - style real fill:#238636,stroke:#196c2e,color:#fff -``` - -An ad-hoc DMG triggers a Gatekeeper warning on first launch. The one-line -workaround is in [`../DESKTOP.md`](../DESKTOP.md): -`xattr -cr "/Applications/Claude Code Monitor.app"`. - ---- - -## Continuous integration - -The `🍎 macOS Desktop (DMG)` job in `.github/workflows/ci.yml`: - -```mermaid -flowchart LR - ch["changes job
dorny/paths-filter"] -->|"desktop/** changed?"| gate{run?} - push["push to any branch"] --> gate - label["PR has 'desktop' label"] --> gate - gate -->|yes| job["desktop job (macos-latest)"] - job --> j1["npm ci (root, client, desktop)"] - j1 --> j2["tsc build"] - j2 --> j3["smoke test"] - j3 --> j4["build both per-arch DMGs
(retry on flaky hdiutil detach)"] - j4 --> j5["upload ClaudeCodeMonitor-dmg artifact"] - j5 --> rel["release job (master only)
publish vX.Y.Z if new"] - - style job fill:#1f6feb,stroke:#1158c7,color:#fff - style rel fill:#238636,stroke:#1a6e2c,color:#fff -``` - -- The job is **path-filtered** — a `changes` job (`dorny/paths-filter`) - detects `desktop/**` edits; the desktop job also runs on any `push` or when a - PR carries the `desktop` label. -- **DMG build resilience** — `electron-builder` finalizes the DMG with - `hdiutil detach`, which is intermittently flaky on GitHub macOS runners. The - step disables Spotlight indexing and retries the build up to 3 times, - force-detaching any stale volume between attempts. -- The built DMG is uploaded as the **`ClaudeCodeMonitor-dmg`** artifact - (downloadable from the workflow run). -- On `master`, a follow-on **`release`** job reads the version from - `package.json` and publishes `vX.Y.Z` as a GitHub Release with the DMG - attached — but only when no release exists for that version yet, so bumping - the version is what cuts a release. The result is a permanent, anonymous - download URL at `releases/latest`. - ---- - -## Smoke test - -`tests/smoke.test.mjs` is intentionally minimal — it proves the embedded server -boots, without needing a display (so CI needs no `xvfb`). - -```mermaid -sequenceDiagram - autonumber - participant T as smoke.test.mjs - participant E as Electron (out/main.js) - participant S as embedded server - - T->>T: pick a unique high port - T->>E: spawn with CCAM_DESKTOP_BIND_PORT= - E->>S: startEmbeddedServer() — bind exactly - loop until healthy or 60s - T->>S: GET /api/health - end - T->>T: assert status == "ok" AND matched - T->>T: assert Electron process still alive - T->>E: SIGTERM -``` - -`CCAM_DESKTOP_BIND_PORT` forces the server onto an exact port (no adoption, no -fallback) so the test can be certain it probed *this* process and not an -unrelated server on `:4820`. - ---- - -## Environment variables - -| Variable | Used by | Effect | -|---|---|---| -| `CCAM_DESKTOP_BIND_PORT` | `server-host.ts` | Bind exactly this port — disables adoption and fallback. Used by the smoke test. | -| `CCAM_DESKTOP_NO_ADOPT` | `server-host.ts` | `=1` → never adopt an existing `:4820` server; always start our own. | -| `CCAM_DESKTOP_VERBOSE` | `logger.ts` | Mirror `info`/`warn` log lines to stdout (errors always go to stderr). | -| `DASHBOARD_DATA_DIR` | `server-host.ts` → server | Set automatically to `app.getPath('userData')/data` so the SQLite database and VAPID keys live in the per-user Application Support directory, never inside the (possibly read-only) `.app` bundle. | -| `CSC_IDENTITY_AUTO_DISCOVERY` | electron-builder | Set to `false` by the `package` script — forces ad-hoc signing. | -| `CSC_LINK` / `CSC_KEY_PASSWORD` | electron-builder | Explicit Developer ID `.p12` for real signing. | -| `APPLE_ID` / `APPLE_TEAM_ID` / `APPLE_APP_SPECIFIC_PASSWORD` | `notarize.js` | Enable Apple notarization when all three are set. | - -The embedded server also honors the dashboard's own env vars (`DASHBOARD_PORT` -and `DASHBOARD_DATA_DIR` are set automatically by `server-host.ts`; everything -else in [`../SETUP.md`](../SETUP.md) applies). - -> **Writable state never lives in the `.app` bundle.** A packaged, code-signed, -> or app-translocated bundle is read-only; a database written there would break -> History Import and event persistence. `server-host.ts` points -> `DASHBOARD_DATA_DIR` at `~/Library/Application Support/Claude Code Monitor/data/`, -> which is also why your imported history survives an app reinstall or update. - ---- - -## Logs & troubleshooting - -The Electron main process has no console when launched from Finder, so -`logger.ts` writes to a per-user file: - -``` -~/Library/Logs/Claude Code Monitor/desktop.log -``` - -Reach it from the tray menu → **Show Logs**. - -| Symptom | Cause / fix | -|---|---| -| `entry file out/main.js does not exist` | You ran `electron-builder` without building first. Run `npm run build` (or use a `dmg*` script). | -| Signing fails: `Application … could not be found` after retries | A keychain cert was auto-discovered. The `package` script now sets `CSC_IDENTITY_AUTO_DISCOVERY=false`; ensure you build via `npm run dmg*`, not bare `electron-builder`. | -| DMG build seems slow | Not hung — `desktop:dmg` packages two architectures back-to-back. See [Build performance](#build-performance--read-this). Use `dmg:arm64` / `dmg:x64` for a single arch. | -| `hdiutil detach … exit code 1` in CI | Flaky GitHub runner; the CI step already retries with Spotlight disabled. Re-run the job if it still fails. | -| Dashboard window is blank | The embedded server failed `/api/health` within 30 s — check `desktop.log`. | -| Gatekeeper blocks the app | Ad-hoc DMG. `xattr -cr "/Applications/Claude Code Monitor.app"`. | -| Hooks not firing | The app installs hooks on first owned-server boot; start a **new** Claude Code session afterwards. Verify entries in `~/.claude/settings.json`. | -| "Run Claude" says `claude` isn't on your PATH | `shell-path.ts` recovers the login-shell PATH at startup. If `claude` is a shell _alias_ or _function_ (not a real binary), it cannot be spawned — install the `claude` CLI as an executable. Check `desktop.log` for the `user PATH resolved` line. | -| `desktop:dev` / `desktop:test` fail with `ERR_DLOPEN_FAILED` | A prior DMG build left `better-sqlite3` built for the other CPU arch. `prebuild.js` auto-heals this on the next build; if needed, run `npm run desktop:install`. | -| Imported history disappeared after reinstall | Fixed — the database now lives in `~/Library/Application Support/Claude Code Monitor/data/`, outside the bundle. A one-time gap exists only across the upgrade from a build that predated this fix; re-run **Import History → Rescan**. | - ---- - -## What this workspace does *not* touch - -By design, changes outside `desktop/` are kept to a minimum: - -- **`server/index.js`** — its post-listen bootstrap was extracted into an - exported `startBackgroundServices()` so the embedded server boots the same - one-time legacy-session import, update scheduler, `cc-watcher`, and - orphaned-run reconciliation that `node server/index.js` does. A - **behavior-preserving refactor** — the standalone server path is functionally - unchanged. (The legacy-session import previously lived in the - `require.main === module` block, so the embedded server never ran it and the - desktop dashboard started empty; moving it into `startBackgroundServices()` - fixes that.) The server also publishes its live port on startup. -- **`server/lib/server-info.js`** *(new)* — multi-server discovery file at - `~/.claude/.agent-dashboard.json`. Every running dashboard appends its - `{port, pid, startedAt}` entry on startup, removes it on clean shutdown, - and stale entries are pruned by a `process.kill(pid, 0)` liveness check on - read. Exposes `writeServerInfo`, `removeServerInfo`, - `resolveAllDashboardPorts` (fan-out targets), and the legacy single-port - `resolveDashboardPort`. The file also carries legacy root-level - `port`/`pid`/`startedAt` fields populated from the most recently started - live server, so older hook handlers bundled inside an already-installed - `.app` still resolve to a reachable port. -- **`scripts/hook-handler.js`** — `Promise.all` fan-out of every hook - payload to every live server returned by `resolveAllDashboardPorts()` - (`CLAUDE_DASHBOARD_PORT` overrides to a single target). This is what lets - the desktop app coexist with `npm run dev` — both dashboards receive every - event and both stay real-time. -- **`server/lib/push.js`** — `sendPushToAll()` now also fires a **native - Electron notification** when `process.versions.electron` is set, so the - desktop app surfaces notifications via the OS API instead of relying on Web - Push (which fails inside Electron — no FCM credentials in the Chromium - build). The standalone server path is unchanged: the native leg is a no-op - there, and Web Push delivers as before. -- **`scripts/dev.js`** *(new)* — `npm run dev`'s entry point. Probes both - `127.0.0.1` and `::1` for a free port in `4820–4859` (so an SSH - `LocalForward` with loopback-specific binds can't shadow Node's wildcard - listen), exports `DASHBOARD_PORT`, then spawns the existing - `concurrently` server + client pipeline. `npm run dev:raw` bypasses it - for parity with the old behaviour. - -`client/`, `mcp/`, and `vscode-extension/` are **untouched**. If you find -yourself wanting to edit those, that belongs in a separate PR. - ---- - -*User-facing docs: [`../DESKTOP.md`](../DESKTOP.md) · Project architecture: -[`../ARCHITECTURE.md`](../ARCHITECTURE.md) · Setup: [`../SETUP.md`](../SETUP.md)* diff --git a/desktop/assets/icon.icns b/desktop/assets/icon.icns deleted file mode 100644 index a14853ef0a4f0823b9b982c013eafdb145eec900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1020994 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 o2I|FbYJ+e6YC01FZOsUC~yR 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

Q4mqB%L(NK`-_`0s?!)zLF(2-ulM0&})1%lE7g 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

tn5m)6q7`_ivUUnmeh_uc&vl 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

MwnsBkOg^p2%( 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

5FF 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 z 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

6A5VpbcbyI97jInprv3@LMUm5){XWgF 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 diff --git a/desktop/assets/icon.png b/desktop/assets/icon.png deleted file mode 100644 index 4a42c74f446cd33dacea82c502c3ee4cd4951619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 662784 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%0ApjPf+ZpnOFkX3eH)O#Y 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

`B#24cVFcHh+{k8l;8|7~qCwV1s6& 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

v#A)(P>WGvN|3wk<5P&c!>8!gR;Z1FRFB6m~_ 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

p7s*W9?#i_u;t=O4PF5I|DP&u+y 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 LOXokB-gxjoTgF02 diff --git a/desktop/assets/icon.svg b/desktop/assets/icon.svg deleted file mode 100644 index db97682..0000000 --- a/desktop/assets/icon.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/desktop/assets/tray-icon-Template.png b/desktop/assets/tray-icon-Template.png deleted file mode 100644 index d4126f079ad9b3b11b9a03780dfd6f0b3cbdf513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fYMw5RAr-fh6C_xbrT(}dUd+}n s()=+~u8nQ->dGq*0-IOP>GNb`n7_8U)>`MUDo_W5r>mdKI;Vst08oP)?*IS* diff --git a/desktop/assets/tray-icon-Template@2x.png b/desktop/assets/tray-icon-Template@2x.png deleted file mode 100644 index 8d6219a70140a74e2578d33833c2e1805d8a473d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!1|;QLq8Ndcv!{z=NX4zU*B!YS6gXTR-`8ha zJ1K}neLnDY{#wCFDlc<(S|)(O1N#G46B801WInik_y7#doqu6_^qUQQ{E^~}^+4ko NJYD@<);T3K0RZYBEbagR diff --git a/desktop/assets/tray-icon.svg b/desktop/assets/tray-icon.svg deleted file mode 100644 index ccc6e40..0000000 --- a/desktop/assets/tray-icon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml deleted file mode 100644 index 73bce7a..0000000 --- a/desktop/electron-builder.yml +++ /dev/null @@ -1,167 +0,0 @@ -# electron-builder configuration for Claude Code Agent Monitor (macOS + Windows). -# -# Defaults to ad-hoc signing so the project can build distributable DMGs -# without a paid Apple Developer account. When the following environment -# variables are set in CI (typically as repository secrets), the same -# config produces a Developer ID–signed and Apple-notarized DMG: -# -# APPLE_ID Apple ID email -# APPLE_TEAM_ID Developer team identifier -# APPLE_APP_SPECIFIC_PASSWORD App-specific password for notarytool -# CSC_LINK Base64-encoded .p12 cert (optional) -# CSC_KEY_PASSWORD Password for the .p12 (optional) -# -# No code changes are required to enable notarization later. - -appId: com.vn.smartgift.ccam.desktop -productName: Claude Code Monitor -copyright: Copyright (c) 2026 SmartGift. All rights reserved. - -directories: - output: release - buildResources: assets - -# We pre-build with tsc into out/, and we ship the existing server/ and -# client/dist/ from the parent repo as extraResources. Keeping the bundle -# small: no source maps, no parent node_modules tree. -files: - - "out/**/*" - - "package.json" - -extraResources: - - from: "../server" - to: "app/server" - filter: - - "**/*" - - "!__tests__/**" - - "!**/*.test.js" - - from: "../client/dist" - to: "app/client/dist" - filter: ["**/*"] - - from: "../scripts" - to: "app/scripts" - filter: - - "**/*" - - "!**/*.test.js" - - from: "../package.json" - to: "app/package.json" - - from: "../node_modules" - to: "app/node_modules" - filter: - - "**/*" - - "!**/*.md" - - "!**/test/**" - - "!**/tests/**" - - "!**/*.d.ts" - # better-sqlite3 ships from desktop/node_modules (per-arch rebuilt by - # install-app-deps). The root copy is built for the system Node and - # would trip @electron/universal's identical-file detector. - - "!**/better-sqlite3/**" - # Tray icon images need to live OUTSIDE the asar archive: `nativeImage` can't - # always read them from an asar path, and `files` here (out/**, package.json) - # would otherwise leave them out of the bundle entirely. Ship them as plain - # files at `Resources/assets/`; `trayImagePath()` reads them via - # `process.resourcesPath` in production. macOS uses the template PNGs; Windows - # uses the colored `icon.ico` (a template/black glyph would vanish on the - # dark Windows taskbar). - - from: "assets" - to: "assets" - filter: - - "tray-icon-Template*.png" - - "icon.ico" - -asar: true -asarUnpack: - # better-sqlite3 native bindings cannot live inside asar. - - "**/node_modules/better-sqlite3/**" - -mac: - category: public.app-category.developer-tools - icon: assets/icon.icns - hardenedRuntime: true - gatekeeperAssess: false - # Ad-hoc signed by default: the `package` npm script sets - # CSC_IDENTITY_AUTO_DISCOVERY=false so a code-signing cert already in the - # contributor's keychain is never picked up (it would fail distribution - # signing). Real Developer ID signing activates only when CSC_LINK (an - # explicit .p12) is provided — that path is unaffected by the flag. - # No `arch:` here on purpose. Pinning the arch list in the config makes - # electron-builder build *every* listed architecture regardless of the CLI - # flag, so `electron-builder --mac --arm64` would still emit an x64 DMG too. - # With arch left unspecified, the `--arm64` / `--x64` / `--universal` flags - # the `dmg:*` npm scripts pass are what decide which single DMG is produced. - target: - - dmg - extendInfo: - LSUIElement: false - NSHighResolutionCapable: true - NSRequiresAquaSystemAppearance: false - -dmg: - artifactName: "ClaudeCodeMonitor-${version}-${arch}.dmg" - # The mounted-volume title carries the architecture so that, when a release/ - # directory holds more than one DMG, the Finder windows are distinguishable - # and nobody drags an x64 build onto Apple Silicon (which triggers a Rosetta - # prompt). The arch label is NOT set here: the `${arch}` macro expands - # inconsistently inside `title` — it yields `-arm64` / an empty string rather - # than `arm64` / `x64`. The per-arch `dmg:*` scripts in package.json override - # `dmg.title` with an explicit, clean label instead. - title: "Claude Code Monitor" - icon: assets/icon.icns - contents: - # Left slot: the .app bundle. Do NOT set `type: file` here — electron-builder - # auto-fills the app at this slot when type/path are omitted. With an - # explicit `type: file` and no `path`, recent electron-builder resolves - # `path: ""` against the project dir and stat's `/desktop`, then - # bombs with `/desktop not a file`. Omitting both is the canonical - # form documented in the electron-builder DMG layout examples. - - x: 130 - y: 220 - - x: 410 - y: 220 - type: link - path: /Applications - window: - width: 540 - height: 380 - -win: - # Multi-size BMP icon generated by `scripts/build-win-icon.ps1` from the same - # `icon.png` the macOS pipeline renders — see that script's header. Embedded - # in the .exe and reused for the installer + taskbar. - icon: assets/icon.ico - # Emit both an NSIS installer (.exe) and a no-install portable .exe. The - # `win` / `win:portable` npm scripts pass an explicit target so each produces - # exactly one artifact; a bare `electron-builder --win` builds both. No - # `arch:` is pinned here for the same reason as macOS above — the per-arch - # CLI flag (`--x64`) is what decides the architecture. - target: - - nsis - - portable - # Unsigned by default. Unlike macOS there is no keychain identity to suppress: - # Windows signing activates only when an explicit certificate is provided via - # CSC_LINK + CSC_KEY_PASSWORD (or win.certificateFile). Unsigned builds run - # fine; SmartScreen may show a "more info" prompt on first launch. - -nsis: - # A two-step installer (not oneClick) so the user can pick the install dir. - # Per-user install (perMachine: false) writes to %LOCALAPPDATA%\Programs and - # needs no administrator elevation. - oneClick: false - perMachine: false - allowToChangeInstallationDirectory: true - createDesktopShortcut: true - createStartMenuShortcut: true - shortcutName: "Claude Code Monitor" - uninstallDisplayName: "Claude Code Monitor ${version}" - artifactName: "ClaudeCodeMonitor-Setup-${version}-${arch}.${ext}" - # Keep the per-user SQLite database + settings (under userData) on uninstall, - # mirroring macOS where dragging the .app to Trash never touches user data. - deleteAppDataOnUninstall: false - -portable: - artifactName: "ClaudeCodeMonitor-${version}-${arch}-portable.${ext}" - -# Notarization runs only when the Apple credentials are present (macOS only; -# the hook is a no-op on Windows). -afterSign: scripts/notarize.js diff --git a/desktop/package-lock.json b/desktop/package-lock.json deleted file mode 100644 index 5c2a500..0000000 --- a/desktop/package-lock.json +++ /dev/null @@ -1,5176 +0,0 @@ -{ - "name": "agent-dashboard-desktop", - "version": "1.4.6", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "agent-dashboard-desktop", - "version": "1.4.6", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "better-sqlite3": "^11.7.0" - }, - "devDependencies": { - "@types/node": "^22.10.0", - "electron": "^35.7.0", - "electron-builder": "^25.1.8", - "typescript": "^5.5.4" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/asar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", - "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/asar/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/asar/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", - "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "node_modules/@electron/universal/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", - "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.19.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", - "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/verror": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", - "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", - "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.6" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "5.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz", - "integrity": "sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==", - "dev": true, - "license": "MIT" - }, - "node_modules/app-builder-lib": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.1.8.tgz", - "integrity": "sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.5.0", - "@electron/osx-sign": "1.3.1", - "@electron/rebuild": "3.6.1", - "@electron/universal": "2.0.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "chromium-pickle-js": "^0.2.0", - "config-file-ts": "0.2.8-rc1", - "debug": "^4.3.4", - "dotenv": "^16.4.5", - "dotenv-expand": "^11.0.6", - "ejs": "^3.1.8", - "electron-publish": "25.1.7", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "lazy-val": "^1.0.5", - "minimatch": "^10.0.0", - "resedit": "^1.7.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "dmg-builder": "25.1.8", - "electron-builder-squirrel-windows": "25.1.8" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/rebuild": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", - "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "dev": true, - "license": "ISC" - }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builder-util": { - "version": "25.1.7", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.1.7.tgz", - "integrity": "sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.10", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.10", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.10", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", - "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/config-file-ts": { - "version": "0.2.8-rc1", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", - "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.3.12", - "typescript": "^5.4.3" - } - }, - "node_modules/config-file-ts/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/config-file-ts/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "node_modules/dir-compare/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dmg-builder": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.1.8.tgz", - "integrity": "sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "25.1.8", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "35.7.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-35.7.5.tgz", - "integrity": "sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^22.7.7", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.1.8.tgz", - "integrity": "sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "25.1.8", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "chalk": "^4.1.2", - "dmg-builder": "25.1.8", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder-squirrel-windows": { - "version": "25.1.8", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.1.8.tgz", - "integrity": "sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "app-builder-lib": "25.1.8", - "archiver": "^5.3.1", - "builder-util": "25.1.7", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-publish": { - "version": "25.1.7", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.1.7.tgz", - "integrity": "sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "25.1.7", - "builder-util-runtime": "9.2.10", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, - "node_modules/filelist": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", - "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true, - "license": "ISC" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/isbinaryfile": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", - "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.92.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-api-version": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", - "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/pe-library": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", - "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/plist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", - "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.9.10", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resedit": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", - "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pe-library": "^0.4.1" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", - "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", - "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/zip-stream/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/zip-stream/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/zip-stream/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - } - } -} diff --git a/desktop/package.json b/desktop/package.json deleted file mode 100644 index 47ded70..0000000 --- a/desktop/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "agent-dashboard-desktop", - "version": "1.4.6", - "private": true, - "description": "Native macOS and Windows desktop shell for Claude Code Agent Monitor.", - "author": "Nguyễn Ngọc Trí Vĩ ", - "license": "UNLICENSED", - "homepage": "https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor", - "repository": { - "type": "git", - "url": "https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor.git" - }, - "main": "out/main.js", - "scripts": { - "clean": "rm -rf out release", - "prebuild": "node scripts/prebuild.js", - "build": "npm run prebuild && tsc -p tsconfig.json", - "build:icons": "bash scripts/build-icons.sh", - "build:win-icon": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/build-win-icon.ps1", - "dev": "npm run build && electron out/main.js", - "package": "rm -rf release && npm run build && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac --arm64 --x64 --publish never", - "dmg": "npm run package", - "dmg:arm64": "rm -rf release && npm run build && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac --arm64 --publish never --config.dmg.title='Claude Code Monitor (Apple Silicon)'", - "dmg:x64": "rm -rf release && npm run build && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac --x64 --publish never --config.dmg.title='Claude Code Monitor (Intel)'", - "dmg:universal": "rm -rf release && npm run build && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac --universal --publish never --config.dmg.title='Claude Code Monitor (Universal)'", - "win": "npm run build && electron-builder --win nsis --x64 --publish never", - "win:portable": "npm run build && electron-builder --win portable --x64 --publish never", - "test": "npm run build && node --test --test-reporter=spec tests/smoke.test.mjs", - "postinstall": "electron-builder install-app-deps" - }, - "dependencies": { - "better-sqlite3": "^11.7.0" - }, - "devDependencies": { - "@types/node": "^22.10.0", - "electron": "^35.7.0", - "electron-builder": "^25.1.8", - "typescript": "^5.5.4" - } -} diff --git a/desktop/scripts/build-icons.sh b/desktop/scripts/build-icons.sh deleted file mode 100755 index 4151b94..0000000 --- a/desktop/scripts/build-icons.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -# Generate icon.icns + tray-icon-Template.png{,@2x.png} from the SVG sources. -# -# Uses macOS-built-in tools only — no Homebrew or npm dependencies: -# * qlmanage : SVG → PNG via Quick Look (always present on macOS) -# * sips : PNG resize/format -# * iconutil : .iconset directory → .icns -# -# This script is idempotent. Run from desktop/ or from anywhere. -# Author: Nguyễn Ngọc Trí Vĩ -# @author Nguyễn Ngọc Trí Vĩ -set -euo pipefail - -HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ASSETS="$(cd "$HERE/../assets" && pwd)" - -require() { - command -v "$1" >/dev/null 2>&1 || { - echo "error: required tool '$1' not found. This script only runs on macOS." >&2 - exit 1 - } -} -require qlmanage -require sips -require iconutil - -cd "$ASSETS" - -echo ">>> rendering icon.svg → icon.png (1024)" -TMP="$(mktemp -d)" -trap 'rm -rf "$TMP"' EXIT -qlmanage -t -s 1024 -o "$TMP" icon.svg >/dev/null 2>&1 -mv "$TMP/icon.svg.png" icon.png - -echo ">>> building icon.iconset" -rm -rf icon.iconset -mkdir -p icon.iconset -for s in 16 32 64 128 256 512 1024; do - sips -z "$s" "$s" icon.png --out "icon.iconset/icon_${s}x${s}.png" >/dev/null -done -# Apple's @2x naming convention. -cp icon.iconset/icon_32x32.png icon.iconset/icon_16x16@2x.png -cp icon.iconset/icon_64x64.png icon.iconset/icon_32x32@2x.png -cp icon.iconset/icon_256x256.png icon.iconset/icon_128x128@2x.png -cp icon.iconset/icon_512x512.png icon.iconset/icon_256x256@2x.png -cp icon.iconset/icon_1024x1024.png icon.iconset/icon_512x512@2x.png -# Drop the 64-only file; iconutil dislikes unknown sizes. -rm -f icon.iconset/icon_64x64.png - -echo ">>> compiling icon.icns" -iconutil -c icns icon.iconset -o icon.icns -rm -rf icon.iconset - -echo ">>> rendering tray-icon-Template.png{,@2x.png} via Python" -# qlmanage flattens SVG against an opaque white background — the tray PNG -# ends up with alpha=255 everywhere and macOS template tinting turns the -# whole 22x22 bounding box white in the menu bar. Generate the RGBA PNG -# pixel-by-pixel instead. Geometry mirrors tray-icon.svg (22-unit viewBox). -require python3 -python3 - <<'PY' -import struct, zlib - -def make_png(width, height, pixels): - def chunk(tag, data): - return struct.pack('>I', len(data)) + tag + data + struct.pack('>I', zlib.crc32(tag + data)) - sig = b'\x89PNG\r\n\x1a\n' - ihdr = struct.pack('>IIBBBBB', width, height, 8, 6, 0, 0, 0) # 8-bit RGBA - raw = bytearray() - for y in range(height): - raw.append(0) - raw.extend(pixels[y*width*4:(y+1)*width*4]) - return sig + chunk(b'IHDR', ihdr) + chunk(b'IDAT', zlib.compress(bytes(raw), 9)) + chunk(b'IEND', b'') - -def draw(w, h, s): - px = bytearray(w * h * 4) # alpha=0 -> transparent - def rect(x, y, rw, rh): - for j in range(y, min(y+rh, h)): - for i in range(x, min(x+rw, w)): - o = (j*w + i) * 4 - px[o:o+4] = b'\x00\x00\x00\xff' # opaque black - rect(2*s, 14*s, 4*s, 7*s) - rect(9*s, 11*s, 4*s, 10*s) - rect(16*s, 5*s, 4*s, 16*s) - return px - -with open('tray-icon-Template.png', 'wb') as f: f.write(make_png(22, 22, draw(22, 22, 1))) -with open('tray-icon-Template@2x.png', 'wb') as f: f.write(make_png(44, 44, draw(44, 44, 2))) -PY - -echo ">>> done." -ls -la icon.icns tray-icon-Template.png tray-icon-Template@2x.png diff --git a/desktop/scripts/build-win-icon.ps1 b/desktop/scripts/build-win-icon.ps1 deleted file mode 100644 index f9294b2..0000000 --- a/desktop/scripts/build-win-icon.ps1 +++ /dev/null @@ -1,121 +0,0 @@ -<# -.SYNOPSIS - Generate assets/icon.ico from assets/icon.png — the Windows counterpart to - scripts/build-icons.sh (which produces icon.icns + the macOS tray PNGs). - -.DESCRIPTION - Uses only the .NET Framework's System.Drawing (always present on Windows) — - no ImageMagick, no npm dependency. icon.png is the 1024x1024 raster already - rendered from assets/icon.svg by the macOS icon pipeline; this script - downscales it to the standard Windows icon sizes and packs them into a - classic, maximally-compatible BMP-based .ico (32bpp BGRA + AND mask). That - format is what electron-builder embeds in the .exe and what NSIS uses for - the installer icon, and it renders correctly on Windows 7 through 11. - - Idempotent. Run from anywhere: - powershell -ExecutionPolicy Bypass -File desktop/scripts/build-win-icon.ps1 - -.NOTES - Author: Nguyễn Ngọc Trí Vĩ -#> -$ErrorActionPreference = 'Stop' -Add-Type -AssemblyName System.Drawing - -$here = Split-Path -Parent $MyInvocation.MyCommand.Path -$assets = Join-Path (Split-Path -Parent $here) 'assets' -$srcPng = Join-Path $assets 'icon.png' -$outIco = Join-Path $assets 'icon.ico' - -if (-not (Test-Path $srcPng)) { - throw "icon.png not found at $srcPng. Generate it first (scripts/build-icons.sh renders it from icon.svg)." -} - -# Standard Windows icon ladder. 256 is required by electron-builder; the small -# sizes keep the taskbar / Alt-Tab / tray crisp. -$sizes = 16, 24, 32, 48, 64, 128, 256 - -$src = [System.Drawing.Image]::FromFile($srcPng) -$entries = New-Object System.Collections.ArrayList - -try { - foreach ($s in $sizes) { - $bmp = New-Object System.Drawing.Bitmap($s, $s, [System.Drawing.Imaging.PixelFormat]::Format32bppArgb) - $g = [System.Drawing.Graphics]::FromImage($bmp) - $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic - $g.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality - $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality - $g.CompositingQuality = [System.Drawing.Drawing2D.CompositingQuality]::HighQuality - $g.Clear([System.Drawing.Color]::Transparent) - $g.DrawImage($src, 0, 0, $s, $s) - $g.Dispose() - - # Pull raw pixels: Format32bppArgb is stored little-endian as B,G,R,A — - # exactly the byte order a 32bpp DIB wants. Rows are top-down here. - $rect = New-Object System.Drawing.Rectangle(0, 0, $s, $s) - $data = $bmp.LockBits($rect, [System.Drawing.Imaging.ImageLockMode]::ReadOnly, [System.Drawing.Imaging.PixelFormat]::Format32bppArgb) - $stride = $data.Stride - $buf = New-Object byte[] ($stride * $s) - [System.Runtime.InteropServices.Marshal]::Copy($data.Scan0, $buf, 0, $buf.Length) - $bmp.UnlockBits($data) - $bmp.Dispose() - - # Build the DIB: BITMAPINFOHEADER(40) + XOR bitmap (bottom-up BGRA) + - # 1bpp AND mask (bottom-up, all zeros — alpha channel does the masking). - $ms = New-Object System.IO.MemoryStream - $bw = New-Object System.IO.BinaryWriter($ms) - $bw.Write([int]40) # biSize - $bw.Write([int]$s) # biWidth - $bw.Write([int]($s * 2)) # biHeight = XOR height + AND height - $bw.Write([int16]1) # biPlanes - $bw.Write([int16]32) # biBitCount - $bw.Write([int]0) # biCompression = BI_RGB - $bw.Write([int]0) # biSizeImage - $bw.Write([int]0) # biXPelsPerMeter - $bw.Write([int]0) # biYPelsPerMeter - $bw.Write([int]0) # biClrUsed - $bw.Write([int]0) # biClrImportant - - # XOR pixels, bottom-up. - for ($y = $s - 1; $y -ge 0; $y--) { - $bw.Write($buf, $y * $stride, 4 * $s) - } - # AND mask: 1 bit/pixel, each row padded to a 4-byte boundary, all zero. - $maskRow = [int]([math]::Floor((($s + 31) / 32)) * 4) - $zeros = New-Object byte[] ($maskRow) - for ($y = 0; $y -lt $s; $y++) { $bw.Write($zeros, 0, $maskRow) } - - $bw.Flush() - [void]$entries.Add([pscustomobject]@{ Size = $s; Data = $ms.ToArray() }) - $bw.Dispose(); $ms.Dispose() - } -} -finally { - $src.Dispose() -} - -# Assemble the .ico: ICONDIR header, then one ICONDIRENTRY per image, then data. -$out = New-Object System.IO.MemoryStream -$w = New-Object System.IO.BinaryWriter($out) -$w.Write([int16]0) # reserved -$w.Write([int16]1) # type = icon -$w.Write([int16]$entries.Count) # image count - -$offset = 6 + 16 * $entries.Count -foreach ($e in $entries) { - $dim = if ($e.Size -ge 256) { 0 } else { $e.Size } # 0 means 256 in the dir - $w.Write([byte]$dim) # width - $w.Write([byte]$dim) # height - $w.Write([byte]0) # palette color count - $w.Write([byte]0) # reserved - $w.Write([int16]1) # color planes - $w.Write([int16]32) # bits per pixel - $w.Write([int]$e.Data.Length) # size of image data - $w.Write([int]$offset) # offset of image data - $offset += $e.Data.Length -} -foreach ($e in $entries) { $w.Write($e.Data, 0, $e.Data.Length) } -$w.Flush() -[System.IO.File]::WriteAllBytes($outIco, $out.ToArray()) -$w.Dispose(); $out.Dispose() - -Write-Output ("Wrote {0} ({1:N0} bytes, sizes: {2})" -f $outIco, (Get-Item $outIco).Length, ($sizes -join ', ')) diff --git a/desktop/scripts/install.js b/desktop/scripts/install.js deleted file mode 100644 index 462b23b..0000000 --- a/desktop/scripts/install.js +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env node -/** - * @file Desktop dependency installer with actionable failure help. - * - * Thin wrapper around `npm install` (which still runs the `postinstall` - * `electron-builder install-app-deps` to rebuild native modules for Electron). - * On success it behaves exactly like a bare `npm install`. On failure — almost - * always the `better-sqlite3` native build — it prints the prerequisite - * guidance + the no-toolchain alternative commands, then exits non-zero so the - * normal command still fails loudly rather than silently leaving a half-set-up - * `node_modules`. - * @author Nguyễn Ngọc Trí Vĩ - */ - -const { spawnSync } = require("node:child_process"); -const path = require("node:path"); -const { printNativeDepHelp, hasBetterSqliteBinary } = require("./preflight"); - -const desktopRoot = path.resolve(__dirname, ".."); - -// On Windows `npm` is a `.cmd` shim that `spawnSync` can only launch via a -// shell; without this it fails with ENOENT. POSIX is unaffected. -const result = spawnSync("npm", ["install"], { - cwd: desktopRoot, - stdio: "inherit", - shell: process.platform === "win32", -}); - -// `npm install` failed outright (e.g. node-gyp could not find a compiler), or -// it "succeeded" but the native binary never landed (a prebuilt download was -// skipped). Either way the desktop app cannot boot — surface the fix and fail. -if (result.status !== 0) { - printNativeDepHelp("`npm install` failed while building the native better-sqlite3 module."); - process.exit(result.status || 1); -} - -if (!hasBetterSqliteBinary()) { - printNativeDepHelp("Dependencies installed, but the better-sqlite3 native binary is missing."); - process.exit(1); -} diff --git a/desktop/scripts/notarize.js b/desktop/scripts/notarize.js deleted file mode 100755 index 0df936e..0000000 --- a/desktop/scripts/notarize.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file electron-builder afterSign hook for Apple notarization. - * - * This is opt-in: it only does anything when all three Apple credentials - * are present as environment variables. In every other case (local builds, - * fork CI without secrets) the hook is a no-op. That keeps the default - * `npm run dmg` working for contributors without an Apple Developer - * account while letting the project maintainer flip a switch later. - * @author Nguyễn Ngọc Trí Vĩ - */ - -exports.default = async function notarizeIfConfigured(context) { - const { electronPlatformName, appOutDir, packager } = context; - if (electronPlatformName !== "darwin") return; - - const { APPLE_ID, APPLE_TEAM_ID, APPLE_APP_SPECIFIC_PASSWORD } = process.env; - if (!APPLE_ID || !APPLE_TEAM_ID || !APPLE_APP_SPECIFIC_PASSWORD) { - console.log("[notarize] Apple credentials not set — skipping notarization (ad-hoc only)."); - return; - } - - // Lazy-require: @electron/notarize is only needed when we actually notarize, - // so contributors without Apple credentials don't have to install it. - let notarize; - try { - ({ notarize } = require("@electron/notarize")); - } catch { - console.log( - "[notarize] Apple credentials present but @electron/notarize is not installed. Run `npm install --save-dev @electron/notarize` in desktop/." - ); - return; - } - - const appName = packager.appInfo.productFilename; - const appPath = `${appOutDir}/${appName}.app`; - console.log(`[notarize] notarizing ${appPath}`); - - await notarize({ - tool: "notarytool", - appBundleId: packager.appInfo.id, - appPath, - appleId: APPLE_ID, - appleIdPassword: APPLE_APP_SPECIFIC_PASSWORD, - teamId: APPLE_TEAM_ID, - }); - - console.log("[notarize] done"); -}; diff --git a/desktop/scripts/prebuild.js b/desktop/scripts/prebuild.js deleted file mode 100755 index 4a82ea4..0000000 --- a/desktop/scripts/prebuild.js +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env node -/** - * @file Pre-build guard. - * - * Ensures the desktop bundle has everything it needs before TypeScript - * compiles. Specifically: - * 1. The root repo's node_modules exists (Express + friends). - * 2. The client has been built (client/dist exists). In production mode the - * Express server serves the SPA from client/dist; if it's missing the - * DMG would ship a 404-only dashboard. - * 3. Asset PNGs exist (or we leave a clear warning — icons can be - * regenerated via scripts/build-icons.sh). - * 4. The desktop-local better-sqlite3 native binary matches this machine's - * CPU architecture. A prior `electron-builder --mac --x64/--arm64` build - * rebuilds it for the target arch; left mismatched it breaks `desktop:dev` - * and `desktop:test` with ERR_DLOPEN_FAILED. We rebuild it if so. - * @author Nguyễn Ngọc Trí Vĩ - */ - -const fs = require("node:fs"); -const path = require("node:path"); -const { spawnSync } = require("node:child_process"); -const { hasBetterSqliteBinary, printNativeDepHelp } = require("./preflight"); - -const desktopRoot = path.resolve(__dirname, ".."); -const repoRoot = path.resolve(__dirname, "..", ".."); -const clientDist = path.join(repoRoot, "client", "dist"); -const rootNodeModules = path.join(repoRoot, "node_modules"); -const assets = path.join(desktopRoot, "assets"); - -function run(cmd, args, opts = {}) { - // On Windows `npm`/`npx` are `.cmd` shims that `spawnSync` can only launch - // through a shell; without this it fails with ENOENT. POSIX is unaffected. - const result = spawnSync(cmd, args, { - stdio: "inherit", - shell: process.platform === "win32", - ...opts, - }); - if (result.status !== 0) { - throw new Error(`${cmd} ${args.join(" ")} failed with exit ${result.status}`); - } -} - -if (!fs.existsSync(rootNodeModules)) { - console.log("[prebuild] installing root dependencies…"); - run("npm", ["ci"], { cwd: repoRoot }); -} - -if (!fs.existsSync(clientDist) || !fs.existsSync(path.join(clientDist, "index.html"))) { - console.log("[prebuild] building client (client/dist missing)…"); - run("npm", ["ci"], { cwd: path.join(repoRoot, "client") }); - run("npm", ["run", "build"], { cwd: repoRoot }); -} - -const trayIcon = path.join(assets, "tray-icon-Template.png"); -if (!fs.existsSync(trayIcon)) { - console.warn( - "[prebuild] WARN: tray-icon-Template.png missing. Run `npm run build:icons` to regenerate from assets/icon.svg." - ); -} - -// Heal a better-sqlite3 native binary left built for the wrong CPU arch by a -// prior `electron-builder --mac --x64/--arm64` run. Without this, `desktop:dev` -// and `desktop:test` fail to load the module (ERR_DLOPEN_FAILED) until the -// contributor manually re-runs `npm run desktop:install`. -if (process.platform === "darwin") { - const bsNode = path.join( - desktopRoot, - "node_modules", - "better-sqlite3", - "build", - "Release", - "better_sqlite3.node" - ); - if (fs.existsSync(bsNode)) { - const desc = spawnSync("file", ["-b", bsNode], { encoding: "utf8" }).stdout || ""; - // A universal binary works on both arches; only act on a clear mismatch. - const universal = /universal/i.test(desc); - const wrongArch = - !universal && - ((process.arch === "arm64" && !/arm64/.test(desc)) || - (process.arch === "x64" && !/x86_64/.test(desc))); - if (wrongArch) { - console.log( - "[prebuild] better-sqlite3 is built for the wrong CPU arch (a prior DMG build left it that way) — rebuilding for this machine…" - ); - run("npx", ["electron-builder", "install-app-deps"], { cwd: desktopRoot }); - } - } -} - -// The embedded server `require`s better-sqlite3 at boot; without its native -// binary the desktop app dies with a fatal dialog after compiling cleanly. -// Catch it here (a build-time, copy-pasteable failure) rather than at runtime. -if (!hasBetterSqliteBinary()) { - printNativeDepHelp("The desktop-local better-sqlite3 native binary is missing."); - process.exit(1); -} - -console.log("[prebuild] ok"); diff --git a/desktop/scripts/preflight.js b/desktop/scripts/preflight.js deleted file mode 100644 index f95cbc6..0000000 --- a/desktop/scripts/preflight.js +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env node -/** - * @file Shared native-dependency preflight checks + actionable failure help. - * - * The desktop shell embeds the dashboard server in-process, which `require`s - * the native `better-sqlite3` module rebuilt against Electron's Node ABI. That - * build is the single most common setup failure: it needs either a C++ toolchain - * (to compile from source) or a Node version new enough to have a prebuilt - * binary. When it's missing we want a clear, copy-pasteable message instead of a - * raw node-gyp stack trace or a runtime "Cannot find module" deep inside boot. - * - * This module is shared by `install.js` (wraps the dependency install) and - * `prebuild.js` (gates every `desktop:*` build/dev script) so both surfaces - * print the same guidance. - * @author Nguyễn Ngọc Trí Vĩ - */ - -const fs = require("node:fs"); -const path = require("node:path"); - -const desktopRoot = path.resolve(__dirname, ".."); - -/** Absolute path to the compiled/prebuilt better-sqlite3 native binary. */ -function betterSqliteBinary() { - return path.join( - desktopRoot, - "node_modules", - "better-sqlite3", - "build", - "Release", - "better_sqlite3.node" - ); -} - -/** True when the Electron-ABI better-sqlite3 binary is present on disk. */ -function hasBetterSqliteBinary() { - return fs.existsSync(betterSqliteBinary()); -} - -/** - * Print prerequisite guidance and the no-toolchain alternative commands to - * stderr. Callers should `process.exit(1)` after this so the failing npm - * command exits non-zero (never leave the user thinking setup succeeded). - */ -function printNativeDepHelp(reason) { - const line = "─".repeat(74); - const out = (s) => process.stderr.write(s + "\n"); - out(""); - out(line); - out(" Claude Code Monitor — desktop native dependency setup did not complete"); - out(line); - if (reason) { - out(` ${reason}`); - out(""); - } - out(" The desktop app embeds the dashboard server, which needs the native"); - out(" 'better-sqlite3' module built for Electron's Node ABI. This typically"); - out(" fails for one of two reasons:"); - out(""); - out(" 1. No C++ build toolchain, so the module can't compile from source:"); - out(' • Windows: install "Visual Studio Build Tools" with the'); - out(' "Desktop development with C++" workload.'); - out(" • macOS: xcode-select --install"); - out(" • Linux: install build-essential + python3."); - out(""); - out(" 2. Your Node.js is newer than any published better-sqlite3 prebuilt"); - out(` binary (you are on Node ${process.version}). A Node LTS (20 or 22)`); - out(" ships prebuilt binaries and avoids the compile entirely."); - out(""); - out(" Or skip the source build and fetch Electron's prebuilt binary directly"); - out(" (no C++ toolchain needed):"); - out(""); - out(" cd desktop"); - out(" npm install --ignore-scripts"); - out(" node node_modules/electron/install.js"); - out(" npx electron-builder install-app-deps"); - out(""); - out(line); - out(""); -} - -module.exports = { betterSqliteBinary, hasBetterSqliteBinary, printNativeDepHelp }; diff --git a/desktop/src/constants.ts b/desktop/src/constants.ts deleted file mode 100644 index 5897110..0000000 --- a/desktop/src/constants.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @file constants.ts - * @description Shared compile-time constants for the Electron desktop shell. - * Values here must stay aligned with `electron-builder.yml` (app ID), the - * documented default dashboard port, and the embedded server health probe in - * `server-host.ts`. - * - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Public surface - * - `APP_NAME` — exported API; see TSDoc on the symbol for behavior. - * - `APP_ID` — exported API; see TSDoc on the symbol for behavior. - * - `PREFERRED_PORT` — exported API; see TSDoc on the symbol for behavior. - * - `FALLBACK_PORT_RANGE` — exported API; see TSDoc on the symbol for behavior. - * - `HEALTH_TIMEOUT_MS` — exported API; see TSDoc on the symbol for behavior. - * - `DEFAULT_WINDOW` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **APP_NAME** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **APP_ID** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **PREFERRED_PORT** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **FALLBACK_PORT_RANGE** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **HEALTH_TIMEOUT_MS** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **DEFAULT_WINDOW** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -/** Human-readable product name shown in window title and About menu. */ -export const APP_NAME = "Claude Code Monitor"; - -/** - * Application identifier. Must match `appId` in electron-builder.yml: on Windows - * we hand it to `app.setAppUserModelId()` so toast notifications attribute to - * the installed Start-Menu shortcut (NSIS writes the same AUMID there) instead - * of appearing as a generic "electron.app" toast — and so taskbar windows group - * under one icon. Ignored on macOS/Linux. - */ -export const APP_ID = "com.vn.smartgift.ccam.desktop"; - -/** - * Preferred dashboard port — matches the project's documented default. Also - * the only port `server-host.ts`'s `startEmbeddedServer` will *adopt* an - * already-healthy server on; a server found on any other port is never - * treated as "ours" to reuse. - */ -export const PREFERRED_PORT = 4820; - -/** - * Last-resort port scan range when `PREFERRED_PORT` and its nine immediate - * fallbacks (4821–4829) are all taken. Set to the IANA-registered - * dynamic/private port range (49152–65535, truncated here to 49500 — far more - * headroom than `pickFreePort()` should ever need) so we never guess at a - * port some other, unrelated service might be registered on. - */ -export const FALLBACK_PORT_RANGE = { min: 49152, max: 49500 } as const; - -/** - * How long `server-host.ts`'s `waitForHealthy()` polls a freshly bound port - * for `/api/health` before giving up and surfacing an error dialog to the - * user. 30s comfortably covers a cold start on a slow disk (SQLite file - * creation, migrations) without leaving the user staring at a spinner - * indefinitely if something is actually broken. - */ -export const HEALTH_TIMEOUT_MS = 30_000; - -/** Default window size, used only when no `window-state.json` exists yet - * (first launch). Persisted to `app.getPath('userData')` after that — see - * `window.ts`'s `loadState`/`saveState`. */ -export const DEFAULT_WINDOW = { width: 1280, height: 800 } as const; diff --git a/desktop/src/logger.ts b/desktop/src/logger.ts deleted file mode 100644 index 7aa978c..0000000 --- a/desktop/src/logger.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @file Lightweight file logger for the desktop shell. - * - * Electron's main process has no console attached when launched from Finder, - * so all diagnostics go to a per-user log file under app.getPath('logs'). - * We deliberately avoid the `electron-log` dependency — the project keeps a - * small dependency tree and this file does the only three things we need. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Public surface - * - `log` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **log** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import { app } from "electron"; -import * as fs from "node:fs"; -import * as path from "node:path"; - -let stream: fs.WriteStream | null = null; -let logPath = ""; - -/** - * Lazily open the append-mode write stream to `desktop.log`, creating the - * `app.getPath('logs')` directory if this is the first write of the process. - * Cached in the module-level `stream` so every subsequent `write()` call - * reuses the same file descriptor instead of re-opening the file. - */ -function ensureStream(): fs.WriteStream { - if (stream) return stream; - const dir = app.getPath("logs"); - fs.mkdirSync(dir, { recursive: true }); - logPath = path.join(dir, "desktop.log"); - stream = fs.createWriteStream(logPath, { flags: "a" }); - return stream; -} - -/** - * Format one log line (ISO timestamp + level + space-joined parts) and fan it - * out to the log file and, conditionally, to the process streams: - * - `error` always echoes to `stderr`, so a crash is visible even without - * `CCAM_DESKTOP_VERBOSE` (e.g. when Electron is launched from a terminal). - * - `info`/`warn` only echo to `stdout` when `CCAM_DESKTOP_VERBOSE` is set, - * keeping a normal launch quiet. - * The file write is wrapped in try/catch — a logging failure (e.g. a full - * disk) must never take down the app. - */ -function write(level: "info" | "warn" | "error", parts: unknown[]): void { - const line = `${new Date().toISOString()} [${level}] ${parts - .map((p) => (typeof p === "string" ? p : safeStringify(p))) - .join(" ")}\n`; - try { - ensureStream().write(line); - } catch { - // Logging must never crash the app. - } - if (level === "error") { - process.stderr.write(line); - } else if (process.env.CCAM_DESKTOP_VERBOSE) { - process.stdout.write(line); - } -} - -/** `JSON.stringify` a non-string log argument, falling back to `String()` for - * values it can't serialize (e.g. circular objects or `BigInt`). */ -function safeStringify(value: unknown): string { - try { - return JSON.stringify(value); - } catch { - return String(value); - } -} - -/** - * The desktop shell's only logging surface. Electron's main process has no - * attached console when launched from Finder/Dock, so every call here is - * durably persisted to `desktop.log` (see `ensureStream`) in addition to the - * conditional stdout/stderr echo described in `write`. - */ -export const log = { - info: (...parts: unknown[]) => write("info", parts), - warn: (...parts: unknown[]) => write("warn", parts), - error: (...parts: unknown[]) => write("error", parts), - /** Absolute path to the active log file (populated after first write). */ - path: () => logPath, -}; diff --git a/desktop/src/login-item.ts b/desktop/src/login-item.ts deleted file mode 100644 index 8ee0d96..0000000 --- a/desktop/src/login-item.ts +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @file Open-at-login integration (macOS Login Items + Windows startup). - * - * Both platforms go through Electron's first-party `app.*LoginItemSettings` - * API — no third-party deps, no hand-rolled plist or registry edits: - * - macOS: wraps the modern `SMAppService` / `ServiceManagement` framework - * (macOS 13+), so the toggle appears in System Settings → General → - * Login Items where users expect to manage it. - * - Windows: writes an entry under the per-user - * `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` registry key (the - * standard startup location), which shows up in Task Manager → Startup. - * - * Linux has no Electron-supported equivalent, so the toggle is a no-op there. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Public surface - * - `isOpenAtLogin` — exported API; see TSDoc on the symbol for behavior. - * - `setOpenAtLogin` — exported API; see TSDoc on the symbol for behavior. - * - `toggleOpenAtLogin` — exported API; see TSDoc on the symbol for behavior. - * - `launchedAtLogin` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **isOpenAtLogin** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **setOpenAtLogin** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **toggleOpenAtLogin** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **launchedAtLogin** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import { app } from "electron"; - -/** - * CLI flag we register the Windows startup entry with, then look for in - * `process.argv` to recognise a login-triggered launch (Windows has no - * `wasOpenedAtLogin`). Harmless if it ever reaches another code path. - */ -const WIN_LAUNCH_FLAG = "--ccam-hidden"; - -/** True on macOS and Windows — the only platforms Electron can register an - * auto-start entry for. Every exported function below is a no-op on Linux. */ -function supported(): boolean { - return process.platform === "darwin" || process.platform === "win32"; -} - -/** - * Read the current auto-start state directly from the OS (macOS Login Items - * or the Windows `Run` key), not from any value cached by this module — so it - * stays correct even if the user disables the entry from outside the app - * (e.g. macOS System Settings, or Windows Task Manager → Startup). - */ -export function isOpenAtLogin(): boolean { - if (!supported()) return false; - return app.getLoginItemSettings().openAtLogin; -} - -/** - * Enable or disable launching the app at login. Delegates entirely to - * `app.setLoginItemSettings`, which picks the platform mechanism: - * - **Windows** — writes/removes the per-user - * `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` entry, tagged with - * `WIN_LAUNCH_FLAG` so a subsequent launch can be recognised as - * login-triggered (see `launchedAtLogin`). - * - **macOS** — registers via the modern `SMAppService` API and starts the - * app hidden (see the `openAsHidden` comment below). - * No-op on Linux, where Electron has no supported mechanism. - */ -export function setOpenAtLogin(enabled: boolean): void { - if (!supported()) return; - if (process.platform === "win32") { - app.setLoginItemSettings({ - openAtLogin: enabled, - // Tag the registry Run entry so launchedAtLogin() can tell a login-time - // start apart from the user double-clicking the app. - args: [WIN_LAUNCH_FLAG], - }); - return; - } - app.setLoginItemSettings({ - openAtLogin: enabled, - // Start hidden — the user just logged in, they didn't ask for a window - // to appear. The tray icon makes the app's presence obvious. (macOS only; - // `openAsHidden` is ignored on other platforms.) - openAsHidden: true, - }); -} - -/** - * Flip the auto-start setting and return the new state. Used by both the - * tray "Open at Login" checkbox and the application menu item — each reads - * `isOpenAtLogin()` to render its own checked state, then calls this on click. - */ -export function toggleOpenAtLogin(): boolean { - const next = !isOpenAtLogin(); - setOpenAtLogin(next); - return next; -} - -/** - * Returns true if the current process was launched at login (as opposed to the - * user double-clicking the app). When true, we keep the window hidden and only - * show the tray icon. - * - * macOS reports this directly via `wasOpenedAtLogin`. Windows has no such flag, - * so we detect the marker argument we registered the startup entry with. - */ -export function launchedAtLogin(): boolean { - if (process.platform === "darwin") { - return app.getLoginItemSettings().wasOpenedAtLogin; - } - if (process.platform === "win32") { - return process.argv.includes(WIN_LAUNCH_FLAG); - } - return false; -} diff --git a/desktop/src/main.ts b/desktop/src/main.ts deleted file mode 100644 index d148cc9..0000000 --- a/desktop/src/main.ts +++ /dev/null @@ -1,377 +0,0 @@ -/** - * @file Electron main process entry point. - * - * Lifecycle: - * 1. App ready → start (or adopt) the embedded Express server. - * 2. Build the application menu + system tray. - * 3. Open the dashboard window (skipped when launched at login). - * 4. On `window-all-closed`: keep the app running (tray-only mode). - * 5. On `before-quit`: gracefully stop the server if we own it. - * - * Single-instance is enforced on every platform via `requestSingleInstanceLock` - * so double-launching (a second Dock click, or the Windows Start-Menu shortcut) - * just focuses the existing window instead of spawning a second tray + server. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Internal dependencies - * - `./constants` - * - `./login-item` - * - `./logger` - * - `./menu` - * - `./server-host` - * - `./shell-path` - * - `./tray` - * - `./window` - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ - -import { BrowserWindow, Notification, app, dialog, shell } from "electron"; - -import { APP_ID, APP_NAME } from "./constants"; -import { isOpenAtLogin, launchedAtLogin, toggleOpenAtLogin } from "./login-item"; -import { log } from "./logger"; -import { focusOrCreateWindow, installApplicationMenu } from "./menu"; -import { - closeEmbeddedDatabase, - getServerSnapshot, - refreshServerSnapshot, - startEmbeddedServer, - startSnapshotPolling, - type ServerHandle, -} from "./server-host"; -import { ensureUserPath } from "./shell-path"; -import { createTray } from "./tray"; -import { appIconPath, createDashboardWindow } from "./window"; - -/** Single mutable record of process-wide state, held in the module-level - * `state` singleton below rather than passed around — this main-process - * entry point has exactly one window, one tray, and one server, so a class - * or a dependency-injected context would add indirection without benefit. */ -interface AppState { - /** `null` until `startEmbeddedServer()` resolves during `boot()`. */ - serverHandle: ServerHandle | null; - /** `null` when hidden/not-yet-created; a live window still counts even - * while hidden by a `close` — see the `win.on("close", ...)` handler. */ - win: BrowserWindow | null; - // Hold a reference to the tray so the GC doesn't collect it (electron quirk). - tray: Electron.Tray | null; - /** Set once teardown has begun (inside `requestQuit`'s confirm callback or - * the bypass path in `before-quit`); gates re-entrant quit handling. */ - quitting: boolean; - /** True while the quit-confirmation dialog is open; a second ⌘Q in this - * window bypasses the dialog and lets macOS quit immediately. */ - confirmingQuit: boolean; -} - -const state: AppState = { - serverHandle: null, - win: null, - tray: null, - quitting: false, - confirmingQuit: false, -}; - -/** - * Show the "Quit Claude Code Monitor?" confirmation dialog. Clicking Quit - * runs the synchronous teardown and exits. Pressing ⌘Q again while the - * dialog is open is caught by `before-quit` below and skips this prompt. - */ -function requestQuit(): void { - if (state.quitting || state.confirmingQuit) return; - state.confirmingQuit = true; - // On macOS a second ⌘Q while this dialog is open bypasses it (handled in - // `before-quit`); mention that shortcut only where it applies. - const quitAccel = process.platform === "darwin" ? "⌘Q" : "Ctrl+Q"; - const opts: Electron.MessageBoxOptions = { - type: "question", - buttons: ["Quit", "Cancel"], - defaultId: 0, - cancelId: 1, - title: APP_NAME, - message: "Quit Claude Code Monitor?", - detail: - "The embedded server will stop and your dashboard window will close. " + - `Press ${quitAccel} again to skip this prompt and quit immediately.`, - noLink: true, - }; - const parent = state.win && !state.win.isDestroyed() ? state.win : undefined; - const promise = parent ? dialog.showMessageBox(parent, opts) : dialog.showMessageBox(opts); - void promise - .then((result) => { - state.confirmingQuit = false; - if (result.response === 0) { - state.quitting = true; - if (state.serverHandle?.ownedByUs) closeEmbeddedDatabase(); - app.exit(0); - } - }) - .catch(() => { - state.confirmingQuit = false; - }); -} - -/** - * The single entry point every "open the dashboard" action goes through - * (dock/tray click, menu item, `second-instance`, macOS `activate`). Delegates - * to `focusOrCreateWindow` to reuse an existing window when possible, and - * otherwise builds one with `createDashboardWindow` and wires its `close` - * handler to hide-not-destroy (see the inline comment below). - * - * @throws If called before `startEmbeddedServer()` has resolved — there is no - * URL to point the window at yet. `boot()` guarantees this can't happen on - * the normal startup path. - */ -function ensureWindow(): BrowserWindow { - if (!state.serverHandle) { - throw new Error("Cannot create window before the server is up."); - } - return focusOrCreateWindow(state.win, () => { - const win = createDashboardWindow(state.serverHandle!.url); - state.win = win; - win.on("close", (event) => { - if (state.quitting) return; - // On macOS, "close" means "hide" — the tray stays, the server stays. - // We deliberately do NOT call `app.dock.hide()` here. With the red - // close button leaving the app running, the user needs a visible - // indication that it is still alive. The dock icon (clickable to - // re-open the window) is exactly that signal; the menu-bar tray - // icon backs it up. Login-launched startup is the only path that - // hides the dock, since that user explicitly asked for unobtrusive - // background behaviour. - event.preventDefault(); - win.hide(); - }); - return win; - }); -} - -/** - * Handler for the "Restart Server" menu/tray action. Stops the current - * server only if we own it (an adopted external server is left untouched — - * we have no business killing a process we didn't start), starts a fresh - * one via `startEmbeddedServer()` (which re-runs port adoption/selection - * from scratch), reloads the dashboard window at the new URL if one is - * open, and surfaces a native notification so the user has confirmation the - * click did something. - */ -async function restartServer(): Promise { - log.info("restarting server"); - if (state.serverHandle?.ownedByUs) { - await state.serverHandle.stop(); - } - state.serverHandle = await startEmbeddedServer(); - if (state.win && !state.win.isDestroyed()) { - state.win - .loadURL(state.serverHandle.url) - .catch((err) => log.error("reload after restart failed", err)); - } - new Notification({ title: APP_NAME, body: "Server restarted." }).show(); -} - -/** Reveal `desktop.log` in the OS file browser (Finder/Explorer), or log a - * no-op note if no line has been written yet (so `log.path()` is empty). */ -function openLogs(): void { - const p = log.path(); - if (p) { - void shell.showItemInFolder(p); - } else { - log.info("(no log file yet)"); - } -} - -/** Open the dashboard's URL in the user's default system browser. A no-op - * before the server has started, since there is no URL yet. */ -function openInBrowser(): void { - if (state.serverHandle) void shell.openExternal(state.serverHandle.url); -} - -/** Show a blocking native error dialog. Used only for conditions the user - * must see immediately and cannot recover from without restarting the app - * (e.g. the embedded server failing to boot at all). */ -function showFatalDialog(message: string, detail?: string): void { - dialog.showErrorBox(`${APP_NAME} — Error`, detail ? `${message}\n\n${detail}` : message); -} - -/** - * Runs once, after Electron fires `app.whenReady()`. Performs the full - * startup sequence documented in the file header: recover the shell `PATH`, - * boot (or adopt) the embedded server, install the application menu and - * tray, start the tray's snapshot poller, then open the dashboard window — - * unless this launch was triggered by the OS at login, in which case the app - * stays tray-only. A server-boot failure here is fatal: it shows a blocking - * error dialog and exits the process, since there is nothing useful the app - * can do without its server. - */ -async function boot(): Promise { - // macOS only shows the bundle's .icns in the Dock; an unpackaged `desktop:dev` - // run otherwise displays the generic Electron icon. Set it explicitly so the - // dev Dock matches the packaged app (Windows/Linux get theirs via the - // BrowserWindow `icon`). Wrapped in try/catch — purely cosmetic. - if (process.platform === "darwin" && !app.isPackaged) { - const icon = appIconPath(); - if (icon) { - try { - app.dock?.setIcon(icon); - } catch (err) { - log.warn("could not set dev dock icon", err); - } - } - } - - // Recover the user's shell PATH before the server boots — a Finder/Dock or - // login-launched app only inherits launchd's minimal PATH, which makes the - // "Run Claude" feature unable to find the `claude` CLI. - ensureUserPath(); - - try { - state.serverHandle = await startEmbeddedServer(); - } catch (err) { - log.error("server failed to start", err); - showFatalDialog( - "The dashboard server failed to start.", - err instanceof Error ? err.message : String(err) - ); - app.exit(1); - return; - } - - installApplicationMenu({ - showDashboard: () => ensureWindow(), - reloadDashboard: () => state.win?.webContents.reload(), - restartServer: () => { - void restartServer().catch((err) => - showFatalDialog("Could not restart the server.", String(err)) - ); - }, - openLogs, - toggleOpenAtLogin: () => { - const next = toggleOpenAtLogin(); - log.info("open-at-login set to", next); - }, - isOpenAtLogin, - }); - - state.tray = createTray({ - showDashboard: () => ensureWindow(), - restartServer: () => { - void restartServer().catch((err) => - showFatalDialog("Could not restart the server.", String(err)) - ); - }, - openLogs, - openInBrowser, - toggleOpenAtLogin: () => toggleOpenAtLogin(), - isOpenAtLogin, - serverPort: () => state.serverHandle?.port ?? null, - getSnapshot: () => getServerSnapshot(), - refreshSnapshot: () => void refreshServerSnapshot(state.serverHandle?.port ?? null), - requestQuit, - }); - - // Keep the tray's live counts fresh by polling the running server's stats - // API on an interval (and on each menu open via refreshSnapshot above). - startSnapshotPolling(() => state.serverHandle?.port ?? null); - - // Skip the dashboard window when macOS launched us at login — the user just - // logged in, they don't want a window jumping in their face. Tray only. - if (!launchedAtLogin()) { - ensureWindow(); - } else { - log.info("launched at login — staying tray-only"); - if (process.platform === "darwin") app.dock?.hide(); - } -} - -/** - * Register the app-level lifecycle handlers. Called synchronously before - * `app.whenReady()` so the single-instance lock and `before-quit` interception - * are in place from the very first tick — there is no window yet to race - * against. - * - * `requestSingleInstanceLock()` is what makes a second launch (a second Dock - * click, or double-clicking the Start-Menu shortcut again) just focus the - * existing window instead of spawning a second tray + embedded server, which - * would otherwise fight over the same port and SQLite file. - */ -function wireLifecycle(): void { - // Single-instance lock: second launches just focus the first window. - const gotLock = app.requestSingleInstanceLock(); - if (!gotLock) { - app.exit(0); - return; - } - app.on("second-instance", () => { - if (state.serverHandle) ensureWindow(); - }); - - app.on("activate", () => { - if (state.serverHandle) ensureWindow(); - }); - - app.on("window-all-closed", () => { - // Stay alive: tray + server keep running on every platform. - }); - - app.on("before-quit", (event) => { - // Second ⌘Q while the confirm dialog is up — bypass the prompt and let - // macOS quit. We still close the SQLite handle on the way out so WAL is - // checkpointed cleanly. - if (state.confirmingQuit) { - state.quitting = true; - if (state.serverHandle?.ownedByUs) closeEmbeddedDatabase(); - return; - } - if (state.quitting) return; - if (state.serverHandle?.ownedByUs) { - event.preventDefault(); - requestQuit(); - } - }); -} - -app.setName(APP_NAME); -// Windows: associate this process with the installed app's AppUserModelID so -// `new Notification()` toasts (e.g. "Server restarted") render under the app's -// name/icon and taskbar windows group correctly. Must be set before any window -// or notification is created. No-op on macOS/Linux. -if (process.platform === "win32") app.setAppUserModelId(APP_ID); -wireLifecycle(); -app - .whenReady() - .then(boot) - .catch((err) => { - log.error("fatal during boot", err); - showFatalDialog("Fatal error during startup.", String(err)); - app.exit(1); - }); diff --git a/desktop/src/menu.ts b/desktop/src/menu.ts deleted file mode 100644 index ef006be..0000000 --- a/desktop/src/menu.ts +++ /dev/null @@ -1,258 +0,0 @@ -/** - * @file Native application menu (the macOS top-bar menu). - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Internal dependencies - * - `./constants` - * - * ## Public surface - * - `MenuActions` — exported API; see TSDoc on the symbol for behavior. - * - `installApplicationMenu` — exported API; see TSDoc on the symbol for behavior. - * - `focusOrCreateWindow` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **MenuActions** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **installApplicationMenu** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **focusOrCreateWindow** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import { BrowserWindow, Menu, app, shell, type MenuItemConstructorOptions } from "electron"; - -import { APP_NAME } from "./constants"; - -/** Callbacks the menu wires to its items. `main.ts` supplies these, sharing - * the same handlers passed to `createTray` so both surfaces stay consistent. */ -export interface MenuActions { - /** Bring the dashboard window to front, creating it if it doesn't exist. */ - showDashboard: () => void; - /** Reload the currently loaded dashboard page (`webContents.reload()`). */ - reloadDashboard: () => void; - /** Stop and re-launch the embedded server, then reload the window. */ - restartServer: () => void; - /** Reveal `desktop.log` in the OS file browser. */ - openLogs: () => void; - /** Flip the OS auto-start-at-login registration. */ - toggleOpenAtLogin: () => void; - /** Read the current auto-start state, used to render the checkbox. */ - isOpenAtLogin: () => boolean; -} - -/** - * Build and install the native application menu (the macOS global menu bar; - * the per-window menu on Windows/Linux) and return it. - * - * Structure: an macOS-only app submenu (About, Open at Login, Services, - * Hide/Quit) prepended to standard File / Edit / View / Window / Help menus. - * Item visibility and roles branch on `process.platform === "darwin"` in a - * handful of places — see the inline comments on the `File ▸ Open Dashboard` - * item and the `Window` submenu for why those specific items are macOS-only. - */ -export function installApplicationMenu(actions: MenuActions): Menu { - const isMac = process.platform === "darwin"; - - const template: MenuItemConstructorOptions[] = [ - ...(isMac - ? ([ - { - label: APP_NAME, - submenu: [ - { role: "about" }, - { type: "separator" }, - { - label: "Open at Login", - type: "checkbox", - checked: actions.isOpenAtLogin(), - click: () => actions.toggleOpenAtLogin(), - }, - { type: "separator" }, - { role: "services" }, - { type: "separator" }, - { role: "hide" }, - { role: "hideOthers" }, - { role: "unhide" }, - { type: "separator" }, - { role: "quit" }, - ], - }, - ] satisfies MenuItemConstructorOptions[]) - : []), - { - label: "File", - submenu: [ - // "Open Dashboard" is macOS-only. On macOS the menu bar is global and - // persists after the window is closed/hidden, so this item (and Cmd+1) - // genuinely reopens it. On Windows/Linux the menu is attached to the - // window itself and a menu accelerator only fires while that window is - // already focused/foreground — so the item could only ever run when the - // window is already up, making it a confusing no-op. Reopening from a - // hidden/tray state is handled by the tray's own "Open Dashboard" there. - ...(isMac - ? ([ - { - label: "Open Dashboard", - accelerator: "CmdOrCtrl+1", - click: () => actions.showDashboard(), - }, - ] satisfies MenuItemConstructorOptions[]) - : []), - { - // No accelerator here: the View menu's `reload` role already owns - // CmdOrCtrl+R. Two menu items sharing one accelerator triggers an - // Electron duplicate-accelerator warning at startup. - label: "Reload Dashboard", - click: () => actions.reloadDashboard(), - }, - { type: "separator" }, - { - label: "Restart Server", - click: () => actions.restartServer(), - }, - { - label: "Show Logs", - click: () => actions.openLogs(), - }, - { type: "separator" }, - isMac ? { role: "close" } : { role: "quit" }, - ], - }, - { - label: "Edit", - submenu: [ - { role: "undo" }, - { role: "redo" }, - { type: "separator" }, - { role: "cut" }, - { role: "copy" }, - { role: "paste" }, - { role: "selectAll" }, - ], - }, - { - label: "View", - submenu: [ - { role: "reload" }, - { role: "forceReload" }, - { role: "toggleDevTools" }, - { type: "separator" }, - { role: "resetZoom" }, - { role: "zoomIn" }, - { role: "zoomOut" }, - { type: "separator" }, - { role: "togglefullscreen" }, - ], - }, - { - label: "Window", - submenu: [ - { role: "minimize" }, - { role: "zoom" }, - ...(isMac - ? ([ - { type: "separator" }, - { role: "front" }, - { type: "separator" }, - { role: "window" }, - ] satisfies MenuItemConstructorOptions[]) - : ([{ role: "close" }] satisfies MenuItemConstructorOptions[])), - ], - }, - { - role: "help", - submenu: [ - { - label: "Project on GitHub", - click: () => - void shell.openExternal("https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor"), - }, - { - label: "Report an Issue", - click: () => - void shell.openExternal( - "https://git.smartgift.io.vn/Smartgift-AI/Claude-Code-Monitor/issues/new/choose" - ), - }, - { - label: `${APP_NAME} v${app.getVersion()}`, - enabled: false, - }, - ], - }, - ]; - - const menu = Menu.buildFromTemplate(template); - Menu.setApplicationMenu(menu); - return menu; -} - -/** - * Bring the dashboard window to focus, creating one via the supplied factory - * if needed. Shared by `main.ts`'s `ensureWindow` for every "open the - * dashboard" entry point (dock click, tray click, menu item, second-instance - * relaunch) so they all get the same restore/show/focus sequence. - * - * @param existing The current window reference, or `null`/destroyed if none. - * @param create Factory invoked only when `existing` is missing or destroyed. - * @returns The existing (now focused) window, or the newly created one. - */ -export function focusOrCreateWindow( - existing: BrowserWindow | null, - create: () => BrowserWindow -): BrowserWindow { - if (existing && !existing.isDestroyed()) { - if (existing.isMinimized()) existing.restore(); - // Call show() unconditionally (not just when hidden): on Windows a bare - // focus() on a visible-but-background window often only flashes the taskbar - // button instead of raising it, whereas show() reliably activates and - // brings it to the foreground. Harmless when the window is already frontmost. - existing.show(); - existing.focus(); - return existing; - } - return create(); -} diff --git a/desktop/src/preload.ts b/desktop/src/preload.ts deleted file mode 100644 index fce92f4..0000000 --- a/desktop/src/preload.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file Preload script. - * - * The dashboard runs as standard web content loaded from - * `http://127.0.0.1:`. It does not need privileged APIs to function; - * keeping this preload empty is intentional and keeps the attack surface - * minimal. Renderer-side desktop helpers (e.g. native notification routing) - * can be added here later via `contextBridge.exposeInMainWorld` if the - * dashboard ever wants to call them. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ - -export {}; diff --git a/desktop/src/server-host.ts b/desktop/src/server-host.ts deleted file mode 100644 index 0adf16a..0000000 --- a/desktop/src/server-host.ts +++ /dev/null @@ -1,556 +0,0 @@ -/** - * @file Hosts the existing Express server in-process. - * - * The dashboard's `server/index.js` already exports `{ createApp, startServer }` - * and serves the built React client (`client/dist`) as static assets in - * production. We import that module directly — no child process, no IPC, no - * port marshalling — and start it on a free port. The whole thing keeps the - * desktop shell to "Electron is a window onto the same code." - * - * If another process is already listening on the preferred port and that - * process answers `/api/health` with `{ status: "ok" }`, we adopt it instead - * of starting a second server. This covers the case where the user already - * runs `npm start` in a terminal — we should not double-bind. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Internal dependencies - * - `./constants` - * - `./logger` - * - * ## Public surface - * - `ServerHandle` — exported API; see TSDoc on the symbol for behavior. - * - `ServerSnapshot` — exported API; see TSDoc on the symbol for behavior. - * - `getServerSnapshot` — exported API; see TSDoc on the symbol for behavior. - * - `refreshServerSnapshot` — exported API; see TSDoc on the symbol for behavior. - * - `startSnapshotPolling` — exported API; see TSDoc on the symbol for behavior. - * - `closeEmbeddedDatabase` — exported API; see TSDoc on the symbol for behavior. - * - `startEmbeddedServer` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **ServerHandle** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **ServerSnapshot** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **getServerSnapshot** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **refreshServerSnapshot** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **startSnapshotPolling** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **closeEmbeddedDatabase** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **startEmbeddedServer** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import * as fs from "node:fs"; -import * as http from "node:http"; -import Module from "node:module"; -import * as net from "node:net"; -import * as path from "node:path"; -import { app } from "electron"; - -import { FALLBACK_PORT_RANGE, HEALTH_TIMEOUT_MS, PREFERRED_PORT } from "./constants"; -import { log } from "./logger"; - -/** - * Redirect `require("better-sqlite3")` from anywhere in the embedded server - * to the copy in `desktop/node_modules`, which has been rebuilt against - * Electron's Node ABI by `electron-builder install-app-deps`. The repo-root - * copy is intentionally left built for the system Node so `npm run test:server` - * continues to work for contributors. This patch is process-local — it does - * not affect any other Node process. - * - * The patch is installed exactly once before we require the server module. - */ -let nativeModulesPatched = false; -function ensureNativeModulesPatched(): void { - if (nativeModulesPatched) return; - nativeModulesPatched = true; - - // Resolve the desktop-local better-sqlite3 from this file's location so we - // get the ABI-correct binary regardless of where the require originates. - let desktopBetterSqlite: string; - try { - desktopBetterSqlite = require.resolve("better-sqlite3"); - } catch (err) { - log.warn("could not pre-resolve desktop better-sqlite3; server may fall back", err); - return; - } - - // Module._resolveFilename is Node's internal lookup. We override it to - // short-circuit "better-sqlite3" requests; everything else passes through. - // Using a typed shim instead of `any` to keep strict mode honest. - type ResolveFn = ( - request: string, - parent: NodeJS.Module | null | undefined, - isMain: boolean, - options?: { paths?: string[] } - ) => string; - const mod = Module as unknown as { _resolveFilename: ResolveFn }; - const original = mod._resolveFilename.bind(Module); - mod._resolveFilename = function (request, parent, isMain, options) { - if (request === "better-sqlite3") return desktopBetterSqlite; - return original(request, parent, isMain, options); - }; - log.info("native module redirect installed", { betterSqlite3: desktopBetterSqlite }); -} - -export interface ServerHandle { - /** Origin (e.g. `http://127.0.0.1:4820`) used by the window. */ - url: string; - port: number; - /** True when the server is owned by us (and we should stop it on quit). */ - ownedByUs: boolean; - /** Gracefully close the HTTP server. A no-op when `ownedByUs` is false — - * an adopted server belongs to whatever process started it, and this app - * must never shut it down out from under that process. */ - stop: () => Promise; -} - -/** - * The subset of `server/index.js`'s exports this file calls. Kept as an - * `unknown`-typed shim (rather than importing the JS module's real types) - * because `server/` is plain JavaScript with no `.d.ts`, and the desktop - * workspace's `tsconfig.json` builds in `strict` mode — this interface is the - * hand-written contract between the two. - */ -interface ServerModule { - createApp: () => unknown; - startServer: (app: unknown, port: number) => Promise; - startBackgroundServices: () => void; -} - -/** - * One-time bootstrap of the services that the standalone `node server/index.js` - * path runs from its `require.main === module` block — the update scheduler, - * the Claude Code config watcher, orphaned-run reconciliation, and Claude Code - * hook installation. The desktop shell `require()`s the server module, so that - * block never fires; without this the embedded server is a degraded copy. - * - * Guarded so a "Restart Server" does not double-register schedulers/watchers. - */ -let backgroundServicesStarted = false; -function bootstrapOwnedServer(appRoot: string, serverModule: ServerModule): void { - if (backgroundServicesStarted) return; - backgroundServicesStarted = true; - - try { - serverModule.startBackgroundServices(); - log.info("background services started"); - } catch (err) { - log.warn("startBackgroundServices failed", err); - } - - // Auto-install Claude Code hooks so a DMG-only user gets events flowing - // without having to run `npm run install-hooks` from a checkout. - try { - const hooks = require(path.join(appRoot, "scripts", "install-hooks.js")) as { - installHooks: (silent?: boolean) => boolean; - }; - hooks.installHooks(true); - log.info("Claude Code hooks ensured"); - } catch (err) { - log.warn("hook auto-install failed", err); - } -} - -/** - * Status snapshot for the tray menu. Sourced from the live server's - * `/api/stats` endpoint rather than a direct SQLite read, so the numbers stay - * correct whether we started the server in-process or adopted an external one - * already listening on the port. (A second SQLite handle opened from the - * desktop process can point at a different/empty database file — or fail - * against the read-only `.app` bundle path — which previously pinned the menu - * at 0/0/0.) - * - * The HTTP fetch is asynchronous but the tray menu is built synchronously on - * click, so we poll on an interval and serve the last cached value. Returns - * `null` until the first successful poll completes. - */ -export interface ServerSnapshot { - /** Count of sessions the dashboard currently considers active. */ - activeSessions: number; - /** Count of agents specifically in the `working` status (not idle/waiting). */ - workingAgents: number; - /** Hook events received since the user's local midnight. */ - eventsToday: number; -} - -let lastSnapshot: ServerSnapshot | null = null; -let snapshotTimer: ReturnType | null = null; - -/** Synchronous accessor for the tray menu's build step — always returns the - * last value `refreshServerSnapshot` cached, never blocks on a network call. */ -export function getServerSnapshot(): ServerSnapshot | null { - return lastSnapshot; -} - -/** - * Fetch a fresh snapshot from the running server's stats API. Resolves to - * `null` on any error (server not up yet, non-200, malformed JSON) so the - * poller can simply keep the previous cached value. - */ -function fetchSnapshotOverHttp(port: number, timeoutMs = 2500): Promise { - // Server expects tz_offset in minutes (Date#getTimezoneOffset) to compute - // "events today" against the user's local midnight. - const tzOffset = new Date().getTimezoneOffset(); - return new Promise((resolve) => { - const req = http.get( - { - host: "127.0.0.1", - port, - path: `/api/stats?tz_offset=${tzOffset}`, - timeout: timeoutMs, - }, - (res) => { - if (res.statusCode !== 200) { - res.resume(); - resolve(null); - return; - } - let buf = ""; - res.setEncoding("utf8"); - res.on("data", (chunk) => (buf += chunk)); - res.on("end", () => { - try { - const j = JSON.parse(buf) as { - active_sessions?: number; - events_today?: number; - agents_by_status?: Record; - }; - resolve({ - activeSessions: Number(j.active_sessions) || 0, - // "working" specifically — waiting/idle agents are not working. - workingAgents: Number(j.agents_by_status?.working) || 0, - eventsToday: Number(j.events_today) || 0, - }); - } catch { - resolve(null); - } - }); - } - ); - req.on("error", () => resolve(null)); - req.on("timeout", () => { - req.destroy(); - resolve(null); - }); - }); -} - -/** Poll once now and update the cache. Safe to call on demand (e.g. menu open). */ -export async function refreshServerSnapshot(port: number | null): Promise { - if (!port) return; - const snap = await fetchSnapshotOverHttp(port); - if (snap) lastSnapshot = snap; -} - -/** - * Begin polling the server's stats endpoint so the tray menu always reflects - * recent state. Idempotent — a second call (e.g. after "Restart Server") is a - * no-op. The timer is unref'd so it never keeps the event loop alive on quit. - */ -export function startSnapshotPolling(getPort: () => number | null, intervalMs = 4000): void { - if (snapshotTimer) return; - const tick = (): void => { - void refreshServerSnapshot(getPort()); - }; - tick(); - snapshotTimer = setInterval(tick, intervalMs); - snapshotTimer.unref?.(); -} - -/** - * Close the embedded SQLite handle so WAL is checkpointed cleanly. Call once on - * application quit — never between restarts, since `server/db.js` is a cached - * singleton and a closed handle would break a subsequent server start. - */ -export function closeEmbeddedDatabase(): void { - try { - const dbModule = require(path.join(resolveAppRoot(), "server", "db.js")) as { - db?: { open?: boolean; close: () => void }; - }; - if (dbModule.db && dbModule.db.open !== false) { - dbModule.db.close(); - log.info("embedded database closed"); - } - } catch (err) { - log.warn("failed to close embedded database", err); - } - // Remove our entry from the multi-server discovery file so the hook - // handler doesn't try to POST to this PID after the process is gone. - // (Stale entries also self-prune via the liveness check on read, but the - // explicit removal closes the window between quit and the next reader.) - try { - const serverInfo = require(path.join(resolveAppRoot(), "server", "lib", "server-info.js")) as { - removeServerInfo: () => void; - }; - serverInfo.removeServerInfo(); - } catch (err) { - log.warn("failed to remove discovery file entry", err); - } -} - -/** - * Resolve the directory that contains the bundled `server/` and `client/dist/`. - * In the packaged DMG these live under `Resources/app/`. In `npm run dev` they - * live at the repo root (one directory up from `desktop/`). - */ -function resolveAppRoot(): string { - if (app.isPackaged) { - return path.join(process.resourcesPath, "app"); - } - // Dev: desktop/out/main.js → ../.. = repo root. - return path.resolve(__dirname, "..", ".."); -} - -/** - * Classify a TCP port on `127.0.0.1` in two steps: - * 1. Attempt a raw socket connection — if nothing answers, the port is - * `"free"`. - * 2. If something is listening, `GET /api/health` and check for - * `{ status: "ok" }` — a match means it is *our* kind of server - * (`"healthy"`, safe to adopt); anything else (wrong app, wrong - * response, timeout) means the port is occupied by something unrelated - * (`"busy"`, must be avoided). - * - * Used both for startup port selection (`pickFreePort`) and for deciding - * whether to adopt an already-running server (`startEmbeddedServer`). - */ -async function probePort(port: number, timeoutMs = 1500): Promise<"healthy" | "busy" | "free"> { - // 1. Is anything listening? Try to connect. - const reachable = await new Promise((resolve) => { - const socket = net.createConnection({ host: "127.0.0.1", port }); - const done = (v: boolean) => { - socket.destroy(); - resolve(v); - }; - socket.setTimeout(timeoutMs); - socket.once("connect", () => done(true)); - socket.once("error", () => done(false)); - socket.once("timeout", () => done(false)); - }); - - if (!reachable) return "free"; - - // 2. Does it answer /api/health like our server would? - const healthy = await new Promise((resolve) => { - const req = http.get( - { host: "127.0.0.1", port, path: "/api/health", timeout: timeoutMs }, - (res) => { - let buf = ""; - res.setEncoding("utf8"); - res.on("data", (chunk) => (buf += chunk)); - res.on("end", () => { - try { - const parsed = JSON.parse(buf); - resolve(parsed?.status === "ok"); - } catch { - resolve(false); - } - }); - } - ); - req.on("error", () => resolve(false)); - req.on("timeout", () => { - req.destroy(); - resolve(false); - }); - }); - - return healthy ? "healthy" : "busy"; -} - -/** - * Choose a port for a server we are about to start ourselves (i.e. we already - * know `PREFERRED_PORT` has nothing healthy to adopt). Tries, in order: - * 1. `PREFERRED_PORT` (4820) — the project's documented default. - * 2. The next nine ports (4821–4829) — small, predictable fallbacks that - * are still easy for a user to guess/bookmark. - * 3. The full `FALLBACK_PORT_RANGE` (49152–49500, the IANA dynamic/private - * range) — scanned sequentially as a last resort. - * - * @throws If every port in both ranges is occupied (practically never). - */ -async function pickFreePort(): Promise { - // Prefer the project's documented port. Otherwise scan a private range. - const initial = await probePort(PREFERRED_PORT); - if (initial === "free") return PREFERRED_PORT; - - // Try the next 9 well-known fallbacks first (4821..4829) before going random. - for (let p = PREFERRED_PORT + 1; p < PREFERRED_PORT + 10; p++) { - if ((await probePort(p)) === "free") return p; - } - for (let p = FALLBACK_PORT_RANGE.min; p <= FALLBACK_PORT_RANGE.max; p++) { - if ((await probePort(p)) === "free") return p; - } - throw new Error("Could not find a free TCP port for the dashboard server."); -} - -/** - * Block until `probePort` reports `"healthy"` for the port we just bound, or - * throw once `timeoutMs` (default `HEALTH_TIMEOUT_MS`, 30s) elapses. Called - * right after `startServer()` returns, before the caller treats the server as - * usable — Express's `listen()` callback fires as soon as the socket is - * bound, which can be before the app has finished any async initialization - * that gates `/api/health`. - */ -async function waitForHealthy(port: number, timeoutMs = HEALTH_TIMEOUT_MS): Promise { - const deadline = Date.now() + timeoutMs; - while (Date.now() < deadline) { - if ((await probePort(port, 500)) === "healthy") return; - await new Promise((r) => setTimeout(r, 250)); - } - throw new Error(`Server on port ${port} did not become healthy within ${timeoutMs}ms.`); -} - -/** - * Bring up the dashboard server. Returns a handle the caller uses to point - * the BrowserWindow and to shut down cleanly on quit. - * - * Two environment overrides exist primarily for testing: - * - `CCAM_DESKTOP_BIND_PORT`: bind exactly this port (no adoption, no fallback). - * Used by the smoke test to verify the spawned process actually started a - * server rather than finding an unrelated one. - * - `CCAM_DESKTOP_NO_ADOPT=1`: skip the "is there already a healthy server - * on 4820?" check and always start our own. - */ -export async function startEmbeddedServer(): Promise { - const forcedPort = process.env.CCAM_DESKTOP_BIND_PORT - ? parseInt(process.env.CCAM_DESKTOP_BIND_PORT, 10) - : null; - const noAdopt = process.env.CCAM_DESKTOP_NO_ADOPT === "1" || forcedPort !== null; - - if (!noAdopt) { - // Adopt an already-running healthy server (e.g. user has `npm start` open). - const adopt = await probePort(PREFERRED_PORT); - if (adopt === "healthy") { - log.info("adopting existing healthy server on port", PREFERRED_PORT); - return { - url: `http://127.0.0.1:${PREFERRED_PORT}`, - port: PREFERRED_PORT, - ownedByUs: false, - stop: async () => { - /* not ours to stop */ - }, - }; - } - } - - const port = forcedPort ?? (await pickFreePort()); - const appRoot = resolveAppRoot(); - const serverEntry = path.join(appRoot, "server", "index.js"); - - // The server reads from process.env. Set everything up before require()ing. - process.env.NODE_ENV = "production"; - process.env.DASHBOARD_PORT = String(port); - - // The server now defaults its writable state (SQLite DB, VAPID keys, - // transcript snapshots) to the shared user-global `~/.claude/agent-dashboard/` - // — outside the read-only `.app`/installed bundle AND identical to what - // `npm start`/`npm run dev` use, so the desktop app and the web app share ONE - // database. We therefore no longer override DASHBOARD_DATA_DIR to this app's - // private `userData/data`. - // - // Earlier desktop builds DID write there, so point the server's one-time - // migration at that old per-user DB: on first launch with no shared DB yet, - // it copies this app's accumulated history into the canonical location - // (non-destructively — the old file is left untouched as a backup). - if (!process.env.DASHBOARD_DATA_DIR && !process.env.DASHBOARD_LEGACY_DB_PATH) { - const legacyDbPath = path.join(app.getPath("userData"), "data", "dashboard.db"); - if (fs.existsSync(legacyDbPath)) { - process.env.DASHBOARD_LEGACY_DB_PATH = legacyDbPath; - log.info("legacy desktop database available for migration", { legacyDbPath }); - } - } - - // Make sure server's `require("better-sqlite3")` finds the ABI-correct copy. - ensureNativeModulesPatched(); - - log.info("starting embedded server", { port, serverEntry, appRoot }); - - // eslint-disable-next-line @typescript-eslint/no-var-requires - const serverModule = require(serverEntry) as ServerModule; - - const expressApp = serverModule.createApp(); - const httpServer = await serverModule.startServer(expressApp, port); - - await waitForHealthy(port); - log.info("embedded server healthy", { port }); - - // Bring up the same background services the standalone server path runs. - // Skipped automatically on a "Restart Server" via the one-time guard. - bootstrapOwnedServer(appRoot, serverModule); - - return { - url: `http://127.0.0.1:${port}`, - port, - ownedByUs: true, - stop: () => - new Promise((resolve) => { - try { - httpServer.close(() => resolve()); - // Force-close lingering websocket connections after a short grace. - setTimeout(() => resolve(), 2000).unref(); - } catch { - resolve(); - } - }), - }; -} diff --git a/desktop/src/shell-path.ts b/desktop/src/shell-path.ts deleted file mode 100644 index 2e31772..0000000 --- a/desktop/src/shell-path.ts +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @file Recover the user's real shell `PATH`. - * - * A macOS app launched from Finder/Dock (or the Login Items auto-start) is - * spawned by `launchd`, which gives it a minimal `PATH` — roughly - * `/usr/bin:/bin:/usr/sbin:/sbin`. It does **not** source the user's shell - * profile (`.zshrc` / `.zprofile` / `.bash_profile`). - * - * The dashboard's "Run Claude" feature spawns the `claude` CLI, which is - * almost always installed somewhere only the shell `PATH` knows about — - * `/opt/homebrew/bin`, `~/.local/bin`, `~/.claude/local`, a Node - * version-manager's bin dir, etc. Under the minimal `launchd` `PATH`, - * `which claude` fails and the dashboard reports *"the `claude` CLI isn't on - * your PATH"* — even though the exact same server works when started from a - * terminal, because a terminal hands down the full shell `PATH`. - * - * We run the user's login shell once at startup, capture its `PATH`, and merge - * it into `process.env.PATH`. The embedded server runs in this same process, - * so it (and every `claude` it spawns) inherits the corrected `PATH`. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Internal dependencies - * - `./logger` - * - * ## Public surface - * - `ensureUserPath` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **ensureUserPath** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import { spawnSync } from "node:child_process"; -import * as os from "node:os"; -import * as path from "node:path"; - -import { log } from "./logger"; - -// Markers fence the PATH off from any shell-startup noise (banners, MOTD, …). -// An interactive login shell may print arbitrary text before running our -// `-c` command (e.g. a `.zshrc` `neofetch` call); scanning for this sentinel -// pair — rather than trusting the last line of stdout — makes extraction -// robust to whatever the user's shell profile prints. -const DELIM = "__CCAM_SHELL_PATH__"; - -/** - * Run the user's login+interactive shell and capture its `PATH`. Returns null - * on any failure (timeout, missing shell, unparseable output). - */ -function loginShellPath(): string | null { - if (process.platform === "win32") return null; - const shell = process.env.SHELL || "/bin/zsh"; - try { - // -i interactive (sources .zshrc/.bashrc), -l login (sources .zprofile), - // -c command. printf avoids the trailing newline `echo` would add. - const res = spawnSync(shell, ["-ilc", `printf '%s' "${DELIM}$PATH${DELIM}"`], { - encoding: "utf8", - timeout: 5000, - }); - const out = `${res.stdout || ""}`; - const start = out.indexOf(DELIM); - const end = out.indexOf(DELIM, start + DELIM.length); - if (start === -1 || end === -1) return null; - const captured = out.slice(start + DELIM.length, end).trim(); - return captured || null; - } catch (err) { - log.warn("could not capture login-shell PATH", err); - return null; - } -} - -/** - * Merge the login-shell `PATH` — plus the common directories CLIs install - * into — onto `process.env.PATH`. Idempotent: deduplicates entries, so it is - * safe even if called more than once. No-op on Windows. - */ -export function ensureUserPath(): void { - if (process.platform === "win32") return; - - const ordered: string[] = []; - const seen = new Set(); - const add = (value?: string | null): void => { - if (!value) return; - for (const seg of value.split(path.delimiter)) { - if (seg && !seen.has(seg)) { - seen.add(seg); - ordered.push(seg); - } - } - }; - - // 1. The user's real shell PATH — the authoritative source. - add(loginShellPath()); - - // 2. Common install locations, as a fallback if the shell capture missed - // them (or failed entirely). - const home = os.homedir(); - add( - [ - "/opt/homebrew/bin", - "/usr/local/bin", - path.join(home, ".local", "bin"), - path.join(home, ".claude", "local"), - path.join(home, ".bun", "bin"), - path.join(home, ".deno", "bin"), - path.join(home, ".npm-global", "bin"), - ].join(path.delimiter) - ); - - // 3. Whatever launchd already gave us, last. - add(process.env.PATH); - - process.env.PATH = ordered.join(path.delimiter); - log.info("user PATH resolved for spawned CLIs", { entries: ordered.length }); -} diff --git a/desktop/src/tray.ts b/desktop/src/tray.ts deleted file mode 100644 index fb07ee9..0000000 --- a/desktop/src/tray.ts +++ /dev/null @@ -1,242 +0,0 @@ -/** - * @file Menu-bar / notification-area (system tray) icon and its context menu. - * - * The tray is the "always-on" surface of the app. A single click opens the - * menu showing live status snapshots from the embedded server plus an Open - * Dashboard action. - * - * The image is platform-specific: macOS uses a black "template" PNG so the OS - * tints it for light/dark menu bars; Windows uses the colored `icon.ico`, - * because a black template glyph would be invisible on the (usually dark) - * Windows taskbar notification area. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Internal dependencies - * - `./constants` - * - `./logger` - * - * ## Public surface - * - `TrayActions` — exported API; see TSDoc on the symbol for behavior. - * - `ServerSnapshot` — exported API; see TSDoc on the symbol for behavior. - * - `createTray` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **TrayActions** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **ServerSnapshot** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **createTray** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import { Menu, Tray, app, nativeImage } from "electron"; -import * as path from "node:path"; - -import { APP_NAME } from "./constants"; -import { log } from "./logger"; - -/** Callbacks the tray menu wires to its rows. `main.ts` supplies these — - * several are shared verbatim with `installApplicationMenu`'s `MenuActions` - * so the tray and the application menu never disagree about behavior. */ -export interface TrayActions { - /** Bring the dashboard window to front, creating it if it doesn't exist. */ - showDashboard: () => void; - /** Stop and re-launch the embedded server, then reload the window. */ - restartServer: () => void; - /** Reveal `desktop.log` in the OS file browser. */ - openLogs: () => void; - /** Open the dashboard URL in the user's default system browser. */ - openInBrowser: () => void; - /** Flip the OS auto-start-at-login registration. */ - toggleOpenAtLogin: () => void; - /** Read the current auto-start state, used to render the checkbox. */ - isOpenAtLogin: () => boolean; - /** The embedded server's live port, or `null` before it has started. */ - serverPort: () => number | null; - /** Last cached status snapshot (refreshed by the background poller). */ - getSnapshot: () => ServerSnapshot | null; - /** Kick an immediate async snapshot refresh (fire-and-forget on menu open). */ - refreshSnapshot: () => void; - /** Prompt the same quit-confirmation dialog ⌘Q triggers. */ - requestQuit: () => void; -} - -/** - * Structurally identical to `server-host.ts`'s `ServerSnapshot` — redeclared - * here so this module has no compile-time dependency on `server-host.ts`, - * only on the `TrayActions` callbacks `main.ts` wires between them. `main.ts` - * passes `getServerSnapshot`/`refreshServerSnapshot` straight through, so the - * two types must stay in sync by hand if the stats API response shape changes. - */ -export interface ServerSnapshot { - activeSessions: number; - workingAgents: number; - eventsToday: number; -} - -/** - * Tray icon image location. In dev `__dirname` is `desktop/out/`, so `../assets` - * resolves to `desktop/assets/`. In the packaged app the images ship outside - * the asar archive via `extraResources` (see electron-builder.yml), so we - * read them from `process.resourcesPath/assets/`. Loading these from inside - * asar can yield empty `nativeImage` results, which is why we keep them - * unpacked. - * - * Windows gets the colored `icon.ico`; macOS gets the black template PNG that - * the menu bar tints automatically. - */ -/** Pick the platform-appropriate tray image filename — a colored `.ico` on - * Windows (a black glyph would vanish on the usually-dark taskbar), or the - * black "template" PNG on macOS (the menu bar auto-tints it for light/dark). */ -function trayImageFile(): string { - return process.platform === "win32" ? "icon.ico" : "tray-icon-Template.png"; -} - -/** Resolve `trayImageFile()` to an absolute path, branching on dev vs - * packaged layout — see the file-level doc comment for why these assets are - * read from disk (`extraResources`) rather than bundled inside the asar. */ -function trayImagePath(): string { - const file = trayImageFile(); - if (app.isPackaged) { - return path.join(process.resourcesPath, "assets", file); - } - return path.join(__dirname, "..", "assets", file); -} - -/** - * Create the menu-bar / notification-area tray icon and wire its dropdown - * menu. The menu is deliberately rebuilt from `actions` on every open (see - * `showMenu` below) rather than mutated in place, so the port label, the - * live `{sessions, agents, events-today}` snapshot, and the "Open at Login" - * checkbox are always current — Electron menus have no live-binding, so a - * cached template would show stale values until the app happened to rebuild - * it for an unrelated reason. - * - * Left- and right-click both pop the same dropdown via `popUpContextMenu` - * (`tray.on('click', ...)` and `tray.on('right-click', ...)`) instead of - * `Tray#setContextMenu` — a static, pre-assigned menu that Electron shows - * automatically on click, with no hook for the `refreshSnapshot()` call that - * needs to run first so the dropdown reflects the very latest counts. - */ -export function createTray(actions: TrayActions): Tray { - const imagePath = trayImagePath(); - const image = nativeImage.createFromPath(imagePath); - if (image.isEmpty()) { - log.warn("tray image is empty; falling back to in-memory placeholder", imagePath); - } else if (process.platform === "darwin") { - // Template tinting is a macOS concept; on Windows the icon is colored and - // must be shown as-is. - image.setTemplateImage(true); - } - - const tray = new Tray(image.isEmpty() ? nativeImage.createEmpty() : image); - tray.setToolTip(APP_NAME); - - // Singular/plural helper so "1 active session" doesn't read as "1 active sessions". - const plural = (n: number, singular: string, pluralForm?: string): string => - `${n.toLocaleString()} ${n === 1 ? singular : (pluralForm ?? singular + "s")}`; - - // Built fresh on each click so the port, status snapshot, and the - // "Open at Login" checkbox always reflect current state. Snapshot rows - // are intentionally `enabled` (with a click handler that opens the - // dashboard) instead of `enabled: false` — disabled menu items get - // dimmed by macOS, which looked sickly next to the actionable rows - // below them. Clicking any row now lands on the dashboard where the - // user can see the same numbers in context. - const buildMenu = (): Menu => { - const port = actions.serverPort(); - const portLabel = port ? `🟢 Listening on :${port}` : "🔴 Server not running"; - const snap = actions.getSnapshot(); - const open = (): void => actions.showDashboard(); - const snapshotItems: Electron.MenuItemConstructorOptions[] = snap - ? [ - { type: "separator" }, - { label: `📊 ${plural(snap.activeSessions, "active session")}`, click: open }, - { label: `🤖 ${plural(snap.workingAgents, "working agent")}`, click: open }, - { label: `📥 ${plural(snap.eventsToday, "event")} today`, click: open }, - ] - : [{ type: "separator" }, { label: "Snapshot unavailable", enabled: false }]; - - return Menu.buildFromTemplate([ - { label: APP_NAME, enabled: false }, - { label: portLabel, enabled: false }, - ...snapshotItems, - { type: "separator" }, - { label: "Open Dashboard", accelerator: "CmdOrCtrl+O", click: open }, - { label: "Open in Browser…", click: () => actions.openInBrowser() }, - { type: "separator" }, - { label: "Restart Server", click: () => actions.restartServer() }, - { label: "Show Logs", click: () => actions.openLogs() }, - { type: "separator" }, - { - label: "Open at Login", - type: "checkbox", - checked: actions.isOpenAtLogin(), - click: () => actions.toggleOpenAtLogin(), - }, - { type: "separator" }, - { label: `Version ${app.getVersion()}`, enabled: false }, - { - label: "Quit Claude Code Monitor", - accelerator: "CmdOrCtrl+Q", - click: () => actions.requestQuit(), - }, - ]); - }; - - // Single click (left or right) opens the menu — the conventional macOS - // menu-bar utility pattern. Opening the dashboard is the first action in - // the menu, so it's still one click + Enter to surface the window. - // We kick an async refresh on open so the next interaction reflects the - // very latest counts; this open renders the most recent cached snapshot. - const showMenu = (): void => { - actions.refreshSnapshot(); - tray.popUpContextMenu(buildMenu()); - }; - tray.on("click", showMenu); - tray.on("right-click", showMenu); - return tray; -} diff --git a/desktop/src/window.ts b/desktop/src/window.ts deleted file mode 100644 index 86bbb13..0000000 --- a/desktop/src/window.ts +++ /dev/null @@ -1,219 +0,0 @@ -/** - * @file Dashboard window creation + state persistence. - * - * We persist size/position to a JSON file under `app.getPath('userData')`. - * Avoids the `electron-window-state` dependency for ~30 lines of code. - * @author Nguyễn Ngọc Trí Vĩ - */ -/* ============================================================================= - * MODULE_GUIDE — extended in-file reference (comments only; safe to read, never executed) - * ============================================================================= - * **Purpose:** Dashboard module consumed by the React client, MCP tools, or desktop shell depending on deployment mode. - * - * ## Design constraints - * - Local-first: no telemetry leaves the machine unless the user configures webhooks. - * - Fail-safe hooks path on the server must never block Claude Code; UI mirrors that - * philosophy by degrading gracefully (empty states, stale badges, reconnect loops). - * - Destructive flows stay behind explicit confirmation modals and server-side gates. - * - Internationalization: user-visible strings belong in i18n JSON, not literals here. - * - * ## Remote data & SSH - * Remote Data Sources let operators aggregate multiple machines. SSH entries describe - * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every - * scoped GET via `?sources=`. Health checks and import history surface in Settings. - * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * - * ## Internal dependencies - * - `./constants` - * - `./logger` - * - * ## Public surface - * - `appIconPath` — exported API; see TSDoc on the symbol for behavior. - * - `createDashboardWindow` — exported API; see TSDoc on the symbol for behavior. - * - * ## Testing pointers - * - Prefer colocated `__tests__` with Vitest + Testing Library for UI. - * - Server contract changes require `npm run test:server` and OpenAPI sync. - * - MCP edits: `npm run mcp:typecheck` and `npm run mcp:build`. - * - * ## Related docs - * - `ARCHITECTURE.md` — hooks → API → SQLite → WebSocket → UI pipeline. - * - `docs/API.md` — REST reference. - * - `.claude/skills/file-headers/` — mandatory `@author` header policy. - * ============================================================================= */ -/* ----------------------------------------------------------------------------- - * EXPORT CATALOG — quick index of symbols defined below (documentation only). - * ----------------------------------------------------------------------------- - * **appIconPath** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * **createDashboardWindow** - * Part of this module's public contract. Downstream imports should treat - * the signature and return type as stable unless release notes say otherwise. - * When behavior changes, update the `@file` overview and relevant tests. - * - * ----------------------------------------------------------------------------- */ - -import { BrowserWindow, app, shell } from "electron"; -import * as fs from "node:fs"; -import * as path from "node:path"; - -import { APP_NAME, DEFAULT_WINDOW } from "./constants"; -import { log } from "./logger"; - -/** Persisted window geometry. `x`/`y` are omitted until the window has been - * moved at least once — a fresh install lets Electron pick the OS default - * placement rather than forcing `(0, 0)`. */ -interface WindowState { - width: number; - height: number; - x?: number; - y?: number; -} - -/** Absolute path to the JSON file geometry is persisted to, under this - * platform's `userData` directory (e.g. `~/Library/Application Support/…` - * on macOS, `%APPDATA%` on Windows). */ -function statePath(): string { - return path.join(app.getPath("userData"), "window-state.json"); -} - -/** - * Absolute path to the colored application icon used for the window title bar - * and the Windows taskbar / Linux launcher — the same logo the macOS app shows - * in its Dock (rendered from `assets/icon.svg`). Without this, an unpackaged - * `electron out/main.js` run falls back to the generic Electron icon. - * - * Windows wants the multi-size `.ico` (crisp at every taskbar scale); other - * platforms take the `.png`. macOS ignores `BrowserWindow#icon` entirely (its - * window has no icon and the Dock uses the bundle's `.icns`), so the value is - * harmless there. Resolves dev (`desktop/assets`) vs packaged - * (`Resources/assets`, shipped via `extraResources`); returns `undefined` if - * the file is absent so we cleanly fall back instead of throwing. - */ -export function appIconPath(): string | undefined { - const file = process.platform === "win32" ? "icon.ico" : "icon.png"; - const base = app.isPackaged - ? path.join(process.resourcesPath, "assets") - : path.join(__dirname, "..", "assets"); - const p = path.join(base, file); - return fs.existsSync(p) ? p : undefined; -} - -/** - * Read the persisted window geometry, falling back field-by-field to - * `DEFAULT_WINDOW` (and to `undefined` for position) whenever the file is - * missing, unreadable, or contains a field of the wrong type — so a - * corrupted or partially-written state file degrades gracefully instead of - * preventing the window from opening at all. - */ -function loadState(): WindowState { - try { - const raw = fs.readFileSync(statePath(), "utf8"); - const parsed = JSON.parse(raw) as Partial; - return { - width: typeof parsed.width === "number" ? parsed.width : DEFAULT_WINDOW.width, - height: typeof parsed.height === "number" ? parsed.height : DEFAULT_WINDOW.height, - x: typeof parsed.x === "number" ? parsed.x : undefined, - y: typeof parsed.y === "number" ? parsed.y : undefined, - }; - } catch { - return { width: DEFAULT_WINDOW.width, height: DEFAULT_WINDOW.height }; - } -} - -/** - * Write the window's current bounds to `statePath()`. Skipped while the - * window is destroyed or minimized, since `getBounds()` on a minimized - * window reports the pre-minimize size on some platforms — persisting it - * would silently discard the user's last real resize/move. Failures (e.g. - * a read-only `userData` dir) are logged, not thrown — losing the saved - * geometry is cosmetic, not fatal. - */ -function saveState(win: BrowserWindow): void { - if (win.isDestroyed() || win.isMinimized()) return; - const { width, height, x, y } = win.getBounds(); - try { - fs.writeFileSync(statePath(), JSON.stringify({ width, height, x, y })); - } catch (err) { - log.warn("could not persist window state", err); - } -} - -/** - * Create the single dashboard `BrowserWindow` and point it at the embedded - * server's origin. Restores the last persisted size/position (see - * `loadState`), re-saves it (debounced) on every resize/move/close, routes - * all external navigation to the system browser instead of inside Electron, - * and defers `show()` until `ready-to-show` so the window never flashes an - * unstyled blank frame while the page loads. - * - * @param targetUrl The embedded server's origin, e.g. `http://127.0.0.1:4820`. - * @returns The newly created, not-yet-visible `BrowserWindow`. - */ -export function createDashboardWindow(targetUrl: string): BrowserWindow { - const state = loadState(); - - const win = new BrowserWindow({ - width: state.width, - height: state.height, - x: state.x, - y: state.y, - minWidth: 720, - minHeight: 480, - show: false, - title: APP_NAME, - // Colored app logo for the title bar + taskbar (matches the macOS Dock - // icon). No-op on macOS; falls through to the Electron default if missing. - icon: appIconPath(), - // Use the standard macOS title bar rather than `hiddenInset`. With a hidden - // title bar the traffic-light buttons float directly over the React app's - // top edge and visually blend into the dashboard chrome; a native title bar - // gives them their own clearly-separated row, shows the app name, and - // restores the conventional double-click-to-maximize / drag-from-anywhere - // behaviour without needing custom drag regions in the renderer. - titleBarStyle: "default", - backgroundColor: "#0b0f1a", - webPreferences: { - preload: path.join(__dirname, "preload.js"), - contextIsolation: true, - nodeIntegration: false, - sandbox: false, - // We're loading our own localhost-only origin, never remote content. - webSecurity: true, - }, - }); - - win.once("ready-to-show", () => win.show()); - - // Persist size/position on resize/move (debounced via the close handler too). - let saveTimer: NodeJS.Timeout | null = null; - const debounced = () => { - if (saveTimer) clearTimeout(saveTimer); - saveTimer = setTimeout(() => saveState(win), 400); - }; - win.on("resize", debounced); - win.on("move", debounced); - win.on("close", () => saveState(win)); - - // External links open in the user's browser, not inside Electron. - win.webContents.setWindowOpenHandler(({ url }) => { - void shell.openExternal(url); - return { action: "deny" }; - }); - win.webContents.on("will-navigate", (event, url) => { - if (!url.startsWith(targetUrl)) { - event.preventDefault(); - void shell.openExternal(url); - } - }); - - win.loadURL(targetUrl).catch((err) => log.error("failed to load dashboard URL", err)); - return win; -} diff --git a/desktop/tests/smoke.test.mjs b/desktop/tests/smoke.test.mjs deleted file mode 100644 index a42fa49..0000000 --- a/desktop/tests/smoke.test.mjs +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @file Desktop smoke test. - * - * Boots the compiled main process under Electron, then probes the embedded - * dashboard server's /api/health endpoint. This is intentionally minimal: - * it does not exercise the BrowserWindow (which requires a display) so it - * runs on headless CI without xvfb. The window itself is covered by manual - * QA in the PR description. - * @author Nguyễn Ngọc Trí Vĩ - */ - -import { describe, it, before, after } from "node:test"; -import assert from "node:assert/strict"; -import { spawn } from "node:child_process"; -import { once } from "node:events"; -import http from "node:http"; -import { createRequire } from "node:module"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const DESKTOP_ROOT = path.resolve(__dirname, ".."); -const MAIN_JS = path.join(DESKTOP_ROOT, "out", "main.js"); -// Resolve the actual Electron executable (electron.exe on Windows, the binary -// under Electron.app on macOS). The `.bin/electron` shim is extension-less and -// cannot be spawned without a shell on Windows; `require("electron")` returns -// the real binary path on every platform. -const ELECTRON_BIN = createRequire(import.meta.url)("electron"); - -const HEALTH_TIMEOUT_MS = 60_000; -const POLL_INTERVAL_MS = 500; - -/** Resolve when GET /api/health on any of these ports answers ok. */ -async function waitForHealth(ports, deadline) { - while (Date.now() < deadline) { - for (const port of ports) { - const ok = await probeHealth(port); - if (ok) return port; - } - await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS)); - } - throw new Error(`No port answered /api/health within ${HEALTH_TIMEOUT_MS}ms (tried ${ports})`); -} - -function probeHealth(port) { - return new Promise((resolve) => { - const req = http.get({ host: "127.0.0.1", port, path: "/api/health", timeout: 1500 }, (res) => { - let buf = ""; - res.setEncoding("utf8"); - res.on("data", (chunk) => (buf += chunk)); - res.on("end", () => { - try { - resolve(JSON.parse(buf)?.status === "ok"); - } catch { - resolve(false); - } - }); - }); - req.on("error", () => resolve(false)); - req.on("timeout", () => { - req.destroy(); - resolve(false); - }); - }); -} - -let electronProc; -// Pick a unique high port for each test run so we never accidentally probe an -// unrelated server (e.g. the user's own `npm start` on 4820). The env var -// `CCAM_DESKTOP_BIND_PORT` tells the desktop process to bind exactly this port, -// skipping the "adopt an existing healthy server" code path. -const TEST_PORT = 50000 + Math.floor(Math.random() * 5000); - -// On POSIX, spawn the Electron parent as a process-group leader so we can -// signal the whole tree (helpers, embedded server) with one kill(-pid). -// Without this, SIGTERM only hits the parent and leaves helpers alive, -// keeping the stdio pipes open and hanging `node --test` indefinitely. -const IS_POSIX = process.platform !== "win32"; - -/** Kill the Electron process tree and resolve when it's actually gone. */ -async function killElectronTree(proc, { timeoutMs = 5_000 } = {}) { - if (!proc || proc.exitCode !== null || proc.signalCode !== null) return; - proc.killedByTest = true; - - const signalGroup = (sig) => { - try { - if (IS_POSIX && proc.pid) process.kill(-proc.pid, sig); - else proc.kill(sig); - } catch { - /* group may already be gone */ - } - }; - - const exited = once(proc, "exit"); - signalGroup("SIGTERM"); - - const timer = new Promise((resolve) => setTimeout(resolve, timeoutMs, "timeout")); - const winner = await Promise.race([exited.then(() => "exit"), timer]); - if (winner === "timeout") { - signalGroup("SIGKILL"); - await Promise.race([exited, new Promise((r) => setTimeout(r, 2_000))]); - } -} - -describe("desktop smoke", () => { - before(async () => { - electronProc = spawn(ELECTRON_BIN, [MAIN_JS], { - cwd: DESKTOP_ROOT, - detached: IS_POSIX, - env: { - ...process.env, - // Suppress the BrowserWindow on the test runner; we only care that - // the server boots cleanly. - ELECTRON_DISABLE_GPU: "1", - ELECTRON_ENABLE_LOGGING: "1", - CCAM_DESKTOP_VERBOSE: "1", - CCAM_DESKTOP_BIND_PORT: String(TEST_PORT), - }, - stdio: ["ignore", "pipe", "pipe"], - }); - - electronProc.stdout.on("data", (b) => process.stdout.write(`[electron] ${b}`)); - electronProc.stderr.on("data", (b) => process.stderr.write(`[electron] ${b}`)); - - electronProc.on("exit", (code, signal) => { - if (!electronProc.killedByTest) { - // eslint-disable-next-line no-console - console.error(`electron exited unexpectedly: code=${code} signal=${signal}`); - } - }); - }); - - after(async () => { - await killElectronTree(electronProc); - }); - - it("brings up the embedded server and serves /api/health on the bound port", async () => { - const deadline = Date.now() + HEALTH_TIMEOUT_MS; - const port = await waitForHealth([TEST_PORT], deadline); - assert.equal( - port, - TEST_PORT, - `desktop process should have bound CCAM_DESKTOP_BIND_PORT=${TEST_PORT}` - ); - assert.ok( - electronProc && !electronProc.killed && electronProc.exitCode === null, - "electron process should still be alive when /api/health answers" - ); - }); -}); diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json deleted file mode 100644 index c032052..0000000 --- a/desktop/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "Node16", - "moduleResolution": "Node16", - "lib": ["ES2022"], - "outDir": "out", - "rootDir": "src", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, - "forceConsistentCasingInFileNames": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "declaration": false - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules", "out", "release", "tests"] -} diff --git a/docker-compose.full.yml b/docker-compose.full.yml deleted file mode 100644 index 225fa70..0000000 --- a/docker-compose.full.yml +++ /dev/null @@ -1,92 +0,0 @@ -# CCAM dashboard + Prometheus + Grafana on one Docker network. -# -# npm run docker:full:up -# open http://localhost:4820 (dashboard) -# open http://localhost:3000 (Grafana — admin / admin) -# -# Hooks still run on the HOST — run `npm run install-hooks` on the host and point -# them at http://localhost:4820 (same as docker-compose.yml alone). -services: - agent-monitor: - build: . - container_name: agent-monitor - ports: - - "127.0.0.1:${DASHBOARD_PORT:-4820}:4820" - volumes: - - ${CLAUDE_HOME:-~/.claude}/agent-dashboard:/app/data - - ${CLAUDE_HOME:-~/.claude}:/root/.claude:ro - environment: - NODE_ENV: production - DASHBOARD_PORT: 4820 - # Lets in-network Prometheus scrape /api/metrics (Host: agent-monitor:4820). - DASHBOARD_ALLOWED_HOSTS: agent-monitor - restart: unless-stopped - networks: - - ccam - healthcheck: - test: - [ - "CMD", - "node", - "-e", - "fetch('http://127.0.0.1:4820/api/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", - ] - interval: 10s - timeout: 5s - retries: 6 - start_period: 20s - - prometheus: - image: prom/prometheus:latest - container_name: ccam-prometheus - restart: unless-stopped - depends_on: - agent-monitor: - condition: service_healthy - command: - - --config.file=/etc/prometheus/prometheus-docker.yml - - --storage.tsdb.path=/prometheus - - --web.enable-lifecycle - - --web.console.templates=/etc/prometheus/consoles - volumes: - - ./monitoring/prometheus:/etc/prometheus:ro - - prometheus-data:/prometheus - ports: - - "127.0.0.1:9090:9090" - networks: - - ccam - healthcheck: - test: ["CMD", "wget", "-qO-", "http://127.0.0.1:9090/-/ready"] - interval: 10s - timeout: 5s - retries: 6 - - grafana: - image: grafana/grafana:latest - container_name: ccam-grafana - restart: unless-stopped - depends_on: - prometheus: - condition: service_healthy - env_file: - - ./monitoring/grafana.defaults.env - volumes: - - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro - - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro - - grafana-data:/var/lib/grafana - ports: - - "127.0.0.1:3000:3000" - networks: - - ccam - healthcheck: - test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/api/health"] - interval: 10s - timeout: 5s - retries: 6 - -networks: - ccam: - -volumes: - prometheus-data: - grafana-data: diff --git a/docker-compose.yml b/docker-compose.yml index 7cf1c22..8fd8e83 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,8 +15,8 @@ services: environment: - NODE_ENV=production - DASHBOARD_PORT=4820 - # Optional — required when Prometheus-in-Docker scrapes this container - # (host.docker.internal) or the full stack (agent-monitor). See monitoring/README.md. + # Optional — required when a Prometheus-in-Docker scraper reaches this + # container as anything other than loopback (e.g. host.docker.internal). - DASHBOARD_ALLOWED_HOSTS=${DASHBOARD_ALLOWED_HOSTS:-} # DASHBOARD_HOST=0.0.0.0 and DASHBOARD_DATA_DIR=/app/data are baked into # the image (see Dockerfile) so both `docker run` and Compose work as-is. diff --git a/docs/API.md b/docs/API.md index 5466f7a..14b61e5 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1058,8 +1058,6 @@ scrape_configs: # credentials: "" ``` -A ready-to-run Prometheus + Grafana stack (four auto-provisioned dashboards; default home **CCAM — Overview**) lives in [`monitoring/`](../monitoring/README.md). **npm path (no Docker):** `npm run monitoring:install` then `npm run monitoring:up` (binaries are pulled via the monitoring package's `postinstall` — there is no official `grafana`/`prometheus` server package on npm). **Docker path:** `npm run monitoring:docker:up` or `npm run docker:full:up` (set `DASHBOARD_ALLOWED_HOSTS=host.docker.internal` on the dashboard when Prometheus runs in a container). Pre-built Prometheus console: `http://localhost:9090/consoles/index.html`. - --- ### Pricing diff --git a/docs/README.md b/docs/README.md index 004542a..d2b21c5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,8 +31,6 @@ graph TB Architecture --> Hooks[HOOKS.md
Hook system integration] Architecture --> MCP[MCP.md
MCP server integration] - Setup --> Deploy[DEPLOYMENT.md
Production deployment] - style Start fill:#3B82F6 style Setup fill:#10B981 style Architecture fill:#F59E0B @@ -50,10 +48,8 @@ graph TB | [DATABASE.md](./DATABASE.md) | SQLite schema, queries, performance | Database administrators | | [HOOKS.md](./HOOKS.md) | Claude Code hook system integration | Hook developers | | [MCP.md](./MCP.md) | MCP server setup and tool reference | MCP integrators | -| [DEPLOYMENT.md](./DEPLOYMENT.md) | Production deployment strategies | DevOps engineers | | [I18N.md](./I18N.md) | Language architecture, locale strategy, and rollout checklist | Frontend and product teams | | [CLI.md](./CLI.md) | `ccam` command reference — monitoring, browsing, insights, alerts, pricing, import, administration | Terminal users and CI scripting | -| [monitoring/README.md](../monitoring/README.md) | Prometheus + Grafana stack (`npm run monitoring:up` or Docker) | DevOps / observability | --- @@ -122,27 +118,6 @@ graph TB --- -### For DevOps Engineers - -```mermaid -graph TB - DevOps[DevOps Engineer] --> Deploy[DEPLOYMENT.md] - Deploy --> Docker[Docker Setup] - Deploy --> PM2[PM2 Process Manager] - Deploy --> Cloud[Cloud Deployment] - Deploy --> Monitoring[Monitoring & Logging] - - style DevOps fill:#F59E0B -``` - -**Key Documents:** - -- [DEPLOYMENT.md](./DEPLOYMENT.md) - Complete deployment guide -- [DATABASE.md](./DATABASE.md#backup-strategies) - Backup strategies -- [server/README.md](../server/README.md#performance) - Performance tuning - ---- - ### For Integration Developers ```mermaid @@ -378,37 +353,6 @@ erDiagram --- -## Deployment Options - -```mermaid -graph TB - subgraph "Development" - Dev[npm run dev
Hot reload] - end - - subgraph "Production" - Docker[Docker Compose
Containerized] - PM2[PM2
Process manager] - Systemd[Systemd Service
Linux systems] - Cloud[Cloud Platform
AWS, Azure, GCP] - end - - Dev -.->|Build| Docker - Dev -.->|Build| PM2 - Dev -.->|Build| Systemd - Dev -.->|Build| Cloud - - style Dev fill:#3B82F6 - style Docker fill:#2496ED - style PM2 fill:#10B981 - style Systemd fill:#F59E0B - style Cloud fill:#8B5CF6 -``` - -**Full Reference:** [DEPLOYMENT.md](./DEPLOYMENT.md) - ---- - ## Performance Metrics ### Benchmarks diff --git a/mcp/build/.srchash b/mcp/build/.srchash index 5a0a20c..feaa6c8 100644 --- a/mcp/build/.srchash +++ b/mcp/build/.srchash @@ -1 +1 @@ -2e9282b25c6d10d236ad0fd91bceeebf9a5c08cdbea74f1c780c1bae5303ca81 +4a478bdd2063e99f6bc7cf62ec091b03757fd54fd99fba4b662d02b1f51543bc diff --git a/mcp/build/clients/dashboard-api-client.js b/mcp/build/clients/dashboard-api-client.js index a68624a..e9e27eb 100644 --- a/mcp/build/clients/dashboard-api-client.js +++ b/mcp/build/clients/dashboard-api-client.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../core/logger.js` diff --git a/mcp/build/config/app-config.js b/mcp/build/config/app-config.js index 8fd3084..f39b63c 100644 --- a/mcp/build/config/app-config.js +++ b/mcp/build/config/app-config.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `LogLevel` — exported API; see TSDoc on the symbol for behavior. * - `TransportMode` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/build/core/logger.js b/mcp/build/core/logger.js index f6d9eee..3ef03a7 100644 --- a/mcp/build/core/logger.js +++ b/mcp/build/core/logger.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * diff --git a/mcp/build/core/tool-registry.js b/mcp/build/core/tool-registry.js index f22cf03..9fe9adf 100644 --- a/mcp/build/core/tool-registry.js +++ b/mcp/build/core/tool-registry.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./logger.js` * - `./tool-result.js` diff --git a/mcp/build/core/tool-result.js b/mcp/build/core/tool-result.js index 81d7168..34a53a8 100644 --- a/mcp/build/core/tool-result.js +++ b/mcp/build/core/tool-result.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../clients/dashboard-api-client.js` * diff --git a/mcp/build/index.js b/mcp/build/index.js index c322a1f..c2eedd2 100644 --- a/mcp/build/index.js +++ b/mcp/build/index.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./clients/dashboard-api-client.js` * - `./config/app-config.js` diff --git a/mcp/build/policy/tool-guards.js b/mcp/build/policy/tool-guards.js index a4549fe..03f2636 100644 --- a/mcp/build/policy/tool-guards.js +++ b/mcp/build/policy/tool-guards.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * diff --git a/mcp/build/server.js b/mcp/build/server.js index 94d7b70..034325c 100644 --- a/mcp/build/server.js +++ b/mcp/build/server.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./config/app-config.js` * - `./clients/dashboard-api-client.js` diff --git a/mcp/build/tools/domains/agent-tools.js b/mcp/build/tools/domains/agent-tools.js index 6fb91b4..b18db2d 100644 --- a/mcp/build/tools/domains/agent-tools.js +++ b/mcp/build/tools/domains/agent-tools.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/build/tools/domains/event-tools.js b/mcp/build/tools/domains/event-tools.js index 802c408..c4a1199 100644 --- a/mcp/build/tools/domains/event-tools.js +++ b/mcp/build/tools/domains/event-tools.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/build/tools/domains/maintenance-tools.js b/mcp/build/tools/domains/maintenance-tools.js index 351a098..75407ca 100644 --- a/mcp/build/tools/domains/maintenance-tools.js +++ b/mcp/build/tools/domains/maintenance-tools.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/build/tools/domains/observability-tools.js b/mcp/build/tools/domains/observability-tools.js index 3a411ef..ace5bfb 100644 --- a/mcp/build/tools/domains/observability-tools.js +++ b/mcp/build/tools/domains/observability-tools.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../types/tool-context.js` * - `../../core/tool-registry.js` diff --git a/mcp/build/tools/domains/pricing-tools.js b/mcp/build/tools/domains/pricing-tools.js index 8a940a7..fc4b72a 100644 --- a/mcp/build/tools/domains/pricing-tools.js +++ b/mcp/build/tools/domains/pricing-tools.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/build/tools/domains/session-tools.js b/mcp/build/tools/domains/session-tools.js index 8de20fa..954f233 100644 --- a/mcp/build/tools/domains/session-tools.js +++ b/mcp/build/tools/domains/session-tools.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/build/tools/index.js b/mcp/build/tools/index.js index d6f9fcc..7c27445 100644 --- a/mcp/build/tools/index.js +++ b/mcp/build/tools/index.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../types/tool-context.js` * - `./domains/observability-tools.js` diff --git a/mcp/build/tools/schemas.js b/mcp/build/tools/schemas.js index 5892a18..d8966f9 100644 --- a/mcp/build/tools/schemas.js +++ b/mcp/build/tools/schemas.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `SessionStatusSchema` — exported API; see TSDoc on the symbol for behavior. * - `AgentStatusSchema` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/build/transports/http-server.js b/mcp/build/transports/http-server.js index c5dc415..60ecf24 100644 --- a/mcp/build/transports/http-server.js +++ b/mcp/build/transports/http-server.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../core/logger.js` diff --git a/mcp/build/transports/repl.js b/mcp/build/transports/repl.js index 0a25724..4d6caf5 100644 --- a/mcp/build/transports/repl.js +++ b/mcp/build/transports/repl.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../clients/dashboard-api-client.js` diff --git a/mcp/build/transports/tool-collector.js b/mcp/build/transports/tool-collector.js index d594492..2ea165b 100644 --- a/mcp/build/transports/tool-collector.js +++ b/mcp/build/transports/tool-collector.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../clients/dashboard-api-client.js` diff --git a/mcp/build/types/tool-context.js b/mcp/build/types/tool-context.js index 5452e8b..86b11e6 100644 --- a/mcp/build/types/tool-context.js +++ b/mcp/build/types/tool-context.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../clients/dashboard-api-client.js` diff --git a/mcp/build/ui/banner.js b/mcp/build/ui/banner.js index 7b4f4a4..7de9dd0 100644 --- a/mcp/build/ui/banner.js +++ b/mcp/build/ui/banner.js @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `printBanner` — exported API; see TSDoc on the symbol for behavior. * - `printServerInfo` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/build/ui/colors.js b/mcp/build/ui/colors.js index 4d00dd8..cabe975 100644 --- a/mcp/build/ui/colors.js +++ b/mcp/build/ui/colors.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `bold` — exported API; see TSDoc on the symbol for behavior. * - `dim` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/build/ui/formatter.js b/mcp/build/ui/formatter.js index 70d54eb..1b71ac8 100644 --- a/mcp/build/ui/formatter.js +++ b/mcp/build/ui/formatter.js @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `box` — exported API; see TSDoc on the symbol for behavior. * - `divider` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/src/clients/dashboard-api-client.ts b/mcp/src/clients/dashboard-api-client.ts index 4f6e271..3189c77 100644 --- a/mcp/src/clients/dashboard-api-client.ts +++ b/mcp/src/clients/dashboard-api-client.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../core/logger.js` diff --git a/mcp/src/config/app-config.ts b/mcp/src/config/app-config.ts index 9ccc6ee..2d5e393 100644 --- a/mcp/src/config/app-config.ts +++ b/mcp/src/config/app-config.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `LogLevel` — exported API; see TSDoc on the symbol for behavior. * - `TransportMode` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/src/core/logger.ts b/mcp/src/core/logger.ts index 0f7c3c6..c7552d9 100644 --- a/mcp/src/core/logger.ts +++ b/mcp/src/core/logger.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * diff --git a/mcp/src/core/tool-registry.ts b/mcp/src/core/tool-registry.ts index fdc3a6b..d2823d9 100644 --- a/mcp/src/core/tool-registry.ts +++ b/mcp/src/core/tool-registry.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./logger.js` * - `./tool-result.js` diff --git a/mcp/src/core/tool-result.ts b/mcp/src/core/tool-result.ts index 6e87972..8a27332 100644 --- a/mcp/src/core/tool-result.ts +++ b/mcp/src/core/tool-result.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../clients/dashboard-api-client.js` * diff --git a/mcp/src/index.ts b/mcp/src/index.ts index f9f8742..7d06823 100644 --- a/mcp/src/index.ts +++ b/mcp/src/index.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./clients/dashboard-api-client.js` * - `./config/app-config.js` diff --git a/mcp/src/policy/tool-guards.ts b/mcp/src/policy/tool-guards.ts index ba7eec2..f296a92 100644 --- a/mcp/src/policy/tool-guards.ts +++ b/mcp/src/policy/tool-guards.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * diff --git a/mcp/src/server.ts b/mcp/src/server.ts index f03a4b7..98c8708 100644 --- a/mcp/src/server.ts +++ b/mcp/src/server.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `./config/app-config.js` * - `./clients/dashboard-api-client.js` diff --git a/mcp/src/tools/domains/agent-tools.ts b/mcp/src/tools/domains/agent-tools.ts index 1d11312..2952dd2 100644 --- a/mcp/src/tools/domains/agent-tools.ts +++ b/mcp/src/tools/domains/agent-tools.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/src/tools/domains/event-tools.ts b/mcp/src/tools/domains/event-tools.ts index bc896cc..2eac2ab 100644 --- a/mcp/src/tools/domains/event-tools.ts +++ b/mcp/src/tools/domains/event-tools.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/src/tools/domains/maintenance-tools.ts b/mcp/src/tools/domains/maintenance-tools.ts index f2008d7..80cd875 100644 --- a/mcp/src/tools/domains/maintenance-tools.ts +++ b/mcp/src/tools/domains/maintenance-tools.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/src/tools/domains/observability-tools.ts b/mcp/src/tools/domains/observability-tools.ts index bc21a3a..f3fc9c0 100644 --- a/mcp/src/tools/domains/observability-tools.ts +++ b/mcp/src/tools/domains/observability-tools.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../types/tool-context.js` * - `../../core/tool-registry.js` diff --git a/mcp/src/tools/domains/pricing-tools.ts b/mcp/src/tools/domains/pricing-tools.ts index 20429ee..cef5938 100644 --- a/mcp/src/tools/domains/pricing-tools.ts +++ b/mcp/src/tools/domains/pricing-tools.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/src/tools/domains/session-tools.ts b/mcp/src/tools/domains/session-tools.ts index 42291ba..8afaac7 100644 --- a/mcp/src/tools/domains/session-tools.ts +++ b/mcp/src/tools/domains/session-tools.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../../core/tool-registry.js` * - `../../policy/tool-guards.js` diff --git a/mcp/src/tools/index.ts b/mcp/src/tools/index.ts index 8be49d4..1cfbad2 100644 --- a/mcp/src/tools/index.ts +++ b/mcp/src/tools/index.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../types/tool-context.js` * - `./domains/observability-tools.js` diff --git a/mcp/src/tools/schemas.ts b/mcp/src/tools/schemas.ts index d8b063c..8eaa09f 100644 --- a/mcp/src/tools/schemas.ts +++ b/mcp/src/tools/schemas.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `SessionStatusSchema` — exported API; see TSDoc on the symbol for behavior. * - `AgentStatusSchema` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/src/transports/http-server.ts b/mcp/src/transports/http-server.ts index 00da65e..7c0a26c 100644 --- a/mcp/src/transports/http-server.ts +++ b/mcp/src/transports/http-server.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../core/logger.js` diff --git a/mcp/src/transports/repl.ts b/mcp/src/transports/repl.ts index 50d3517..cfdacf7 100644 --- a/mcp/src/transports/repl.ts +++ b/mcp/src/transports/repl.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../clients/dashboard-api-client.js` diff --git a/mcp/src/transports/tool-collector.ts b/mcp/src/transports/tool-collector.ts index 8773465..5e95843 100644 --- a/mcp/src/transports/tool-collector.ts +++ b/mcp/src/transports/tool-collector.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../clients/dashboard-api-client.js` diff --git a/mcp/src/types/tool-context.ts b/mcp/src/types/tool-context.ts index e2b7e04..38e8882 100644 --- a/mcp/src/types/tool-context.ts +++ b/mcp/src/types/tool-context.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Internal dependencies * - `../config/app-config.js` * - `../clients/dashboard-api-client.js` diff --git a/mcp/src/ui/banner.ts b/mcp/src/ui/banner.ts index f5ccd9a..35af21b 100644 --- a/mcp/src/ui/banner.ts +++ b/mcp/src/ui/banner.ts @@ -23,11 +23,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `printBanner` — exported API; see TSDoc on the symbol for behavior. * - `printServerInfo` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/src/ui/colors.ts b/mcp/src/ui/colors.ts index 412f02c..44e8f20 100644 --- a/mcp/src/ui/colors.ts +++ b/mcp/src/ui/colors.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `bold` — exported API; see TSDoc on the symbol for behavior. * - `dim` — exported API; see TSDoc on the symbol for behavior. diff --git a/mcp/src/ui/formatter.ts b/mcp/src/ui/formatter.ts index ebbff64..a90def6 100644 --- a/mcp/src/ui/formatter.ts +++ b/mcp/src/ui/formatter.ts @@ -20,11 +20,6 @@ * how to reach a peer dashboard; the global data scope (`dataScope.ts`) narrows every * scoped GET via `?sources=`. Health checks and import history surface in Settings. * - * ## Observability - * Prometheus scrapes `GET /api/metrics` (see `monitoring/`). Grafana ships four - * provisioned boards (overview, sessions, tools, alerts). Native npm scripts and - * Docker Compose profiles are documented in `monitoring/README.md`. - * * ## Public surface * - `box` — exported API; see TSDoc on the symbol for behavior. * - `divider` — exported API; see TSDoc on the symbol for behavior. diff --git a/monitoring/.gitignore b/monitoring/.gitignore deleted file mode 100644 index f348210..0000000 --- a/monitoring/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.data/ -.bin/ -node_modules/ -package-lock.json diff --git a/monitoring/README.md b/monitoring/README.md deleted file mode 100644 index 1b9fa3c..0000000 --- a/monitoring/README.md +++ /dev/null @@ -1,272 +0,0 @@ -# CCAM monitoring stack (Prometheus + Grafana) - -![Prometheus](https://img.shields.io/badge/Prometheus-2.x-E6522C?style=flat-square&logo=prometheus&logoColor=white) -![Grafana](https://img.shields.io/badge/Grafana-10.x-F46800?style=flat-square&logo=grafana&logoColor=white) -![Docker](https://img.shields.io/badge/Docker-optional-2496ED?style=flat-square&logo=docker&logoColor=white) -![Node.js](https://img.shields.io/badge/npm-managed-339933?style=flat-square&logo=nodedotjs&logoColor=white) - -A turnkey [Prometheus](https://prometheus.io/) + [Grafana](https://grafana.com/) -stack that scrapes the dashboard's [`GET /api/metrics`](../docs/API.md#metrics) -endpoint and renders **four auto-provisioned Grafana dashboards** (default home: -**CCAM — Overview**). Use it to watch live -sessions, agent states, event throughput, and token burn from the same -observability stack as the rest of your infra. - -**No Homebrew, apt, or global installs required.** There is no official `prometheus` or -`grafana` server package on npm (only client libraries and UI components) — the -stack uses npm's own install lifecycle instead: `npm run monitoring:install` -runs `postinstall` in this folder and pulls official release binaries into -`monitoring/.bin/` (same pattern as Playwright browsers or Electron). - -### Supported platforms (npm path) - -| OS | Architectures | -| --- | --- | -| macOS | Apple Silicon (`arm64`), Intel (`x64`) | -| Linux | `arm64`, `amd64` (`x64`) | -| Windows | `x64` | - -Node.js 20+ is the only prerequisite. On Windows, run the npm commands from -PowerShell or Command Prompt in the repo root (same as the rest of CCAM). - -## Grafana login (local default) - -Open after `monitoring:up` or `monitoring:docker:up`. -The admin account is **auto-created on first start** — no manual signup: - -| Field | Value | -| --- | --- | -| Username | `admin` | -| Password | `admin` | - -Credentials are defined in [`grafana.defaults.env`](./grafana.defaults.env) and -applied by both the npm and Docker paths. **CCAM — Overview** is the default -home dashboard (`GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_UID=ccam-overview`) with -PromQL queries against your live `/api/metrics` scrape — no sample or synthetic -data. The Prometheus datasource is pre-provisioned, so you land straight in the -UI after login. - -> If login fails after an earlier Grafana run, reset local state: -> `rm -rf monitoring/.data/grafana` (npm) or recreate the `grafana-data` Docker -> volume, then start the stack again. - -``` -monitoring/ -├── package.json # npm install downloads binaries (postinstall) -├── grafana.defaults.env # default admin / admin credentials -├── scripts/ # lifecycle helpers (setup / up / down) -├── prometheus/ -│ ├── prometheus-native.yml # scrape config for npm-managed stack -│ ├── prometheus.yml # scrape config for Docker stack -│ ├── prometheus-docker.yml # all-Docker stack (docker-compose.full.yml) -│ ├── ccam-rules.yml # recording rules (derived from live scrapes) -│ └── consoles/index.html # Prometheus CCAM console (pre-built graphs) -├── grafana/ -│ ├── provisioning/… # Docker datasource + dashboard provider -│ ├── provisioning-native/… # npm-managed datasource template -│ └── dashboards/ # ccam-overview + 3 focused boards -└── docker-compose.yml # optional Docker path -``` - -## Quick start (npm — no Docker) - -1. **Start the dashboard** on loopback (default `npm start` on port 4820). No - `DASHBOARD_ALLOWED_HOSTS` override is needed — Prometheus scrapes - `127.0.0.1:4820`, which the server's Host guard already accepts. - - ```bash - npm start - ``` - -2. **One-time install** — uses npm's `postinstall` to download official - Prometheus + Grafana OSS binaries into `monitoring/.bin/` (~150 MB total): - - ```bash - npm run monitoring:install - ``` - - (`monitoring:setup` is an alias for the same command.) - -3. **Bring up the stack:** - - ```bash - npm run monitoring:up - ``` - -4. **Open Grafana** at (login `admin` / `admin`). The - **CCAM — Overview** dashboard is already there — no import step. For - Prometheus, open the pre-built **CCAM console** at - (live graphs + tables), or - → **Consoles** → `index.html` (`Status → Targets`: - `ccam` should be **UP**). - -Stop with `npm run monitoring:down`. For a foreground session with logs on the -terminal, use `npm run monitoring:start` instead (Ctrl+C stops both). - -## Quick start (Docker / Podman) - -Use this when you prefer containers or when the dashboard itself runs in Docker. - -1. **Start the dashboard** so the container can scrape it. The server's - DNS-rebinding guard only accepts loopback `Host` headers, and Prometheus (in - Docker) reaches the host as `host.docker.internal` — so allow that Host: - - ```bash - DASHBOARD_ALLOWED_HOSTS=host.docker.internal npm start - ``` - - When the dashboard runs **inside Docker** (`docker compose up` at the repo - root), set the same variable on the `agent-monitor` service: - - ```bash - DASHBOARD_ALLOWED_HOSTS=host.docker.internal docker compose up -d - ``` - - > Without this you'll see the Prometheus target stuck **DOWN** with - > `403 EBADHOST`. If you also set `DASHBOARD_TOKEN`, see [Auth](#auth) below. - -2. **Bring up the monitoring stack:** - - ```bash - npm run monitoring:docker:up - ``` - -3. **Open Grafana** at (login `admin` / `admin`). - -Tear down with `npm run monitoring:docker:down`. - -### All-in-one Docker (app + monitoring) - -Runs the dashboard, Prometheus, and Grafana on one network — no -`host.docker.internal` wiring required: - -```bash -npm run docker:full:up -npm run monitoring:verify -``` - -Stop with `npm run docker:full:down`. - -## Deployment options - -| Dashboard | Monitoring | Commands | -| --- | --- | --- | -| **npm** (`npm start`) | **npm** | `monitoring:install` → `monitoring:up` | -| **npm** | **Docker** | `DASHBOARD_ALLOWED_HOSTS=host.docker.internal npm start` → `monitoring:docker:up` | -| **Docker** (`docker:up`) | **Docker** | `DASHBOARD_ALLOWED_HOSTS=host.docker.internal docker compose up -d` → `monitoring:docker:up` | -| **Docker** | **npm** | `docker:up` + `monitoring:up` (scrapes host `127.0.0.1:4820`) | -| **Docker full stack** | **included** | `docker:full:up` | - -Verify any running stack: `npm run monitoring:verify`. - -## npm scripts - -| Command | Description | -| --- | --- | -| `npm run monitoring:install` | `npm install` in `monitoring/` — downloads binaries via `postinstall` | -| `npm run monitoring:setup` | Alias for `monitoring:install` | -| `npm run monitoring:up` | Start Prometheus (:9090) + Grafana (:3000) in the background | -| `npm run monitoring:down` | Stop the npm-managed stack | -| `npm run monitoring:start` | Foreground start (Ctrl+C stops both) | -| `npm run monitoring:docker:up` | `docker compose` Prometheus + Grafana | -| `npm run monitoring:docker:down` | Tear down the Docker monitoring stack | -| `npm run monitoring:verify` | Health-check dashboard + Prometheus + Grafana + scrape target | -| `npm run docker:up` | Start the dashboard container only | -| `npm run docker:down` | Stop the dashboard container | -| `npm run docker:full:up` | Dashboard + Prometheus + Grafana (all Docker) | -| `npm run docker:full:down` | Tear down the full Docker stack | - -## Bundled Grafana dashboards - -Four dashboards are auto-provisioned from `grafana/dashboards/` — all query live -`/api/metrics` data (no sample or synthetic series): - -| Dashboard | UID | Focus | -| --- | --- | --- | -| **CCAM — Overview** | `ccam-overview` | Default home — fleet snapshot, totals, breakdowns, rates | -| **CCAM — Sessions & Agents** | `ccam-sessions-agents` | Session lifecycle, agent states, WebSocket clients | -| **CCAM — Tokens & Events** | `ccam-tokens-events` | Cumulative tokens/events, throughput rates, cache efficiency | -| **CCAM — Platform Health** | `ccam-platform` | Scrape/API uptime, process memory, remote sources, build info | - -Each board links to the others in the header. After `monitoring:up`, open -http://localhost:3000/dashboards or land on **Overview** as the home dashboard. - -## What's on the Overview dashboard - -The bundled **CCAM — Overview** board uses only metrics from your database. -**Cumulative stat panels** (total sessions, events, tokens) show substantial -numbers on the first scrape; **rate panels** need a few minutes of scrape -history before lines appear. - -| Section | Example queries | -| --- | --- | -| Live fleet | `ccam_sessions{status="active"}`, `ccam_agents{status="working"}`, `ccam_websocket_clients`, `sum(ccam_sessions)` | -| Database totals | `ccam_sessions{status="completed"}`, `ccam_events_total`, `ccam_tokens_total`, `sum(ccam_tokens_total)` | -| Breakdown | `ccam_sessions` (pie), `ccam_tokens_total` (bar gauge) | -| Over time | `ccam_sessions`, `ccam_events_total`, `ccam_tokens_total` | -| Rates | `rate(ccam_events_total[5m])`, `rate(ccam_tokens_total[5m])` | -| Process | `ccam_process_uptime_seconds`, `ccam_process_resident_memory_bytes`, `ccam_build_info` | - -See [`docs/API.md` → Metrics](../docs/API.md#metrics) for the full metric list. - -## Prometheus quick start - -**Open the CCAM console first** — static HTML that queries Prometheus directly -(Prometheus 3.x compatible; no deprecated console template libraries): - -**http://localhost:9090/consoles/index.html** - -Also reachable from the Prometheus UI menu: **Consoles → index.html**. - -The console runs real PromQL against your scraped metrics: session totals, -cumulative events/tokens, working agents, and drill-down links into the Graph UI. -If the page warns about a missing scrape target, start CCAM on port 4820 and -wait ~15s for the first poll. - -### Graph tab bookmarks - -Open [http://localhost:9090](http://localhost:9090) and paste any of these into -the **Graph** tab (all read live scraped data — never seeded): - -| Query | What it shows | -| --- | --- | -| `sum(ccam_sessions)` | Total sessions across all statuses | -| `ccam_events_total` | Cumulative hook events in the database | -| `sum(ccam_tokens_total)` | All token kinds combined | -| `ccam:sessions:total` | Same as above via [recording rule](./prometheus/ccam-rules.yml) | -| `ccam:events:rate5m` | Events per second (5m window) | - -Pre-filled graph links (bookmark these): - -- [Total sessions](http://localhost:9090/graph?g0.expr=sum(ccam_sessions)&g0.tab=0) -- [Total events](http://localhost:9090/graph?g0.expr=ccam_events_total&g0.tab=0) -- [Token totals by kind](http://localhost:9090/graph?g0.expr=ccam_tokens_total&g0.tab=0) - -## Configuration - -- **npm-managed stack.** Scrape target lives in - [`prometheus/prometheus-native.yml`](./prometheus/prometheus-native.yml) - (default `127.0.0.1:4820`). Binary versions are pinned in - [`scripts/paths.js`](./scripts/paths.js). -- **Docker stack.** Host-native dashboard: [`prometheus/prometheus.yml`](./prometheus/prometheus.yml) - (`host.docker.internal:4820`). All-Docker stack: [`prometheus/prometheus-docker.yml`](./prometheus/prometheus-docker.yml) - (`agent-monitor:4820`, used by `docker-compose.full.yml`). -- **
Auth (`DASHBOARD_TOKEN`).** If the server requires a token, - uncomment the `authorization` block in the relevant prometheus config and set - `credentials` to your `DASHBOARD_TOKEN`. (The `DASHBOARD_ALLOWED_HOSTS` step is - still required for Docker scrapes — the Host guard runs independently of the - token.) -- **Scrape interval** lives in the prometheus config (`global.scrape_interval`). -- **Grafana admin password** — defaults to `admin` / `admin` via - [`grafana.defaults.env`](./grafana.defaults.env) (Docker) and `grafanaAdminEnv()` - in [`scripts/paths.js`](./scripts/paths.js) (npm). Applied on **first start** - only; wipe `monitoring/.data/grafana` or the `grafana-data` volume to re-seed. - -## Security note - -`/api/metrics` exposes aggregate operational counts (session/agent tallies, event -and token totals, uptime) — no prompts, transcripts, costs, or secrets. It sits -behind the same loopback/Host guard and optional `DASHBOARD_TOKEN` as the rest of -the API; scraping is only possible once you explicitly allow the scraper's Host -(and token, if set). Keep Grafana/Prometheus on a trusted network or behind your -own reverse proxy. diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml deleted file mode 100644 index 5552d62..0000000 --- a/monitoring/docker-compose.yml +++ /dev/null @@ -1,48 +0,0 @@ -# Turnkey Prometheus + Grafana stack for the CCAM `/api/metrics` endpoint. -# -# cd monitoring && docker compose up -d -# open http://localhost:3000 (admin / admin) -# -# The "CCAM — Overview" dashboard and the Prometheus datasource are -# pre-provisioned, so there is nothing to click after start. Prometheus scrapes -# the dashboard running on the HOST (a plain `npm start` on :4820) via -# host.docker.internal — see ./prometheus/prometheus.yml to change the target -# or add a bearer token when DASHBOARD_TOKEN is set. See ./README.md. -services: - prometheus: - image: prom/prometheus:latest - container_name: ccam-prometheus - restart: unless-stopped - command: - - --config.file=/etc/prometheus/prometheus.yml - - --storage.tsdb.path=/prometheus - - --web.enable-lifecycle - - --web.console.templates=/etc/prometheus/consoles - volumes: - - ./prometheus:/etc/prometheus:ro - - prometheus-data:/prometheus - ports: - - "127.0.0.1:9090:9090" - # Lets the container reach a CCAM server running on the host (Linux needs the - # explicit host-gateway mapping; Docker Desktop resolves it natively). - extra_hosts: - - "host.docker.internal:host-gateway" - - grafana: - image: grafana/grafana:latest - container_name: ccam-grafana - restart: unless-stopped - depends_on: - - prometheus - env_file: - - ./grafana.defaults.env - volumes: - - ./grafana/provisioning:/etc/grafana/provisioning:ro - - ./grafana/dashboards:/var/lib/grafana/dashboards:ro - - grafana-data:/var/lib/grafana - ports: - - "127.0.0.1:3000:3000" - -volumes: - prometheus-data: - grafana-data: diff --git a/monitoring/grafana.defaults.env b/monitoring/grafana.defaults.env deleted file mode 100644 index 9c2aa01..0000000 --- a/monitoring/grafana.defaults.env +++ /dev/null @@ -1,6 +0,0 @@ -# Default local Grafana credentials — applied on first start (npm or Docker). -# Shared by monitoring/docker-compose.yml, docker-compose.full.yml, and start.js. -GF_SECURITY_ADMIN_USER=admin -GF_SECURITY_ADMIN_PASSWORD=admin -GF_USERS_ALLOW_SIGN_UP=false -GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_UID=ccam-overview diff --git a/monitoring/grafana/dashboards/ccam-overview.json b/monitoring/grafana/dashboards/ccam-overview.json deleted file mode 100644 index d27042e..0000000 --- a/monitoring/grafana/dashboards/ccam-overview.json +++ /dev/null @@ -1,855 +0,0 @@ -{ - "uid": "ccam-overview", - "title": "CCAM — Overview", - "description": "Live metrics scraped from GET /api/metrics on each 15s interval. Every value is read from your SQLite database at scrape time — no sample or synthetic data.", - "tags": ["ccam", "claude-code"], - "timezone": "browser", - "schemaVersion": 39, - "version": 2, - "editable": true, - "refresh": "15s", - "time": { "from": "now-24h", "to": "now" }, - "links": [ - { - "title": "Sessions & Agents", - "type": "link", - "url": "/d/ccam-sessions-agents/ccam-sessions-agents", - "keepTime": true - }, - { - "title": "Tokens & Events", - "type": "link", - "url": "/d/ccam-tokens-events/ccam-tokens-events", - "keepTime": true - }, - { - "title": "Platform Health", - "type": "link", - "url": "/d/ccam-platform/ccam-platform", - "keepTime": true - }, - { - "title": "Prometheus — total sessions", - "type": "link", - "icon": "external link", - "url": "http://localhost:9090/graph?g0.expr=sum(ccam_sessions)&g0.tab=0", - "targetBlank": true, - "keepTime": true - }, - { - "title": "Prometheus — event total", - "type": "link", - "icon": "external link", - "url": "http://localhost:9090/graph?g0.expr=ccam_events_total&g0.tab=0", - "targetBlank": true, - "keepTime": true - } - ], - "templating": { "list": [] }, - "annotations": { "list": [] }, - "panels": [ - { - "id": 100, - "type": "row", - "title": "Live fleet", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 } - }, - { - "id": 1, - "type": "stat", - "title": "Active sessions", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 0, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_sessions{status=\"active\"}", - "legendFormat": "active" - } - ] - }, - { - "id": 2, - "type": "stat", - "title": "Working agents", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 4, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_agents{status=\"working\"}", - "legendFormat": "working" - } - ] - }, - { - "id": 3, - "type": "stat", - "title": "Realtime clients", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 8, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "purple", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_websocket_clients", - "legendFormat": "clients" - } - ] - }, - { - "id": 4, - "type": "stat", - "title": "Enabled remote sources", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 12, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "none", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_remote_sources{enabled=\"true\"}", - "legendFormat": "enabled" - } - ] - }, - { - "id": 12, - "type": "stat", - "title": "Scrape healthy", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 16, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "background", - "graphMode": "none", - "textMode": "value", - "justifyMode": "center" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "type": "value", - "options": { - "0": { "text": "DOWN", "color": "red" }, - "1": { "text": "UP", "color": "green" } - } - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "red", "value": null }, - { "color": "green", "value": 1 } - ] - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_up", - "legendFormat": "up" - } - ] - }, - { - "id": 13, - "type": "stat", - "title": "Total sessions", - "description": "Sum of all session statuses in the database (active + completed + error + abandoned).", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 20, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "orange", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "sum(ccam_sessions)", - "legendFormat": "total" - } - ] - }, - { - "id": 101, - "type": "row", - "title": "Database totals (cumulative — from your SQLite history)", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 } - }, - { - "id": 14, - "type": "stat", - "title": "Completed sessions", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 0, "y": 6 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_sessions{status=\"completed\"}", - "legendFormat": "completed" - } - ] - }, - { - "id": 15, - "type": "stat", - "title": "Error sessions", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 4, "y": 6 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_sessions{status=\"error\"}", - "legendFormat": "error" - } - ] - }, - { - "id": 16, - "type": "stat", - "title": "Total events", - "description": "Monotonic counter since the database was created.", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 8, "y": 6 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_events_total", - "legendFormat": "events" - } - ] - }, - { - "id": 17, - "type": "stat", - "title": "Input tokens", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 12, "y": 6 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "yellow", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_tokens_total{kind=\"input\"}", - "legendFormat": "input" - } - ] - }, - { - "id": 18, - "type": "stat", - "title": "Output tokens", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 16, "y": 6 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "orange", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_tokens_total{kind=\"output\"}", - "legendFormat": "output" - } - ] - }, - { - "id": 19, - "type": "stat", - "title": "All tokens (sum)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 20, "y": 6 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "purple", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "sum(ccam_tokens_total)", - "legendFormat": "tokens" - } - ] - }, - { - "id": 102, - "type": "row", - "title": "Breakdown", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 10 } - }, - { - "id": 20, - "type": "piechart", - "title": "Sessions by status", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 8, "x": 0, "y": 11 }, - "options": { - "legend": { "displayMode": "table", "placement": "right", "values": ["value", "percent"] }, - "pieType": "donut", - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "tooltip": { "mode": "single" } - }, - "fieldConfig": { - "defaults": { "unit": "none", "decimals": 0 }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_sessions", - "legendFormat": "{{status}}", - "instant": true - } - ] - }, - { - "id": 21, - "type": "bargauge", - "title": "Token totals by kind", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 8, "x": 8, "y": 11 }, - "options": { - "orientation": "horizontal", - "displayMode": "gradient", - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "showUnfilled": true - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "color": { "mode": "palette-classic" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_tokens_total", - "legendFormat": "{{kind}}", - "instant": true - } - ] - }, - { - "id": 22, - "type": "bargauge", - "title": "Agents by status", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 8, "x": 16, "y": 11 }, - "options": { - "orientation": "horizontal", - "displayMode": "gradient", - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "showUnfilled": true - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "decimals": 0, - "color": { "mode": "palette-classic" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_agents", - "legendFormat": "{{status}}", - "instant": true - } - ] - }, - { - "id": 103, - "type": "row", - "title": "Over time", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 19 } - }, - { - "id": 5, - "type": "timeseries", - "title": "Sessions by status", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 20 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": [] }, - "tooltip": { "mode": "multi", "sort": "desc" } - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never", - "stacking": { "mode": "none", "group": "A" } - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_sessions", - "legendFormat": "{{status}}" - } - ] - }, - { - "id": 6, - "type": "timeseries", - "title": "Agents by status", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 20 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": [] }, - "tooltip": { "mode": "multi", "sort": "desc" } - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never", - "stacking": { "mode": "none", "group": "A" } - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_agents", - "legendFormat": "{{status}}" - } - ] - }, - { - "id": 23, - "type": "timeseries", - "title": "Cumulative events (database total)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 28 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": ["lastNotNull"] }, - "tooltip": { "mode": "single", "sort": "none" } - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 0, - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 20, - "showPoints": "never", - "stacking": { "mode": "none", "group": "A" } - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_events_total", - "legendFormat": "events" - } - ] - }, - { - "id": 24, - "type": "timeseries", - "title": "Cumulative tokens by kind", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 28 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": ["lastNotNull"] }, - "tooltip": { "mode": "multi", "sort": "desc" } - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never", - "stacking": { "mode": "none", "group": "A" } - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_tokens_total", - "legendFormat": "{{kind}}" - } - ] - }, - { - "id": 104, - "type": "row", - "title": "Rates (need a few scrape intervals)", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 36 } - }, - { - "id": 7, - "type": "timeseries", - "title": "Event throughput (events/sec)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 37 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": [] }, - "tooltip": { "mode": "single", "sort": "none" } - }, - "fieldConfig": { - "defaults": { - "unit": "ops", - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 15, - "showPoints": "never" - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "rate(ccam_events_total[5m])", - "legendFormat": "events/s" - } - ] - }, - { - "id": 8, - "type": "timeseries", - "title": "Token usage rate by kind (tokens/sec)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 37 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": [] }, - "tooltip": { "mode": "multi", "sort": "desc" } - }, - "fieldConfig": { - "defaults": { - "unit": "none", - "color": { "mode": "palette-classic" }, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never" - } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "rate(ccam_tokens_total[5m])", - "legendFormat": "{{kind}}" - } - ] - }, - { - "id": 105, - "type": "row", - "title": "Process", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 45 } - }, - { - "id": 9, - "type": "stat", - "title": "Server uptime", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 6, "w": 6, "x": 0, "y": 46 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "none", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "s", - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_process_uptime_seconds", - "legendFormat": "uptime" - } - ] - }, - { - "id": 10, - "type": "stat", - "title": "Server memory (RSS)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 6, "w": 6, "x": 6, "y": 46 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, - "colorMode": "value", - "graphMode": "area", - "textMode": "auto", - "justifyMode": "auto" - }, - "fieldConfig": { - "defaults": { - "unit": "bytes", - "color": { "mode": "thresholds" }, - "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } - }, - "overrides": [] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_process_resident_memory_bytes", - "legendFormat": "rss" - } - ] - }, - { - "id": 11, - "type": "table", - "title": "Build info", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 6, "w": 12, "x": 12, "y": 46 }, - "options": { "showHeader": true }, - "fieldConfig": { - "defaults": {}, - "overrides": [ - { - "matcher": { "id": "byName", "options": "Value" }, - "properties": [{ "id": "custom.hidden", "value": true }] - }, - { - "matcher": { "id": "byName", "options": "Time" }, - "properties": [{ "id": "custom.hidden", "value": true }] - }, - { - "matcher": { "id": "byName", "options": "job" }, - "properties": [{ "id": "custom.hidden", "value": true }] - } - ] - }, - "targets": [ - { - "refId": "A", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "expr": "ccam_build_info", - "format": "table", - "instant": true - } - ] - } - ] -} diff --git a/monitoring/grafana/dashboards/ccam-platform.json b/monitoring/grafana/dashboards/ccam-platform.json deleted file mode 100644 index 6f20b6b..0000000 --- a/monitoring/grafana/dashboards/ccam-platform.json +++ /dev/null @@ -1,401 +0,0 @@ -{ - "uid": "ccam-platform", - "title": "CCAM — Platform Health", - "description": "Scrape health, process resources, remote sources, and build info from live metrics.", - "tags": ["ccam", "claude-code", "platform", "health"], - "timezone": "browser", - "schemaVersion": 39, - "version": 1, - "editable": true, - "refresh": "15s", - "time": { "from": "now-24h", "to": "now" }, - "links": [ - { - "title": "Overview", - "type": "link", - "url": "/d/ccam-overview/ccam-overview", - "keepTime": true - }, - { - "title": "Sessions & Agents", - "type": "link", - "url": "/d/ccam-sessions-agents/ccam-sessions-agents", - "keepTime": true - }, - { - "title": "Tokens & Events", - "type": "link", - "url": "/d/ccam-tokens-events/ccam-tokens-events", - "keepTime": true - } - ], - "templating": { "list": [] }, - "annotations": { "list": [] }, - "panels": [ - { - "id": 100, - "type": "row", - "title": "Availability", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 } - }, - { - "id": 1, - "type": "stat", - "title": "Prometheus scrape", - "description": "up{job=\"ccam\"} — 1 when Prometheus successfully scrapes /api/metrics.", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 5, "w": 6, "x": 0, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "background", - "graphMode": "none", - "textMode": "value" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "type": "value", - "options": { - "0": { "text": "DOWN", "color": "red" }, - "1": { "text": "UP", "color": "green" } - } - } - ], - "thresholds": { - "steps": [ - { "color": "red", "value": null }, - { "color": "green", "value": 1 } - ] - } - } - }, - "targets": [{ "refId": "A", "expr": "up{job=\"ccam\"}", "legendFormat": "scrape" }] - }, - { - "id": 2, - "type": "stat", - "title": "CCAM API", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 5, "w": 6, "x": 6, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "background", - "graphMode": "none", - "textMode": "value" - }, - "fieldConfig": { - "defaults": { - "mappings": [ - { - "type": "value", - "options": { - "0": { "text": "DOWN", "color": "red" }, - "1": { "text": "UP", "color": "green" } - } - } - ], - "thresholds": { - "steps": [ - { "color": "red", "value": null }, - { "color": "green", "value": 1 } - ] - } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_up", "legendFormat": "api" }] - }, - { - "id": 3, - "type": "stat", - "title": "Server uptime", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 5, "w": 6, "x": 12, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "s", - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_process_uptime_seconds", "legendFormat": "uptime" }] - }, - { - "id": 4, - "type": "stat", - "title": "Memory (RSS)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 5, "w": 6, "x": 18, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "bytes", - "thresholds": { "steps": [{ "color": "blue", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_process_resident_memory_bytes", "legendFormat": "rss" } - ] - }, - { - "id": 5, - "type": "timeseries", - "title": "Scrape health over time", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 7, "w": 12, "x": 0, "y": 6 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "min": 0, - "max": 1, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 30, - "showPoints": "never", - "spanNulls": false - } - }, - "overrides": [ - { - "matcher": { "id": "byName", "options": "scrape" }, - "properties": [{ "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }] - }, - { - "matcher": { "id": "byName", "options": "api" }, - "properties": [{ "id": "color", "value": { "fixedColor": "blue", "mode": "fixed" } }] - } - ] - }, - "targets": [ - { "refId": "A", "expr": "up{job=\"ccam\"}", "legendFormat": "scrape" }, - { "refId": "B", "expr": "ccam_up", "legendFormat": "api" } - ] - }, - { - "id": 6, - "type": "timeseries", - "title": "Process memory (RSS)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 7, "w": 12, "x": 12, "y": 6 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "unit": "bytes", - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 20, - "showPoints": "never" - }, - "color": { "mode": "fixed", "fixedColor": "blue" } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_process_resident_memory_bytes", "legendFormat": "rss" } - ] - }, - { - "id": 101, - "type": "row", - "title": "Realtime & federation", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 13 } - }, - { - "id": 7, - "type": "stat", - "title": "WebSocket clients", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 0, "y": 14 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "purple", "value": null }] } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_websocket_clients", "legendFormat": "clients" }] - }, - { - "id": 8, - "type": "stat", - "title": "Remote sources (enabled)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 6, "y": 14 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "none" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_remote_sources{enabled=\"true\"}", "legendFormat": "enabled" } - ] - }, - { - "id": 9, - "type": "stat", - "title": "Remote sources (disabled)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 12, "y": 14 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "none" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "orange", "value": null }] } - } - }, - "targets": [ - { - "refId": "A", - "expr": "ccam_remote_sources{enabled=\"false\"}", - "legendFormat": "disabled" - } - ] - }, - { - "id": 10, - "type": "stat", - "title": "Hook activity (events/s)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 18, "y": 14 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "ops", - "decimals": 3, - "thresholds": { "steps": [{ "color": "blue", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "rate(ccam_events_total[5m])", "legendFormat": "events/s" } - ] - }, - { - "id": 11, - "type": "timeseries", - "title": "WebSocket clients over time", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 7, "w": 12, "x": 0, "y": 18 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 25, - "showPoints": "never" - }, - "color": { "mode": "fixed", "fixedColor": "purple" } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_websocket_clients", "legendFormat": "clients" }] - }, - { - "id": 12, - "type": "timeseries", - "title": "Remote data sources", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 7, "w": 12, "x": 12, "y": 18 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 15, - "showPoints": "never" - }, - "color": { "mode": "palette-classic" } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_remote_sources", "legendFormat": "enabled={{enabled}}" } - ] - }, - { - "id": 102, - "type": "row", - "title": "Build", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 25 } - }, - { - "id": 13, - "type": "table", - "title": "CCAM build info", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 6, "w": 12, "x": 0, "y": 26 }, - "options": { "showHeader": true }, - "fieldConfig": { - "defaults": {}, - "overrides": [ - { - "matcher": { "id": "byName", "options": "Value" }, - "properties": [{ "id": "custom.hidden", "value": true }] - }, - { - "matcher": { "id": "byName", "options": "Time" }, - "properties": [{ "id": "custom.hidden", "value": true }] - }, - { - "matcher": { "id": "byName", "options": "job" }, - "properties": [{ "id": "custom.hidden", "value": true }] - }, - { - "matcher": { "id": "byName", "options": "instance" }, - "properties": [{ "id": "custom.hidden", "value": true }] - } - ] - }, - "targets": [{ "refId": "A", "expr": "ccam_build_info", "format": "table", "instant": true }] - }, - { - "id": 14, - "type": "timeseries", - "title": "Server uptime", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 6, "w": 12, "x": 12, "y": 26 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "unit": "s", - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never" - } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_process_uptime_seconds", "legendFormat": "uptime" }] - } - ] -} diff --git a/monitoring/grafana/dashboards/ccam-sessions-agents.json b/monitoring/grafana/dashboards/ccam-sessions-agents.json deleted file mode 100644 index 962a6f3..0000000 --- a/monitoring/grafana/dashboards/ccam-sessions-agents.json +++ /dev/null @@ -1,371 +0,0 @@ -{ - "uid": "ccam-sessions-agents", - "title": "CCAM — Sessions & Agents", - "description": "Session lifecycle and agent fleet metrics from live /api/metrics scrapes.", - "tags": ["ccam", "claude-code", "sessions", "agents"], - "timezone": "browser", - "schemaVersion": 39, - "version": 1, - "editable": true, - "refresh": "15s", - "time": { "from": "now-24h", "to": "now" }, - "links": [ - { - "title": "Overview", - "type": "link", - "url": "/d/ccam-overview/ccam-overview", - "keepTime": true - }, - { - "title": "Tokens & Events", - "type": "link", - "url": "/d/ccam-tokens-events/ccam-tokens-events", - "keepTime": true - }, - { - "title": "Platform Health", - "type": "link", - "url": "/d/ccam-platform/ccam-platform", - "keepTime": true - } - ], - "templating": { "list": [] }, - "annotations": { "list": [] }, - "panels": [ - { - "id": 100, - "type": "row", - "title": "Sessions", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 } - }, - { - "id": 1, - "type": "stat", - "title": "Active", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 0, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_sessions{status=\"active\"}", "legendFormat": "active" } - ] - }, - { - "id": 2, - "type": "stat", - "title": "Completed", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 4, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "steps": [{ "color": "blue", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_sessions{status=\"completed\"}", "legendFormat": "completed" } - ] - }, - { - "id": 3, - "type": "stat", - "title": "Error", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 8, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "steps": [{ "color": "red", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_sessions{status=\"error\"}", "legendFormat": "error" } - ] - }, - { - "id": 4, - "type": "stat", - "title": "Abandoned", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 12, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "color": { "mode": "thresholds" }, - "thresholds": { "steps": [{ "color": "orange", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_sessions{status=\"abandoned\"}", "legendFormat": "abandoned" } - ] - }, - { - "id": 5, - "type": "stat", - "title": "Total sessions", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 16, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "unit": "none", - "color": { "mode": "thresholds" }, - "thresholds": { "steps": [{ "color": "purple", "value": null }] } - } - }, - "targets": [{ "refId": "A", "expr": "sum(ccam_sessions)", "legendFormat": "total" }] - }, - { - "id": 6, - "type": "stat", - "title": "Active % of total", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 20, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "none" - }, - "fieldConfig": { - "defaults": { - "unit": "percentunit", - "decimals": 1, - "min": 0, - "max": 1, - "color": { "mode": "thresholds" }, - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "targets": [ - { - "refId": "A", - "expr": "ccam_sessions{status=\"active\"} / clamp_min(sum(ccam_sessions), 1)", - "legendFormat": "active ratio" - } - ] - }, - { - "id": 7, - "type": "piechart", - "title": "Sessions by status", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 9, "w": 8, "x": 0, "y": 5 }, - "options": { - "legend": { "displayMode": "table", "placement": "right", "values": ["value", "percent"] }, - "pieType": "donut", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "fieldConfig": { "defaults": { "decimals": 0 } }, - "targets": [ - { "refId": "A", "expr": "ccam_sessions", "legendFormat": "{{status}}", "instant": true } - ] - }, - { - "id": 8, - "type": "timeseries", - "title": "Sessions over time", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 9, "w": 16, "x": 8, "y": 5 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "fieldConfig": { - "defaults": { - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 12, - "showPoints": "never" - }, - "color": { "mode": "palette-classic" } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_sessions", "legendFormat": "{{status}}" }] - }, - { - "id": 101, - "type": "row", - "title": "Agents", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 14 } - }, - { - "id": 9, - "type": "stat", - "title": "Working", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 0, "y": 15 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_agents{status=\"working\"}", "legendFormat": "working" } - ] - }, - { - "id": 10, - "type": "stat", - "title": "Waiting", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 6, "y": 15 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "yellow", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_agents{status=\"waiting\"}", "legendFormat": "waiting" } - ] - }, - { - "id": 11, - "type": "stat", - "title": "Completed", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 12, "y": 15 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "blue", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_agents{status=\"completed\"}", "legendFormat": "completed" } - ] - }, - { - "id": 12, - "type": "stat", - "title": "Error", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 6, "x": 18, "y": 15 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "decimals": 0, - "thresholds": { "steps": [{ "color": "red", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_agents{status=\"error\"}", "legendFormat": "error" } - ] - }, - { - "id": 13, - "type": "bargauge", - "title": "Agents by status", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 8, "x": 0, "y": 19 }, - "options": { - "orientation": "horizontal", - "displayMode": "gradient", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "fieldConfig": { "defaults": { "decimals": 0, "color": { "mode": "palette-classic" } } }, - "targets": [ - { "refId": "A", "expr": "ccam_agents", "legendFormat": "{{status}}", "instant": true } - ] - }, - { - "id": 14, - "type": "timeseries", - "title": "Agents over time", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 16, "x": 8, "y": 19 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "fieldConfig": { - "defaults": { - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never" - }, - "color": { "mode": "palette-classic" } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_agents", "legendFormat": "{{status}}" }] - }, - { - "id": 15, - "type": "timeseries", - "title": "Realtime dashboard clients", - "description": "WebSocket clients connected to the CCAM UI.", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 7, "w": 24, "x": 0, "y": 27 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 20, - "showPoints": "never" - }, - "color": { "mode": "fixed", "fixedColor": "purple" } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_websocket_clients", "legendFormat": "clients" }] - } - ] -} diff --git a/monitoring/grafana/dashboards/ccam-tokens-events.json b/monitoring/grafana/dashboards/ccam-tokens-events.json deleted file mode 100644 index 6003505..0000000 --- a/monitoring/grafana/dashboards/ccam-tokens-events.json +++ /dev/null @@ -1,350 +0,0 @@ -{ - "uid": "ccam-tokens-events", - "title": "CCAM — Tokens & Events", - "description": "Cumulative and rate views of hook events and token usage from live /api/metrics scrapes.", - "tags": ["ccam", "claude-code", "tokens", "events"], - "timezone": "browser", - "schemaVersion": 39, - "version": 1, - "editable": true, - "refresh": "15s", - "time": { "from": "now-24h", "to": "now" }, - "links": [ - { - "title": "Overview", - "type": "link", - "url": "/d/ccam-overview/ccam-overview", - "keepTime": true - }, - { - "title": "Sessions & Agents", - "type": "link", - "url": "/d/ccam-sessions-agents/ccam-sessions-agents", - "keepTime": true - }, - { - "title": "Platform Health", - "type": "link", - "url": "/d/ccam-platform/ccam-platform", - "keepTime": true - } - ], - "templating": { "list": [] }, - "annotations": { "list": [] }, - "panels": [ - { - "id": 100, - "type": "row", - "title": "Cumulative totals", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 } - }, - { - "id": 1, - "type": "stat", - "title": "Total events", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 4, "x": 0, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 0, - "thresholds": { "steps": [{ "color": "blue", "value": null }] } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_events_total", "legendFormat": "events" }] - }, - { - "id": 2, - "type": "stat", - "title": "Input tokens", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 5, "x": 4, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "thresholds": { "steps": [{ "color": "yellow", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_tokens_total{kind=\"input\"}", "legendFormat": "input" } - ] - }, - { - "id": 3, - "type": "stat", - "title": "Output tokens", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 5, "x": 9, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "thresholds": { "steps": [{ "color": "orange", "value": null }] } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_tokens_total{kind=\"output\"}", "legendFormat": "output" } - ] - }, - { - "id": 4, - "type": "stat", - "title": "Cache read", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 5, "x": 14, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "thresholds": { "steps": [{ "color": "green", "value": null }] } - } - }, - "targets": [ - { - "refId": "A", - "expr": "ccam_tokens_total{kind=\"cache_read\"}", - "legendFormat": "cache_read" - } - ] - }, - { - "id": 5, - "type": "stat", - "title": "Cache write", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 4, "w": 5, "x": 19, "y": 1 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 1, - "thresholds": { "steps": [{ "color": "teal", "value": null }] } - } - }, - "targets": [ - { - "refId": "A", - "expr": "ccam_tokens_total{kind=\"cache_write\"}", - "legendFormat": "cache_write" - } - ] - }, - { - "id": 6, - "type": "piechart", - "title": "Token share by kind", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 9, "w": 8, "x": 0, "y": 5 }, - "options": { - "legend": { "displayMode": "table", "placement": "right", "values": ["value", "percent"] }, - "pieType": "pie", - "reduceOptions": { "calcs": ["lastNotNull"] } - }, - "fieldConfig": { "defaults": { "unit": "short" } }, - "targets": [ - { "refId": "A", "expr": "ccam_tokens_total", "legendFormat": "{{kind}}", "instant": true } - ] - }, - { - "id": 7, - "type": "timeseries", - "title": "Cumulative tokens by kind", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 9, "w": 16, "x": 8, "y": 5 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 15, - "showPoints": "never" - }, - "color": { "mode": "palette-classic" } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_tokens_total", "legendFormat": "{{kind}}" }] - }, - { - "id": 8, - "type": "timeseries", - "title": "Cumulative events", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 24, "x": 0, "y": 14 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom", "calcs": ["lastNotNull"] } - }, - "fieldConfig": { - "defaults": { - "unit": "short", - "decimals": 0, - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 25, - "showPoints": "never" - }, - "color": { "mode": "fixed", "fixedColor": "blue" } - } - }, - "targets": [{ "refId": "A", "expr": "ccam_events_total", "legendFormat": "events" }] - }, - { - "id": 101, - "type": "row", - "title": "Throughput rates", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 22 } - }, - { - "id": 9, - "type": "timeseries", - "title": "Events per second (5m rate)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 23 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "unit": "ops", - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 20, - "showPoints": "never" - }, - "color": { "mode": "fixed", "fixedColor": "blue" } - } - }, - "targets": [ - { "refId": "A", "expr": "rate(ccam_events_total[5m])", "legendFormat": "events/s" }, - { "refId": "B", "expr": "ccam:events:rate5m", "legendFormat": "recording rule" } - ] - }, - { - "id": 10, - "type": "timeseries", - "title": "Tokens per second by kind (5m rate)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 23 }, - "options": { - "legend": { "displayMode": "list", "placement": "bottom" }, - "tooltip": { "mode": "multi" } - }, - "fieldConfig": { - "defaults": { - "unit": "ops", - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 12, - "showPoints": "never" - }, - "color": { "mode": "palette-classic" } - } - }, - "targets": [ - { "refId": "A", "expr": "rate(ccam_tokens_total[5m])", "legendFormat": "{{kind}}" } - ] - }, - { - "id": 102, - "type": "row", - "title": "Cache efficiency", - "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 31 } - }, - { - "id": 11, - "type": "stat", - "title": "Cache read share of prompt tokens", - "description": "cache_read / (input + cache_read) — higher means more prompt served from cache.", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 5, "w": 8, "x": 0, "y": 32 }, - "options": { - "reduceOptions": { "calcs": ["lastNotNull"] }, - "colorMode": "value", - "graphMode": "area" - }, - "fieldConfig": { - "defaults": { - "unit": "percentunit", - "decimals": 1, - "min": 0, - "max": 1, - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "red", "value": null }, - { "color": "yellow", "value": 0.2 }, - { "color": "green", "value": 0.5 } - ] - } - } - }, - "targets": [ - { - "refId": "A", - "expr": "ccam_tokens_total{kind=\"cache_read\"} / clamp_min(ccam_tokens_total{kind=\"input\"} + ccam_tokens_total{kind=\"cache_read\"}, 1)", - "legendFormat": "cache hit ratio" - } - ] - }, - { - "id": 12, - "type": "timeseries", - "title": "Input vs cache read tokens (cumulative)", - "datasource": { "type": "prometheus", "uid": "ccam-prometheus" }, - "gridPos": { "h": 5, "w": 16, "x": 8, "y": 32 }, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, - "fieldConfig": { - "defaults": { - "unit": "short", - "custom": { - "drawStyle": "line", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never" - } - } - }, - "targets": [ - { "refId": "A", "expr": "ccam_tokens_total{kind=\"input\"}", "legendFormat": "input" }, - { - "refId": "B", - "expr": "ccam_tokens_total{kind=\"cache_read\"}", - "legendFormat": "cache_read" - } - ] - } - ] -} diff --git a/monitoring/grafana/provisioning-native/dashboards/provider.yml b/monitoring/grafana/provisioning-native/dashboards/provider.yml deleted file mode 100644 index c3627ad..0000000 --- a/monitoring/grafana/provisioning-native/dashboards/provider.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Dashboard provider for the native stack. start-native.sh writes the absolute -# dashboards path into .data/grafana-provisioning/dashboards/provider.runtime.yml -# because Grafana requires an absolute path in file providers. -apiVersion: 1 - -providers: - - name: CCAM - orgId: 1 - type: file - disableDeletion: false - updateIntervalSeconds: 30 - allowUiUpdates: true - options: - path: /var/lib/grafana/dashboards - foldersFromFilesStructure: false diff --git a/monitoring/grafana/provisioning-native/datasources/datasource.yml b/monitoring/grafana/provisioning-native/datasources/datasource.yml deleted file mode 100644 index 2dabc17..0000000 --- a/monitoring/grafana/provisioning-native/datasources/datasource.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Auto-provisions the Prometheus datasource for a NATIVE (non-Docker) stack. -# Prometheus is expected on the host loopback interface (see start-native.sh). -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - uid: ccam-prometheus - access: proxy - url: http://127.0.0.1:9090 - isDefault: true - editable: true diff --git a/monitoring/grafana/provisioning/dashboards/provider.yml b/monitoring/grafana/provisioning/dashboards/provider.yml deleted file mode 100644 index 9df5510..0000000 --- a/monitoring/grafana/provisioning/dashboards/provider.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Loads every dashboard JSON under /var/lib/grafana/dashboards on startup — four -# bundled CCAM boards (Overview, Sessions & Agents, Tokens & Events, Platform Health). -apiVersion: 1 - -providers: - - name: CCAM - orgId: 1 - type: file - disableDeletion: false - updateIntervalSeconds: 30 - allowUiUpdates: true - options: - path: /var/lib/grafana/dashboards - foldersFromFilesStructure: false diff --git a/monitoring/grafana/provisioning/datasources/datasource.yml b/monitoring/grafana/provisioning/datasources/datasource.yml deleted file mode 100644 index 3fa9d16..0000000 --- a/monitoring/grafana/provisioning/datasources/datasource.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Auto-provisions the Prometheus datasource the CCAM dashboard queries. The uid -# is fixed so the bundled dashboard JSON can reference it deterministically. -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - uid: ccam-prometheus - access: proxy - url: http://prometheus:9090 - isDefault: true - editable: true diff --git a/monitoring/package.json b/monitoring/package.json deleted file mode 100644 index c522850..0000000 --- a/monitoring/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@ccam/monitoring", - "version": "1.0.0", - "private": true, - "description": "CCAM Prometheus + Grafana stack (npm-managed binaries, no Docker required)", - "scripts": { - "postinstall": "node scripts/ensure-binaries.js", - "start": "node scripts/start.js --detach", - "start:foreground": "node scripts/start.js --foreground", - "stop": "node scripts/stop.js", - "verify": "node scripts/verify.js" - }, - "dependencies": { - "adm-zip": "^0.5.16", - "tar": "^7.4.3" - }, - "engines": { - "node": ">=20.0.0" - } -} diff --git a/monitoring/prometheus/ccam-rules.yml b/monitoring/prometheus/ccam-rules.yml deleted file mode 100644 index 103eeda..0000000 --- a/monitoring/prometheus/ccam-rules.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Recording rules derived from live CCAM scrapes — no synthetic data. -# Pre-aggregates common queries so Prometheus Graph/Explore autocomplete -# surfaces useful series immediately after the ccam target comes up. -groups: - - name: ccam_recording - interval: 15s - rules: - - record: ccam:sessions:total - expr: sum(ccam_sessions) - - record: ccam:sessions:active - expr: ccam_sessions{status="active"} - - record: ccam:sessions:completed - expr: ccam_sessions{status="completed"} - - record: ccam:agents:working - expr: ccam_agents{status="working"} - - record: ccam:events:rate5m - expr: rate(ccam_events_total[5m]) - - record: ccam:tokens:rate5m - expr: sum by (kind) (rate(ccam_tokens_total[5m])) - - record: ccam:tokens:total - expr: sum(ccam_tokens_total) diff --git a/monitoring/prometheus/consoles/index.html b/monitoring/prometheus/consoles/index.html deleted file mode 100644 index 4232593..0000000 --- a/monitoring/prometheus/consoles/index.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - CCAM — Prometheus Console - - - -

-

CCAM — Claude Code Agent Monitor

-

- Live metrics from GET /api/metrics via Prometheus — your SQLite - database on each scrape. No synthetic data. -

- - - -
- -

Sessions by status

- - - -
StatusCountGraph
Loading…
- -

Tokens by kind

- - - -
KindTotalGraph
Loading…
- -

Starter expressions

-
    - - -
    - - - - diff --git a/monitoring/prometheus/prometheus-docker.yml b/monitoring/prometheus/prometheus-docker.yml deleted file mode 100644 index 46eecdd..0000000 --- a/monitoring/prometheus/prometheus-docker.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Prometheus scrape config when BOTH CCAM and Prometheus run in Docker on the -# shared `ccam` network (docker-compose.full.yml). The Host guard on the -# dashboard must allow `agent-monitor` — set via DASHBOARD_ALLOWED_HOSTS there. -global: - scrape_interval: 15s - scrape_timeout: 10s - -rule_files: - - ccam-rules.yml - -scrape_configs: - - job_name: ccam - metrics_path: /api/metrics - static_configs: - - targets: ["agent-monitor:4820"] - # If the server sets DASHBOARD_TOKEN (LAN deployments), uncomment and fill in: - # authorization: - # type: Bearer - # credentials: "" diff --git a/monitoring/prometheus/prometheus-native.yml b/monitoring/prometheus/prometheus-native.yml deleted file mode 100644 index b078823..0000000 --- a/monitoring/prometheus/prometheus-native.yml +++ /dev/null @@ -1,26 +0,0 @@ -# Prometheus scrape config for a NATIVE (non-Docker) CCAM + monitoring stack. -# -# Use this when Prometheus runs directly on the host (Homebrew, apt, a release -# tarball, etc.) and the dashboard is a plain `npm start` on loopback :4820. -# No DASHBOARD_ALLOWED_HOSTS override is required — 127.0.0.1 is already -# accepted by the server's Host guard. -# -# Started by: monitoring/scripts/start-native.sh (or npm run monitoring:native) -# See ../README.md. -global: - scrape_interval: 15s - scrape_timeout: 10s - -rule_files: - - ccam-rules.yml - -scrape_configs: - - job_name: ccam - metrics_path: /api/metrics - static_configs: - - targets: ["127.0.0.1:4820"] - # If the server sets DASHBOARD_TOKEN (LAN deployments), uncomment and fill in - # so the scrape passes the token guard: - # authorization: - # type: Bearer - # credentials: "" diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml deleted file mode 100644 index 8b76db9..0000000 --- a/monitoring/prometheus/prometheus.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Prometheus scrape config for the CCAM dashboard's /api/metrics endpoint. -# -# CCAM normally runs on the HOST (a plain `npm start` on port 4820), so from -# inside the Prometheus container it is reached via host.docker.internal. If the -# dashboard runs elsewhere or on a different port, edit the `targets` below. -# -# IMPORTANT: the CCAM server's DNS-rebinding guard rejects any Host header that -# is not loopback, so a container scrape gets 403 EBADHOST until you start the -# server allowing this Host: -# DASHBOARD_ALLOWED_HOSTS=host.docker.internal npm start -# (and, if DASHBOARD_TOKEN is set, also uncomment the authorization block below). -# See ../README.md. -global: - scrape_interval: 15s - scrape_timeout: 10s - -rule_files: - - ccam-rules.yml - -scrape_configs: - - job_name: ccam - metrics_path: /api/metrics - static_configs: - - targets: ["host.docker.internal:4820"] - # If the server sets DASHBOARD_TOKEN (LAN deployments), uncomment and fill in - # so the scrape passes the same-origin/token guard: - # authorization: - # type: Bearer - # credentials: "" diff --git a/monitoring/scripts/ensure-binaries.js b/monitoring/scripts/ensure-binaries.js deleted file mode 100644 index edf7f7c..0000000 --- a/monitoring/scripts/ensure-binaries.js +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env node -/** - * @file Downloads official Prometheus + Grafana OSS binaries into monitoring/.bin/. - * Supports macOS (arm64/Intel), Linux (arm64/amd64), and Windows (x64). - * Run via `npm run monitoring:setup` — no Homebrew, apt, or global install needed. - * @author Nguyễn Ngọc Trí Vĩ - */ -const fs = require("node:fs"); -const path = require("node:path"); -const { - BIN_ROOT, - DATA_ROOT, - VERSIONS, - SUPPORTED_TARGETS, - prometheusUrl, - grafanaUrl, - prometheusArchiveName, - grafanaArchiveName, - prometheusArchiveExt, - grafanaArchiveExt, - prometheusHome, - grafanaHome, - prometheusBinary, - grafanaBinary, - prometheusPlatform, - binariesReady, -} = require("./paths"); -const { - downloadFile, - extractArchive, - findExtractedRoot, - replaceDir, - prometheusContainsFile, - grafanaContainsFile, -} = require("./install-utils"); - -async function installPrometheus(tmpDir) { - const archive = path.join(tmpDir, `${prometheusArchiveName()}.${prometheusArchiveExt()}`); - const extractRoot = path.join(tmpDir, "prometheus-extract"); - console.log(`→ Prometheus ${VERSIONS.prometheus} (${prometheusPlatform()})`); - await downloadFile(prometheusUrl(), archive); - await fs.promises.rm(extractRoot, { recursive: true, force: true }); - await extractArchive(archive, extractRoot); - const extracted = await findExtractedRoot( - extractRoot, - [prometheusArchiveName(), `prometheus-${VERSIONS.prometheus}`], - prometheusContainsFile - ); - await replaceDir(prometheusHome(), extracted); -} - -async function installGrafana(tmpDir) { - const archive = path.join(tmpDir, `${grafanaArchiveName()}.${grafanaArchiveExt()}`); - const extractRoot = path.join(tmpDir, "grafana-extract"); - console.log(`→ Grafana OSS ${VERSIONS.grafana} (${prometheusPlatform()})`); - await downloadFile(grafanaUrl(), archive); - await fs.promises.rm(extractRoot, { recursive: true, force: true }); - await extractArchive(archive, extractRoot); - const extracted = await findExtractedRoot( - extractRoot, - [grafanaArchiveName(), `grafana-${VERSIONS.grafana}`, `grafana-v${VERSIONS.grafana}`], - grafanaContainsFile - ); - await replaceDir(grafanaHome(), extracted); -} - -async function main() { - if (binariesReady()) { - console.log("Monitoring binaries already present:"); - console.log(` Prometheus: ${prometheusBinary()}`); - console.log(` Grafana: ${grafanaBinary()}`); - return; - } - - console.log(`Platform: ${process.platform} ${process.arch}`); - console.log(`Supported: ${SUPPORTED_TARGETS.join(" · ")}`); - - await fs.promises.mkdir(BIN_ROOT, { recursive: true }); - await fs.promises.mkdir(DATA_ROOT, { recursive: true }); - - const tmpDir = path.join(DATA_ROOT, "downloads"); - await fs.promises.mkdir(tmpDir, { recursive: true }); - - console.log("Downloading CCAM monitoring binaries (one-time setup)…"); - await installPrometheus(tmpDir); - await installGrafana(tmpDir); - await fs.promises.rm(tmpDir, { recursive: true, force: true }); - - if (!binariesReady()) { - throw new Error("Binary install finished but executables were not found."); - } - - console.log("Done. Binaries installed to monitoring/.bin/"); - console.log(` Prometheus: ${prometheusBinary()}`); - console.log(` Grafana: ${grafanaBinary()}`); -} - -main().catch((err) => { - console.error(`monitoring:setup failed: ${err.message}`); - process.exit(1); -}); diff --git a/monitoring/scripts/install-utils.js b/monitoring/scripts/install-utils.js deleted file mode 100644 index d11a965..0000000 --- a/monitoring/scripts/install-utils.js +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @file Archive extraction and install-dir discovery for cross-platform binaries. - * @author Nguyễn Ngọc Trí Vĩ - */ -const fs = require("node:fs"); -const path = require("node:path"); -const { pipeline } = require("node:stream/promises"); -const { Readable } = require("node:stream"); -const tar = require("tar"); -const AdmZip = require("adm-zip"); -const { isWindows } = require("./paths"); - -async function downloadFile(url, dest) { - const response = await fetch(url, { redirect: "follow" }); - if (!response.ok) { - throw new Error(`Download failed (${response.status}): ${url}`); - } - if (!response.body) { - throw new Error(`Empty response body: ${url}`); - } - await fs.promises.mkdir(path.dirname(dest), { recursive: true }); - await pipeline(Readable.fromWeb(response.body), fs.createWriteStream(dest)); -} - -async function extractTar(archivePath, destDir) { - await fs.promises.mkdir(destDir, { recursive: true }); - await tar.x({ file: archivePath, cwd: destDir }); -} - -async function extractZip(archivePath, destDir) { - await fs.promises.mkdir(destDir, { recursive: true }); - const zip = new AdmZip(archivePath); - zip.extractAllTo(destDir, true); -} - -async function extractArchive(archivePath, destDir) { - if (archivePath.endsWith(".zip")) { - await extractZip(archivePath, destDir); - return; - } - await extractTar(archivePath, destDir); -} - -async function listChildDirs(parent) { - const entries = await fs.promises.readdir(parent, { withFileTypes: true }); - return entries.filter((e) => e.isDirectory()).map((e) => path.join(parent, e.name)); -} - -/** - * Locate a single top-level directory after extraction. Official archives ship - * one root folder; this also tolerates minor naming differences across OS builds. - */ -async function findExtractedRoot(extractRoot, preferredNames, containsFile) { - for (const name of preferredNames) { - const candidate = path.join(extractRoot, name); - if (fs.existsSync(path.join(candidate, containsFile))) return candidate; - } - - const dirs = await listChildDirs(extractRoot); - const matches = []; - for (const dir of dirs) { - if (fs.existsSync(path.join(dir, containsFile))) matches.push(dir); - } - if (matches.length === 1) return matches[0]; - if (matches.length > 1) { - throw new Error( - `Multiple install directories matched in ${extractRoot}: ${matches.map(path.basename).join(", ")}` - ); - } - throw new Error( - `Could not find install directory under ${extractRoot} (expected ${containsFile}).` - ); -} - -async function replaceDir(target, source) { - await fs.promises.rm(target, { recursive: true, force: true }); - await fs.promises.mkdir(path.dirname(target), { recursive: true }); - await fs.promises.cp(source, target, { recursive: true }); -} - -module.exports = { - downloadFile, - extractArchive, - findExtractedRoot, - replaceDir, - prometheusContainsFile: isWindows() ? "prometheus.exe" : "prometheus", - grafanaContainsFile: path.join("bin", isWindows() ? "grafana.exe" : "grafana"), -}; diff --git a/monitoring/scripts/lib.js b/monitoring/scripts/lib.js deleted file mode 100644 index da2918a..0000000 --- a/monitoring/scripts/lib.js +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @file Shared helpers for starting and stopping the npm-managed monitoring stack. - * @author Nguyễn Ngọc Trí Vĩ - */ -const fs = require("node:fs"); -const path = require("node:path"); -const { spawn, spawnSync } = require("node:child_process"); -const { - DATA_ROOT, - RUNTIME_PROVISIONING, - GRAFANA_DASHBOARDS, - GRAFANA_DATASOURCE_TEMPLATE, - PROMETHEUS_PID, - GRAFANA_PID, - PROMETHEUS_LOG, - GRAFANA_LOG, - isWindows, - toGrafanaPath, -} = require("./paths"); - -function readPid(file) { - try { - const raw = fs.readFileSync(file, "utf8").trim(); - const pid = Number(raw); - return Number.isInteger(pid) && pid > 0 ? pid : null; - } catch { - return null; - } -} - -function isRunning(pid) { - if (!pid) return false; - try { - process.kill(pid, 0); - return true; - } catch { - return false; - } -} - -function writePid(file, pid) { - fs.mkdirSync(path.dirname(file), { recursive: true }); - fs.writeFileSync(file, String(pid)); -} - -function removePid(file) { - try { - fs.unlinkSync(file); - } catch { - /* already gone */ - } -} - -function killProcess(pid) { - if (!pid) return; - if (isWindows()) { - spawnSync("taskkill", ["/PID", String(pid), "/T", "/F"], { stdio: "ignore" }); - return; - } - process.kill(pid, "SIGTERM"); -} - -function stopPid(file, label) { - const pid = readPid(file); - if (!pid) return false; - if (!isRunning(pid)) { - removePid(file); - return false; - } - try { - killProcess(pid); - console.log(`Stopped ${label} (pid ${pid})`); - } catch (err) { - console.warn(`Could not stop ${label} (pid ${pid}): ${err.message}`); - } - removePid(file); - return true; -} - -function writeGrafanaProvisioning() { - const dashboardsDir = path.join(RUNTIME_PROVISIONING, "dashboards"); - const datasourcesDir = path.join(RUNTIME_PROVISIONING, "datasources"); - fs.mkdirSync(dashboardsDir, { recursive: true }); - fs.mkdirSync(datasourcesDir, { recursive: true }); - - fs.copyFileSync(GRAFANA_DATASOURCE_TEMPLATE, path.join(datasourcesDir, "datasource.yml")); - - const provider = [ - "apiVersion: 1", - "", - "providers:", - " - name: CCAM", - " orgId: 1", - " type: file", - " disableDeletion: false", - " updateIntervalSeconds: 30", - " allowUiUpdates: true", - " options:", - ` path: ${toGrafanaPath(GRAFANA_DASHBOARDS)}`, - " foldersFromFilesStructure: false", - "", - ].join("\n"); - fs.writeFileSync(path.join(dashboardsDir, "provider.yml"), provider); -} - -function spawnDetached(binary, args, env, logFile) { - fs.mkdirSync(path.dirname(logFile), { recursive: true }); - const logFd = fs.openSync(logFile, "a"); - const child = spawn(binary, args, { - detached: !isWindows(), - stdio: ["ignore", logFd, logFd], - env: { ...process.env, ...env }, - windowsHide: true, - }); - if (!isWindows()) child.unref(); - fs.closeSync(logFd); - return child.pid; -} - -function spawnForeground(binary, args, env) { - return spawn(binary, args, { - stdio: "inherit", - env: { ...process.env, ...env }, - windowsHide: true, - }); -} - -async function waitForHttp(url, attempts = 30, intervalMs = 500) { - for (let i = 0; i < attempts; i += 1) { - try { - const res = await fetch(url); - if (res.ok) return true; - } catch { - /* retry */ - } - await new Promise((r) => setTimeout(r, intervalMs)); - } - return false; -} - -module.exports = { - readPid, - isRunning, - writePid, - removePid, - killProcess, - stopPid, - writeGrafanaProvisioning, - spawnDetached, - spawnForeground, - waitForHttp, - PROMETHEUS_PID, - GRAFANA_PID, - PROMETHEUS_LOG, - GRAFANA_LOG, - DATA_ROOT, - RUNTIME_PROVISIONING, -}; diff --git a/monitoring/scripts/paths.js b/monitoring/scripts/paths.js deleted file mode 100644 index 7cdc1dc..0000000 --- a/monitoring/scripts/paths.js +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @file Shared paths and version pins for the CCAM monitoring stack. - * Binaries are downloaded into monitoring/.bin/ by ensure-binaries.js so the - * stack runs with plain npm on macOS, Linux, and Windows — no Homebrew, apt, - * or global installs required. - * @author Nguyễn Ngọc Trí Vĩ - */ -const path = require("node:path"); - -const MONITORING_ROOT = path.resolve(__dirname, ".."); -const REPO_ROOT = path.resolve(MONITORING_ROOT, ".."); - -const VERSIONS = { - prometheus: "3.2.1", - grafana: "11.6.1", -}; - -/** Human-readable list for error messages. */ -const SUPPORTED_TARGETS = [ - "macOS (Apple Silicon / Intel)", - "Linux (arm64 / amd64)", - "Windows (x64)", -]; - -const BIN_ROOT = path.join(MONITORING_ROOT, ".bin"); -const DATA_ROOT = path.join(MONITORING_ROOT, ".data"); -const PROMETHEUS_DATA = path.join(DATA_ROOT, "prometheus"); -const GRAFANA_DATA = path.join(DATA_ROOT, "grafana"); -const RUNTIME_PROVISIONING = path.join(DATA_ROOT, "grafana-provisioning"); - -const PROMETHEUS_CONFIG = path.join(MONITORING_ROOT, "prometheus", "prometheus-native.yml"); -const PROMETHEUS_CONSOLES = path.join(MONITORING_ROOT, "prometheus", "consoles"); -const GRAFANA_DASHBOARDS = path.join(MONITORING_ROOT, "grafana", "dashboards"); -const GRAFANA_DATASOURCE_TEMPLATE = path.join( - MONITORING_ROOT, - "grafana", - "provisioning-native", - "datasources", - "datasource.yml" -); - -const PROMETHEUS_PID = path.join(DATA_ROOT, "prometheus.pid"); -const GRAFANA_PID = path.join(DATA_ROOT, "grafana.pid"); -const PROMETHEUS_LOG = path.join(DATA_ROOT, "prometheus.log"); -const GRAFANA_LOG = path.join(DATA_ROOT, "grafana.log"); - -function isWindows() { - return process.platform === "win32"; -} - -/** - * Maps Node's `process.arch` to Prometheus/Grafana release asset arch slugs. - * @returns {"arm64"|"amd64"} - */ -function releaseArch() { - if (process.arch === "arm64") return "arm64"; - if (process.arch === "x64") return "amd64"; - throw new Error( - `Unsupported CPU architecture "${process.arch}". Supported: ${SUPPORTED_TARGETS.join(", ")}.` - ); -} - -/** @returns {string} Prometheus platform slug used in release asset names. */ -function prometheusPlatform() { - const arch = releaseArch(); - if (process.platform === "darwin") return arch === "arm64" ? "darwin-arm64" : "darwin-amd64"; - if (process.platform === "linux") return arch === "arm64" ? "linux-arm64" : "linux-amd64"; - if (process.platform === "win32") return "windows-amd64"; - throw new Error( - `Unsupported OS "${process.platform}". Supported: ${SUPPORTED_TARGETS.join(", ")}.` - ); -} - -/** @returns {string} Grafana platform slug used in release asset names. */ -function grafanaPlatform() { - return prometheusPlatform(); -} - -function prometheusArchiveName() { - return `prometheus-${VERSIONS.prometheus}.${prometheusPlatform()}`; -} - -function grafanaArchiveName() { - return `grafana-${VERSIONS.grafana}.${grafanaPlatform()}`; -} - -function prometheusArchiveExt() { - return isWindows() ? "zip" : "tar.gz"; -} - -function grafanaArchiveExt() { - return isWindows() ? "zip" : "tar.gz"; -} - -function prometheusUrl() { - const name = prometheusArchiveName(); - return `https://github.com/prometheus/prometheus/releases/download/v${VERSIONS.prometheus}/${name}.${prometheusArchiveExt()}`; -} - -function grafanaUrl() { - const plat = grafanaPlatform(); - return `https://dl.grafana.com/oss/release/grafana-${VERSIONS.grafana}.${plat}.${grafanaArchiveExt()}`; -} - -function prometheusHome() { - return path.join(BIN_ROOT, "prometheus"); -} - -function grafanaHome() { - return path.join(BIN_ROOT, "grafana"); -} - -function prometheusBinary() { - const name = isWindows() ? "prometheus.exe" : "prometheus"; - return path.join(prometheusHome(), name); -} - -function grafanaBinary() { - const name = isWindows() ? "grafana.exe" : "grafana"; - return path.join(grafanaHome(), "bin", name); -} - -const GRAFANA_ADMIN_USER = "admin"; -const GRAFANA_ADMIN_PASSWORD = "admin"; - -/** Grafana env vars that seed the default admin account on first start. */ -function grafanaAdminEnv() { - return { - GF_SECURITY_ADMIN_USER: GRAFANA_ADMIN_USER, - GF_SECURITY_ADMIN_PASSWORD: GRAFANA_ADMIN_PASSWORD, - GF_USERS_ALLOW_SIGN_UP: "false", - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_UID: "ccam-overview", - }; -} - -function grafanaLoginLabel() { - return `${GRAFANA_ADMIN_USER} / ${GRAFANA_ADMIN_PASSWORD}`; -} - -/** Grafana file providers require forward slashes even on Windows. */ -function toGrafanaPath(filePath) { - return filePath.replace(/\\/g, "/"); -} - -/** CLI args for Prometheus 3.x (console libraries removed upstream). */ -function prometheusServerArgs(configFile, storagePath = PROMETHEUS_DATA) { - return [ - `--config.file=${configFile}`, - `--storage.tsdb.path=${storagePath}`, - "--web.enable-lifecycle", - `--web.console.templates=${PROMETHEUS_CONSOLES}`, - ]; -} - -function prometheusDockerServerArgs(configFile) { - return [ - `--config.file=${configFile}`, - `--storage.tsdb.path=/prometheus`, - "--web.enable-lifecycle", - `--web.console.templates=/etc/prometheus/consoles`, - ]; -} - -const PROMETHEUS_CONSOLES_URL = "http://localhost:9090/consoles/index.html"; - -function binariesReady() { - const fs = require("node:fs"); - return fs.existsSync(prometheusBinary()) && fs.existsSync(grafanaBinary()); -} - -module.exports = { - MONITORING_ROOT, - REPO_ROOT, - VERSIONS, - SUPPORTED_TARGETS, - BIN_ROOT, - DATA_ROOT, - PROMETHEUS_DATA, - GRAFANA_DATA, - RUNTIME_PROVISIONING, - PROMETHEUS_CONFIG, - PROMETHEUS_CONSOLES, - PROMETHEUS_CONSOLES_URL, - GRAFANA_DASHBOARDS, - GRAFANA_DATASOURCE_TEMPLATE, - PROMETHEUS_PID, - GRAFANA_PID, - PROMETHEUS_LOG, - GRAFANA_LOG, - isWindows, - releaseArch, - prometheusPlatform, - grafanaPlatform, - prometheusArchiveName, - grafanaArchiveName, - prometheusArchiveExt, - grafanaArchiveExt, - prometheusUrl, - grafanaUrl, - prometheusHome, - grafanaHome, - prometheusBinary, - grafanaBinary, - prometheusServerArgs, - prometheusDockerServerArgs, - GRAFANA_ADMIN_USER, - GRAFANA_ADMIN_PASSWORD, - grafanaAdminEnv, - grafanaLoginLabel, - toGrafanaPath, - binariesReady, -}; diff --git a/monitoring/scripts/start.js b/monitoring/scripts/start.js deleted file mode 100644 index a40058f..0000000 --- a/monitoring/scripts/start.js +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env node -/** - * @file Starts the npm-managed Prometheus + Grafana stack (no Docker / no Brew). - * Downloads binaries on first run if monitoring:setup has not been run yet. - * @author Nguyễn Ngọc Trí Vĩ - */ -const fs = require("node:fs"); -const { spawnSync } = require("node:child_process"); -const path = require("node:path"); -const { - PROMETHEUS_CONFIG, - PROMETHEUS_DATA, - GRAFANA_DATA, - RUNTIME_PROVISIONING, - prometheusBinary, - prometheusServerArgs, - PROMETHEUS_CONSOLES_URL, - grafanaBinary, - grafanaHome, - grafanaAdminEnv, - grafanaLoginLabel, - binariesReady, -} = require("./paths"); -const { - readPid, - isRunning, - writePid, - writeGrafanaProvisioning, - spawnDetached, - spawnForeground, - waitForHttp, - killProcess, - PROMETHEUS_PID, - GRAFANA_PID, - PROMETHEUS_LOG, - GRAFANA_LOG, -} = require("./lib"); - -const detached = process.argv.includes("--detach") || process.argv.includes("-d"); -const foreground = process.argv.includes("--foreground") || process.argv.includes("-f"); - -async function ensureBinaries() { - if (binariesReady()) return; - console.log("Monitoring binaries not found — running setup…"); - const script = path.join(__dirname, "ensure-binaries.js"); - const result = spawnSync(process.execPath, [script], { stdio: "inherit" }); - if (result.status !== 0) process.exit(result.status || 1); -} - -function assertNotRunning() { - for (const [file, label] of [ - [PROMETHEUS_PID, "Prometheus"], - [GRAFANA_PID, "Grafana"], - ]) { - const pid = readPid(file); - if (isRunning(pid)) { - console.error(`${label} is already running (pid ${pid}). Run: npm run monitoring:down`); - process.exit(1); - } - } -} - -function startPrometheus() { - fs.mkdirSync(PROMETHEUS_DATA, { recursive: true }); - const args = prometheusServerArgs(PROMETHEUS_CONFIG); - const binary = prometheusBinary(); - if (detached || (!foreground && !process.stdout.isTTY)) { - const pid = spawnDetached(binary, args, {}, PROMETHEUS_LOG); - writePid(PROMETHEUS_PID, pid); - return pid; - } - return spawnForeground(binary, args, {}); -} - -function startGrafana() { - fs.mkdirSync(GRAFANA_DATA, { recursive: true }); - writeGrafanaProvisioning(); - const env = { - GF_PATHS_HOME: grafanaHome(), - GF_PATHS_DATA: GRAFANA_DATA, - GF_PATHS_PROVISIONING: RUNTIME_PROVISIONING, - ...grafanaAdminEnv(), - }; - const args = ["server", "--homepath", grafanaHome()]; - const binary = grafanaBinary(); - if (detached || (!foreground && !process.stdout.isTTY)) { - const pid = spawnDetached(binary, args, env, GRAFANA_LOG); - writePid(GRAFANA_PID, pid); - return pid; - } - return spawnForeground(binary, args, env); -} - -async function main() { - await ensureBinaries(); - assertNotRunning(); - - console.log("Starting CCAM monitoring stack…"); - console.log(` Prometheus config: ${PROMETHEUS_CONFIG}`); - console.log(` Grafana home: ${grafanaHome()}`); - - if (detached || (!foreground && !process.stdout.isTTY)) { - const promPid = startPrometheus(); - const grafPid = startGrafana(); - const promOk = await waitForHttp("http://127.0.0.1:9090/-/ready"); - const grafOk = await waitForHttp("http://127.0.0.1:3000/api/health"); - console.log(""); - console.log( - `Prometheus http://localhost:9090 (pid ${promPid})${promOk ? "" : " [still starting]"}` - ); - console.log(` CCAM console: ${PROMETHEUS_CONSOLES_URL}`); - console.log( - `Grafana http://localhost:3000 (pid ${grafPid}) ${grafanaLoginLabel()}${grafOk ? "" : " [still starting]"}` - ); - console.log( - "CCAM dashboards auto-provisioned (Overview, Sessions & Agents, Tokens & Events, Platform Health)." - ); - console.log("Stop with: npm run monitoring:down"); - if (!promOk || !grafOk) { - console.log(`Logs: ${PROMETHEUS_LOG} ${GRAFANA_LOG}`); - } - return; - } - - // Foreground: Prometheus in background, Grafana in foreground (Grafana owns the tty). - const promPid = spawnDetached( - prometheusBinary(), - prometheusServerArgs(PROMETHEUS_CONFIG), - {}, - PROMETHEUS_LOG - ); - writePid(PROMETHEUS_PID, promPid); - console.log(`Prometheus running at http://localhost:9090 (pid ${promPid})`); - console.log(` CCAM console: ${PROMETHEUS_CONSOLES_URL}`); - console.log( - `Grafana starting at http://localhost:3000 (${grafanaLoginLabel()}) — Ctrl+C stops both` - ); - const graf = startGrafana(); - const shutdown = () => { - killProcess(promPid); - process.exit(0); - }; - process.on("SIGINT", shutdown); - process.on("SIGTERM", shutdown); - graf.on("exit", (code) => { - shutdown(); - process.exit(code ?? 0); - }); -} - -main().catch((err) => { - console.error(`monitoring:start failed: ${err.message}`); - process.exit(1); -}); diff --git a/monitoring/scripts/stop.js b/monitoring/scripts/stop.js deleted file mode 100644 index 8a06a83..0000000 --- a/monitoring/scripts/stop.js +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env node -/** - * @file Stops the npm-managed Prometheus + Grafana stack started by start.js. - * @author Nguyễn Ngọc Trí Vĩ - */ -const { stopPid, PROMETHEUS_PID, GRAFANA_PID } = require("./lib"); - -const stoppedGrafana = stopPid(GRAFANA_PID, "Grafana"); -const stoppedPrometheus = stopPid(PROMETHEUS_PID, "Prometheus"); - -if (!stoppedGrafana && !stoppedPrometheus) { - console.log("Monitoring stack is not running."); -} else { - console.log("Monitoring stack stopped."); -} diff --git a/monitoring/scripts/verify.js b/monitoring/scripts/verify.js deleted file mode 100644 index 7eb2643..0000000 --- a/monitoring/scripts/verify.js +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/env node -/** - * @file Verifies the CCAM dashboard and optional Prometheus/Grafana stack are up. - * Used after `monitoring:up` or `monitoring:docker:up` to confirm scrape health. - * @author Nguyễn Ngọc Trí Vĩ - */ -const { GRAFANA_ADMIN_USER, GRAFANA_ADMIN_PASSWORD } = require("./paths"); - -const DASHBOARD_URL = process.env.CCAM_DASHBOARD_URL || "http://127.0.0.1:4820"; -const PROMETHEUS_URL = process.env.CCAM_PROMETHEUS_URL || "http://127.0.0.1:9090"; -const GRAFANA_URL = process.env.CCAM_GRAFANA_URL || "http://127.0.0.1:3000"; -const JSON_MODE = process.argv.includes("--json"); - -async function checkDashboardHealth() { - try { - const res = await fetch(`${DASHBOARD_URL}/api/health`); - if (!res.ok) { - return { name: "Dashboard /api/health", ok: false, detail: `HTTP ${res.status}` }; - } - const body = await res.json(); - const detail = body.version ? `v${body.version}` : undefined; - return { name: "Dashboard /api/health", ok: true, detail, version: body.version }; - } catch (err) { - return { name: "Dashboard /api/health", ok: false, detail: err.message }; - } -} - -async function check(name, url, ok = (res) => res.ok) { - try { - const res = await fetch(url); - if (!ok(res)) { - return { name, ok: false, detail: `HTTP ${res.status}` }; - } - return { name, ok: true }; - } catch (err) { - return { name, ok: false, detail: err.message }; - } -} - -async function checkPrometheusTarget(attempts = 12, intervalMs = 2500) { - for (let i = 0; i < attempts; i += 1) { - const result = await checkPrometheusTargetOnce(); - if (result.ok) return result; - if (i < attempts - 1) await new Promise((r) => setTimeout(r, intervalMs)); - if (i === attempts - 1) return result; - } - return { name: "Prometheus ccam target", ok: false, detail: "timeout" }; -} - -async function checkPrometheusTargetOnce() { - try { - const res = await fetch(`${PROMETHEUS_URL}/api/v1/targets`); - if (!res.ok) return { name: "Prometheus ccam target", ok: false, detail: `HTTP ${res.status}` }; - const body = await res.json(); - const target = body?.data?.activeTargets?.find((t) => t.labels?.job === "ccam"); - if (!target) return { name: "Prometheus ccam target", ok: false, detail: "job not found" }; - if (target.health !== "up") { - return { - name: "Prometheus ccam target", - ok: false, - detail: target.lastError || `health=${target.health}`, - }; - } - return { name: "Prometheus ccam target", ok: true, detail: target.scrapeUrl }; - } catch (err) { - return { name: "Prometheus ccam target", ok: false, detail: err.message }; - } -} - -async function checkGrafanaLogin() { - try { - const res = await fetch(`${GRAFANA_URL}/login`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - user: GRAFANA_ADMIN_USER, - password: GRAFANA_ADMIN_PASSWORD, - }), - }); - if (!res.ok) { - return { name: "Grafana admin login", ok: false, detail: `HTTP ${res.status}` }; - } - const body = await res.json(); - if (body?.message !== "Logged in") { - return { name: "Grafana admin login", ok: false, detail: body?.message || "login rejected" }; - } - return { name: "Grafana admin login", ok: true, detail: grafanaLoginDetail() }; - } catch (err) { - return { name: "Grafana admin login", ok: false, detail: err.message }; - } -} - -function grafanaLoginDetail() { - return `${GRAFANA_ADMIN_USER} / ${GRAFANA_ADMIN_PASSWORD}`; -} - -async function checkPrometheusMetrics() { - try { - const queries = [ - { name: "Prometheus ccam_up", q: "ccam_up" }, - { name: "Prometheus total sessions", q: "sum(ccam_sessions)" }, - ]; - const results = []; - for (const { name, q } of queries) { - const res = await fetch( - `${PROMETHEUS_URL}/api/v1/query?${new URLSearchParams({ query: q })}` - ); - if (!res.ok) { - results.push({ name, ok: false, detail: `HTTP ${res.status}` }); - continue; - } - const body = await res.json(); - const series = body?.data?.result; - if (!Array.isArray(series) || series.length === 0) { - results.push({ name, ok: false, detail: "no series (is CCAM scraping?)" }); - continue; - } - const sample = series[0]?.value?.[1]; - results.push({ name, ok: true, detail: `${q} = ${sample}` }); - } - return results; - } catch (err) { - return [{ name: "Prometheus ccam metrics", ok: false, detail: err.message }]; - } -} - -async function checkPrometheusConsole() { - try { - const res = await fetch(`${PROMETHEUS_URL}/consoles/index.html`); - if (!res.ok) { - return { name: "Prometheus CCAM console", ok: false, detail: `HTTP ${res.status}` }; - } - const html = await res.text(); - if (!html.includes("CCAM")) { - return { name: "Prometheus CCAM console", ok: false, detail: "unexpected page body" }; - } - return { name: "Prometheus CCAM console", ok: true, detail: "/consoles/index.html" }; - } catch (err) { - return { name: "Prometheus CCAM console", ok: false, detail: err.message }; - } -} - -async function main() { - const checks = [ - await checkDashboardHealth(), - await check( - "Dashboard /api/metrics", - `${DASHBOARD_URL}/api/metrics`, - (res) => res.ok && res.headers.get("content-type")?.includes("text/plain") - ), - await check("Prometheus /-/ready", `${PROMETHEUS_URL}/-/ready`), - await checkPrometheusConsole(), - await check("Grafana /api/health", `${GRAFANA_URL}/api/health`), - await checkGrafanaLogin(), - await checkPrometheusTarget(), - ...(await checkPrometheusMetrics()), - ]; - - let failed = 0; - for (const c of checks) { - if (c.ok) { - if (!JSON_MODE) { - console.log(`✔ ${c.name}${c.detail ? ` (${c.detail})` : ""}`); - } - } else { - failed += 1; - if (!JSON_MODE) { - console.error(`✖ ${c.name}: ${c.detail || "failed"}`); - } - } - } - - if (JSON_MODE) { - const payload = { - ok: failed === 0, - checks, - urls: { - dashboard: DASHBOARD_URL, - prometheus: PROMETHEUS_URL, - grafana: GRAFANA_URL, - metrics: `${DASHBOARD_URL}/api/metrics`, - }, - }; - console.log(JSON.stringify(payload, null, 2)); - process.exit(failed > 0 ? 1 : 0); - } - - if (failed > 0) { - console.error(`\n${failed} check(s) failed.`); - process.exit(1); - } - console.log("\nMonitoring stack OK."); - console.log(` Grafana: ${GRAFANA_URL} (${grafanaLoginDetail()})`); - console.log(` Console: ${PROMETHEUS_URL}/consoles/index.html`); - console.log(` Graph: ${PROMETHEUS_URL}/graph`); - console.log(` Metrics: ${DASHBOARD_URL}/api/metrics`); -} - -main(); diff --git a/package.json b/package.json index 46c8e09..f5d86e7 100644 --- a/package.json +++ b/package.json @@ -72,16 +72,6 @@ "mcp:typecheck": "npm --prefix mcp run typecheck", "mcp:docker:build": "docker build -f mcp/Dockerfile -t agent-dashboard-mcp:local .", "mcp:podman:build": "podman build -f mcp/Dockerfile -t localhost/agent-dashboard-mcp:local .", - "desktop:install": "cd desktop && node scripts/install.js", - "desktop:dev": "npm run build && cd desktop && npm run dev", - "desktop:build": "cd desktop && npm run build", - "desktop:dmg": "npm run build && cd desktop && npm run dmg", - "desktop:dmg:arm64": "npm run build && cd desktop && npm run dmg:arm64", - "desktop:dmg:x64": "npm run build && cd desktop && npm run dmg:x64", - "desktop:dmg:universal": "npm run build && cd desktop && npm run dmg:universal", - "desktop:win": "npm run build && cd desktop && npm run win", - "desktop:win:portable": "npm run build && cd desktop && npm run win:portable", - "desktop:test": "cd desktop && npm test", "install-hooks": "node scripts/install-hooks.js", "seed": "node scripts/seed.js", "import-history": "node scripts/import-history.js", @@ -95,18 +85,8 @@ "format:check": "prettier --check .", "openapi:yaml": "node scripts/generate-openapi-yaml.js", "link-cli": "npm link || node -e \"console.warn('ccam CLI not linked globally (no permission?). Link manually with: npm link')\"", - "monitoring:install": "npm install --prefix monitoring", - "monitoring:setup": "npm run monitoring:install", - "monitoring:up": "npm --prefix monitoring run start", - "monitoring:down": "npm --prefix monitoring run stop", - "monitoring:start": "npm --prefix monitoring run start:foreground", - "monitoring:docker:up": "docker compose -f monitoring/docker-compose.yml up -d", - "monitoring:docker:down": "docker compose -f monitoring/docker-compose.yml down", - "monitoring:verify": "node monitoring/scripts/verify.js", "docker:up": "docker compose up -d --build", - "docker:down": "docker compose down", - "docker:full:up": "docker compose -f docker-compose.full.yml up -d --build", - "docker:full:down": "docker compose -f docker-compose.full.yml down" + "docker:down": "docker compose down" }, "dependencies": { "adm-zip": "^0.5.16", diff --git a/scripts/import-history.js b/scripts/import-history.js index 452c673..342b0bc 100644 --- a/scripts/import-history.js +++ b/scripts/import-history.js @@ -34,14 +34,11 @@ const CLAUDE_DIR = getClaudeHome(); const PROJECTS_DIR = getProjectsDir(); // Max session files a directory sweep scans synchronously before it yields to -// the event loop. The desktop app hosts this Express server IN the Electron main -// process (see desktop/src/server-host.ts), so a long synchronous scan of a -// large ~/.claude/projects tree — one statSync + one getSession query per file — -// would freeze the whole app window, not just delay an API response. Yielding -// every N files keeps each synchronous burst short so a multi-thousand-session -// history never monopolizes the loop. Under `npm start` the server is its own -// process, so the same scan can't freeze the UI there — which is exactly why -// the issue only reproduces in the packaged app (#223). +// the event loop. A long synchronous scan of a large ~/.claude/projects tree — +// one statSync + one getSession query per file — would otherwise block every +// other request (including hook ingestion) on this single Node process. +// Yielding every N files keeps each synchronous burst short so a +// multi-thousand-session history never monopolizes the loop. const SWEEP_YIELD_EVERY_FILES = 100; /** @@ -1900,10 +1897,10 @@ async function syncDefaultProjects(dbModule, options = {}) { // Cooperative yield BEFORE the per-file work, so it covers the unchanged // -file fast paths below (statSync + a getSession query) that otherwise // never await. Without this, a cold-cache sweep of a large projects tree - // runs thousands of files back-to-back with no yield and freezes the - // desktop app's window (its server shares the Electron main event loop — - // see SWEEP_YIELD_EVERY_FILES). The heavy-parse path keeps its own yield - // further down; this one is what makes the common skip path cooperative. + // runs thousands of files back-to-back with no yield and blocks every + // other request on this process (see SWEEP_YIELD_EVERY_FILES). The + // heavy-parse path keeps its own yield further down; this one is what + // makes the common skip path cooperative. if (scanned > 0 && scanned % SWEEP_YIELD_EVERY_FILES === 0) { await new Promise((resolve) => setImmediate(resolve)); } diff --git a/server/README.md b/server/README.md index 42d1dc9..7d0c86c 100644 --- a/server/README.md +++ b/server/README.md @@ -467,7 +467,7 @@ The OpenAPI spec is generated from `server/openapi.js` (`createOpenApiSpec()`), | `GET` | `/api/analytics` | Analytics aggregates for charts/trends | | `GET` | `/api/metrics` | Prometheus / OpenMetrics exposition (text; v0.0.4) | -**Prometheus metrics (`GET /api/metrics`).** Exposes the dashboard's live counters — `ccam_sessions`/`ccam_agents` by status, `ccam_events_total`, `ccam_tokens_total` by kind, `ccam_websocket_clients`, `ccam_remote_sources` by enabled state, `ccam_process_uptime_seconds`/`ccam_process_resident_memory_bytes`, and `ccam_build_info{version}` — in the Prometheus v0.0.4 text-exposition format for scraping into Prometheus / Grafana (`server/routes/metrics.js`). Values come from the same `server/db.js` prepared statements the REST API uses, so they match the UI; status series are enumerated so a gauge never drops out of the exposition at zero. The route is read-only and, being under `/api`, sits behind both the Host-header (DNS-rebinding) guard and the optional `DASHBOARD_TOKEN` guard: a non-loopback scraper (e.g. Prometheus in Docker via `host.docker.internal`) must be allowlisted with `DASHBOARD_ALLOWED_HOSTS` or it gets `403 EBADHOST`, and must send the token when one is set. A ready-to-run Prometheus + Grafana stack with four auto-provisioned dashboards (default home **CCAM — Overview**) lives in [`monitoring/`](../monitoring/README.md). +**Prometheus metrics (`GET /api/metrics`).** Exposes the dashboard's live counters — `ccam_sessions`/`ccam_agents` by status, `ccam_events_total`, `ccam_tokens_total` by kind, `ccam_websocket_clients`, `ccam_remote_sources` by enabled state, `ccam_process_uptime_seconds`/`ccam_process_resident_memory_bytes`, and `ccam_build_info{version}` — in the Prometheus v0.0.4 text-exposition format for scraping into Prometheus / Grafana (`server/routes/metrics.js`). Values come from the same `server/db.js` prepared statements the REST API uses, so they match the UI; status series are enumerated so a gauge never drops out of the exposition at zero. The route is read-only and, being under `/api`, sits behind both the Host-header (DNS-rebinding) guard and the optional `DASHBOARD_TOKEN` guard: a non-loopback scraper (e.g. Prometheus in Docker via `host.docker.internal`) must be allowlisted with `DASHBOARD_ALLOWED_HOSTS` or it gets `403 EBADHOST`, and must send the token when one is set. **Data scope (`?sources=`).** `GET /api/sessions`, `/api/events`, `/api/agents`, `/api/stats`, and `/api/analytics` all accept an optional `sources` query param — a comma-separated list of source ids (`local` plus any remote source id, see [Remote Data Sources](#remote-data-sources)) — that narrows the result to sessions with a matching `sessions.source`. It is parsed by `server/lib/source-filter.js` into SQL predicates; `/api/stats` and `/api/analytics` route to the source-scoped aggregates in `server/lib/scoped-stats.js` only when a scope is present, leaving the unscoped fast paths unchanged. `GET /api/sessions/facets` additionally returns a `sources` facet enumerating the known source ids. diff --git a/server/__tests__/monitoring-paths.test.js b/server/__tests__/monitoring-paths.test.js deleted file mode 100644 index dfbd856..0000000 --- a/server/__tests__/monitoring-paths.test.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file Unit tests for cross-platform monitoring binary URL/path resolution. - * @author Nguyễn Ngọc Trí Vĩ - */ -const { describe, it } = require("node:test"); -const assert = require("node:assert/strict"); -const { - prometheusUrl, - grafanaUrl, - prometheusArchiveExt, - grafanaArchiveExt, - prometheusPlatform, - prometheusArchiveName, - grafanaArchiveName, - toGrafanaPath, -} = require("../../monitoring/scripts/paths"); - -describe("monitoring paths", () => { - it("builds official download URLs for the current platform", () => { - const plat = prometheusPlatform(); - const promExt = prometheusArchiveExt(); - const grafExt = grafanaArchiveExt(); - - assert.match( - prometheusUrl(), - new RegExp(`${prometheusArchiveName()}\\.${promExt.replace(".", "\\.")}$`) - ); - assert.match( - grafanaUrl(), - new RegExp(`grafana-[0-9.]+\\.${plat}\\.${grafExt.replace(".", "\\.")}$`) - ); - - if (process.platform === "win32") { - assert.equal(promExt, "zip"); - assert.equal(grafExt, "zip"); - } else { - assert.equal(promExt, "tar.gz"); - assert.equal(grafExt, "tar.gz"); - } - }); - - it("normalizes Windows paths for Grafana YAML", () => { - assert.equal( - toGrafanaPath("C:\\ccam\\monitoring\\grafana\\dashboards"), - "C:/ccam/monitoring/grafana/dashboards" - ); - }); - - it("uses consistent archive naming", () => { - assert.match(prometheusArchiveName(), /^prometheus-[0-9.]+\./); - assert.match(grafanaArchiveName(), /^grafana-[0-9.]+\./); - }); -}); diff --git a/server/routes/metrics.js b/server/routes/metrics.js index f88cb88..49b2dc4 100644 --- a/server/routes/metrics.js +++ b/server/routes/metrics.js @@ -17,8 +17,7 @@ * server as anything other than loopback (e.g. Prometheus in Docker via * `host.docker.internal`) must therefore be allowlisted with * `DASHBOARD_ALLOWED_HOSTS` (and send the token when one is set), so an instance - * never leaks operational data to an unexpected origin. The turnkey Prometheus + - * Grafana bundle in `monitoring/` documents the exact setup. + * never leaks operational data to an unexpected origin. * * @author Nguyễn Ngọc Trí Vĩ */

    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≪a<&sM?}ZXO$L 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

    jXD*N0ZA>6DZvzKxCk2#ODke7uwA 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