snow-flow 1.1.74 ā 1.1.76
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/.claude-flow/queen/queen-memory.db +0 -0
- package/.claude-flow/queen-test/test-memory.db +0 -0
- package/.claude-flow/queen-test/test-memory.db-agents +0 -0
- package/.claude-flow/queen-test/test-memory.db-import +0 -0
- package/.claude-flow/queen-test/test-memory.db-memory +0 -0
- package/.claude-flow/queen-test/test-memory.db-neural +0 -0
- package/CLAUDE.md +111 -8
- package/README.md +117 -50
- package/deploy.sh +366 -0
- package/dist/cli.js +226 -0
- package/dist/cli.js.map +1 -1
- package/dist/mcp/http-transport-wrapper.d.ts +29 -0
- package/dist/mcp/http-transport-wrapper.d.ts.map +1 -0
- package/dist/mcp/http-transport-wrapper.js +318 -0
- package/dist/mcp/http-transport-wrapper.js.map +1 -0
- package/dist/mcp/service-discovery-client.d.ts +83 -0
- package/dist/mcp/service-discovery-client.d.ts.map +1 -0
- package/dist/mcp/service-discovery-client.js +211 -0
- package/dist/mcp/service-discovery-client.js.map +1 -0
- package/dist/mcp/servicenow-deployment-mcp.js +262 -29
- package/dist/mcp/servicenow-deployment-mcp.js.map +1 -1
- package/dist/mcp/servicenow-intelligent-mcp.js +252 -18
- package/dist/mcp/servicenow-intelligent-mcp.js.map +1 -1
- package/dist/mcp/servicenow-operations-mcp.js +274 -46
- package/dist/mcp/servicenow-operations-mcp.js.map +1 -1
- package/dist/orchestration/discovery/service-discovery.d.ts +81 -0
- package/dist/orchestration/discovery/service-discovery.d.ts.map +1 -0
- package/dist/orchestration/discovery/service-discovery.js +808 -0
- package/dist/orchestration/discovery/service-discovery.js.map +1 -0
- package/dist/orchestration/distributed-orchestrator.d.ts +131 -0
- package/dist/orchestration/distributed-orchestrator.d.ts.map +1 -0
- package/dist/orchestration/distributed-orchestrator.js +712 -0
- package/dist/orchestration/distributed-orchestrator.js.map +1 -0
- package/dist/orchestration/distribution/task-distribution-engine.d.ts +53 -0
- package/dist/orchestration/distribution/task-distribution-engine.d.ts.map +1 -0
- package/dist/orchestration/distribution/task-distribution-engine.js +586 -0
- package/dist/orchestration/distribution/task-distribution-engine.js.map +1 -0
- package/dist/orchestration/interfaces/distributed-orchestration.interface.d.ts +606 -0
- package/dist/orchestration/interfaces/distributed-orchestration.interface.d.ts.map +1 -0
- package/dist/orchestration/interfaces/distributed-orchestration.interface.js +65 -0
- package/dist/orchestration/interfaces/distributed-orchestration.interface.js.map +1 -0
- package/dist/orchestration/protocols/mcpx-protocol.d.ts +71 -0
- package/dist/orchestration/protocols/mcpx-protocol.d.ts.map +1 -0
- package/dist/orchestration/protocols/mcpx-protocol.js +668 -0
- package/dist/orchestration/protocols/mcpx-protocol.js.map +1 -0
- package/dist/orchestration/state/distributed-state-manager.d.ts +89 -0
- package/dist/orchestration/state/distributed-state-manager.d.ts.map +1 -0
- package/dist/orchestration/state/distributed-state-manager.js +716 -0
- package/dist/orchestration/state/distributed-state-manager.js.map +1 -0
- package/dist/queen/advanced-integration-test.d.ts +48 -0
- package/dist/queen/advanced-integration-test.d.ts.map +1 -0
- package/dist/queen/advanced-integration-test.js +474 -0
- package/dist/queen/advanced-integration-test.js.map +1 -0
- package/dist/queen/agent-factory.d.ts +40 -0
- package/dist/queen/agent-factory.d.ts.map +1 -0
- package/dist/queen/agent-factory.js +433 -0
- package/dist/queen/agent-factory.js.map +1 -0
- package/dist/queen/index.d.ts +58 -0
- package/dist/queen/index.d.ts.map +1 -0
- package/dist/queen/index.js +79 -0
- package/dist/queen/index.js.map +1 -0
- package/dist/queen/integration-example.d.ts +82 -0
- package/dist/queen/integration-example.d.ts.map +1 -0
- package/dist/queen/integration-example.js +220 -0
- package/dist/queen/integration-example.js.map +1 -0
- package/dist/queen/integration-test.d.ts +72 -0
- package/dist/queen/integration-test.d.ts.map +1 -0
- package/dist/queen/integration-test.js +564 -0
- package/dist/queen/integration-test.js.map +1 -0
- package/dist/queen/mock-mcp-client.d.ts +66 -0
- package/dist/queen/mock-mcp-client.d.ts.map +1 -0
- package/dist/queen/mock-mcp-client.js +297 -0
- package/dist/queen/mock-mcp-client.js.map +1 -0
- package/dist/queen/neural-learning.d.ts +28 -0
- package/dist/queen/neural-learning.d.ts.map +1 -0
- package/dist/queen/neural-learning.js +244 -0
- package/dist/queen/neural-learning.js.map +1 -0
- package/dist/queen/queen-memory.d.ts +25 -0
- package/dist/queen/queen-memory.d.ts.map +1 -0
- package/dist/queen/queen-memory.js +273 -0
- package/dist/queen/queen-memory.js.map +1 -0
- package/dist/queen/run-integration-tests.d.ts +9 -0
- package/dist/queen/run-integration-tests.d.ts.map +1 -0
- package/dist/queen/run-integration-tests.js +28 -0
- package/dist/queen/run-integration-tests.js.map +1 -0
- package/dist/queen/servicenow-queen.d.ts +56 -0
- package/dist/queen/servicenow-queen.d.ts.map +1 -0
- package/dist/queen/servicenow-queen.js +659 -0
- package/dist/queen/servicenow-queen.js.map +1 -0
- package/dist/queen/types.d.ts +58 -0
- package/dist/queen/types.d.ts.map +1 -0
- package/dist/queen/types.js +7 -0
- package/dist/queen/types.js.map +1 -0
- package/dist/version.d.ts +3 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +27 -2
- package/dist/version.js.map +1 -1
- package/docker/base/Dockerfile.base +45 -0
- package/docker/generate-services.js +244 -0
- package/docker/nginx/Dockerfile +71 -0
- package/docker/nginx/consul-template.hcl +64 -0
- package/docker/nginx/healthcheck.sh +178 -0
- package/docker/nginx/nginx.conf +210 -0
- package/docker/nginx/supervisord.conf +57 -0
- package/docker/nginx/templates/upstreams.conf.tpl +48 -0
- package/docker/services/automation-mcp/Dockerfile +32 -0
- package/docker/services/automation-mcp/config/service.json +28 -0
- package/docker/services/automation-mcp/entrypoint.js +51 -0
- package/docker/services/deployment-mcp/Dockerfile +32 -0
- package/docker/services/deployment-mcp/entrypoint.js +51 -0
- package/docker/services/flow-composer-mcp/Dockerfile +32 -0
- package/docker/services/flow-composer-mcp/config/service.json +28 -0
- package/docker/services/flow-composer-mcp/entrypoint.js +51 -0
- package/docker/services/graph-memory-mcp/Dockerfile +32 -0
- package/docker/services/graph-memory-mcp/config/service.json +28 -0
- package/docker/services/graph-memory-mcp/entrypoint.js +51 -0
- package/docker/services/integration-mcp/Dockerfile +32 -0
- package/docker/services/integration-mcp/config/service.json +28 -0
- package/docker/services/integration-mcp/entrypoint.js +51 -0
- package/docker/services/intelligent-mcp/Dockerfile +32 -0
- package/docker/services/intelligent-mcp/config/service.json +28 -0
- package/docker/services/intelligent-mcp/entrypoint.js +51 -0
- package/docker/services/operations-mcp/Dockerfile +32 -0
- package/docker/services/operations-mcp/config/service.json +28 -0
- package/docker/services/operations-mcp/entrypoint.js +51 -0
- package/docker/services/platform-development-mcp/Dockerfile +32 -0
- package/docker/services/platform-development-mcp/config/service.json +28 -0
- package/docker/services/platform-development-mcp/entrypoint.js +51 -0
- package/docker/services/reporting-analytics-mcp/Dockerfile +32 -0
- package/docker/services/reporting-analytics-mcp/config/service.json +28 -0
- package/docker/services/reporting-analytics-mcp/entrypoint.js +51 -0
- package/docker/services/security-compliance-mcp/Dockerfile +32 -0
- package/docker/services/security-compliance-mcp/config/service.json +28 -0
- package/docker/services/security-compliance-mcp/entrypoint.js +51 -0
- package/docker/services/update-set-mcp/Dockerfile +32 -0
- package/docker/services/update-set-mcp/config/service.json +28 -0
- package/docker/services/update-set-mcp/entrypoint.js +51 -0
- package/docker-compose.override.yml +132 -0
- package/docker-compose.prod.yml +340 -0
- package/docker-compose.yml +579 -0
- package/k8s/automation-mcp.yaml +232 -0
- package/k8s/configmap.yaml +237 -0
- package/k8s/deployment-mcp.yaml +232 -0
- package/k8s/flow-composer-mcp.yaml +232 -0
- package/k8s/generate-k8s-manifests.js +453 -0
- package/k8s/graph-memory-mcp.yaml +232 -0
- package/k8s/infrastructure.yaml +456 -0
- package/k8s/ingress.yaml +361 -0
- package/k8s/integration-mcp.yaml +232 -0
- package/k8s/intelligent-mcp.yaml +232 -0
- package/k8s/kustomization.yaml +111 -0
- package/k8s/mcp-services.yaml +2552 -0
- package/k8s/monitoring.yaml +515 -0
- package/k8s/namespace.yaml +80 -0
- package/k8s/operations-mcp.yaml +232 -0
- package/k8s/platform-development-mcp.yaml +232 -0
- package/k8s/rbac.yaml +140 -0
- package/k8s/reporting-analytics-mcp.yaml +232 -0
- package/k8s/security-compliance-mcp.yaml +232 -0
- package/k8s/update-set-mcp.yaml +232 -0
- package/package.json +2 -2
package/deploy.sh
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Deployment script for ServiceNow MCP containerized services
|
|
3
|
+
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
# Colors for output
|
|
7
|
+
RED='\033[0;31m'
|
|
8
|
+
GREEN='\033[0;32m'
|
|
9
|
+
YELLOW='\033[1;33m'
|
|
10
|
+
BLUE='\033[0;34m'
|
|
11
|
+
NC='\033[0m' # No Color
|
|
12
|
+
|
|
13
|
+
# Configuration
|
|
14
|
+
DOCKER_REGISTRY=${DOCKER_REGISTRY:-"servicenow-mcp"}
|
|
15
|
+
TAG=${TAG:-"latest"}
|
|
16
|
+
ENVIRONMENT=${ENVIRONMENT:-"development"}
|
|
17
|
+
NAMESPACE=${NAMESPACE:-"servicenow-mcp"}
|
|
18
|
+
|
|
19
|
+
# Function to print colored output
|
|
20
|
+
print_status() {
|
|
21
|
+
echo -e "${BLUE}[INFO]${NC} $1"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
print_success() {
|
|
25
|
+
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
print_warning() {
|
|
29
|
+
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
print_error() {
|
|
33
|
+
echo -e "${RED}[ERROR]${NC} $1"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Function to check prerequisites
|
|
37
|
+
check_prerequisites() {
|
|
38
|
+
print_status "Checking prerequisites..."
|
|
39
|
+
|
|
40
|
+
# Check if Docker is installed and running
|
|
41
|
+
if ! command -v docker &> /dev/null; then
|
|
42
|
+
print_error "Docker is not installed or not in PATH"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
if ! docker info &> /dev/null; then
|
|
47
|
+
print_error "Docker daemon is not running"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# Check if Docker Compose is available
|
|
52
|
+
if ! command -v docker-compose &> /dev/null; then
|
|
53
|
+
print_error "Docker Compose is not installed or not in PATH"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# Check for Kubernetes tools if deploying to K8s
|
|
58
|
+
if [[ "$ENVIRONMENT" == "production" ]]; then
|
|
59
|
+
if ! command -v kubectl &> /dev/null; then
|
|
60
|
+
print_error "kubectl is not installed or not in PATH"
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
if ! kubectl cluster-info &> /dev/null; then
|
|
65
|
+
print_error "Unable to connect to Kubernetes cluster"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
print_success "Prerequisites check passed"
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Function to build Docker images
|
|
74
|
+
build_images() {
|
|
75
|
+
print_status "Building Docker images..."
|
|
76
|
+
|
|
77
|
+
# Build base image first
|
|
78
|
+
print_status "Building base image..."
|
|
79
|
+
docker build -f docker/base/Dockerfile.base -t ${DOCKER_REGISTRY}/base:${TAG} .
|
|
80
|
+
|
|
81
|
+
# Build all MCP service images
|
|
82
|
+
services=(
|
|
83
|
+
"deployment-mcp"
|
|
84
|
+
"flow-composer-mcp"
|
|
85
|
+
"intelligent-mcp"
|
|
86
|
+
"update-set-mcp"
|
|
87
|
+
"graph-memory-mcp"
|
|
88
|
+
"operations-mcp"
|
|
89
|
+
"platform-development-mcp"
|
|
90
|
+
"integration-mcp"
|
|
91
|
+
"automation-mcp"
|
|
92
|
+
"security-compliance-mcp"
|
|
93
|
+
"reporting-analytics-mcp"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
for service in "${services[@]}"; do
|
|
97
|
+
print_status "Building ${service} image..."
|
|
98
|
+
docker build \
|
|
99
|
+
--build-arg BASE_IMAGE=${DOCKER_REGISTRY}/base:${TAG} \
|
|
100
|
+
-f docker/services/${service}/Dockerfile \
|
|
101
|
+
-t ${DOCKER_REGISTRY}/${service}:${TAG} \
|
|
102
|
+
.
|
|
103
|
+
done
|
|
104
|
+
|
|
105
|
+
# Build nginx load balancer
|
|
106
|
+
print_status "Building nginx load balancer image..."
|
|
107
|
+
docker build \
|
|
108
|
+
-f docker/nginx/Dockerfile \
|
|
109
|
+
-t ${DOCKER_REGISTRY}/nginx-lb:${TAG} \
|
|
110
|
+
docker/nginx/
|
|
111
|
+
|
|
112
|
+
print_success "All images built successfully"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# Function to deploy using Docker Compose
|
|
116
|
+
deploy_compose() {
|
|
117
|
+
local compose_file="docker-compose.yml"
|
|
118
|
+
local override_file=""
|
|
119
|
+
|
|
120
|
+
case "$ENVIRONMENT" in
|
|
121
|
+
"development")
|
|
122
|
+
override_file="docker-compose.override.yml"
|
|
123
|
+
;;
|
|
124
|
+
"staging")
|
|
125
|
+
override_file="docker-compose.staging.yml"
|
|
126
|
+
;;
|
|
127
|
+
"production")
|
|
128
|
+
override_file="docker-compose.prod.yml"
|
|
129
|
+
;;
|
|
130
|
+
esac
|
|
131
|
+
|
|
132
|
+
print_status "Deploying with Docker Compose (Environment: $ENVIRONMENT)..."
|
|
133
|
+
|
|
134
|
+
# Create .env file if it doesn't exist
|
|
135
|
+
if [[ ! -f .env ]]; then
|
|
136
|
+
print_warning ".env file not found. Creating template..."
|
|
137
|
+
cat > .env << EOF
|
|
138
|
+
# ServiceNow Configuration
|
|
139
|
+
SERVICENOW_INSTANCE_URL=https://your-instance.service-now.com
|
|
140
|
+
SERVICENOW_CLIENT_ID=your-client-id
|
|
141
|
+
SERVICENOW_CLIENT_SECRET=your-client-secret
|
|
142
|
+
|
|
143
|
+
# Neo4j Configuration
|
|
144
|
+
NEO4J_PASSWORD=your-neo4j-password
|
|
145
|
+
|
|
146
|
+
# Monitoring Configuration
|
|
147
|
+
GRAFANA_ADMIN_PASSWORD=your-grafana-password
|
|
148
|
+
EOF
|
|
149
|
+
print_warning "Please update the .env file with your actual values before running again"
|
|
150
|
+
exit 1
|
|
151
|
+
fi
|
|
152
|
+
|
|
153
|
+
# Deploy services
|
|
154
|
+
if [[ -n "$override_file" && -f "$override_file" ]]; then
|
|
155
|
+
docker-compose -f "$compose_file" -f "$override_file" up -d
|
|
156
|
+
else
|
|
157
|
+
docker-compose -f "$compose_file" up -d
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
print_success "Docker Compose deployment completed"
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# Function to deploy to Kubernetes
|
|
164
|
+
deploy_kubernetes() {
|
|
165
|
+
print_status "Deploying to Kubernetes (Environment: $ENVIRONMENT)..."
|
|
166
|
+
|
|
167
|
+
# Create namespace if it doesn't exist
|
|
168
|
+
kubectl create namespace "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f -
|
|
169
|
+
|
|
170
|
+
# Apply configurations in order
|
|
171
|
+
print_status "Applying namespace and RBAC configurations..."
|
|
172
|
+
kubectl apply -f k8s/namespace.yaml
|
|
173
|
+
kubectl apply -f k8s/rbac.yaml
|
|
174
|
+
|
|
175
|
+
print_status "Applying configuration maps and secrets..."
|
|
176
|
+
kubectl apply -f k8s/configmap.yaml
|
|
177
|
+
|
|
178
|
+
print_status "Deploying infrastructure services..."
|
|
179
|
+
kubectl apply -f k8s/infrastructure.yaml
|
|
180
|
+
|
|
181
|
+
print_status "Waiting for infrastructure services to be ready..."
|
|
182
|
+
kubectl -n "$NAMESPACE" wait --for=condition=available --timeout=300s deployment/consul
|
|
183
|
+
kubectl -n "$NAMESPACE" wait --for=condition=available --timeout=300s deployment/redis
|
|
184
|
+
kubectl -n "$NAMESPACE" wait --for=condition=available --timeout=300s deployment/neo4j
|
|
185
|
+
|
|
186
|
+
print_status "Deploying MCP services..."
|
|
187
|
+
kubectl apply -f k8s/mcp-services.yaml
|
|
188
|
+
|
|
189
|
+
print_status "Waiting for MCP services to be ready..."
|
|
190
|
+
kubectl -n "$NAMESPACE" wait --for=condition=available --timeout=300s deployment --all
|
|
191
|
+
|
|
192
|
+
print_status "Deploying monitoring stack..."
|
|
193
|
+
kubectl apply -f k8s/monitoring.yaml
|
|
194
|
+
|
|
195
|
+
print_status "Configuring ingress..."
|
|
196
|
+
kubectl apply -f k8s/ingress.yaml
|
|
197
|
+
|
|
198
|
+
print_success "Kubernetes deployment completed"
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
# Function to verify deployment
|
|
202
|
+
verify_deployment() {
|
|
203
|
+
print_status "Verifying deployment..."
|
|
204
|
+
|
|
205
|
+
if [[ "$ENVIRONMENT" == "production" ]]; then
|
|
206
|
+
# Verify Kubernetes deployment
|
|
207
|
+
print_status "Checking Kubernetes pod status..."
|
|
208
|
+
kubectl -n "$NAMESPACE" get pods
|
|
209
|
+
|
|
210
|
+
print_status "Checking service endpoints..."
|
|
211
|
+
kubectl -n "$NAMESPACE" get services
|
|
212
|
+
|
|
213
|
+
# Test service connectivity
|
|
214
|
+
print_status "Testing service connectivity..."
|
|
215
|
+
services=("deployment-mcp" "flow-composer-mcp" "intelligent-mcp" "operations-mcp")
|
|
216
|
+
|
|
217
|
+
for service in "${services[@]}"; do
|
|
218
|
+
if kubectl -n "$NAMESPACE" get service "$service" &> /dev/null; then
|
|
219
|
+
print_status "ā Service $service is accessible"
|
|
220
|
+
else
|
|
221
|
+
print_warning "ā Service $service is not accessible"
|
|
222
|
+
fi
|
|
223
|
+
done
|
|
224
|
+
|
|
225
|
+
else
|
|
226
|
+
# Verify Docker Compose deployment
|
|
227
|
+
print_status "Checking Docker Compose services..."
|
|
228
|
+
docker-compose ps
|
|
229
|
+
|
|
230
|
+
# Test basic connectivity
|
|
231
|
+
print_status "Testing service connectivity..."
|
|
232
|
+
|
|
233
|
+
if curl -f -s http://localhost/health &> /dev/null; then
|
|
234
|
+
print_success "ā Load balancer health check passed"
|
|
235
|
+
else
|
|
236
|
+
print_warning "ā Load balancer health check failed"
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
if curl -f -s http://localhost:8500/v1/status/leader &> /dev/null; then
|
|
240
|
+
print_success "ā Consul is accessible"
|
|
241
|
+
else
|
|
242
|
+
print_warning "ā Consul is not accessible"
|
|
243
|
+
fi
|
|
244
|
+
fi
|
|
245
|
+
|
|
246
|
+
print_success "Deployment verification completed"
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# Function to show deployment info
|
|
250
|
+
show_info() {
|
|
251
|
+
print_status "Deployment Information"
|
|
252
|
+
echo "========================"
|
|
253
|
+
echo "Environment: $ENVIRONMENT"
|
|
254
|
+
echo "Docker Registry: $DOCKER_REGISTRY"
|
|
255
|
+
echo "Tag: $TAG"
|
|
256
|
+
|
|
257
|
+
if [[ "$ENVIRONMENT" == "production" ]]; then
|
|
258
|
+
echo "Namespace: $NAMESPACE"
|
|
259
|
+
echo ""
|
|
260
|
+
echo "Access URLs:"
|
|
261
|
+
echo " - Main API: https://mcp.servicenow.local"
|
|
262
|
+
echo " - Monitoring: https://monitoring.servicenow.local"
|
|
263
|
+
echo " - Direct Access: https://direct.mcp.servicenow.local"
|
|
264
|
+
else
|
|
265
|
+
echo ""
|
|
266
|
+
echo "Access URLs:"
|
|
267
|
+
echo " - Load Balancer: http://localhost"
|
|
268
|
+
echo " - Consul UI: http://localhost:8500"
|
|
269
|
+
echo " - Grafana: http://localhost:3000 (admin/admin)"
|
|
270
|
+
echo " - Prometheus: http://localhost:9090"
|
|
271
|
+
echo ""
|
|
272
|
+
echo "Individual Services:"
|
|
273
|
+
for i in {1..11}; do
|
|
274
|
+
port=$((3000 + i))
|
|
275
|
+
echo " - Service on port $port: http://localhost:$port"
|
|
276
|
+
done
|
|
277
|
+
fi
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
# Function to stop deployment
|
|
281
|
+
stop_deployment() {
|
|
282
|
+
print_status "Stopping deployment..."
|
|
283
|
+
|
|
284
|
+
if [[ "$ENVIRONMENT" == "production" ]]; then
|
|
285
|
+
# Stop Kubernetes deployment
|
|
286
|
+
kubectl delete namespace "$NAMESPACE" --ignore-not-found=true
|
|
287
|
+
print_success "Kubernetes deployment stopped"
|
|
288
|
+
else
|
|
289
|
+
# Stop Docker Compose deployment
|
|
290
|
+
docker-compose down -v
|
|
291
|
+
print_success "Docker Compose deployment stopped"
|
|
292
|
+
fi
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
# Function to show logs
|
|
296
|
+
show_logs() {
|
|
297
|
+
if [[ "$ENVIRONMENT" == "production" ]]; then
|
|
298
|
+
# Show Kubernetes logs
|
|
299
|
+
print_status "Showing recent logs from all pods..."
|
|
300
|
+
kubectl -n "$NAMESPACE" logs --tail=50 -l app.kubernetes.io/part-of=servicenow-mcp
|
|
301
|
+
else
|
|
302
|
+
# Show Docker Compose logs
|
|
303
|
+
docker-compose logs --tail=50 -f
|
|
304
|
+
fi
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
# Main execution
|
|
308
|
+
case "${1:-}" in
|
|
309
|
+
"build")
|
|
310
|
+
check_prerequisites
|
|
311
|
+
build_images
|
|
312
|
+
;;
|
|
313
|
+
"deploy")
|
|
314
|
+
check_prerequisites
|
|
315
|
+
build_images
|
|
316
|
+
if [[ "$ENVIRONMENT" == "production" ]]; then
|
|
317
|
+
deploy_kubernetes
|
|
318
|
+
else
|
|
319
|
+
deploy_compose
|
|
320
|
+
fi
|
|
321
|
+
verify_deployment
|
|
322
|
+
show_info
|
|
323
|
+
;;
|
|
324
|
+
"verify")
|
|
325
|
+
verify_deployment
|
|
326
|
+
;;
|
|
327
|
+
"info")
|
|
328
|
+
show_info
|
|
329
|
+
;;
|
|
330
|
+
"stop")
|
|
331
|
+
stop_deployment
|
|
332
|
+
;;
|
|
333
|
+
"logs")
|
|
334
|
+
show_logs
|
|
335
|
+
;;
|
|
336
|
+
"clean")
|
|
337
|
+
stop_deployment
|
|
338
|
+
print_status "Cleaning up Docker images..."
|
|
339
|
+
docker system prune -f
|
|
340
|
+
print_success "Cleanup completed"
|
|
341
|
+
;;
|
|
342
|
+
*)
|
|
343
|
+
echo "Usage: $0 {build|deploy|verify|info|stop|logs|clean}"
|
|
344
|
+
echo ""
|
|
345
|
+
echo "Commands:"
|
|
346
|
+
echo " build - Build all Docker images"
|
|
347
|
+
echo " deploy - Deploy the complete stack"
|
|
348
|
+
echo " verify - Verify deployment health"
|
|
349
|
+
echo " info - Show deployment information"
|
|
350
|
+
echo " stop - Stop the deployment"
|
|
351
|
+
echo " logs - Show service logs"
|
|
352
|
+
echo " clean - Stop deployment and clean up"
|
|
353
|
+
echo ""
|
|
354
|
+
echo "Environment Variables:"
|
|
355
|
+
echo " ENVIRONMENT - deployment environment (development|staging|production)"
|
|
356
|
+
echo " DOCKER_REGISTRY - Docker registry prefix"
|
|
357
|
+
echo " TAG - Docker image tag"
|
|
358
|
+
echo " NAMESPACE - Kubernetes namespace (production only)"
|
|
359
|
+
echo ""
|
|
360
|
+
echo "Examples:"
|
|
361
|
+
echo " ./deploy.sh build"
|
|
362
|
+
echo " ENVIRONMENT=staging ./deploy.sh deploy"
|
|
363
|
+
echo " ENVIRONMENT=production NAMESPACE=prod-mcp ./deploy.sh deploy"
|
|
364
|
+
exit 1
|
|
365
|
+
;;
|
|
366
|
+
esac
|
package/dist/cli.js
CHANGED
|
@@ -3141,6 +3141,232 @@ program
|
|
|
3141
3141
|
console.error('ā Failed to load SPARC help:', error instanceof Error ? error.message : String(error));
|
|
3142
3142
|
}
|
|
3143
3143
|
});
|
|
3144
|
+
// ===================================================
|
|
3145
|
+
// š QUEEN AGENT COMMANDS - Elegant Orchestration
|
|
3146
|
+
// ===================================================
|
|
3147
|
+
/**
|
|
3148
|
+
* Main Queen command - replaces complex swarm orchestration
|
|
3149
|
+
* Simple, elegant, and intelligent ServiceNow objective execution
|
|
3150
|
+
*/
|
|
3151
|
+
program
|
|
3152
|
+
.command('queen <objective>')
|
|
3153
|
+
.description('š Execute ServiceNow objective with Queen Agent hive-mind intelligence')
|
|
3154
|
+
.option('--learn', 'Enable enhanced learning from execution (default: true)', true)
|
|
3155
|
+
.option('--no-learn', 'Disable learning')
|
|
3156
|
+
.option('--debug', 'Enable debug mode for detailed insights')
|
|
3157
|
+
.option('--dry-run', 'Preview execution plan without deployment')
|
|
3158
|
+
.option('--memory-driven', 'Use memory for optimal workflow patterns')
|
|
3159
|
+
.option('--monitor', 'Show real-time hive-mind monitoring')
|
|
3160
|
+
.option('--type <type>', 'Hint at task type (widget, flow, app, integration)')
|
|
3161
|
+
.action(async (objective, options) => {
|
|
3162
|
+
console.log(`\nš ServiceNow Queen Agent v${version_js_1.VERSION} - Hive-Mind Intelligence`);
|
|
3163
|
+
console.log('š Elegant orchestration replacing complex team coordination\n');
|
|
3164
|
+
try {
|
|
3165
|
+
const { QueenIntegration } = await Promise.resolve().then(() => __importStar(require('./queen/integration-example.js')));
|
|
3166
|
+
const queenIntegration = new QueenIntegration({
|
|
3167
|
+
debugMode: options.debug || false
|
|
3168
|
+
});
|
|
3169
|
+
if (options.dryRun) {
|
|
3170
|
+
console.log('š DRY RUN MODE - Analyzing objective...');
|
|
3171
|
+
// TODO: Add dry run analysis
|
|
3172
|
+
console.log(`š Objective: ${objective}`);
|
|
3173
|
+
console.log('šÆ Queen would analyze, spawn agents, coordinate, and deploy');
|
|
3174
|
+
return;
|
|
3175
|
+
}
|
|
3176
|
+
console.log(`šÆ Queen analyzing objective: ${objective}`);
|
|
3177
|
+
const result = await queenIntegration.executeSwarmObjective(objective, {
|
|
3178
|
+
learn: options.learn,
|
|
3179
|
+
memoryDriven: options.memoryDriven,
|
|
3180
|
+
monitor: options.monitor
|
|
3181
|
+
});
|
|
3182
|
+
if (result.success) {
|
|
3183
|
+
console.log('\nā
Queen Agent completed objective successfully!');
|
|
3184
|
+
console.log(`š Hive-Mind coordination: ${result.queen_managed ? 'ACTIVE' : 'INACTIVE'}`);
|
|
3185
|
+
if (result.hive_mind_status) {
|
|
3186
|
+
console.log(`š„ Active Agents: ${result.hive_mind_status.activeAgents}`);
|
|
3187
|
+
console.log(`š Active Tasks: ${result.hive_mind_status.activeTasks}`);
|
|
3188
|
+
console.log(`š§ Learned Patterns: ${result.hive_mind_status.memoryStats.patterns}`);
|
|
3189
|
+
}
|
|
3190
|
+
if (options.monitor) {
|
|
3191
|
+
console.log('\nš HIVE-MIND MONITORING:');
|
|
3192
|
+
queenIntegration.logHiveMindStatus();
|
|
3193
|
+
}
|
|
3194
|
+
}
|
|
3195
|
+
else {
|
|
3196
|
+
console.error('\nā Queen Agent execution failed!');
|
|
3197
|
+
if (result.fallback_required) {
|
|
3198
|
+
console.log('š Consider using traditional swarm command as fallback:');
|
|
3199
|
+
console.log(` snow-flow swarm "${objective}"`);
|
|
3200
|
+
}
|
|
3201
|
+
process.exit(1);
|
|
3202
|
+
}
|
|
3203
|
+
await queenIntegration.shutdown();
|
|
3204
|
+
}
|
|
3205
|
+
catch (error) {
|
|
3206
|
+
console.error('\nš„ Queen Agent error:', error.message);
|
|
3207
|
+
console.log('\nš Fallback to traditional swarm:');
|
|
3208
|
+
console.log(` snow-flow swarm "${objective}"`);
|
|
3209
|
+
process.exit(1);
|
|
3210
|
+
}
|
|
3211
|
+
});
|
|
3212
|
+
/**
|
|
3213
|
+
* Queen Memory Management
|
|
3214
|
+
*/
|
|
3215
|
+
const queenMemory = program.command('queen-memory');
|
|
3216
|
+
queenMemory.description('š§ Manage Queen Agent hive-mind memory');
|
|
3217
|
+
queenMemory
|
|
3218
|
+
.command('export [file]')
|
|
3219
|
+
.description('Export Queen memory to file')
|
|
3220
|
+
.action(async (file = 'queen-memory.json') => {
|
|
3221
|
+
console.log(`\nš§ Exporting Queen hive-mind memory to ${file}...`);
|
|
3222
|
+
try {
|
|
3223
|
+
const { createServiceNowQueen } = await Promise.resolve().then(() => __importStar(require('./queen/index.js')));
|
|
3224
|
+
const queen = createServiceNowQueen({ debugMode: true });
|
|
3225
|
+
const memoryData = queen.exportMemory();
|
|
3226
|
+
const { promises: fs } = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
3227
|
+
await fs.writeFile(file, memoryData, 'utf-8');
|
|
3228
|
+
console.log(`ā
Memory exported successfully to ${file}`);
|
|
3229
|
+
console.log(`š Memory contains learned patterns and successful deployments`);
|
|
3230
|
+
await queen.shutdown();
|
|
3231
|
+
}
|
|
3232
|
+
catch (error) {
|
|
3233
|
+
console.error('ā Memory export failed:', error.message);
|
|
3234
|
+
process.exit(1);
|
|
3235
|
+
}
|
|
3236
|
+
});
|
|
3237
|
+
queenMemory
|
|
3238
|
+
.command('import <file>')
|
|
3239
|
+
.description('Import Queen memory from file')
|
|
3240
|
+
.action(async (file) => {
|
|
3241
|
+
console.log(`\nš§ Importing Queen hive-mind memory from ${file}...`);
|
|
3242
|
+
try {
|
|
3243
|
+
const { promises: fs } = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
3244
|
+
const memoryData = await fs.readFile(file, 'utf-8');
|
|
3245
|
+
const { createServiceNowQueen } = await Promise.resolve().then(() => __importStar(require('./queen/index.js')));
|
|
3246
|
+
const queen = createServiceNowQueen({ debugMode: true });
|
|
3247
|
+
queen.importMemory(memoryData);
|
|
3248
|
+
console.log(`ā
Memory imported successfully from ${file}`);
|
|
3249
|
+
console.log(`š§ Queen now has access to previous learning patterns`);
|
|
3250
|
+
await queen.shutdown();
|
|
3251
|
+
}
|
|
3252
|
+
catch (error) {
|
|
3253
|
+
console.error('ā Memory import failed:', error.message);
|
|
3254
|
+
process.exit(1);
|
|
3255
|
+
}
|
|
3256
|
+
});
|
|
3257
|
+
queenMemory
|
|
3258
|
+
.command('clear')
|
|
3259
|
+
.description('Clear Queen memory (reset learning)')
|
|
3260
|
+
.option('--confirm', 'Confirm memory clearing')
|
|
3261
|
+
.action(async (options) => {
|
|
3262
|
+
if (!options.confirm) {
|
|
3263
|
+
console.log('\nā ļø This will clear all Queen hive-mind learning!');
|
|
3264
|
+
console.log('Use --confirm to proceed: snow-flow queen-memory clear --confirm');
|
|
3265
|
+
return;
|
|
3266
|
+
}
|
|
3267
|
+
console.log('\nš§ Clearing Queen hive-mind memory...');
|
|
3268
|
+
try {
|
|
3269
|
+
const { createServiceNowQueen } = await Promise.resolve().then(() => __importStar(require('./queen/index.js')));
|
|
3270
|
+
const queen = createServiceNowQueen({ debugMode: true });
|
|
3271
|
+
queen.clearMemory();
|
|
3272
|
+
console.log('ā
Queen memory cleared successfully');
|
|
3273
|
+
console.log('š Queen will start fresh learning from next execution');
|
|
3274
|
+
await queen.shutdown();
|
|
3275
|
+
}
|
|
3276
|
+
catch (error) {
|
|
3277
|
+
console.error('ā Memory clear failed:', error.message);
|
|
3278
|
+
process.exit(1);
|
|
3279
|
+
}
|
|
3280
|
+
});
|
|
3281
|
+
/**
|
|
3282
|
+
* Queen Status and Insights
|
|
3283
|
+
*/
|
|
3284
|
+
program
|
|
3285
|
+
.command('queen-status')
|
|
3286
|
+
.description('š Show Queen Agent hive-mind status and insights')
|
|
3287
|
+
.option('--detailed', 'Show detailed memory and learning statistics')
|
|
3288
|
+
.action(async (options) => {
|
|
3289
|
+
console.log(`\nš ServiceNow Queen Agent Status v${version_js_1.VERSION}`);
|
|
3290
|
+
try {
|
|
3291
|
+
const { createServiceNowQueen } = await Promise.resolve().then(() => __importStar(require('./queen/index.js')));
|
|
3292
|
+
const queen = createServiceNowQueen({ debugMode: true });
|
|
3293
|
+
const status = queen.getHiveMindStatus();
|
|
3294
|
+
console.log('\nš HIVE-MIND STATUS š');
|
|
3295
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāā');
|
|
3296
|
+
console.log(`š Active Tasks: ${status.activeTasks}`);
|
|
3297
|
+
console.log(`š„ Active Agents: ${status.activeAgents}`);
|
|
3298
|
+
console.log(`š§ Learned Patterns: ${status.memoryStats.patterns}`);
|
|
3299
|
+
console.log(`š Stored Artifacts: ${status.memoryStats.artifacts}`);
|
|
3300
|
+
console.log(`š” Learning Insights: ${status.memoryStats.learnings}`);
|
|
3301
|
+
if (status.factoryStats.agentTypeCounts) {
|
|
3302
|
+
console.log('\nš„ AGENT BREAKDOWN:');
|
|
3303
|
+
Object.entries(status.factoryStats.agentTypeCounts).forEach(([type, count]) => {
|
|
3304
|
+
console.log(` ${type}: ${count}`);
|
|
3305
|
+
});
|
|
3306
|
+
}
|
|
3307
|
+
if (options.detailed) {
|
|
3308
|
+
console.log('\nš DETAILED MEMORY ANALYSIS:');
|
|
3309
|
+
console.log(` Memory Size: ${status.memoryStats.totalSize || 'Unknown'}`);
|
|
3310
|
+
console.log(` Success Rate: ${status.memoryStats.successRate || 'Unknown'}%`);
|
|
3311
|
+
console.log(` Most Effective Pattern: ${status.memoryStats.bestPattern || 'Learning...'}`);
|
|
3312
|
+
}
|
|
3313
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
3314
|
+
await queen.shutdown();
|
|
3315
|
+
}
|
|
3316
|
+
catch (error) {
|
|
3317
|
+
console.error('ā Status check failed:', error.message);
|
|
3318
|
+
process.exit(1);
|
|
3319
|
+
}
|
|
3320
|
+
});
|
|
3321
|
+
program
|
|
3322
|
+
.command('queen-insights')
|
|
3323
|
+
.description('š” Show Queen Agent learning insights and recommendations')
|
|
3324
|
+
.action(async () => {
|
|
3325
|
+
console.log(`\nš” Queen Agent Learning Insights v${version_js_1.VERSION}`);
|
|
3326
|
+
try {
|
|
3327
|
+
const { createServiceNowQueen } = await Promise.resolve().then(() => __importStar(require('./queen/index.js')));
|
|
3328
|
+
const queen = createServiceNowQueen({ debugMode: true });
|
|
3329
|
+
const insights = queen.getLearningInsights();
|
|
3330
|
+
console.log('\nš§ LEARNING INSIGHTS š§ ');
|
|
3331
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāā');
|
|
3332
|
+
if (insights.successfulPatterns && insights.successfulPatterns.length > 0) {
|
|
3333
|
+
console.log('\nā
SUCCESSFUL PATTERNS:');
|
|
3334
|
+
insights.successfulPatterns.forEach((pattern, idx) => {
|
|
3335
|
+
console.log(` ${idx + 1}. ${pattern.description} (${pattern.successRate}% success)`);
|
|
3336
|
+
});
|
|
3337
|
+
}
|
|
3338
|
+
else {
|
|
3339
|
+
console.log('\nš No patterns learned yet - execute objectives to build intelligence');
|
|
3340
|
+
}
|
|
3341
|
+
if (insights.recommendations && insights.recommendations.length > 0) {
|
|
3342
|
+
console.log('\nš” RECOMMENDATIONS:');
|
|
3343
|
+
insights.recommendations.forEach((rec, idx) => {
|
|
3344
|
+
console.log(` ${idx + 1}. ${rec}`);
|
|
3345
|
+
});
|
|
3346
|
+
}
|
|
3347
|
+
if (insights.commonTasks && insights.commonTasks.length > 0) {
|
|
3348
|
+
console.log('\nšÆ COMMON TASK TYPES:');
|
|
3349
|
+
insights.commonTasks.forEach((task, idx) => {
|
|
3350
|
+
console.log(` ${idx + 1}. ${task.type}: ${task.count} executions`);
|
|
3351
|
+
});
|
|
3352
|
+
}
|
|
3353
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
3354
|
+
await queen.shutdown();
|
|
3355
|
+
}
|
|
3356
|
+
catch (error) {
|
|
3357
|
+
console.error('ā Insights failed:', error.message);
|
|
3358
|
+
process.exit(1);
|
|
3359
|
+
}
|
|
3360
|
+
});
|
|
3361
|
+
// ===================================================
|
|
3362
|
+
// š BACKWARD COMPATIBILITY ENHANCEMENTS
|
|
3363
|
+
// ===================================================
|
|
3364
|
+
/**
|
|
3365
|
+
* Enhance existing swarm command with optional Queen intelligence
|
|
3366
|
+
*
|
|
3367
|
+
* Note: Users can use: snow-flow swarm "objective" --queen
|
|
3368
|
+
* This will be implemented in a future version once the Queen system is stable.
|
|
3369
|
+
*/
|
|
3144
3370
|
program.parse(process.argv);
|
|
3145
3371
|
// Show help if no command provided
|
|
3146
3372
|
if (!process.argv.slice(2).length) {
|