jiva-core 0.2.2 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +53 -0
- package/.gcloudignore +49 -0
- package/CONTRIBUTING.md +92 -0
- package/Dockerfile +63 -0
- package/LICENSE +21 -0
- package/README.md +248 -102
- package/cloud-run-deploy.yaml +135 -0
- package/cloud-run.yaml +135 -0
- package/cloud-run.yaml.template +143 -0
- package/deploy.sh +107 -0
- package/dist/core/agent-spawner.d.ts +89 -0
- package/dist/core/agent-spawner.d.ts.map +1 -0
- package/dist/core/agent-spawner.js +195 -0
- package/dist/core/agent-spawner.js.map +1 -0
- package/dist/core/client-agent.d.ts +82 -0
- package/dist/core/client-agent.d.ts.map +1 -0
- package/dist/core/client-agent.js +406 -0
- package/dist/core/client-agent.js.map +1 -0
- package/dist/core/config.d.ts +59 -10
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +19 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/conversation-manager.d.ts +10 -18
- package/dist/core/conversation-manager.d.ts.map +1 -1
- package/dist/core/conversation-manager.js +28 -60
- package/dist/core/conversation-manager.js.map +1 -1
- package/dist/core/dual-agent.d.ts +24 -3
- package/dist/core/dual-agent.d.ts.map +1 -1
- package/dist/core/dual-agent.js +112 -19
- package/dist/core/dual-agent.js.map +1 -1
- package/dist/core/manager-agent.d.ts +3 -1
- package/dist/core/manager-agent.d.ts.map +1 -1
- package/dist/core/manager-agent.js +66 -14
- package/dist/core/manager-agent.js.map +1 -1
- package/dist/core/worker-agent.d.ts +15 -1
- package/dist/core/worker-agent.d.ts.map +1 -1
- package/dist/core/worker-agent.js +244 -11
- package/dist/core/worker-agent.js.map +1 -1
- package/dist/core/workspace.d.ts +5 -0
- package/dist/core/workspace.d.ts.map +1 -1
- package/dist/core/workspace.js +47 -7
- package/dist/core/workspace.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/cli/index.js +376 -44
- package/dist/interfaces/cli/index.js.map +1 -1
- package/dist/interfaces/cli/repl.d.ts.map +1 -1
- package/dist/interfaces/cli/repl.js +6 -0
- package/dist/interfaces/cli/repl.js.map +1 -1
- package/dist/interfaces/http/index.d.ts +22 -0
- package/dist/interfaces/http/index.d.ts.map +1 -0
- package/dist/interfaces/http/index.js +135 -0
- package/dist/interfaces/http/index.js.map +1 -0
- package/dist/interfaces/http/middleware/auth.d.ts +32 -0
- package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
- package/dist/interfaces/http/middleware/auth.js +176 -0
- package/dist/interfaces/http/middleware/auth.js.map +1 -0
- package/dist/interfaces/http/routes/chat.d.ts +7 -0
- package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
- package/dist/interfaces/http/routes/chat.js +144 -0
- package/dist/interfaces/http/routes/chat.js.map +1 -0
- package/dist/interfaces/http/routes/health.d.ts +6 -0
- package/dist/interfaces/http/routes/health.d.ts.map +1 -0
- package/dist/interfaces/http/routes/health.js +25 -0
- package/dist/interfaces/http/routes/health.js.map +1 -0
- package/dist/interfaces/http/routes/session.d.ts +7 -0
- package/dist/interfaces/http/routes/session.d.ts.map +1 -0
- package/dist/interfaces/http/routes/session.js +114 -0
- package/dist/interfaces/http/routes/session.js.map +1 -0
- package/dist/interfaces/http/session-manager.d.ts +76 -0
- package/dist/interfaces/http/session-manager.d.ts.map +1 -0
- package/dist/interfaces/http/session-manager.js +339 -0
- package/dist/interfaces/http/session-manager.js.map +1 -0
- package/dist/interfaces/http/websocket-handler.d.ts +18 -0
- package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
- package/dist/interfaces/http/websocket-handler.js +146 -0
- package/dist/interfaces/http/websocket-handler.js.map +1 -0
- package/dist/mcp/client.d.ts +11 -2
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +44 -19
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/server-manager.d.ts +1 -1
- package/dist/mcp/server-manager.d.ts.map +1 -1
- package/dist/mcp/server-manager.js +12 -2
- package/dist/mcp/server-manager.js.map +1 -1
- package/dist/personas/index.d.ts +13 -0
- package/dist/personas/index.d.ts.map +1 -0
- package/dist/personas/index.js +13 -0
- package/dist/personas/index.js.map +1 -0
- package/dist/personas/persona-loader.d.ts +30 -0
- package/dist/personas/persona-loader.d.ts.map +1 -0
- package/dist/personas/persona-loader.js +246 -0
- package/dist/personas/persona-loader.js.map +1 -0
- package/dist/personas/persona-manager.d.ts +82 -0
- package/dist/personas/persona-manager.d.ts.map +1 -0
- package/dist/personas/persona-manager.js +211 -0
- package/dist/personas/persona-manager.js.map +1 -0
- package/dist/personas/skill-loader.d.ts +35 -0
- package/dist/personas/skill-loader.d.ts.map +1 -0
- package/dist/personas/skill-loader.js +144 -0
- package/dist/personas/skill-loader.js.map +1 -0
- package/dist/personas/skill-packager.d.ts +25 -0
- package/dist/personas/skill-packager.d.ts.map +1 -0
- package/dist/personas/skill-packager.js +233 -0
- package/dist/personas/skill-packager.js.map +1 -0
- package/dist/personas/types.d.ts +134 -0
- package/dist/personas/types.d.ts.map +1 -0
- package/dist/personas/types.js +7 -0
- package/dist/personas/types.js.map +1 -0
- package/dist/personas/validator.d.ts +22 -0
- package/dist/personas/validator.d.ts.map +1 -0
- package/dist/personas/validator.js +144 -0
- package/dist/personas/validator.js.map +1 -0
- package/dist/storage/factory.d.ts +51 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +154 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/gcp-bucket-provider.d.ts +59 -0
- package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
- package/dist/storage/gcp-bucket-provider.js +275 -0
- package/dist/storage/gcp-bucket-provider.js.map +1 -0
- package/dist/storage/index.d.ts +33 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +37 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-provider.d.ts +36 -0
- package/dist/storage/local-provider.d.ts.map +1 -0
- package/dist/storage/local-provider.js +219 -0
- package/dist/storage/local-provider.js.map +1 -0
- package/dist/storage/provider.d.ts +137 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +136 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/types.d.ts +78 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +14 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/utils/orchestration-logger.d.ts +36 -0
- package/dist/utils/orchestration-logger.d.ts.map +1 -0
- package/dist/utils/orchestration-logger.js +224 -0
- package/dist/utils/orchestration-logger.js.map +1 -0
- package/jiva-new-demo.gif +0 -0
- package/package.json +30 -2
- package/.fluen/cache/state.json +0 -7
- package/actions/action_registry.py +0 -75
- package/actions/python_coder.py +0 -470
- package/api/main.py +0 -269
- package/downloaded_image.avif +0 -0
- package/downloads/snipping_tool.avif +0 -0
- package/image.avif +0 -0
- package/ms_image.avif +0 -0
- package/screenshot.png +0 -0
- package/snipping_tool.avif +0 -0
- package/tmp_image.avif +0 -0
package/cloud-run.yaml
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Cloud Run service configuration for Jiva
|
|
2
|
+
# Deploy with: gcloud run services replace cloud-run.yaml
|
|
3
|
+
|
|
4
|
+
apiVersion: serving.knative.dev/v1
|
|
5
|
+
kind: Service
|
|
6
|
+
metadata:
|
|
7
|
+
name: jiva
|
|
8
|
+
labels:
|
|
9
|
+
app: jiva
|
|
10
|
+
environment: production
|
|
11
|
+
spec:
|
|
12
|
+
template:
|
|
13
|
+
metadata:
|
|
14
|
+
annotations:
|
|
15
|
+
# Launch stage for beta features
|
|
16
|
+
run.googleapis.com/launch-stage: "BETA"
|
|
17
|
+
|
|
18
|
+
# Scale to zero when idle
|
|
19
|
+
autoscaling.knative.dev/minScale: "0"
|
|
20
|
+
autoscaling.knative.dev/maxScale: "10"
|
|
21
|
+
|
|
22
|
+
# CPU allocation - always allocated since we need WebSocket support
|
|
23
|
+
run.googleapis.com/cpu-throttling: "false"
|
|
24
|
+
|
|
25
|
+
# Startup probe for slow initialization
|
|
26
|
+
run.googleapis.com/startup-cpu-boost: "true"
|
|
27
|
+
|
|
28
|
+
# Container execution environment
|
|
29
|
+
run.googleapis.com/execution-environment: gen2
|
|
30
|
+
|
|
31
|
+
# Session affinity for WebSocket connections
|
|
32
|
+
run.googleapis.com/session-affinity: "true"
|
|
33
|
+
spec:
|
|
34
|
+
# Timeout for long-running WebSocket sessions
|
|
35
|
+
timeoutSeconds: 3600 # 60 minutes
|
|
36
|
+
|
|
37
|
+
# Container concurrency (WebSocket connections per instance)
|
|
38
|
+
containerConcurrency: 80
|
|
39
|
+
|
|
40
|
+
serviceAccountName: jiva-cloud-run@PROJECT_ID.iam.gserviceaccount.com
|
|
41
|
+
|
|
42
|
+
containers:
|
|
43
|
+
- name: jiva
|
|
44
|
+
image: gcr.io/PROJECT_ID/jiva:latest
|
|
45
|
+
|
|
46
|
+
ports:
|
|
47
|
+
- name: http1
|
|
48
|
+
containerPort: 8080
|
|
49
|
+
|
|
50
|
+
env:
|
|
51
|
+
# Node environment
|
|
52
|
+
- name: NODE_ENV
|
|
53
|
+
value: "production"
|
|
54
|
+
|
|
55
|
+
# Server configuration
|
|
56
|
+
- name: LOG_LEVEL
|
|
57
|
+
value: "info"
|
|
58
|
+
|
|
59
|
+
# Storage configuration
|
|
60
|
+
- name: JIVA_STORAGE_PROVIDER
|
|
61
|
+
value: "gcp"
|
|
62
|
+
- name: JIVA_GCP_BUCKET
|
|
63
|
+
value: "jiva-state-BUCKET_NAME"
|
|
64
|
+
- name: JIVA_GCP_PROJECT
|
|
65
|
+
value: "PROJECT_ID"
|
|
66
|
+
|
|
67
|
+
# Session configuration
|
|
68
|
+
- name: MAX_CONCURRENT_SESSIONS
|
|
69
|
+
value: "100"
|
|
70
|
+
- name: SESSION_IDLE_TIMEOUT_MS
|
|
71
|
+
value: "1800000" # 30 minutes
|
|
72
|
+
|
|
73
|
+
# Authentication
|
|
74
|
+
- name: AUTH_STRATEGY
|
|
75
|
+
value: "firebase" # or "custom"
|
|
76
|
+
- name: AUTH_DISABLED
|
|
77
|
+
value: "true" # Set to false for production
|
|
78
|
+
|
|
79
|
+
# Model configuration (from Secret Manager)
|
|
80
|
+
- name: JIVA_MODEL_PROVIDER
|
|
81
|
+
value: "krutrim"
|
|
82
|
+
- name: JIVA_MODEL_API_KEY
|
|
83
|
+
valueFrom:
|
|
84
|
+
secretKeyRef:
|
|
85
|
+
name: jiva-model-api-key
|
|
86
|
+
key: latest
|
|
87
|
+
- name: JIVA_MODEL_BASE_URL
|
|
88
|
+
value: "https://cloud.olakrutrim.com/v1/chat/completions"
|
|
89
|
+
- name: JIVA_MODEL_NAME
|
|
90
|
+
value: "gpt-oss-120b"
|
|
91
|
+
|
|
92
|
+
# MCP Server Configuration
|
|
93
|
+
- name: ENABLE_MCP_SERVERS
|
|
94
|
+
value: "true"
|
|
95
|
+
- name: MCP_FILESYSTEM_ENABLED
|
|
96
|
+
value: "true"
|
|
97
|
+
- name: MCP_FILESYSTEM_ALLOWED_PATHS
|
|
98
|
+
value: "/tmp,/workspace"
|
|
99
|
+
|
|
100
|
+
# CORS allowed origins
|
|
101
|
+
- name: ALLOWED_ORIGINS
|
|
102
|
+
value: "https://yourdomain.com,https://app.yourdomain.com"
|
|
103
|
+
|
|
104
|
+
resources:
|
|
105
|
+
limits:
|
|
106
|
+
# CPU: 2 vCPU for handling concurrent sessions
|
|
107
|
+
cpu: "2000m"
|
|
108
|
+
# Memory: 4GB for model inference and session state
|
|
109
|
+
memory: "4Gi"
|
|
110
|
+
requests:
|
|
111
|
+
cpu: "1000m"
|
|
112
|
+
memory: "2Gi"
|
|
113
|
+
|
|
114
|
+
# Health probes
|
|
115
|
+
startupProbe:
|
|
116
|
+
httpGet:
|
|
117
|
+
path: /startup
|
|
118
|
+
port: 8080
|
|
119
|
+
initialDelaySeconds: 0
|
|
120
|
+
periodSeconds: 10
|
|
121
|
+
timeoutSeconds: 5
|
|
122
|
+
failureThreshold: 3
|
|
123
|
+
|
|
124
|
+
livenessProbe:
|
|
125
|
+
httpGet:
|
|
126
|
+
path: /health
|
|
127
|
+
port: 8080
|
|
128
|
+
initialDelaySeconds: 0
|
|
129
|
+
periodSeconds: 10
|
|
130
|
+
timeoutSeconds: 5
|
|
131
|
+
failureThreshold: 3
|
|
132
|
+
|
|
133
|
+
traffic:
|
|
134
|
+
- percent: 100
|
|
135
|
+
latestRevision: true
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Cloud Run service configuration for Jiva
|
|
2
|
+
# Deploy with: gcloud run services replace cloud-run.yaml
|
|
3
|
+
|
|
4
|
+
apiVersion: serving.knative.dev/v1
|
|
5
|
+
kind: Service
|
|
6
|
+
metadata:
|
|
7
|
+
name: jiva
|
|
8
|
+
labels:
|
|
9
|
+
app: jiva
|
|
10
|
+
environment: production
|
|
11
|
+
spec:
|
|
12
|
+
template:
|
|
13
|
+
metadata:
|
|
14
|
+
annotations:
|
|
15
|
+
# Scale to zero when idle
|
|
16
|
+
autoscaling.knative.dev/minScale: "0"
|
|
17
|
+
autoscaling.knative.dev/maxScale: "10"
|
|
18
|
+
|
|
19
|
+
# CPU allocation - always allocated since we need WebSocket support
|
|
20
|
+
run.googleapis.com/cpu-throttling: "false"
|
|
21
|
+
|
|
22
|
+
# Startup probe for slow initialization
|
|
23
|
+
run.googleapis.com/startup-cpu-boost: "true"
|
|
24
|
+
|
|
25
|
+
# Container execution environment
|
|
26
|
+
run.googleapis.com/execution-environment: gen2
|
|
27
|
+
|
|
28
|
+
# Session affinity for WebSocket connections
|
|
29
|
+
run.googleapis.com/session-affinity: "true"
|
|
30
|
+
spec:
|
|
31
|
+
# Timeout for long-running WebSocket sessions
|
|
32
|
+
timeoutSeconds: 3600 # 60 minutes
|
|
33
|
+
|
|
34
|
+
# Container concurrency (WebSocket connections per instance)
|
|
35
|
+
containerConcurrency: 80
|
|
36
|
+
|
|
37
|
+
serviceAccountName: jiva-cloud-run@PROJECT_ID.iam.gserviceaccount.com
|
|
38
|
+
|
|
39
|
+
containers:
|
|
40
|
+
- name: jiva
|
|
41
|
+
image: gcr.io/PROJECT_ID/jiva:latest
|
|
42
|
+
|
|
43
|
+
ports:
|
|
44
|
+
- name: http1
|
|
45
|
+
containerPort: 8080
|
|
46
|
+
|
|
47
|
+
env:
|
|
48
|
+
# Node environment
|
|
49
|
+
- name: NODE_ENV
|
|
50
|
+
value: "production"
|
|
51
|
+
|
|
52
|
+
# Server configuration
|
|
53
|
+
- name: PORT
|
|
54
|
+
value: "8080"
|
|
55
|
+
- name: LOG_LEVEL
|
|
56
|
+
value: "info"
|
|
57
|
+
|
|
58
|
+
# Storage configuration
|
|
59
|
+
- name: JIVA_STORAGE_PROVIDER
|
|
60
|
+
value: "gcp"
|
|
61
|
+
- name: JIVA_GCP_BUCKET
|
|
62
|
+
value: "jiva-state-BUCKET_NAME"
|
|
63
|
+
- name: JIVA_GCP_PROJECT
|
|
64
|
+
value: "PROJECT_ID"
|
|
65
|
+
|
|
66
|
+
# Session configuration
|
|
67
|
+
- name: MAX_CONCURRENT_SESSIONS
|
|
68
|
+
value: "100"
|
|
69
|
+
- name: SESSION_IDLE_TIMEOUT_MS
|
|
70
|
+
value: "1800000" # 30 minutes
|
|
71
|
+
|
|
72
|
+
# Authentication
|
|
73
|
+
- name: AUTH_STRATEGY
|
|
74
|
+
value: "firebase" # or "custom"
|
|
75
|
+
- name: AUTH_DISABLED
|
|
76
|
+
value: "false"
|
|
77
|
+
|
|
78
|
+
# Model configuration (from Secret Manager)
|
|
79
|
+
- name: JIVA_MODEL_PROVIDER
|
|
80
|
+
value: "krutrim"
|
|
81
|
+
- name: JIVA_MODEL_API_KEY
|
|
82
|
+
valueFrom:
|
|
83
|
+
secretKeyRef:
|
|
84
|
+
name: jiva-model-api-key
|
|
85
|
+
key: latest
|
|
86
|
+
- name: JIVA_MODEL_BASE_URL
|
|
87
|
+
value: "https://cloud.olakrutrim.com/v1/chat/completions"
|
|
88
|
+
- name: JIVA_MODEL_NAME
|
|
89
|
+
value: "gpt-oss-120b"
|
|
90
|
+
|
|
91
|
+
# MCP Server Configuration
|
|
92
|
+
- name: ENABLE_MCP_SERVERS
|
|
93
|
+
value: "true"
|
|
94
|
+
- name: MCP_FILESYSTEM_ENABLED
|
|
95
|
+
value: "true"
|
|
96
|
+
- name: MCP_FILESYSTEM_ALLOWED_PATHS
|
|
97
|
+
value: "/tmp,/workspace"
|
|
98
|
+
|
|
99
|
+
# CORS allowed origins
|
|
100
|
+
- name: ALLOWED_ORIGINS
|
|
101
|
+
value: "https://yourdomain.com,https://app.yourdomain.com"
|
|
102
|
+
|
|
103
|
+
resources:
|
|
104
|
+
limits:
|
|
105
|
+
# CPU: 2 vCPU for handling concurrent sessions
|
|
106
|
+
cpu: "2000m"
|
|
107
|
+
# Memory: 4GB for model inference and session state
|
|
108
|
+
memory: "4Gi"
|
|
109
|
+
requests:
|
|
110
|
+
cpu: "1000m"
|
|
111
|
+
memory: "2Gi"
|
|
112
|
+
|
|
113
|
+
# Health probes
|
|
114
|
+
startupProbe:
|
|
115
|
+
httpGet:
|
|
116
|
+
path: /startup
|
|
117
|
+
port: 8080
|
|
118
|
+
initialDelaySeconds: 0
|
|
119
|
+
periodSeconds: 10
|
|
120
|
+
timeoutSeconds: 5
|
|
121
|
+
failureThreshold: 3
|
|
122
|
+
|
|
123
|
+
livenessProbe:
|
|
124
|
+
httpGet:
|
|
125
|
+
path: /health
|
|
126
|
+
port: 8080
|
|
127
|
+
initialDelaySeconds: 0
|
|
128
|
+
periodSeconds: 10
|
|
129
|
+
timeoutSeconds: 5
|
|
130
|
+
failureThreshold: 3
|
|
131
|
+
|
|
132
|
+
readinessProbe:
|
|
133
|
+
httpGet:
|
|
134
|
+
path: /ready
|
|
135
|
+
port: 8080
|
|
136
|
+
initialDelaySeconds: 0
|
|
137
|
+
periodSeconds: 5
|
|
138
|
+
timeoutSeconds: 3
|
|
139
|
+
failureThreshold: 2
|
|
140
|
+
|
|
141
|
+
traffic:
|
|
142
|
+
- percent: 100
|
|
143
|
+
latestRevision: true
|
package/deploy.sh
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Deploy Jiva to Cloud Run
|
|
3
|
+
# Usage: ./deploy.sh [PROJECT_ID] [REGION]
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
PROJECT_ID="${1:-your-project-id}"
|
|
8
|
+
REGION="${2:-us-central1}"
|
|
9
|
+
SERVICE_NAME="jiva"
|
|
10
|
+
IMAGE_NAME="gcr.io/$PROJECT_ID/jiva"
|
|
11
|
+
BUCKET_NAME="jiva-state-$PROJECT_ID"
|
|
12
|
+
|
|
13
|
+
echo "🚀 Deploying Jiva to Cloud Run"
|
|
14
|
+
echo "Project: $PROJECT_ID"
|
|
15
|
+
echo "Region: $REGION"
|
|
16
|
+
echo "Service: $SERVICE_NAME"
|
|
17
|
+
echo ""
|
|
18
|
+
|
|
19
|
+
# Check if gcloud is installed
|
|
20
|
+
if ! command -v gcloud &> /dev/null; then
|
|
21
|
+
echo "❌ gcloud CLI not found. Please install it first."
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Set project
|
|
26
|
+
echo "📦 Setting GCP project..."
|
|
27
|
+
gcloud config set project $PROJECT_ID
|
|
28
|
+
|
|
29
|
+
# Enable required APIs
|
|
30
|
+
echo "🔧 Enabling required APIs..."
|
|
31
|
+
gcloud services enable \
|
|
32
|
+
cloudbuild.googleapis.com \
|
|
33
|
+
run.googleapis.com \
|
|
34
|
+
storage.googleapis.com \
|
|
35
|
+
secretmanager.googleapis.com \
|
|
36
|
+
--quiet
|
|
37
|
+
|
|
38
|
+
# Create GCS bucket if it doesn't exist
|
|
39
|
+
echo "🪣 Creating GCS bucket (if not exists)..."
|
|
40
|
+
gsutil mb -p $PROJECT_ID -c STANDARD -l $REGION gs://$BUCKET_NAME 2>/dev/null || echo "Bucket already exists"
|
|
41
|
+
|
|
42
|
+
# Create service account if it doesn't exist
|
|
43
|
+
echo "👤 Creating service account (if not exists)..."
|
|
44
|
+
gcloud iam service-accounts create jiva-cloud-run \
|
|
45
|
+
--display-name="Jiva Cloud Run Service Account" \
|
|
46
|
+
--quiet 2>/dev/null || echo "Service account already exists"
|
|
47
|
+
|
|
48
|
+
# Grant permissions
|
|
49
|
+
echo "🔐 Granting permissions..."
|
|
50
|
+
gcloud projects add-iam-policy-binding $PROJECT_ID \
|
|
51
|
+
--member="serviceAccount:jiva-cloud-run@$PROJECT_ID.iam.gserviceaccount.com" \
|
|
52
|
+
--role="roles/storage.objectAdmin" \
|
|
53
|
+
--quiet
|
|
54
|
+
|
|
55
|
+
gcloud projects add-iam-policy-binding $PROJECT_ID \
|
|
56
|
+
--member="serviceAccount:jiva-cloud-run@$PROJECT_ID.iam.gserviceaccount.com" \
|
|
57
|
+
--role="roles/secretmanager.secretAccessor" \
|
|
58
|
+
--quiet
|
|
59
|
+
|
|
60
|
+
# Create secret for model API key if it doesn't exist
|
|
61
|
+
echo "🔑 Checking model API key secret..."
|
|
62
|
+
if ! gcloud secrets describe jiva-model-api-key --quiet 2>/dev/null; then
|
|
63
|
+
echo "Please enter your model API key:"
|
|
64
|
+
read -s API_KEY
|
|
65
|
+
echo -n "$API_KEY" | gcloud secrets create jiva-model-api-key \
|
|
66
|
+
--data-file=- \
|
|
67
|
+
--replication-policy="automatic" \
|
|
68
|
+
--quiet
|
|
69
|
+
echo "✅ Secret created"
|
|
70
|
+
else
|
|
71
|
+
echo "✅ Secret already exists"
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Build container image
|
|
75
|
+
echo "🏗️ Building container image..."
|
|
76
|
+
gcloud builds submit --tag $IMAGE_NAME:latest --quiet
|
|
77
|
+
|
|
78
|
+
# Update cloud-run.yaml with project-specific values
|
|
79
|
+
echo "📝 Updating configuration..."
|
|
80
|
+
sed -i.bak "s/PROJECT_ID/$PROJECT_ID/g" cloud-run.yaml
|
|
81
|
+
sed -i.bak "s/BUCKET_NAME/$PROJECT_ID/g" cloud-run.yaml
|
|
82
|
+
|
|
83
|
+
# Deploy to Cloud Run
|
|
84
|
+
echo "🚢 Deploying to Cloud Run..."
|
|
85
|
+
gcloud run services replace cloud-run.yaml \
|
|
86
|
+
--region=$REGION \
|
|
87
|
+
--quiet
|
|
88
|
+
|
|
89
|
+
# Restore original cloud-run.yaml
|
|
90
|
+
mv cloud-run.yaml.bak cloud-run.yaml
|
|
91
|
+
|
|
92
|
+
# Get service URL
|
|
93
|
+
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region=$REGION --format='value(status.url)')
|
|
94
|
+
|
|
95
|
+
echo ""
|
|
96
|
+
echo "✅ Deployment complete!"
|
|
97
|
+
echo "🌐 Service URL: $SERVICE_URL"
|
|
98
|
+
echo ""
|
|
99
|
+
echo "Test the service:"
|
|
100
|
+
echo " Health: curl $SERVICE_URL/health"
|
|
101
|
+
echo " WebSocket: ws://${SERVICE_URL#https://}/ws?token=YOUR_TOKEN"
|
|
102
|
+
echo ""
|
|
103
|
+
echo "To make the service public (optional):"
|
|
104
|
+
echo " gcloud run services add-iam-policy-binding $SERVICE_NAME \\"
|
|
105
|
+
echo " --region=$REGION \\"
|
|
106
|
+
echo " --member=\"allUsers\" \\"
|
|
107
|
+
echo " --role=\"roles/run.invoker\""
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Spawner - Manages hierarchical sub-agent spawning with personas
|
|
3
|
+
*
|
|
4
|
+
* Enables a parent agent to spawn child agents with specific personas,
|
|
5
|
+
* creating a multi-agent collaboration system for complex tasks.
|
|
6
|
+
*
|
|
7
|
+
* Example: An "engineering-manager" persona can spawn:
|
|
8
|
+
* - "code-reviewer" agent to review code
|
|
9
|
+
* - "developer" agent to implement features
|
|
10
|
+
* - "tester" agent to write tests
|
|
11
|
+
*/
|
|
12
|
+
import { DualAgent } from './dual-agent.js';
|
|
13
|
+
import { ModelOrchestrator } from '../models/orchestrator.js';
|
|
14
|
+
import { MCPServerManager } from '../mcp/server-manager.js';
|
|
15
|
+
import { WorkspaceManager } from './workspace.js';
|
|
16
|
+
import { ConversationManager } from './conversation-manager.js';
|
|
17
|
+
import { PersonaManager } from '../personas/persona-manager.js';
|
|
18
|
+
export interface SpawnedAgent {
|
|
19
|
+
id: string;
|
|
20
|
+
persona: string;
|
|
21
|
+
agent: DualAgent;
|
|
22
|
+
parentId?: string;
|
|
23
|
+
createdAt: Date;
|
|
24
|
+
messageCount: number;
|
|
25
|
+
status: 'active' | 'completed' | 'failed';
|
|
26
|
+
result?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface SpawnAgentRequest {
|
|
29
|
+
persona: string;
|
|
30
|
+
task: string;
|
|
31
|
+
context?: string;
|
|
32
|
+
maxIterations?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface SpawnAgentResponse {
|
|
35
|
+
agentId: string;
|
|
36
|
+
persona: string;
|
|
37
|
+
result: string;
|
|
38
|
+
iterations: number;
|
|
39
|
+
toolsUsed: string[];
|
|
40
|
+
}
|
|
41
|
+
export declare class AgentSpawner {
|
|
42
|
+
private agents;
|
|
43
|
+
private orchestrator;
|
|
44
|
+
private mcpManager;
|
|
45
|
+
private workspace;
|
|
46
|
+
private conversationManager;
|
|
47
|
+
private basePersonaManager;
|
|
48
|
+
private parentAgentId?;
|
|
49
|
+
private maxDepth;
|
|
50
|
+
private currentDepth;
|
|
51
|
+
constructor(orchestrator: ModelOrchestrator, mcpManager: MCPServerManager, workspace: WorkspaceManager, conversationManager: ConversationManager | null, basePersonaManager: PersonaManager, options?: {
|
|
52
|
+
parentAgentId?: string;
|
|
53
|
+
maxDepth?: number;
|
|
54
|
+
currentDepth?: number;
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Check if agent spawning is allowed at current depth
|
|
58
|
+
*/
|
|
59
|
+
canSpawnMore(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Get current depth level
|
|
62
|
+
*/
|
|
63
|
+
getCurrentDepth(): number;
|
|
64
|
+
/**
|
|
65
|
+
* Get maximum depth
|
|
66
|
+
*/
|
|
67
|
+
getMaxDepth(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Spawn a sub-agent with a specific persona
|
|
70
|
+
*/
|
|
71
|
+
spawnAgent(request: SpawnAgentRequest): Promise<SpawnAgentResponse>;
|
|
72
|
+
/**
|
|
73
|
+
* Get information about a spawned agent
|
|
74
|
+
*/
|
|
75
|
+
getAgent(agentId: string): SpawnedAgent | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* List all spawned agents
|
|
78
|
+
*/
|
|
79
|
+
listAgents(): SpawnedAgent[];
|
|
80
|
+
/**
|
|
81
|
+
* Get available personas that can be spawned
|
|
82
|
+
*/
|
|
83
|
+
getAvailablePersonas(): string[];
|
|
84
|
+
/**
|
|
85
|
+
* Cleanup all spawned agents
|
|
86
|
+
*/
|
|
87
|
+
cleanup(): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=agent-spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-spawner.d.ts","sourceRoot":"","sources":["../../src/core/agent-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAmB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,kBAAkB,CAAiB;IAC3C,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAG3B,YAAY,EAAE,iBAAiB,EAC/B,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,gBAAgB,EAC3B,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,EAC/C,kBAAkB,EAAE,cAAc,EAClC,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;IAYH;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8IzE;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAInD;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,oBAAoB,IAAI,MAAM,EAAE;IAIhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Spawner - Manages hierarchical sub-agent spawning with personas
|
|
3
|
+
*
|
|
4
|
+
* Enables a parent agent to spawn child agents with specific personas,
|
|
5
|
+
* creating a multi-agent collaboration system for complex tasks.
|
|
6
|
+
*
|
|
7
|
+
* Example: An "engineering-manager" persona can spawn:
|
|
8
|
+
* - "code-reviewer" agent to review code
|
|
9
|
+
* - "developer" agent to implement features
|
|
10
|
+
* - "tester" agent to write tests
|
|
11
|
+
*/
|
|
12
|
+
import { DualAgent } from './dual-agent.js';
|
|
13
|
+
import { PersonaManager } from '../personas/persona-manager.js';
|
|
14
|
+
import { logger } from '../utils/logger.js';
|
|
15
|
+
export class AgentSpawner {
|
|
16
|
+
agents = new Map();
|
|
17
|
+
orchestrator;
|
|
18
|
+
mcpManager;
|
|
19
|
+
workspace;
|
|
20
|
+
conversationManager;
|
|
21
|
+
basePersonaManager;
|
|
22
|
+
parentAgentId;
|
|
23
|
+
maxDepth;
|
|
24
|
+
currentDepth;
|
|
25
|
+
constructor(orchestrator, mcpManager, workspace, conversationManager, basePersonaManager, options) {
|
|
26
|
+
this.orchestrator = orchestrator;
|
|
27
|
+
this.mcpManager = mcpManager;
|
|
28
|
+
this.workspace = workspace;
|
|
29
|
+
this.conversationManager = conversationManager;
|
|
30
|
+
this.basePersonaManager = basePersonaManager;
|
|
31
|
+
this.parentAgentId = options?.parentAgentId;
|
|
32
|
+
this.maxDepth = options?.maxDepth || 1; // Default: only top-level can spawn
|
|
33
|
+
this.currentDepth = options?.currentDepth || 0;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if agent spawning is allowed at current depth
|
|
37
|
+
*/
|
|
38
|
+
canSpawnMore() {
|
|
39
|
+
return this.currentDepth < this.maxDepth;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get current depth level
|
|
43
|
+
*/
|
|
44
|
+
getCurrentDepth() {
|
|
45
|
+
return this.currentDepth;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get maximum depth
|
|
49
|
+
*/
|
|
50
|
+
getMaxDepth() {
|
|
51
|
+
return this.maxDepth;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Spawn a sub-agent with a specific persona
|
|
55
|
+
*/
|
|
56
|
+
async spawnAgent(request) {
|
|
57
|
+
// Check depth limit
|
|
58
|
+
if (this.currentDepth >= this.maxDepth) {
|
|
59
|
+
throw new Error(`Maximum agent depth (${this.maxDepth}) reached. Cannot spawn more sub-agents.`);
|
|
60
|
+
}
|
|
61
|
+
// Ensure PersonaManager is initialized
|
|
62
|
+
if (this.basePersonaManager.getPersonas().length === 0) {
|
|
63
|
+
logger.info('[AgentSpawner] PersonaManager not initialized, initializing now...');
|
|
64
|
+
await this.basePersonaManager.initialize();
|
|
65
|
+
}
|
|
66
|
+
// Validate persona exists
|
|
67
|
+
const availablePersonas = this.basePersonaManager.getPersonas();
|
|
68
|
+
if (availablePersonas.length === 0) {
|
|
69
|
+
throw new Error(`No personas available. Please install personas in ~/.jiva/personas/ or activate one with 'jiva persona activate <name>'`);
|
|
70
|
+
}
|
|
71
|
+
const personaExists = availablePersonas.some((p) => p.manifest.name === request.persona);
|
|
72
|
+
if (!personaExists) {
|
|
73
|
+
throw new Error(`Persona '${request.persona}' not found. Available personas: ${availablePersonas.map((p) => p.manifest.name).join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
const agentId = `agent-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
76
|
+
logger.info(`[AgentSpawner] Spawning sub-agent with persona: ${request.persona}`);
|
|
77
|
+
logger.info(`[AgentSpawner] Task: ${request.task}`);
|
|
78
|
+
logger.info(`[AgentSpawner] Depth: ${this.currentDepth + 1}/${this.maxDepth}`);
|
|
79
|
+
try {
|
|
80
|
+
// Create a new PersonaManager for the sub-agent
|
|
81
|
+
const subPersonaManager = new PersonaManager();
|
|
82
|
+
await subPersonaManager.initialize();
|
|
83
|
+
// Activate the requested persona
|
|
84
|
+
await subPersonaManager.activatePersona(request.persona);
|
|
85
|
+
logger.success(`[AgentSpawner] Activated persona: ${request.persona}`);
|
|
86
|
+
// Merge persona MCP servers
|
|
87
|
+
const personaMCPServers = subPersonaManager.getPersonaMCPServers();
|
|
88
|
+
if (Object.keys(personaMCPServers).length > 0) {
|
|
89
|
+
logger.info(`[AgentSpawner] Loading ${Object.keys(personaMCPServers).length} MCP servers from persona`);
|
|
90
|
+
for (const [name, config] of Object.entries(personaMCPServers)) {
|
|
91
|
+
try {
|
|
92
|
+
await this.mcpManager.addServer(name, config);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// Server might already exist from parent, that's ok
|
|
96
|
+
logger.debug(`[AgentSpawner] MCP server '${name}' already exists or failed to add`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Create sub-agent with persona and nested spawner
|
|
101
|
+
const subSpawner = new AgentSpawner(this.orchestrator, this.mcpManager, this.workspace, this.conversationManager, this.basePersonaManager, {
|
|
102
|
+
parentAgentId: agentId,
|
|
103
|
+
maxDepth: this.maxDepth,
|
|
104
|
+
currentDepth: this.currentDepth + 1,
|
|
105
|
+
});
|
|
106
|
+
const subAgentConfig = {
|
|
107
|
+
orchestrator: this.orchestrator,
|
|
108
|
+
mcpManager: this.mcpManager,
|
|
109
|
+
workspace: this.workspace,
|
|
110
|
+
conversationManager: this.conversationManager || undefined,
|
|
111
|
+
personaManager: subPersonaManager,
|
|
112
|
+
maxSubtasks: 20,
|
|
113
|
+
maxIterations: request.maxIterations || 10,
|
|
114
|
+
maxAgentDepth: this.maxDepth, // Inherit parent's max depth limit
|
|
115
|
+
autoSave: false, // Sub-agents don't auto-save
|
|
116
|
+
};
|
|
117
|
+
const subAgent = new DualAgent(subAgentConfig);
|
|
118
|
+
// Override with the nested spawner (which has currentDepth + 1)
|
|
119
|
+
subAgent.setAgentSpawner(subSpawner);
|
|
120
|
+
// Track the spawned agent
|
|
121
|
+
const spawnedAgent = {
|
|
122
|
+
id: agentId,
|
|
123
|
+
persona: request.persona,
|
|
124
|
+
agent: subAgent,
|
|
125
|
+
parentId: this.parentAgentId,
|
|
126
|
+
createdAt: new Date(),
|
|
127
|
+
messageCount: 0,
|
|
128
|
+
status: 'active',
|
|
129
|
+
};
|
|
130
|
+
this.agents.set(agentId, spawnedAgent);
|
|
131
|
+
// Prepare task message with context
|
|
132
|
+
let taskMessage = request.task;
|
|
133
|
+
if (request.context) {
|
|
134
|
+
taskMessage = `CONTEXT:\n${request.context}\n\nTASK:\n${request.task}`;
|
|
135
|
+
}
|
|
136
|
+
// Execute the task
|
|
137
|
+
logger.info(`[AgentSpawner] Executing task with sub-agent...`);
|
|
138
|
+
const response = await subAgent.chat(taskMessage);
|
|
139
|
+
// Update agent status
|
|
140
|
+
spawnedAgent.messageCount = 1;
|
|
141
|
+
spawnedAgent.status = 'completed';
|
|
142
|
+
spawnedAgent.result = response.content;
|
|
143
|
+
logger.success(`[AgentSpawner] Sub-agent completed task (${response.iterations} iterations)`);
|
|
144
|
+
return {
|
|
145
|
+
agentId,
|
|
146
|
+
persona: request.persona,
|
|
147
|
+
result: response.content,
|
|
148
|
+
iterations: response.iterations,
|
|
149
|
+
toolsUsed: response.toolsUsed,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
logger.error(`[AgentSpawner] Sub-agent failed:`, error);
|
|
154
|
+
const agent = this.agents.get(agentId);
|
|
155
|
+
if (agent) {
|
|
156
|
+
agent.status = 'failed';
|
|
157
|
+
agent.result = error instanceof Error ? error.message : String(error);
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get information about a spawned agent
|
|
164
|
+
*/
|
|
165
|
+
getAgent(agentId) {
|
|
166
|
+
return this.agents.get(agentId);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* List all spawned agents
|
|
170
|
+
*/
|
|
171
|
+
listAgents() {
|
|
172
|
+
return Array.from(this.agents.values());
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get available personas that can be spawned
|
|
176
|
+
*/
|
|
177
|
+
getAvailablePersonas() {
|
|
178
|
+
return this.basePersonaManager.getPersonas().map((p) => p.manifest.name);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Cleanup all spawned agents
|
|
182
|
+
*/
|
|
183
|
+
async cleanup() {
|
|
184
|
+
for (const [agentId, spawnedAgent] of this.agents.entries()) {
|
|
185
|
+
try {
|
|
186
|
+
await spawnedAgent.agent.cleanup();
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
logger.warn(`[AgentSpawner] Failed to cleanup agent ${agentId}:`, error);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
this.agents.clear();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=agent-spawner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-spawner.js","sourceRoot":"","sources":["../../src/core/agent-spawner.ts"],"names":[],"mappings":"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"}
|