jiva-core 0.1.0

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 (94) hide show
  1. package/.env.example +18 -0
  2. package/.fluen/cache/state.json +7 -0
  3. package/README.md +350 -0
  4. package/actions/action_registry.py +75 -0
  5. package/actions/python_coder.py +470 -0
  6. package/api/main.py +269 -0
  7. package/dist/core/agent.d.ts +69 -0
  8. package/dist/core/agent.d.ts.map +1 -0
  9. package/dist/core/agent.js +214 -0
  10. package/dist/core/agent.js.map +1 -0
  11. package/dist/core/config.d.ts +222 -0
  12. package/dist/core/config.d.ts.map +1 -0
  13. package/dist/core/config.js +138 -0
  14. package/dist/core/config.js.map +1 -0
  15. package/dist/core/workspace.d.ts +53 -0
  16. package/dist/core/workspace.d.ts.map +1 -0
  17. package/dist/core/workspace.js +164 -0
  18. package/dist/core/workspace.js.map +1 -0
  19. package/dist/index.d.ts +17 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +17 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/interfaces/cli/index.d.ts +6 -0
  24. package/dist/interfaces/cli/index.d.ts.map +1 -0
  25. package/dist/interfaces/cli/index.js +257 -0
  26. package/dist/interfaces/cli/index.js.map +1 -0
  27. package/dist/interfaces/cli/repl.d.ts +9 -0
  28. package/dist/interfaces/cli/repl.d.ts.map +1 -0
  29. package/dist/interfaces/cli/repl.js +139 -0
  30. package/dist/interfaces/cli/repl.js.map +1 -0
  31. package/dist/interfaces/cli/setup-wizard.d.ts +9 -0
  32. package/dist/interfaces/cli/setup-wizard.d.ts.map +1 -0
  33. package/dist/interfaces/cli/setup-wizard.js +321 -0
  34. package/dist/interfaces/cli/setup-wizard.js.map +1 -0
  35. package/dist/mcp/client.d.ts +58 -0
  36. package/dist/mcp/client.d.ts.map +1 -0
  37. package/dist/mcp/client.js +178 -0
  38. package/dist/mcp/client.js.map +1 -0
  39. package/dist/mcp/server-manager.d.ts +58 -0
  40. package/dist/mcp/server-manager.d.ts.map +1 -0
  41. package/dist/mcp/server-manager.js +135 -0
  42. package/dist/mcp/server-manager.js.map +1 -0
  43. package/dist/models/base.d.ts +57 -0
  44. package/dist/models/base.d.ts.map +1 -0
  45. package/dist/models/base.js +5 -0
  46. package/dist/models/base.js.map +1 -0
  47. package/dist/models/harmony.d.ts +78 -0
  48. package/dist/models/harmony.d.ts.map +1 -0
  49. package/dist/models/harmony.js +226 -0
  50. package/dist/models/harmony.js.map +1 -0
  51. package/dist/models/krutrim.d.ts +30 -0
  52. package/dist/models/krutrim.d.ts.map +1 -0
  53. package/dist/models/krutrim.js +185 -0
  54. package/dist/models/krutrim.js.map +1 -0
  55. package/dist/models/orchestrator.d.ts +49 -0
  56. package/dist/models/orchestrator.d.ts.map +1 -0
  57. package/dist/models/orchestrator.js +140 -0
  58. package/dist/models/orchestrator.js.map +1 -0
  59. package/dist/utils/errors.d.ts +23 -0
  60. package/dist/utils/errors.d.ts.map +1 -0
  61. package/dist/utils/errors.js +45 -0
  62. package/dist/utils/errors.js.map +1 -0
  63. package/dist/utils/logger.d.ts +24 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +74 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/docs/BUILD.md +317 -0
  68. package/docs/DEV_WORKFLOW.md +197 -0
  69. package/docs/FILESYSTEM_ACCESS.md +244 -0
  70. package/docs/IMPLEMENTATION_SUMMARY.md +459 -0
  71. package/docs/QUICKSTART.md +162 -0
  72. package/docs/TROUBLESHOOTING.md +393 -0
  73. package/examples/code-review-directive.md +26 -0
  74. package/examples/data-analysis-directive.md +26 -0
  75. package/examples/programmatic-usage.ts +120 -0
  76. package/jiva-directive.md +24 -0
  77. package/package.json +46 -0
  78. package/setup.sh +65 -0
  79. package/src/core/agent.ts +275 -0
  80. package/src/core/config.ts +177 -0
  81. package/src/core/workspace.ts +205 -0
  82. package/src/index.ts +21 -0
  83. package/src/interfaces/cli/index.ts +290 -0
  84. package/src/interfaces/cli/repl.ts +182 -0
  85. package/src/interfaces/cli/setup-wizard.ts +355 -0
  86. package/src/mcp/client.ts +231 -0
  87. package/src/mcp/server-manager.ts +168 -0
  88. package/src/models/base.ts +63 -0
  89. package/src/models/harmony.ts +301 -0
  90. package/src/models/krutrim.ts +236 -0
  91. package/src/models/orchestrator.ts +180 -0
  92. package/src/utils/errors.ts +41 -0
  93. package/src/utils/logger.ts +87 -0
  94. package/tsconfig.json +22 -0
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Krutrim API Client
3
+ *
4
+ * Handles communication with Krutrim Cloud API for both gpt-oss-120b and Llama-4-Maverick-17B models.
5
+ * Implements Harmony format for gpt-oss-120b and standard format for multimodal model.
6
+ */
7
+ import { formatMessagesForHarmony, parseHarmonyResponse } from './harmony.js';
8
+ import { ModelError } from '../utils/errors.js';
9
+ import { logger } from '../utils/logger.js';
10
+ export class KrutrimModel {
11
+ config;
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ supportsVision() {
16
+ return this.config.type === 'multimodal';
17
+ }
18
+ supportsToolCalling() {
19
+ // Only reasoning model (gpt-oss-120b) supports tool calling
20
+ return this.config.type === 'reasoning';
21
+ }
22
+ async chat(options) {
23
+ const isReasoningModel = this.config.type === 'reasoning';
24
+ // Retry logic for WAF/rate limiting issues
25
+ const maxRetries = 2;
26
+ let lastError = null;
27
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
28
+ if (attempt > 0) {
29
+ const waitTime = Math.pow(2, attempt) * 1000; // Exponential backoff
30
+ logger.warn(`Retrying after ${waitTime}ms (attempt ${attempt + 1}/${maxRetries + 1})...`);
31
+ await new Promise(resolve => setTimeout(resolve, waitTime));
32
+ }
33
+ try {
34
+ return await this.attemptChat(options, isReasoningModel);
35
+ }
36
+ catch (error) {
37
+ lastError = error;
38
+ // Only retry on 403 (WAF) or 429 (rate limit) errors
39
+ if (error instanceof ModelError) {
40
+ const is403or429 = error.message.includes('(403)') || error.message.includes('(429)');
41
+ if (!is403or429 || attempt === maxRetries) {
42
+ throw error;
43
+ }
44
+ logger.warn(`Got ${error.message.includes('(403)') ? '403 Access Denied' : '429 Rate Limited'}, will retry...`);
45
+ }
46
+ else {
47
+ throw error;
48
+ }
49
+ }
50
+ }
51
+ throw lastError;
52
+ }
53
+ async attemptChat(options, isReasoningModel) {
54
+ try {
55
+ let messages;
56
+ let tools;
57
+ if (isReasoningModel && options.tools && options.tools.length > 0) {
58
+ // Convert to Harmony format for gpt-oss-120b
59
+ tools = options.tools.map(t => ({
60
+ name: t.name,
61
+ description: t.description,
62
+ parameters: t.parameters,
63
+ }));
64
+ messages = formatMessagesForHarmony(options.messages, tools);
65
+ }
66
+ else {
67
+ messages = options.messages;
68
+ }
69
+ // Krutrim API only supports standard OpenAI roles: system, user, assistant, tool
70
+ // Convert 'developer' role to 'system' for API compatibility
71
+ const apiMessages = messages.map((msg) => {
72
+ if (msg.role === 'developer') {
73
+ return { ...msg, role: 'system' };
74
+ }
75
+ return msg;
76
+ });
77
+ const requestBody = {
78
+ model: options.model || this.config.model,
79
+ messages: apiMessages,
80
+ temperature: options.temperature ?? 0.7,
81
+ };
82
+ if (options.maxTokens) {
83
+ requestBody.max_tokens = options.maxTokens;
84
+ }
85
+ // Note: We don't send tools in OpenAI format to Krutrim
86
+ // Tools are embedded in the developer message via Harmony format
87
+ logger.debug('Krutrim API Request:', JSON.stringify(requestBody, null, 2));
88
+ const response = await fetch(this.config.endpoint, {
89
+ method: 'POST',
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ 'Authorization': `Bearer ${this.config.apiKey}`,
93
+ 'User-Agent': 'Jiva/0.1.0',
94
+ 'Accept': 'application/json',
95
+ },
96
+ body: JSON.stringify(requestBody),
97
+ });
98
+ if (!response.ok) {
99
+ const errorText = await response.text();
100
+ logger.error(`API Error Response (${response.status}):`, errorText);
101
+ logger.debug('Request that failed:', JSON.stringify(requestBody, null, 2));
102
+ throw new ModelError(`Krutrim API error (${response.status}): ${errorText}`, this.config.model);
103
+ }
104
+ const data = await response.json();
105
+ logger.debug('Krutrim API Response:', JSON.stringify(data, null, 2));
106
+ if (!data.choices || data.choices.length === 0) {
107
+ throw new ModelError('No choices in response', this.config.model);
108
+ }
109
+ const choice = data.choices[0];
110
+ const messageContent = choice.message?.content || '';
111
+ // Parse response based on model type
112
+ if (isReasoningModel && options.tools && options.tools.length > 0) {
113
+ // Parse Harmony format response
114
+ const parsed = parseHarmonyResponse(messageContent);
115
+ return {
116
+ content: parsed.final || parsed.commentary || messageContent,
117
+ toolCalls: parsed.toolCalls.length > 0 ? parsed.toolCalls : undefined,
118
+ usage: data.usage ? {
119
+ promptTokens: data.usage.prompt_tokens || 0,
120
+ completionTokens: data.usage.completion_tokens || 0,
121
+ totalTokens: data.usage.total_tokens || 0,
122
+ } : undefined,
123
+ raw: {
124
+ ...data,
125
+ parsedHarmony: parsed,
126
+ },
127
+ };
128
+ }
129
+ else {
130
+ // Standard response
131
+ return {
132
+ content: messageContent,
133
+ usage: data.usage ? {
134
+ promptTokens: data.usage.prompt_tokens || 0,
135
+ completionTokens: data.usage.completion_tokens || 0,
136
+ totalTokens: data.usage.total_tokens || 0,
137
+ } : undefined,
138
+ raw: data,
139
+ };
140
+ }
141
+ }
142
+ catch (error) {
143
+ if (error instanceof ModelError) {
144
+ throw error;
145
+ }
146
+ throw new ModelError(`Failed to communicate with Krutrim API: ${error instanceof Error ? error.message : String(error)}`, this.config.model);
147
+ }
148
+ }
149
+ /**
150
+ * Helper method for vision tasks using multimodal model
151
+ */
152
+ async describeImage(imageUrl, prompt) {
153
+ if (!this.supportsVision()) {
154
+ throw new ModelError('This model does not support vision tasks', this.config.model);
155
+ }
156
+ const response = await this.chat({
157
+ model: this.config.model,
158
+ messages: [
159
+ {
160
+ role: 'user',
161
+ content: [
162
+ {
163
+ type: 'text',
164
+ text: prompt || 'Describe this image in detail.',
165
+ },
166
+ {
167
+ type: 'image_url',
168
+ image_url: {
169
+ url: imageUrl,
170
+ },
171
+ },
172
+ ],
173
+ },
174
+ ],
175
+ });
176
+ return response.content;
177
+ }
178
+ }
179
+ /**
180
+ * Factory function to create Krutrim model instances
181
+ */
182
+ export function createKrutrimModel(config) {
183
+ return new KrutrimModel(config);
184
+ }
185
+ //# sourceMappingURL=krutrim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krutrim.js","sourceRoot":"","sources":["../../src/models/krutrim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Multi-Model Orchestrator
3
+ *
4
+ * Coordinates between reasoning model (gpt-oss-120b) and multimodal model (Llama-4-Maverick)
5
+ */
6
+ import { KrutrimModel } from './krutrim.js';
7
+ import { ChatCompletionOptions, ModelResponse } from './base.js';
8
+ export interface OrchestratorConfig {
9
+ reasoningModel: KrutrimModel;
10
+ multimodalModel?: KrutrimModel;
11
+ }
12
+ export declare class ModelOrchestrator {
13
+ private reasoningModel;
14
+ private multimodalModel?;
15
+ constructor(config: OrchestratorConfig);
16
+ /**
17
+ * Process a chat completion with automatic model selection
18
+ */
19
+ chat(options: ChatCompletionOptions): Promise<ModelResponse>;
20
+ /**
21
+ * Handle requests with image content
22
+ */
23
+ private handleMultimodalRequest;
24
+ /**
25
+ * Check if messages contain image content
26
+ */
27
+ private hasImageContent;
28
+ /**
29
+ * Extract messages that contain images
30
+ */
31
+ private extractImageMessages;
32
+ /**
33
+ * Replace image content with text descriptions
34
+ */
35
+ private replaceImagesWithDescriptions;
36
+ /**
37
+ * Get reasoning model instance
38
+ */
39
+ getReasoningModel(): KrutrimModel;
40
+ /**
41
+ * Get multimodal model instance if configured
42
+ */
43
+ getMultimodalModel(): KrutrimModel | undefined;
44
+ /**
45
+ * Check if multimodal support is available
46
+ */
47
+ hasMultimodalSupport(): boolean;
48
+ }
49
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/models/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAA2B,qBAAqB,EAAE,aAAa,EAAQ,MAAM,WAAW,CAAC;AAIhG,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,YAAY,CAAC;IAC7B,eAAe,CAAC,EAAE,YAAY,CAAC;CAChC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,eAAe,CAAC,CAAe;gBAE3B,MAAM,EAAE,kBAAkB;IAKtC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAalE;;OAEG;YACW,uBAAuB;IAiDrC;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAiCrC;;OAEG;IACH,iBAAiB,IAAI,YAAY;IAIjC;;OAEG;IACH,kBAAkB,IAAI,YAAY,GAAG,SAAS;IAI9C;;OAEG;IACH,oBAAoB,IAAI,OAAO;CAGhC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Multi-Model Orchestrator
3
+ *
4
+ * Coordinates between reasoning model (gpt-oss-120b) and multimodal model (Llama-4-Maverick)
5
+ */
6
+ import { logger } from '../utils/logger.js';
7
+ import { ModelError } from '../utils/errors.js';
8
+ export class ModelOrchestrator {
9
+ reasoningModel;
10
+ multimodalModel;
11
+ constructor(config) {
12
+ this.reasoningModel = config.reasoningModel;
13
+ this.multimodalModel = config.multimodalModel;
14
+ }
15
+ /**
16
+ * Process a chat completion with automatic model selection
17
+ */
18
+ async chat(options) {
19
+ // Check if request contains images
20
+ const hasImages = this.hasImageContent(options.messages);
21
+ if (hasImages && this.multimodalModel) {
22
+ // Use multimodal model to process images first, then reasoning model
23
+ return await this.handleMultimodalRequest(options);
24
+ }
25
+ else {
26
+ // Use reasoning model directly
27
+ return await this.reasoningModel.chat(options);
28
+ }
29
+ }
30
+ /**
31
+ * Handle requests with image content
32
+ */
33
+ async handleMultimodalRequest(options) {
34
+ if (!this.multimodalModel) {
35
+ throw new ModelError('Multimodal model not configured, but request contains images');
36
+ }
37
+ logger.info('Processing multimodal request...');
38
+ // Extract messages with images
39
+ const imageMessages = this.extractImageMessages(options.messages);
40
+ // Process each image with multimodal model
41
+ const imageDescriptions = new Map();
42
+ for (const [index, msg] of imageMessages) {
43
+ logger.debug(`Processing image in message ${index}`);
44
+ try {
45
+ const response = await this.multimodalModel.chat({
46
+ model: options.model || 'Llama-4-Maverick-17B-128E-Instruct',
47
+ messages: [msg],
48
+ temperature: options.temperature,
49
+ });
50
+ imageDescriptions.set(index, response.content);
51
+ logger.debug(`Image description: ${response.content.substring(0, 100)}...`);
52
+ }
53
+ catch (error) {
54
+ logger.error(`Failed to process image in message ${index}`, error);
55
+ throw error;
56
+ }
57
+ }
58
+ // Replace images with descriptions for reasoning model
59
+ const messagesWithDescriptions = this.replaceImagesWithDescriptions(options.messages, imageDescriptions);
60
+ // Now use reasoning model with text-only messages
61
+ logger.info('Forwarding to reasoning model...');
62
+ return await this.reasoningModel.chat({
63
+ ...options,
64
+ messages: messagesWithDescriptions,
65
+ });
66
+ }
67
+ /**
68
+ * Check if messages contain image content
69
+ */
70
+ hasImageContent(messages) {
71
+ return messages.some(msg => {
72
+ if (Array.isArray(msg.content)) {
73
+ return msg.content.some(c => c.type === 'image_url');
74
+ }
75
+ return false;
76
+ });
77
+ }
78
+ /**
79
+ * Extract messages that contain images
80
+ */
81
+ extractImageMessages(messages) {
82
+ const imageMessages = [];
83
+ messages.forEach((msg, index) => {
84
+ if (Array.isArray(msg.content)) {
85
+ const hasImage = msg.content.some(c => c.type === 'image_url');
86
+ if (hasImage) {
87
+ imageMessages.push([index, msg]);
88
+ }
89
+ }
90
+ });
91
+ return imageMessages;
92
+ }
93
+ /**
94
+ * Replace image content with text descriptions
95
+ */
96
+ replaceImagesWithDescriptions(messages, descriptions) {
97
+ return messages.map((msg, index) => {
98
+ if (!descriptions.has(index)) {
99
+ return msg;
100
+ }
101
+ const description = descriptions.get(index);
102
+ if (Array.isArray(msg.content)) {
103
+ // Replace image_url content with text description
104
+ const newContent = msg.content.map(c => {
105
+ if (c.type === 'image_url') {
106
+ return {
107
+ type: 'text',
108
+ text: `[Image description: ${description}]`,
109
+ };
110
+ }
111
+ return c;
112
+ });
113
+ return {
114
+ ...msg,
115
+ content: newContent,
116
+ };
117
+ }
118
+ return msg;
119
+ });
120
+ }
121
+ /**
122
+ * Get reasoning model instance
123
+ */
124
+ getReasoningModel() {
125
+ return this.reasoningModel;
126
+ }
127
+ /**
128
+ * Get multimodal model instance if configured
129
+ */
130
+ getMultimodalModel() {
131
+ return this.multimodalModel;
132
+ }
133
+ /**
134
+ * Check if multimodal support is available
135
+ */
136
+ hasMultimodalSupport() {
137
+ return !!this.multimodalModel;
138
+ }
139
+ }
140
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/models/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare class JivaError extends Error {
2
+ code?: string | undefined;
3
+ constructor(message: string, code?: string | undefined);
4
+ }
5
+ export declare class ConfigurationError extends JivaError {
6
+ constructor(message: string);
7
+ }
8
+ export declare class ModelError extends JivaError {
9
+ modelName?: string | undefined;
10
+ constructor(message: string, modelName?: string | undefined);
11
+ }
12
+ export declare class MCPError extends JivaError {
13
+ serverName?: string | undefined;
14
+ constructor(message: string, serverName?: string | undefined);
15
+ }
16
+ export declare class WorkspaceError extends JivaError {
17
+ constructor(message: string);
18
+ }
19
+ export declare class ToolCallError extends JivaError {
20
+ toolName?: string | undefined;
21
+ constructor(message: string, toolName?: string | undefined);
22
+ }
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;IACE,IAAI,CAAC,EAAE,MAAM;gBAArC,OAAO,EAAE,MAAM,EAAS,IAAI,CAAC,EAAE,MAAM,YAAA;CAIlD;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,UAAW,SAAQ,SAAS;IACH,SAAS,CAAC,EAAE,MAAM;gBAA1C,OAAO,EAAE,MAAM,EAAS,SAAS,CAAC,EAAE,MAAM,YAAA;CAIvD;AAED,qBAAa,QAAS,SAAQ,SAAS;IACD,UAAU,CAAC,EAAE,MAAM;gBAA3C,OAAO,EAAE,MAAM,EAAS,UAAU,CAAC,EAAE,MAAM,YAAA;CAIxD;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,SAAS;IACN,QAAQ,CAAC,EAAE,MAAM;gBAAzC,OAAO,EAAE,MAAM,EAAS,QAAQ,CAAC,EAAE,MAAM,YAAA;CAItD"}
@@ -0,0 +1,45 @@
1
+ export class JivaError extends Error {
2
+ code;
3
+ constructor(message, code) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = 'JivaError';
7
+ }
8
+ }
9
+ export class ConfigurationError extends JivaError {
10
+ constructor(message) {
11
+ super(message, 'CONFIG_ERROR');
12
+ this.name = 'ConfigurationError';
13
+ }
14
+ }
15
+ export class ModelError extends JivaError {
16
+ modelName;
17
+ constructor(message, modelName) {
18
+ super(message, 'MODEL_ERROR');
19
+ this.modelName = modelName;
20
+ this.name = 'ModelError';
21
+ }
22
+ }
23
+ export class MCPError extends JivaError {
24
+ serverName;
25
+ constructor(message, serverName) {
26
+ super(message, 'MCP_ERROR');
27
+ this.serverName = serverName;
28
+ this.name = 'MCPError';
29
+ }
30
+ }
31
+ export class WorkspaceError extends JivaError {
32
+ constructor(message) {
33
+ super(message, 'WORKSPACE_ERROR');
34
+ this.name = 'WorkspaceError';
35
+ }
36
+ }
37
+ export class ToolCallError extends JivaError {
38
+ toolName;
39
+ constructor(message, toolName) {
40
+ super(message, 'TOOL_CALL_ERROR');
41
+ this.toolName = toolName;
42
+ this.name = 'ToolCallError';
43
+ }
44
+ }
45
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACE;IAApC,YAAY,OAAe,EAAS,IAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAS;QAE/C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,SAAS;IACH;IAApC,YAAY,OAAe,EAAS,SAAkB;QACpD,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QADI,cAAS,GAAT,SAAS,CAAS;QAEpD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,SAAS;IACD;IAApC,YAAY,OAAe,EAAS,UAAmB;QACrD,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QADM,eAAU,GAAV,UAAU,CAAS;QAErD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,SAAS;IACN;IAApC,YAAY,OAAe,EAAS,QAAiB;QACnD,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QADA,aAAQ,GAAR,QAAQ,CAAS;QAEnD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ export declare enum LogLevel {
2
+ DEBUG = "DEBUG",
3
+ INFO = "INFO",
4
+ WARN = "WARN",
5
+ ERROR = "ERROR",
6
+ SUCCESS = "SUCCESS"
7
+ }
8
+ declare class Logger {
9
+ private static instance;
10
+ private logLevel;
11
+ private constructor();
12
+ static getInstance(): Logger;
13
+ setLogLevel(level: LogLevel): void;
14
+ debug(message: string, ...args: any[]): void;
15
+ info(message: string, ...args: any[]): void;
16
+ warn(message: string, ...args: any[]): void;
17
+ error(message: string, error?: Error | unknown, ...args: any[]): void;
18
+ success(message: string, ...args: any[]): void;
19
+ private log;
20
+ private getPrefix;
21
+ }
22
+ export declare const logger: Logger;
23
+ export {};
24
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,oBAAY,QAAQ;IAClB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAA2B;IAE3C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,WAAW,CAAC,KAAK,EAAE,QAAQ;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAS9D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIvC,OAAO,CAAC,GAAG;IAgBX,OAAO,CAAC,SAAS;CAgBlB;AAED,eAAO,MAAM,MAAM,QAAuB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import chalk from 'chalk';
2
+ export var LogLevel;
3
+ (function (LogLevel) {
4
+ LogLevel["DEBUG"] = "DEBUG";
5
+ LogLevel["INFO"] = "INFO";
6
+ LogLevel["WARN"] = "WARN";
7
+ LogLevel["ERROR"] = "ERROR";
8
+ LogLevel["SUCCESS"] = "SUCCESS";
9
+ })(LogLevel || (LogLevel = {}));
10
+ class Logger {
11
+ static instance;
12
+ logLevel = LogLevel.INFO;
13
+ constructor() { }
14
+ static getInstance() {
15
+ if (!Logger.instance) {
16
+ Logger.instance = new Logger();
17
+ }
18
+ return Logger.instance;
19
+ }
20
+ setLogLevel(level) {
21
+ this.logLevel = level;
22
+ }
23
+ debug(message, ...args) {
24
+ this.log(LogLevel.DEBUG, message, ...args);
25
+ }
26
+ info(message, ...args) {
27
+ this.log(LogLevel.INFO, message, ...args);
28
+ }
29
+ warn(message, ...args) {
30
+ this.log(LogLevel.WARN, message, ...args);
31
+ }
32
+ error(message, error, ...args) {
33
+ this.log(LogLevel.ERROR, message, ...args);
34
+ if (error instanceof Error) {
35
+ console.error(chalk.red(error.stack || error.message));
36
+ }
37
+ else if (error) {
38
+ console.error(chalk.red(JSON.stringify(error, null, 2)));
39
+ }
40
+ }
41
+ success(message, ...args) {
42
+ this.log(LogLevel.SUCCESS, message, ...args);
43
+ }
44
+ log(level, message, ...args) {
45
+ const levelOrder = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR, LogLevel.SUCCESS];
46
+ const currentLevelIndex = levelOrder.indexOf(this.logLevel);
47
+ const messageLevelIndex = levelOrder.indexOf(level);
48
+ if (messageLevelIndex < currentLevelIndex && level !== LogLevel.SUCCESS) {
49
+ return;
50
+ }
51
+ const timestamp = new Date().toISOString();
52
+ const prefix = this.getPrefix(level);
53
+ const formattedMessage = `${chalk.gray(timestamp)} ${prefix} ${message}`;
54
+ console.log(formattedMessage, ...args);
55
+ }
56
+ getPrefix(level) {
57
+ switch (level) {
58
+ case LogLevel.DEBUG:
59
+ return chalk.gray('[DEBUG]');
60
+ case LogLevel.INFO:
61
+ return chalk.blue('[INFO]');
62
+ case LogLevel.WARN:
63
+ return chalk.yellow('[WARN]');
64
+ case LogLevel.ERROR:
65
+ return chalk.red('[ERROR]');
66
+ case LogLevel.SUCCESS:
67
+ return chalk.green('[SUCCESS]');
68
+ default:
69
+ return '';
70
+ }
71
+ }
72
+ }
73
+ export const logger = Logger.getInstance();
74
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}