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.
Files changed (156) hide show
  1. package/.dockerignore +53 -0
  2. package/.gcloudignore +49 -0
  3. package/CONTRIBUTING.md +92 -0
  4. package/Dockerfile +63 -0
  5. package/LICENSE +21 -0
  6. package/README.md +248 -102
  7. package/cloud-run-deploy.yaml +135 -0
  8. package/cloud-run.yaml +135 -0
  9. package/cloud-run.yaml.template +143 -0
  10. package/deploy.sh +107 -0
  11. package/dist/core/agent-spawner.d.ts +89 -0
  12. package/dist/core/agent-spawner.d.ts.map +1 -0
  13. package/dist/core/agent-spawner.js +195 -0
  14. package/dist/core/agent-spawner.js.map +1 -0
  15. package/dist/core/client-agent.d.ts +82 -0
  16. package/dist/core/client-agent.d.ts.map +1 -0
  17. package/dist/core/client-agent.js +406 -0
  18. package/dist/core/client-agent.js.map +1 -0
  19. package/dist/core/config.d.ts +59 -10
  20. package/dist/core/config.d.ts.map +1 -1
  21. package/dist/core/config.js +19 -2
  22. package/dist/core/config.js.map +1 -1
  23. package/dist/core/conversation-manager.d.ts +10 -18
  24. package/dist/core/conversation-manager.d.ts.map +1 -1
  25. package/dist/core/conversation-manager.js +28 -60
  26. package/dist/core/conversation-manager.js.map +1 -1
  27. package/dist/core/dual-agent.d.ts +24 -3
  28. package/dist/core/dual-agent.d.ts.map +1 -1
  29. package/dist/core/dual-agent.js +112 -19
  30. package/dist/core/dual-agent.js.map +1 -1
  31. package/dist/core/manager-agent.d.ts +3 -1
  32. package/dist/core/manager-agent.d.ts.map +1 -1
  33. package/dist/core/manager-agent.js +66 -14
  34. package/dist/core/manager-agent.js.map +1 -1
  35. package/dist/core/worker-agent.d.ts +15 -1
  36. package/dist/core/worker-agent.d.ts.map +1 -1
  37. package/dist/core/worker-agent.js +244 -11
  38. package/dist/core/worker-agent.js.map +1 -1
  39. package/dist/core/workspace.d.ts +5 -0
  40. package/dist/core/workspace.d.ts.map +1 -1
  41. package/dist/core/workspace.js +47 -7
  42. package/dist/core/workspace.js.map +1 -1
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/interfaces/cli/index.js +376 -44
  48. package/dist/interfaces/cli/index.js.map +1 -1
  49. package/dist/interfaces/cli/repl.d.ts.map +1 -1
  50. package/dist/interfaces/cli/repl.js +6 -0
  51. package/dist/interfaces/cli/repl.js.map +1 -1
  52. package/dist/interfaces/http/index.d.ts +22 -0
  53. package/dist/interfaces/http/index.d.ts.map +1 -0
  54. package/dist/interfaces/http/index.js +135 -0
  55. package/dist/interfaces/http/index.js.map +1 -0
  56. package/dist/interfaces/http/middleware/auth.d.ts +32 -0
  57. package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
  58. package/dist/interfaces/http/middleware/auth.js +176 -0
  59. package/dist/interfaces/http/middleware/auth.js.map +1 -0
  60. package/dist/interfaces/http/routes/chat.d.ts +7 -0
  61. package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
  62. package/dist/interfaces/http/routes/chat.js +144 -0
  63. package/dist/interfaces/http/routes/chat.js.map +1 -0
  64. package/dist/interfaces/http/routes/health.d.ts +6 -0
  65. package/dist/interfaces/http/routes/health.d.ts.map +1 -0
  66. package/dist/interfaces/http/routes/health.js +25 -0
  67. package/dist/interfaces/http/routes/health.js.map +1 -0
  68. package/dist/interfaces/http/routes/session.d.ts +7 -0
  69. package/dist/interfaces/http/routes/session.d.ts.map +1 -0
  70. package/dist/interfaces/http/routes/session.js +114 -0
  71. package/dist/interfaces/http/routes/session.js.map +1 -0
  72. package/dist/interfaces/http/session-manager.d.ts +76 -0
  73. package/dist/interfaces/http/session-manager.d.ts.map +1 -0
  74. package/dist/interfaces/http/session-manager.js +339 -0
  75. package/dist/interfaces/http/session-manager.js.map +1 -0
  76. package/dist/interfaces/http/websocket-handler.d.ts +18 -0
  77. package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
  78. package/dist/interfaces/http/websocket-handler.js +146 -0
  79. package/dist/interfaces/http/websocket-handler.js.map +1 -0
  80. package/dist/mcp/client.d.ts +11 -2
  81. package/dist/mcp/client.d.ts.map +1 -1
  82. package/dist/mcp/client.js +44 -19
  83. package/dist/mcp/client.js.map +1 -1
  84. package/dist/mcp/server-manager.d.ts +1 -1
  85. package/dist/mcp/server-manager.d.ts.map +1 -1
  86. package/dist/mcp/server-manager.js +12 -2
  87. package/dist/mcp/server-manager.js.map +1 -1
  88. package/dist/personas/index.d.ts +13 -0
  89. package/dist/personas/index.d.ts.map +1 -0
  90. package/dist/personas/index.js +13 -0
  91. package/dist/personas/index.js.map +1 -0
  92. package/dist/personas/persona-loader.d.ts +30 -0
  93. package/dist/personas/persona-loader.d.ts.map +1 -0
  94. package/dist/personas/persona-loader.js +246 -0
  95. package/dist/personas/persona-loader.js.map +1 -0
  96. package/dist/personas/persona-manager.d.ts +82 -0
  97. package/dist/personas/persona-manager.d.ts.map +1 -0
  98. package/dist/personas/persona-manager.js +211 -0
  99. package/dist/personas/persona-manager.js.map +1 -0
  100. package/dist/personas/skill-loader.d.ts +35 -0
  101. package/dist/personas/skill-loader.d.ts.map +1 -0
  102. package/dist/personas/skill-loader.js +144 -0
  103. package/dist/personas/skill-loader.js.map +1 -0
  104. package/dist/personas/skill-packager.d.ts +25 -0
  105. package/dist/personas/skill-packager.d.ts.map +1 -0
  106. package/dist/personas/skill-packager.js +233 -0
  107. package/dist/personas/skill-packager.js.map +1 -0
  108. package/dist/personas/types.d.ts +134 -0
  109. package/dist/personas/types.d.ts.map +1 -0
  110. package/dist/personas/types.js +7 -0
  111. package/dist/personas/types.js.map +1 -0
  112. package/dist/personas/validator.d.ts +22 -0
  113. package/dist/personas/validator.d.ts.map +1 -0
  114. package/dist/personas/validator.js +144 -0
  115. package/dist/personas/validator.js.map +1 -0
  116. package/dist/storage/factory.d.ts +51 -0
  117. package/dist/storage/factory.d.ts.map +1 -0
  118. package/dist/storage/factory.js +154 -0
  119. package/dist/storage/factory.js.map +1 -0
  120. package/dist/storage/gcp-bucket-provider.d.ts +59 -0
  121. package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
  122. package/dist/storage/gcp-bucket-provider.js +275 -0
  123. package/dist/storage/gcp-bucket-provider.js.map +1 -0
  124. package/dist/storage/index.d.ts +33 -0
  125. package/dist/storage/index.d.ts.map +1 -0
  126. package/dist/storage/index.js +37 -0
  127. package/dist/storage/index.js.map +1 -0
  128. package/dist/storage/local-provider.d.ts +36 -0
  129. package/dist/storage/local-provider.d.ts.map +1 -0
  130. package/dist/storage/local-provider.js +219 -0
  131. package/dist/storage/local-provider.js.map +1 -0
  132. package/dist/storage/provider.d.ts +137 -0
  133. package/dist/storage/provider.d.ts.map +1 -0
  134. package/dist/storage/provider.js +136 -0
  135. package/dist/storage/provider.js.map +1 -0
  136. package/dist/storage/types.d.ts +78 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +14 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/utils/orchestration-logger.d.ts +36 -0
  141. package/dist/utils/orchestration-logger.d.ts.map +1 -0
  142. package/dist/utils/orchestration-logger.js +224 -0
  143. package/dist/utils/orchestration-logger.js.map +1 -0
  144. package/jiva-new-demo.gif +0 -0
  145. package/package.json +30 -2
  146. package/.fluen/cache/state.json +0 -7
  147. package/actions/action_registry.py +0 -75
  148. package/actions/python_coder.py +0 -470
  149. package/api/main.py +0 -269
  150. package/downloaded_image.avif +0 -0
  151. package/downloads/snipping_tool.avif +0 -0
  152. package/image.avif +0 -0
  153. package/ms_image.avif +0 -0
  154. package/screenshot.png +0 -0
  155. package/snipping_tool.avif +0 -0
  156. 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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"}