claude-flow-novice 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,891 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
import { EventEmitter } from "events";
|
|
15
|
+
import { writeFile, readFile, mkdir, readdir } from "node:fs/promises";
|
|
16
|
+
import { join } from "path";
|
|
17
|
+
import { Logger } from "../core/logger.js";
|
|
18
|
+
import { ConfigManager } from "../core/config.js";
|
|
19
|
+
export class CloudManager extends EventEmitter {
|
|
20
|
+
async initialize() {
|
|
21
|
+
try {
|
|
22
|
+
await mkdir(this.cloudPath, {
|
|
23
|
+
recursive: true
|
|
24
|
+
});
|
|
25
|
+
await mkdir(join(this.cloudPath, 'providers'), {
|
|
26
|
+
recursive: true
|
|
27
|
+
});
|
|
28
|
+
await mkdir(join(this.cloudPath, 'resources'), {
|
|
29
|
+
recursive: true
|
|
30
|
+
});
|
|
31
|
+
await mkdir(join(this.cloudPath, 'infrastructures'), {
|
|
32
|
+
recursive: true
|
|
33
|
+
});
|
|
34
|
+
await mkdir(join(this.cloudPath, 'templates'), {
|
|
35
|
+
recursive: true
|
|
36
|
+
});
|
|
37
|
+
await this.loadConfigurations();
|
|
38
|
+
await this.initializeDefaultProviders();
|
|
39
|
+
this.logger.info('Cloud Manager initialized successfully');
|
|
40
|
+
} catch (error) {
|
|
41
|
+
this.logger.error('Failed to initialize Cloud Manager', {
|
|
42
|
+
error
|
|
43
|
+
});
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async addProvider(providerData) {
|
|
48
|
+
const provider = {
|
|
49
|
+
id: providerData.id || `provider-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
50
|
+
name: providerData.name || 'Unnamed Provider',
|
|
51
|
+
type: providerData.type || 'custom',
|
|
52
|
+
credentials: providerData.credentials || {},
|
|
53
|
+
configuration: {
|
|
54
|
+
defaultRegion: 'us-east-1',
|
|
55
|
+
availableRegions: [
|
|
56
|
+
'us-east-1',
|
|
57
|
+
'us-west-2',
|
|
58
|
+
'eu-west-1'
|
|
59
|
+
],
|
|
60
|
+
services: [],
|
|
61
|
+
endpoints: {},
|
|
62
|
+
features: [],
|
|
63
|
+
...providerData.configuration
|
|
64
|
+
},
|
|
65
|
+
status: 'inactive',
|
|
66
|
+
quotas: {
|
|
67
|
+
computeInstances: 20,
|
|
68
|
+
storage: 1000,
|
|
69
|
+
bandwidth: 1000,
|
|
70
|
+
requests: 1000000,
|
|
71
|
+
...providerData.quotas
|
|
72
|
+
},
|
|
73
|
+
pricing: {
|
|
74
|
+
currency: 'USD',
|
|
75
|
+
computePerHour: 0.1,
|
|
76
|
+
storagePerGB: 0.023,
|
|
77
|
+
bandwidthPerGB: 0.09,
|
|
78
|
+
requestsPer1000: 0.0004,
|
|
79
|
+
...providerData.pricing
|
|
80
|
+
},
|
|
81
|
+
createdAt: new Date(),
|
|
82
|
+
updatedAt: new Date()
|
|
83
|
+
};
|
|
84
|
+
// Validate credentials
|
|
85
|
+
try {
|
|
86
|
+
await this.validateProviderCredentials(provider);
|
|
87
|
+
provider.status = 'active';
|
|
88
|
+
} catch (error) {
|
|
89
|
+
provider.status = 'error';
|
|
90
|
+
this.logger.warn(`Provider credentials validation failed: ${provider.name}`, {
|
|
91
|
+
error
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
this.providers.set(provider.id, provider);
|
|
95
|
+
await this.saveProvider(provider);
|
|
96
|
+
this.emit('provider:added', provider);
|
|
97
|
+
this.logger.info(`Cloud provider added: ${provider.name} (${provider.id})`);
|
|
98
|
+
return provider;
|
|
99
|
+
}
|
|
100
|
+
async createResource(resourceData) {
|
|
101
|
+
const provider = this.providers.get(resourceData.providerId);
|
|
102
|
+
if (!provider) {
|
|
103
|
+
throw new Error(`Provider not found: ${resourceData.providerId}`);
|
|
104
|
+
}
|
|
105
|
+
if (provider.status !== 'active') {
|
|
106
|
+
throw new Error(`Provider is not active: ${provider.name}`);
|
|
107
|
+
}
|
|
108
|
+
const resource = {
|
|
109
|
+
id: `resource-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
110
|
+
name: resourceData.name,
|
|
111
|
+
type: resourceData.type,
|
|
112
|
+
providerId: resourceData.providerId,
|
|
113
|
+
region: resourceData.region,
|
|
114
|
+
status: 'creating',
|
|
115
|
+
configuration: {
|
|
116
|
+
size: 'small',
|
|
117
|
+
ports: [],
|
|
118
|
+
environment: {},
|
|
119
|
+
volumes: [],
|
|
120
|
+
networks: [],
|
|
121
|
+
tags: {},
|
|
122
|
+
...resourceData.configuration
|
|
123
|
+
},
|
|
124
|
+
monitoring: {
|
|
125
|
+
enabled: true,
|
|
126
|
+
metrics: [],
|
|
127
|
+
alerts: [],
|
|
128
|
+
healthChecks: []
|
|
129
|
+
},
|
|
130
|
+
security: {
|
|
131
|
+
encryption: true,
|
|
132
|
+
backups: true,
|
|
133
|
+
accessControl: [],
|
|
134
|
+
vulnerabilityScanning: true,
|
|
135
|
+
complianceFrameworks: []
|
|
136
|
+
},
|
|
137
|
+
costs: {
|
|
138
|
+
hourlyRate: this.calculateResourceCost(provider, resourceData.type, resourceData.configuration.size || 'small'),
|
|
139
|
+
monthlyEstimate: 0,
|
|
140
|
+
actualSpend: 0,
|
|
141
|
+
lastBillingDate: new Date(),
|
|
142
|
+
costBreakdown: {}
|
|
143
|
+
},
|
|
144
|
+
performance: {
|
|
145
|
+
cpu: 0,
|
|
146
|
+
memory: 0,
|
|
147
|
+
storage: 0,
|
|
148
|
+
network: 0,
|
|
149
|
+
uptime: 100,
|
|
150
|
+
availability: 100
|
|
151
|
+
},
|
|
152
|
+
metadata: {
|
|
153
|
+
environment: 'development',
|
|
154
|
+
owner: 'system',
|
|
155
|
+
purpose: 'general',
|
|
156
|
+
lifecycle: 'permanent',
|
|
157
|
+
...resourceData.metadata
|
|
158
|
+
},
|
|
159
|
+
createdAt: new Date(),
|
|
160
|
+
updatedAt: new Date(),
|
|
161
|
+
auditLog: []
|
|
162
|
+
};
|
|
163
|
+
// Calculate monthly estimate
|
|
164
|
+
resource.costs.monthlyEstimate = resource.costs.hourlyRate * 24 * 30;
|
|
165
|
+
this.addAuditEntry(resource, resource.metadata.owner, 'resource_created', 'resource', {
|
|
166
|
+
resourceId: resource.id,
|
|
167
|
+
resourceName: resource.name,
|
|
168
|
+
providerId: resourceData.providerId
|
|
169
|
+
});
|
|
170
|
+
this.resources.set(resource.id, resource);
|
|
171
|
+
await this.saveResource(resource);
|
|
172
|
+
// Start resource creation process
|
|
173
|
+
await this.provisionResource(resource);
|
|
174
|
+
this.emit('resource:created', resource);
|
|
175
|
+
this.logger.info(`Cloud resource created: ${resource.name} (${resource.id})`);
|
|
176
|
+
return resource;
|
|
177
|
+
}
|
|
178
|
+
async createInfrastructure(infrastructureData) {
|
|
179
|
+
const infrastructure = {
|
|
180
|
+
id: `infra-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
181
|
+
name: infrastructureData.name,
|
|
182
|
+
description: infrastructureData.description,
|
|
183
|
+
projectId: infrastructureData.projectId,
|
|
184
|
+
environment: infrastructureData.environment,
|
|
185
|
+
resources: [],
|
|
186
|
+
topology: {
|
|
187
|
+
networks: [],
|
|
188
|
+
loadBalancers: [],
|
|
189
|
+
databases: [],
|
|
190
|
+
caches: [],
|
|
191
|
+
queues: []
|
|
192
|
+
},
|
|
193
|
+
deployment: {
|
|
194
|
+
strategy: 'terraform',
|
|
195
|
+
template: infrastructureData.template,
|
|
196
|
+
parameters: infrastructureData.parameters,
|
|
197
|
+
deploymentHistory: []
|
|
198
|
+
},
|
|
199
|
+
monitoring: {
|
|
200
|
+
dashboard: '',
|
|
201
|
+
alerts: [],
|
|
202
|
+
sla: {
|
|
203
|
+
availability: 99.9,
|
|
204
|
+
responseTime: 200,
|
|
205
|
+
errorRate: 0.1
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
costs: {
|
|
209
|
+
budgetLimit: 1000,
|
|
210
|
+
currentSpend: 0,
|
|
211
|
+
projectedSpend: 0,
|
|
212
|
+
costAlerts: [],
|
|
213
|
+
optimization: []
|
|
214
|
+
},
|
|
215
|
+
compliance: {
|
|
216
|
+
frameworks: [],
|
|
217
|
+
requirements: [],
|
|
218
|
+
lastAudit: new Date(),
|
|
219
|
+
nextAudit: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000)
|
|
220
|
+
},
|
|
221
|
+
backup: {
|
|
222
|
+
enabled: true,
|
|
223
|
+
schedule: '0 2 * * *',
|
|
224
|
+
retention: '30d',
|
|
225
|
+
backupLocations: []
|
|
226
|
+
},
|
|
227
|
+
disaster_recovery: {
|
|
228
|
+
enabled: false,
|
|
229
|
+
rto: 60,
|
|
230
|
+
rpo: 15,
|
|
231
|
+
strategy: 'active-passive',
|
|
232
|
+
testFrequency: 'quarterly'
|
|
233
|
+
},
|
|
234
|
+
createdAt: new Date(),
|
|
235
|
+
updatedAt: new Date()
|
|
236
|
+
};
|
|
237
|
+
this.infrastructures.set(infrastructure.id, infrastructure);
|
|
238
|
+
await this.saveInfrastructure(infrastructure);
|
|
239
|
+
this.emit('infrastructure:created', infrastructure);
|
|
240
|
+
this.logger.info(`Infrastructure created: ${infrastructure.name} (${infrastructure.id})`);
|
|
241
|
+
return infrastructure;
|
|
242
|
+
}
|
|
243
|
+
async deployInfrastructure(infrastructureId, userId = 'system') {
|
|
244
|
+
const infrastructure = this.infrastructures.get(infrastructureId);
|
|
245
|
+
if (!infrastructure) {
|
|
246
|
+
throw new Error(`Infrastructure not found: ${infrastructureId}`);
|
|
247
|
+
}
|
|
248
|
+
const deploymentId = `deploy-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
249
|
+
const startTime = new Date();
|
|
250
|
+
try {
|
|
251
|
+
this.logger.info(`Starting infrastructure deployment: ${infrastructure.name}`);
|
|
252
|
+
this.emit('infrastructure:deployment_started', {
|
|
253
|
+
infrastructure,
|
|
254
|
+
deploymentId
|
|
255
|
+
});
|
|
256
|
+
// Execute deployment based on strategy
|
|
257
|
+
await this.executeInfrastructureDeployment(infrastructure);
|
|
258
|
+
const endTime = new Date();
|
|
259
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
260
|
+
const deployment = {
|
|
261
|
+
id: deploymentId,
|
|
262
|
+
timestamp: startTime,
|
|
263
|
+
version: `v${Date.now()}`,
|
|
264
|
+
changes: [
|
|
265
|
+
'Initial deployment'
|
|
266
|
+
],
|
|
267
|
+
status: 'success',
|
|
268
|
+
duration,
|
|
269
|
+
deployedBy: userId
|
|
270
|
+
};
|
|
271
|
+
infrastructure.deployment.deploymentHistory.push(deployment);
|
|
272
|
+
infrastructure.deployment.lastDeployment = startTime;
|
|
273
|
+
infrastructure.updatedAt = new Date();
|
|
274
|
+
await this.saveInfrastructure(infrastructure);
|
|
275
|
+
this.emit('infrastructure:deployment_completed', {
|
|
276
|
+
infrastructure,
|
|
277
|
+
deployment
|
|
278
|
+
});
|
|
279
|
+
this.logger.info(`Infrastructure deployment completed: ${infrastructure.name} in ${duration}ms`);
|
|
280
|
+
} catch (error) {
|
|
281
|
+
const endTime = new Date();
|
|
282
|
+
const duration = endTime.getTime() - startTime.getTime();
|
|
283
|
+
const deployment = {
|
|
284
|
+
id: deploymentId,
|
|
285
|
+
timestamp: startTime,
|
|
286
|
+
version: `v${Date.now()}`,
|
|
287
|
+
changes: [
|
|
288
|
+
'Failed deployment'
|
|
289
|
+
],
|
|
290
|
+
status: 'failed',
|
|
291
|
+
duration,
|
|
292
|
+
deployedBy: userId
|
|
293
|
+
};
|
|
294
|
+
infrastructure.deployment.deploymentHistory.push(deployment);
|
|
295
|
+
infrastructure.updatedAt = new Date();
|
|
296
|
+
await this.saveInfrastructure(infrastructure);
|
|
297
|
+
this.emit('infrastructure:deployment_failed', {
|
|
298
|
+
infrastructure,
|
|
299
|
+
deployment,
|
|
300
|
+
error
|
|
301
|
+
});
|
|
302
|
+
this.logger.error(`Infrastructure deployment failed: ${infrastructure.name}`, {
|
|
303
|
+
error
|
|
304
|
+
});
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async optimizeCosts(filters) {
|
|
309
|
+
let resources = Array.from(this.resources.values());
|
|
310
|
+
// Apply filters
|
|
311
|
+
if (filters) {
|
|
312
|
+
if (filters.providerId) {
|
|
313
|
+
resources = resources.filter((r)=>r.providerId === filters.providerId);
|
|
314
|
+
}
|
|
315
|
+
if (filters.environment) {
|
|
316
|
+
resources = resources.filter((r)=>r.metadata.environment === filters.environment);
|
|
317
|
+
}
|
|
318
|
+
if (filters.resourceType) {
|
|
319
|
+
resources = resources.filter((r)=>r.type === filters.resourceType);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const optimizations = [];
|
|
323
|
+
for (const resource of resources){
|
|
324
|
+
// Rightsizing opportunities
|
|
325
|
+
if (resource.performance.cpu < 20 && resource.performance.memory < 30) {
|
|
326
|
+
optimizations.push({
|
|
327
|
+
id: `opt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
328
|
+
type: 'rightsizing',
|
|
329
|
+
description: `Resource ${resource.name} is underutilized (CPU: ${resource.performance.cpu}%, Memory: ${resource.performance.memory}%). Consider downsizing.`,
|
|
330
|
+
potentialSavings: resource.costs.monthlyEstimate * 0.3,
|
|
331
|
+
implementation: 'Downsize instance to smaller type',
|
|
332
|
+
effort: 'low',
|
|
333
|
+
priority: 'medium',
|
|
334
|
+
status: 'identified'
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
// Scheduling opportunities for non-production
|
|
338
|
+
if (resource.metadata.environment !== 'production' && resource.status === 'running') {
|
|
339
|
+
optimizations.push({
|
|
340
|
+
id: `opt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
341
|
+
type: 'scheduling',
|
|
342
|
+
description: `Resource ${resource.name} in ${resource.metadata.environment} environment could be scheduled to run only during business hours.`,
|
|
343
|
+
potentialSavings: resource.costs.monthlyEstimate * 0.6,
|
|
344
|
+
implementation: 'Implement auto-scaling schedule (8 AM - 6 PM weekdays)',
|
|
345
|
+
effort: 'medium',
|
|
346
|
+
priority: 'high',
|
|
347
|
+
status: 'identified'
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
// Storage optimization
|
|
351
|
+
if (resource.type === 'storage' && resource.performance.storage < 50) {
|
|
352
|
+
optimizations.push({
|
|
353
|
+
id: `opt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
354
|
+
type: 'storage-optimization',
|
|
355
|
+
description: `Storage resource ${resource.name} is only ${resource.performance.storage}% utilized. Consider reducing allocated storage.`,
|
|
356
|
+
potentialSavings: resource.costs.monthlyEstimate * 0.25,
|
|
357
|
+
implementation: 'Reduce storage allocation and implement lifecycle policies',
|
|
358
|
+
effort: 'low',
|
|
359
|
+
priority: 'medium',
|
|
360
|
+
status: 'identified'
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Sort by potential savings
|
|
365
|
+
optimizations.sort((a, b)=>b.potentialSavings - a.potentialSavings);
|
|
366
|
+
this.logger.info(`Cost optimization analysis completed: ${optimizations.length} opportunities identified`);
|
|
367
|
+
this.emit('cost_optimization:analyzed', {
|
|
368
|
+
optimizations,
|
|
369
|
+
resourceCount: resources.length
|
|
370
|
+
});
|
|
371
|
+
return optimizations;
|
|
372
|
+
}
|
|
373
|
+
async getCloudMetrics(filters) {
|
|
374
|
+
let resources = Array.from(this.resources.values());
|
|
375
|
+
let providers = Array.from(this.providers.values());
|
|
376
|
+
// Apply filters
|
|
377
|
+
if (filters) {
|
|
378
|
+
if (filters.providerId) {
|
|
379
|
+
resources = resources.filter((r)=>r.providerId === filters.providerId);
|
|
380
|
+
providers = providers.filter((p)=>p.id === filters.providerId);
|
|
381
|
+
}
|
|
382
|
+
if (filters.environment) {
|
|
383
|
+
resources = resources.filter((r)=>r.metadata.environment === filters.environment);
|
|
384
|
+
}
|
|
385
|
+
if (filters.timeRange) {
|
|
386
|
+
resources = resources.filter((r)=>r.createdAt >= filters.timeRange.start && r.createdAt <= filters.timeRange.end);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Provider metrics
|
|
390
|
+
const providerMetrics = {
|
|
391
|
+
total: providers.length,
|
|
392
|
+
active: providers.filter((p)=>p.status === 'active').length,
|
|
393
|
+
inactive: providers.filter((p)=>p.status === 'inactive').length,
|
|
394
|
+
errors: providers.filter((p)=>p.status === 'error').length
|
|
395
|
+
};
|
|
396
|
+
// Resource metrics
|
|
397
|
+
const resourcesByType = {};
|
|
398
|
+
const resourcesByProvider = {};
|
|
399
|
+
const resourcesByEnvironment = {};
|
|
400
|
+
for (const resource of resources){
|
|
401
|
+
resourcesByType[resource.type] = (resourcesByType[resource.type] || 0) + 1;
|
|
402
|
+
resourcesByProvider[resource.providerId] = (resourcesByProvider[resource.providerId] || 0) + 1;
|
|
403
|
+
resourcesByEnvironment[resource.metadata.environment] = (resourcesByEnvironment[resource.metadata.environment] || 0) + 1;
|
|
404
|
+
}
|
|
405
|
+
const resourceMetrics = {
|
|
406
|
+
total: resources.length,
|
|
407
|
+
running: resources.filter((r)=>r.status === 'running').length,
|
|
408
|
+
stopped: resources.filter((r)=>r.status === 'stopped').length,
|
|
409
|
+
errors: resources.filter((r)=>r.status === 'error').length,
|
|
410
|
+
byType: resourcesByType,
|
|
411
|
+
byProvider: resourcesByProvider,
|
|
412
|
+
byEnvironment: resourcesByEnvironment
|
|
413
|
+
};
|
|
414
|
+
// Cost metrics
|
|
415
|
+
const totalSpend = resources.reduce((sum, r)=>sum + r.costs.actualSpend, 0);
|
|
416
|
+
const monthlySpend = resources.reduce((sum, r)=>sum + r.costs.monthlyEstimate, 0);
|
|
417
|
+
const projectedSpend = monthlySpend * 12;
|
|
418
|
+
const topSpenders = resources.map((r)=>({
|
|
419
|
+
resourceId: r.id,
|
|
420
|
+
cost: r.costs.actualSpend
|
|
421
|
+
})).sort((a, b)=>b.cost - a.cost).slice(0, 10);
|
|
422
|
+
const costByProvider = {};
|
|
423
|
+
const costByEnvironment = {};
|
|
424
|
+
for (const resource of resources){
|
|
425
|
+
costByProvider[resource.providerId] = (costByProvider[resource.providerId] || 0) + resource.costs.actualSpend;
|
|
426
|
+
costByEnvironment[resource.metadata.environment] = (costByEnvironment[resource.metadata.environment] || 0) + resource.costs.actualSpend;
|
|
427
|
+
}
|
|
428
|
+
const costMetrics = {
|
|
429
|
+
totalSpend,
|
|
430
|
+
monthlySpend,
|
|
431
|
+
projectedSpend,
|
|
432
|
+
topSpenders,
|
|
433
|
+
costByProvider,
|
|
434
|
+
costByEnvironment,
|
|
435
|
+
optimization: {
|
|
436
|
+
potentialSavings: 0,
|
|
437
|
+
implementedSavings: 0,
|
|
438
|
+
opportunities: 0
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
// Performance metrics
|
|
442
|
+
const performanceMetrics = {
|
|
443
|
+
averageUptime: resources.length > 0 ? resources.reduce((sum, r)=>sum + r.performance.uptime, 0) / resources.length : 0,
|
|
444
|
+
averageResponseTime: 0,
|
|
445
|
+
errorRate: 0,
|
|
446
|
+
availability: resources.length > 0 ? resources.reduce((sum, r)=>sum + r.performance.availability, 0) / resources.length : 0
|
|
447
|
+
};
|
|
448
|
+
// Security metrics
|
|
449
|
+
const encryptedResources = resources.filter((r)=>r.security.encryption).length;
|
|
450
|
+
const backedUpResources = resources.filter((r)=>r.security.backups).length;
|
|
451
|
+
const securityMetrics = {
|
|
452
|
+
vulnerabilities: {
|
|
453
|
+
critical: 0,
|
|
454
|
+
high: 0,
|
|
455
|
+
medium: 0,
|
|
456
|
+
low: 0
|
|
457
|
+
},
|
|
458
|
+
compliance: {
|
|
459
|
+
compliant: 0,
|
|
460
|
+
nonCompliant: 0,
|
|
461
|
+
pending: 0
|
|
462
|
+
},
|
|
463
|
+
encryptionCoverage: resources.length > 0 ? encryptedResources / resources.length * 100 : 0,
|
|
464
|
+
backupCoverage: resources.length > 0 ? backedUpResources / resources.length * 100 : 0
|
|
465
|
+
};
|
|
466
|
+
return {
|
|
467
|
+
providers: providerMetrics,
|
|
468
|
+
resources: resourceMetrics,
|
|
469
|
+
costs: costMetrics,
|
|
470
|
+
performance: performanceMetrics,
|
|
471
|
+
security: securityMetrics
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
async scaleResource(resourceId, scalingConfig, userId = 'system') {
|
|
475
|
+
const resource = this.resources.get(resourceId);
|
|
476
|
+
if (!resource) {
|
|
477
|
+
throw new Error(`Resource not found: ${resourceId}`);
|
|
478
|
+
}
|
|
479
|
+
const oldConfiguration = {
|
|
480
|
+
...resource.configuration
|
|
481
|
+
};
|
|
482
|
+
if (scalingConfig.size) {
|
|
483
|
+
resource.configuration.size = scalingConfig.size;
|
|
484
|
+
// Update cost calculation
|
|
485
|
+
const provider = this.providers.get(resource.providerId);
|
|
486
|
+
if (provider) {
|
|
487
|
+
resource.costs.hourlyRate = this.calculateResourceCost(provider, resource.type, scalingConfig.size);
|
|
488
|
+
resource.costs.monthlyEstimate = resource.costs.hourlyRate * 24 * 30;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (scalingConfig.replicas !== undefined) {
|
|
492
|
+
resource.configuration.tags.replicas = scalingConfig.replicas.toString();
|
|
493
|
+
}
|
|
494
|
+
if (scalingConfig.autoScaling) {
|
|
495
|
+
resource.configuration.tags.autoScaling = JSON.stringify(scalingConfig.autoScaling);
|
|
496
|
+
}
|
|
497
|
+
resource.updatedAt = new Date();
|
|
498
|
+
this.addAuditEntry(resource, userId, 'resource_scaled', 'resource', {
|
|
499
|
+
resourceId,
|
|
500
|
+
oldConfiguration,
|
|
501
|
+
newConfiguration: resource.configuration,
|
|
502
|
+
scalingConfig
|
|
503
|
+
});
|
|
504
|
+
await this.saveResource(resource);
|
|
505
|
+
this.emit('resource:scaled', {
|
|
506
|
+
resource,
|
|
507
|
+
scalingConfig
|
|
508
|
+
});
|
|
509
|
+
this.logger.info(`Resource scaled: ${resource.name} (${resourceId})`);
|
|
510
|
+
}
|
|
511
|
+
async deleteResource(resourceId, userId = 'system') {
|
|
512
|
+
const resource = this.resources.get(resourceId);
|
|
513
|
+
if (!resource) {
|
|
514
|
+
throw new Error(`Resource not found: ${resourceId}`);
|
|
515
|
+
}
|
|
516
|
+
// Update status to indicate deletion in progress
|
|
517
|
+
resource.status = 'terminated';
|
|
518
|
+
resource.updatedAt = new Date();
|
|
519
|
+
this.addAuditEntry(resource, userId, 'resource_deleted', 'resource', {
|
|
520
|
+
resourceId,
|
|
521
|
+
resourceName: resource.name
|
|
522
|
+
});
|
|
523
|
+
// Perform cloud provider cleanup
|
|
524
|
+
await this.deprovisionResource(resource);
|
|
525
|
+
this.resources.delete(resourceId);
|
|
526
|
+
this.emit('resource:deleted', {
|
|
527
|
+
resourceId,
|
|
528
|
+
resource
|
|
529
|
+
});
|
|
530
|
+
this.logger.info(`Resource deleted: ${resource.name} (${resourceId})`);
|
|
531
|
+
}
|
|
532
|
+
// Private helper methods
|
|
533
|
+
async loadConfigurations() {
|
|
534
|
+
try {
|
|
535
|
+
// Load providers
|
|
536
|
+
const providerFiles = await readdir(join(this.cloudPath, 'providers'));
|
|
537
|
+
for (const file of providerFiles.filter((f)=>f.endsWith('.json'))){
|
|
538
|
+
const content = await readFile(join(this.cloudPath, 'providers', file), 'utf-8');
|
|
539
|
+
const provider = JSON.parse(content);
|
|
540
|
+
this.providers.set(provider.id, provider);
|
|
541
|
+
}
|
|
542
|
+
// Load resources
|
|
543
|
+
const resourceFiles = await readdir(join(this.cloudPath, 'resources'));
|
|
544
|
+
for (const file of resourceFiles.filter((f)=>f.endsWith('.json'))){
|
|
545
|
+
const content = await readFile(join(this.cloudPath, 'resources', file), 'utf-8');
|
|
546
|
+
const resource = JSON.parse(content);
|
|
547
|
+
this.resources.set(resource.id, resource);
|
|
548
|
+
}
|
|
549
|
+
// Load infrastructures
|
|
550
|
+
const infraFiles = await readdir(join(this.cloudPath, 'infrastructures'));
|
|
551
|
+
for (const file of infraFiles.filter((f)=>f.endsWith('.json'))){
|
|
552
|
+
const content = await readFile(join(this.cloudPath, 'infrastructures', file), 'utf-8');
|
|
553
|
+
const infrastructure = JSON.parse(content);
|
|
554
|
+
this.infrastructures.set(infrastructure.id, infrastructure);
|
|
555
|
+
}
|
|
556
|
+
this.logger.info(`Loaded ${this.providers.size} providers, ${this.resources.size} resources, ${this.infrastructures.size} infrastructures`);
|
|
557
|
+
} catch (error) {
|
|
558
|
+
this.logger.warn('Failed to load some cloud configurations', {
|
|
559
|
+
error
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
async initializeDefaultProviders() {
|
|
564
|
+
const defaultProviders = [
|
|
565
|
+
{
|
|
566
|
+
name: 'AWS',
|
|
567
|
+
type: 'aws',
|
|
568
|
+
configuration: {
|
|
569
|
+
defaultRegion: 'us-east-1',
|
|
570
|
+
availableRegions: [
|
|
571
|
+
'us-east-1',
|
|
572
|
+
'us-west-2',
|
|
573
|
+
'eu-west-1',
|
|
574
|
+
'ap-southeast-1'
|
|
575
|
+
],
|
|
576
|
+
services: [
|
|
577
|
+
'ec2',
|
|
578
|
+
's3',
|
|
579
|
+
'rds',
|
|
580
|
+
'lambda',
|
|
581
|
+
'ecs',
|
|
582
|
+
'eks'
|
|
583
|
+
],
|
|
584
|
+
endpoints: {
|
|
585
|
+
ec2: 'https://ec2.amazonaws.com',
|
|
586
|
+
s3: 'https://s3.amazonaws.com',
|
|
587
|
+
rds: 'https://rds.amazonaws.com'
|
|
588
|
+
},
|
|
589
|
+
features: [
|
|
590
|
+
'auto-scaling',
|
|
591
|
+
'load-balancing',
|
|
592
|
+
'monitoring',
|
|
593
|
+
'backup'
|
|
594
|
+
]
|
|
595
|
+
},
|
|
596
|
+
pricing: {
|
|
597
|
+
currency: 'USD',
|
|
598
|
+
computePerHour: 0.1,
|
|
599
|
+
storagePerGB: 0.023,
|
|
600
|
+
bandwidthPerGB: 0.09,
|
|
601
|
+
requestsPer1000: 0.0004
|
|
602
|
+
}
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
name: 'Google Cloud Platform',
|
|
606
|
+
type: 'gcp',
|
|
607
|
+
configuration: {
|
|
608
|
+
defaultRegion: 'us-central1',
|
|
609
|
+
availableRegions: [
|
|
610
|
+
'us-central1',
|
|
611
|
+
'us-east1',
|
|
612
|
+
'europe-west1',
|
|
613
|
+
'asia-east1'
|
|
614
|
+
],
|
|
615
|
+
services: [
|
|
616
|
+
'compute',
|
|
617
|
+
'storage',
|
|
618
|
+
'sql',
|
|
619
|
+
'functions',
|
|
620
|
+
'gke'
|
|
621
|
+
],
|
|
622
|
+
endpoints: {
|
|
623
|
+
compute: 'https://compute.googleapis.com',
|
|
624
|
+
storage: 'https://storage.googleapis.com',
|
|
625
|
+
sql: 'https://sqladmin.googleapis.com'
|
|
626
|
+
},
|
|
627
|
+
features: [
|
|
628
|
+
'auto-scaling',
|
|
629
|
+
'load-balancing',
|
|
630
|
+
'monitoring',
|
|
631
|
+
'backup'
|
|
632
|
+
]
|
|
633
|
+
},
|
|
634
|
+
pricing: {
|
|
635
|
+
currency: 'USD',
|
|
636
|
+
computePerHour: 0.095,
|
|
637
|
+
storagePerGB: 0.02,
|
|
638
|
+
bandwidthPerGB: 0.08,
|
|
639
|
+
requestsPer1000: 0.0004
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
name: 'Microsoft Azure',
|
|
644
|
+
type: 'azure',
|
|
645
|
+
configuration: {
|
|
646
|
+
defaultRegion: 'East US',
|
|
647
|
+
availableRegions: [
|
|
648
|
+
'East US',
|
|
649
|
+
'West US 2',
|
|
650
|
+
'West Europe',
|
|
651
|
+
'Southeast Asia'
|
|
652
|
+
],
|
|
653
|
+
services: [
|
|
654
|
+
'virtual-machines',
|
|
655
|
+
'storage',
|
|
656
|
+
'sql-database',
|
|
657
|
+
'functions',
|
|
658
|
+
'aks'
|
|
659
|
+
],
|
|
660
|
+
endpoints: {
|
|
661
|
+
compute: 'https://management.azure.com',
|
|
662
|
+
storage: 'https://management.azure.com',
|
|
663
|
+
sql: 'https://management.azure.com'
|
|
664
|
+
},
|
|
665
|
+
features: [
|
|
666
|
+
'auto-scaling',
|
|
667
|
+
'load-balancing',
|
|
668
|
+
'monitoring',
|
|
669
|
+
'backup'
|
|
670
|
+
]
|
|
671
|
+
},
|
|
672
|
+
pricing: {
|
|
673
|
+
currency: 'USD',
|
|
674
|
+
computePerHour: 0.096,
|
|
675
|
+
storagePerGB: 0.024,
|
|
676
|
+
bandwidthPerGB: 0.087,
|
|
677
|
+
requestsPer1000: 0.0004
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
];
|
|
681
|
+
for (const providerData of defaultProviders){
|
|
682
|
+
if (!Array.from(this.providers.values()).some((p)=>p.name === providerData.name)) {
|
|
683
|
+
const provider = {
|
|
684
|
+
id: `provider-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
685
|
+
name: providerData.name,
|
|
686
|
+
type: providerData.type,
|
|
687
|
+
credentials: {},
|
|
688
|
+
configuration: providerData.configuration,
|
|
689
|
+
status: 'inactive',
|
|
690
|
+
quotas: {
|
|
691
|
+
computeInstances: 20,
|
|
692
|
+
storage: 1000,
|
|
693
|
+
bandwidth: 1000,
|
|
694
|
+
requests: 1000000
|
|
695
|
+
},
|
|
696
|
+
pricing: providerData.pricing,
|
|
697
|
+
createdAt: new Date(),
|
|
698
|
+
updatedAt: new Date()
|
|
699
|
+
};
|
|
700
|
+
this.providers.set(provider.id, provider);
|
|
701
|
+
await this.saveProvider(provider);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
async validateProviderCredentials(provider) {
|
|
706
|
+
// Implement credential validation logic for each provider type
|
|
707
|
+
switch(provider.type){
|
|
708
|
+
case 'aws':
|
|
709
|
+
return this.validateAWSCredentials(provider);
|
|
710
|
+
case 'gcp':
|
|
711
|
+
return this.validateGCPCredentials(provider);
|
|
712
|
+
case 'azure':
|
|
713
|
+
return this.validateAzureCredentials(provider);
|
|
714
|
+
default:
|
|
715
|
+
return true; // Assume valid for custom providers
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
async validateAWSCredentials(provider) {
|
|
719
|
+
// Implement AWS credential validation
|
|
720
|
+
// This would typically involve making a simple API call like ListRegions
|
|
721
|
+
return true; // Simplified for now
|
|
722
|
+
}
|
|
723
|
+
async validateGCPCredentials(provider) {
|
|
724
|
+
// Implement GCP credential validation
|
|
725
|
+
// This would typically involve making a simple API call like listing projects
|
|
726
|
+
return true; // Simplified for now
|
|
727
|
+
}
|
|
728
|
+
async validateAzureCredentials(provider) {
|
|
729
|
+
// Implement Azure credential validation
|
|
730
|
+
// This would typically involve making a simple API call like listing subscriptions
|
|
731
|
+
return true; // Simplified for now
|
|
732
|
+
}
|
|
733
|
+
calculateResourceCost(provider, type, size) {
|
|
734
|
+
const baseHourlyRate = provider.pricing.computePerHour;
|
|
735
|
+
const sizeMultipliers = {
|
|
736
|
+
nano: 0.5,
|
|
737
|
+
micro: 0.75,
|
|
738
|
+
small: 1.0,
|
|
739
|
+
medium: 2.0,
|
|
740
|
+
large: 4.0,
|
|
741
|
+
xlarge: 8.0,
|
|
742
|
+
'2xlarge': 16.0,
|
|
743
|
+
'4xlarge': 32.0
|
|
744
|
+
};
|
|
745
|
+
const typeMultipliers = {
|
|
746
|
+
compute: 1.0,
|
|
747
|
+
storage: 0.1,
|
|
748
|
+
database: 1.5,
|
|
749
|
+
cache: 0.8,
|
|
750
|
+
network: 0.3,
|
|
751
|
+
function: 0.01
|
|
752
|
+
};
|
|
753
|
+
const sizeMultiplier = sizeMultipliers[size] || 1.0;
|
|
754
|
+
const typeMultiplier = typeMultipliers[type] || 1.0;
|
|
755
|
+
return baseHourlyRate * sizeMultiplier * typeMultiplier;
|
|
756
|
+
}
|
|
757
|
+
async saveProvider(provider) {
|
|
758
|
+
const filePath = join(this.cloudPath, 'providers', `${provider.id}.json`);
|
|
759
|
+
await writeFile(filePath, JSON.stringify(provider, null, 2));
|
|
760
|
+
}
|
|
761
|
+
async saveResource(resource) {
|
|
762
|
+
const filePath = join(this.cloudPath, 'resources', `${resource.id}.json`);
|
|
763
|
+
await writeFile(filePath, JSON.stringify(resource, null, 2));
|
|
764
|
+
}
|
|
765
|
+
async saveInfrastructure(infrastructure) {
|
|
766
|
+
const filePath = join(this.cloudPath, 'infrastructures', `${infrastructure.id}.json`);
|
|
767
|
+
await writeFile(filePath, JSON.stringify(infrastructure, null, 2));
|
|
768
|
+
}
|
|
769
|
+
addAuditEntry(resource, userId, action, target, details) {
|
|
770
|
+
const entry = {
|
|
771
|
+
id: `audit-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
772
|
+
timestamp: new Date(),
|
|
773
|
+
userId,
|
|
774
|
+
action,
|
|
775
|
+
resource: target,
|
|
776
|
+
details
|
|
777
|
+
};
|
|
778
|
+
resource.auditLog.push(entry);
|
|
779
|
+
}
|
|
780
|
+
async provisionResource(resource) {
|
|
781
|
+
try {
|
|
782
|
+
this.logger.info(`Provisioning resource: ${resource.name}`);
|
|
783
|
+
// Simulate provisioning process
|
|
784
|
+
resource.status = 'running';
|
|
785
|
+
resource.updatedAt = new Date();
|
|
786
|
+
// Update performance metrics
|
|
787
|
+
resource.performance.cpu = Math.random() * 50 + 20; // 20-70%
|
|
788
|
+
resource.performance.memory = Math.random() * 60 + 30; // 30-90%
|
|
789
|
+
resource.performance.storage = Math.random() * 80 + 10; // 10-90%
|
|
790
|
+
resource.performance.network = Math.random() * 100; // 0-100 Mbps
|
|
791
|
+
await this.saveResource(resource);
|
|
792
|
+
this.emit('resource:provisioned', resource);
|
|
793
|
+
this.logger.info(`Resource provisioned successfully: ${resource.name}`);
|
|
794
|
+
} catch (error) {
|
|
795
|
+
resource.status = 'error';
|
|
796
|
+
resource.updatedAt = new Date();
|
|
797
|
+
await this.saveResource(resource);
|
|
798
|
+
this.emit('resource:provision_failed', {
|
|
799
|
+
resource,
|
|
800
|
+
error
|
|
801
|
+
});
|
|
802
|
+
this.logger.error(`Resource provisioning failed: ${resource.name}`, {
|
|
803
|
+
error
|
|
804
|
+
});
|
|
805
|
+
throw error;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
async deprovisionResource(resource) {
|
|
809
|
+
try {
|
|
810
|
+
this.logger.info(`Deprovisioning resource: ${resource.name}`);
|
|
811
|
+
// Implement cloud provider-specific deprovisioning logic
|
|
812
|
+
// This would typically involve API calls to delete the resource
|
|
813
|
+
this.emit('resource:deprovisioned', resource);
|
|
814
|
+
this.logger.info(`Resource deprovisioned successfully: ${resource.name}`);
|
|
815
|
+
} catch (error) {
|
|
816
|
+
this.emit('resource:deprovision_failed', {
|
|
817
|
+
resource,
|
|
818
|
+
error
|
|
819
|
+
});
|
|
820
|
+
this.logger.error(`Resource deprovisioning failed: ${resource.name}`, {
|
|
821
|
+
error
|
|
822
|
+
});
|
|
823
|
+
throw error;
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
async executeInfrastructureDeployment(infrastructure) {
|
|
827
|
+
switch(infrastructure.deployment.strategy){
|
|
828
|
+
case 'terraform':
|
|
829
|
+
await this.deployWithTerraform(infrastructure);
|
|
830
|
+
break;
|
|
831
|
+
case 'cloudformation':
|
|
832
|
+
await this.deployWithCloudFormation(infrastructure);
|
|
833
|
+
break;
|
|
834
|
+
case 'kubernetes':
|
|
835
|
+
await this.deployWithKubernetes(infrastructure);
|
|
836
|
+
break;
|
|
837
|
+
default:
|
|
838
|
+
await this.deployWithCustomStrategy(infrastructure);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
async deployWithTerraform(infrastructure) {
|
|
842
|
+
// Implement Terraform deployment logic
|
|
843
|
+
this.logger.info(`Deploying infrastructure with Terraform: ${infrastructure.name}`);
|
|
844
|
+
// This would typically:
|
|
845
|
+
// 1. Generate Terraform configuration from template
|
|
846
|
+
// 2. Run terraform init
|
|
847
|
+
// 3. Run terraform plan
|
|
848
|
+
// 4. Run terraform apply
|
|
849
|
+
// Simulate deployment
|
|
850
|
+
await new Promise((resolve)=>setTimeout(resolve, 2000));
|
|
851
|
+
}
|
|
852
|
+
async deployWithCloudFormation(infrastructure) {
|
|
853
|
+
// Implement CloudFormation deployment logic
|
|
854
|
+
this.logger.info(`Deploying infrastructure with CloudFormation: ${infrastructure.name}`);
|
|
855
|
+
// This would typically:
|
|
856
|
+
// 1. Upload template to S3
|
|
857
|
+
// 2. Create or update CloudFormation stack
|
|
858
|
+
// 3. Monitor stack events
|
|
859
|
+
// 4. Wait for completion
|
|
860
|
+
// Simulate deployment
|
|
861
|
+
await new Promise((resolve)=>setTimeout(resolve, 2000));
|
|
862
|
+
}
|
|
863
|
+
async deployWithKubernetes(infrastructure) {
|
|
864
|
+
// Implement Kubernetes deployment logic
|
|
865
|
+
this.logger.info(`Deploying infrastructure with Kubernetes: ${infrastructure.name}`);
|
|
866
|
+
// This would typically:
|
|
867
|
+
// 1. Generate Kubernetes manifests
|
|
868
|
+
// 2. Apply manifests using kubectl or Kubernetes API
|
|
869
|
+
// 3. Monitor deployment status
|
|
870
|
+
// 4. Wait for all resources to be ready
|
|
871
|
+
// Simulate deployment
|
|
872
|
+
await new Promise((resolve)=>setTimeout(resolve, 2000));
|
|
873
|
+
}
|
|
874
|
+
async deployWithCustomStrategy(infrastructure) {
|
|
875
|
+
// Implement custom deployment logic
|
|
876
|
+
this.logger.info(`Deploying infrastructure with custom strategy: ${infrastructure.name}`);
|
|
877
|
+
// This would be defined by the user's custom deployment script
|
|
878
|
+
// Simulate deployment
|
|
879
|
+
await new Promise((resolve)=>setTimeout(resolve, 2000));
|
|
880
|
+
}
|
|
881
|
+
constructor(cloudPath = './cloud', logger, config){
|
|
882
|
+
super(), _define_property(this, "providers", new Map()), _define_property(this, "resources", new Map()), _define_property(this, "infrastructures", new Map()), _define_property(this, "cloudPath", void 0), _define_property(this, "logger", void 0), _define_property(this, "config", void 0);
|
|
883
|
+
this.cloudPath = cloudPath;
|
|
884
|
+
this.logger = logger || new Logger({
|
|
885
|
+
level: 'info',
|
|
886
|
+
format: 'text',
|
|
887
|
+
destination: 'console'
|
|
888
|
+
});
|
|
889
|
+
this.config = config || ConfigManager.getInstance();
|
|
890
|
+
}
|
|
891
|
+
}
|