@sekuire/sdk 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/loader.d.ts +1 -1
- package/dist/index.d.ts +69 -47
- package/dist/index.esm.js +996 -795
- package/dist/index.js +997 -794
- package/dist/llm/anthropic.d.ts +1 -1
- package/dist/llm/google.d.ts +1 -1
- package/dist/llm/index.d.ts +10 -10
- package/dist/llm/ollama.d.ts +1 -1
- package/dist/llm/openai.d.ts +1 -1
- package/dist/llm/types.d.ts +1 -1
- package/dist/memory/base.d.ts +1 -1
- package/dist/memory/in-memory.d.ts +1 -1
- package/dist/memory/index.d.ts +8 -8
- package/dist/memory/postgres.d.ts +1 -1
- package/dist/memory/redis.d.ts +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/tools/agent-invocation.d.ts +1 -1
- package/dist/tools/base.d.ts +3 -3
- package/dist/tools/calculator.d.ts +1 -1
- package/dist/tools/compliance-operations.d.ts +1 -1
- package/dist/tools/data-operations.d.ts +1 -1
- package/dist/tools/directory-operations.d.ts +1 -1
- package/dist/tools/file-operations.d.ts +1 -1
- package/dist/tools/google-workspace.d.ts +8 -0
- package/dist/tools/http-request.d.ts +1 -1
- package/dist/tools/index.d.ts +34 -31
- package/dist/tools/pattern-parser.d.ts +1 -1
- package/dist/tools/remote.d.ts +10 -0
- package/dist/tools/system-operations.d.ts +1 -1
- package/dist/tools/utility-operations.d.ts +1 -1
- package/dist/tools/verification-status.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -18,6 +18,7 @@ import * as path$4 from 'node:path';
|
|
|
18
18
|
import * as https from 'https';
|
|
19
19
|
import * as http from 'http';
|
|
20
20
|
import { URL as URL$1 } from 'url';
|
|
21
|
+
import { z } from 'zod';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* 🛡️ Sekuire Compliance Enforcement System for TypeScript
|
|
@@ -1638,14 +1639,14 @@ class SekuireClient {
|
|
|
1638
1639
|
/**
|
|
1639
1640
|
* Load sekuire.yml configuration file
|
|
1640
1641
|
*/
|
|
1641
|
-
async function loadConfig(configPath =
|
|
1642
|
+
async function loadConfig(configPath = './sekuire.yml') {
|
|
1642
1643
|
try {
|
|
1643
|
-
const content = await fs$3.readFile(configPath,
|
|
1644
|
+
const content = await fs$3.readFile(configPath, 'utf-8');
|
|
1644
1645
|
const config = yaml__default.load(content);
|
|
1645
1646
|
return resolveEnvVars(config);
|
|
1646
1647
|
}
|
|
1647
1648
|
catch (error) {
|
|
1648
|
-
if (error.code ===
|
|
1649
|
+
if (error.code === 'ENOENT') {
|
|
1649
1650
|
throw new Error(`Config file not found: ${configPath}`);
|
|
1650
1651
|
}
|
|
1651
1652
|
throw error;
|
|
@@ -1654,15 +1655,13 @@ async function loadConfig(configPath = "./sekuire.yml") {
|
|
|
1654
1655
|
/**
|
|
1655
1656
|
* Load system prompt from file
|
|
1656
1657
|
*/
|
|
1657
|
-
async function loadSystemPrompt(promptPath, basePath =
|
|
1658
|
+
async function loadSystemPrompt(promptPath, basePath = '.') {
|
|
1658
1659
|
try {
|
|
1659
|
-
const fullPath = path__default.isAbsolute(promptPath)
|
|
1660
|
-
|
|
1661
|
-
: path__default.join(basePath, promptPath);
|
|
1662
|
-
return await fs$3.readFile(fullPath, "utf-8");
|
|
1660
|
+
const fullPath = path__default.isAbsolute(promptPath) ? promptPath : path__default.join(basePath, promptPath);
|
|
1661
|
+
return await fs$3.readFile(fullPath, 'utf-8');
|
|
1663
1662
|
}
|
|
1664
1663
|
catch (error) {
|
|
1665
|
-
if (error.code ===
|
|
1664
|
+
if (error.code === 'ENOENT') {
|
|
1666
1665
|
throw new Error(`System prompt file not found: ${promptPath}`);
|
|
1667
1666
|
}
|
|
1668
1667
|
throw error;
|
|
@@ -1671,16 +1670,14 @@ async function loadSystemPrompt(promptPath, basePath = ".") {
|
|
|
1671
1670
|
/**
|
|
1672
1671
|
* Load tools configuration from JSON file
|
|
1673
1672
|
*/
|
|
1674
|
-
async function loadTools(toolsPath, basePath =
|
|
1673
|
+
async function loadTools(toolsPath, basePath = '.') {
|
|
1675
1674
|
try {
|
|
1676
|
-
const fullPath = path__default.isAbsolute(toolsPath)
|
|
1677
|
-
|
|
1678
|
-
: path__default.join(basePath, toolsPath);
|
|
1679
|
-
const content = await fs$3.readFile(fullPath, "utf-8");
|
|
1675
|
+
const fullPath = path__default.isAbsolute(toolsPath) ? toolsPath : path__default.join(basePath, toolsPath);
|
|
1676
|
+
const content = await fs$3.readFile(fullPath, 'utf-8');
|
|
1680
1677
|
return JSON.parse(content);
|
|
1681
1678
|
}
|
|
1682
1679
|
catch (error) {
|
|
1683
|
-
if (error.code ===
|
|
1680
|
+
if (error.code === 'ENOENT') {
|
|
1684
1681
|
throw new Error(`Tools file not found: ${toolsPath}`);
|
|
1685
1682
|
}
|
|
1686
1683
|
throw error;
|
|
@@ -1691,7 +1688,7 @@ async function loadTools(toolsPath, basePath = ".") {
|
|
|
1691
1688
|
* Supports ${VAR} and ${VAR:-default} syntax
|
|
1692
1689
|
*/
|
|
1693
1690
|
function resolveEnvVars(obj) {
|
|
1694
|
-
if (typeof obj ===
|
|
1691
|
+
if (typeof obj === 'string') {
|
|
1695
1692
|
// Match ${VAR} or ${VAR:-default}
|
|
1696
1693
|
return obj.replace(/\$\{([^}:]+)(?::-([^}]*))?\}/g, (match, varName, defaultValue) => {
|
|
1697
1694
|
const value = process.env[varName];
|
|
@@ -1701,7 +1698,7 @@ function resolveEnvVars(obj) {
|
|
|
1701
1698
|
if (Array.isArray(obj)) {
|
|
1702
1699
|
return obj.map((item) => resolveEnvVars(item));
|
|
1703
1700
|
}
|
|
1704
|
-
if (obj !== null && typeof obj ===
|
|
1701
|
+
if (obj !== null && typeof obj === 'object') {
|
|
1705
1702
|
const resolved = {};
|
|
1706
1703
|
for (const [key, value] of Object.entries(obj)) {
|
|
1707
1704
|
resolved[key] = resolveEnvVars(value);
|
|
@@ -1721,7 +1718,7 @@ function getAgentConfig(config, agentName) {
|
|
|
1721
1718
|
// Return first agent if no name specified
|
|
1722
1719
|
const firstKey = Object.keys(config.agents)[0];
|
|
1723
1720
|
if (!firstKey) {
|
|
1724
|
-
throw new Error(
|
|
1721
|
+
throw new Error('No agents defined in sekuire.yml');
|
|
1725
1722
|
}
|
|
1726
1723
|
return config.agents[firstKey];
|
|
1727
1724
|
}
|
|
@@ -1748,12 +1745,12 @@ function getAgentConfig(config, agentName) {
|
|
|
1748
1745
|
if (config.llm) {
|
|
1749
1746
|
return {
|
|
1750
1747
|
name: config.project.name,
|
|
1751
|
-
system_prompt:
|
|
1752
|
-
tools:
|
|
1748
|
+
system_prompt: './system_prompt.md',
|
|
1749
|
+
tools: './tools.json',
|
|
1753
1750
|
llm: config.llm,
|
|
1754
1751
|
};
|
|
1755
1752
|
}
|
|
1756
|
-
throw new Error(
|
|
1753
|
+
throw new Error('No agent configuration found in sekuire.yml');
|
|
1757
1754
|
}
|
|
1758
1755
|
|
|
1759
1756
|
function __classPrivateFieldSet$1(receiver, state, value, kind, f) {
|
|
@@ -6676,8 +6673,8 @@ class AnthropicProvider {
|
|
|
6676
6673
|
async chat(messages, options) {
|
|
6677
6674
|
try {
|
|
6678
6675
|
// Anthropic requires system message separately
|
|
6679
|
-
const systemMessage = messages.find((m) => m.role ===
|
|
6680
|
-
const conversationMessages = messages.filter((m) => m.role !==
|
|
6676
|
+
const systemMessage = messages.find((m) => m.role === 'system');
|
|
6677
|
+
const conversationMessages = messages.filter((m) => m.role !== 'system');
|
|
6681
6678
|
const response = await this.client.messages.create({
|
|
6682
6679
|
model: this.model,
|
|
6683
6680
|
max_tokens: options?.max_tokens || 4096,
|
|
@@ -6687,14 +6684,14 @@ class AnthropicProvider {
|
|
|
6687
6684
|
system: systemMessage?.content || undefined,
|
|
6688
6685
|
messages: conversationMessages.map((m) => ({
|
|
6689
6686
|
role: m.role,
|
|
6690
|
-
content: m.content ||
|
|
6687
|
+
content: m.content || '',
|
|
6691
6688
|
})),
|
|
6692
6689
|
});
|
|
6693
6690
|
// Extract text content from response
|
|
6694
6691
|
const content = response.content
|
|
6695
|
-
.filter((block) => block.type ===
|
|
6692
|
+
.filter((block) => block.type === 'text')
|
|
6696
6693
|
.map((block) => block.text)
|
|
6697
|
-
.join(
|
|
6694
|
+
.join('');
|
|
6698
6695
|
return {
|
|
6699
6696
|
content,
|
|
6700
6697
|
model: response.model,
|
|
@@ -6713,8 +6710,8 @@ class AnthropicProvider {
|
|
|
6713
6710
|
async *chatStream(messages, options) {
|
|
6714
6711
|
try {
|
|
6715
6712
|
// Anthropic requires system message separately
|
|
6716
|
-
const systemMessage = messages.find((m) => m.role ===
|
|
6717
|
-
const conversationMessages = messages.filter((m) => m.role !==
|
|
6713
|
+
const systemMessage = messages.find((m) => m.role === 'system');
|
|
6714
|
+
const conversationMessages = messages.filter((m) => m.role !== 'system');
|
|
6718
6715
|
const stream = await this.client.messages.create({
|
|
6719
6716
|
model: this.model,
|
|
6720
6717
|
max_tokens: options?.max_tokens || 4096,
|
|
@@ -6724,22 +6721,22 @@ class AnthropicProvider {
|
|
|
6724
6721
|
system: systemMessage?.content || undefined,
|
|
6725
6722
|
messages: conversationMessages.map((m) => ({
|
|
6726
6723
|
role: m.role,
|
|
6727
|
-
content: m.content ||
|
|
6724
|
+
content: m.content || '',
|
|
6728
6725
|
})),
|
|
6729
6726
|
stream: true,
|
|
6730
6727
|
});
|
|
6731
6728
|
for await (const event of stream) {
|
|
6732
|
-
if (event.type ===
|
|
6733
|
-
if (event.delta.type ===
|
|
6729
|
+
if (event.type === 'content_block_delta') {
|
|
6730
|
+
if (event.delta.type === 'text_delta') {
|
|
6734
6731
|
yield {
|
|
6735
6732
|
content: event.delta.text,
|
|
6736
6733
|
};
|
|
6737
6734
|
}
|
|
6738
6735
|
}
|
|
6739
|
-
else if (event.type ===
|
|
6736
|
+
else if (event.type === 'message_stop') {
|
|
6740
6737
|
yield {
|
|
6741
|
-
content:
|
|
6742
|
-
finish_reason:
|
|
6738
|
+
content: '',
|
|
6739
|
+
finish_reason: 'stop',
|
|
6743
6740
|
};
|
|
6744
6741
|
}
|
|
6745
6742
|
}
|
|
@@ -6757,29 +6754,29 @@ class AnthropicProvider {
|
|
|
6757
6754
|
return this.maxTokens;
|
|
6758
6755
|
}
|
|
6759
6756
|
getProviderName() {
|
|
6760
|
-
return
|
|
6757
|
+
return 'anthropic';
|
|
6761
6758
|
}
|
|
6762
6759
|
getModelName() {
|
|
6763
6760
|
return this.model;
|
|
6764
6761
|
}
|
|
6765
6762
|
getMaxTokensForModel(model) {
|
|
6766
6763
|
// Context window sizes for Claude models
|
|
6767
|
-
if (model.includes(
|
|
6764
|
+
if (model.includes('claude-3-5-sonnet')) {
|
|
6768
6765
|
return 200000; // Claude 3.5 Sonnet
|
|
6769
6766
|
}
|
|
6770
|
-
if (model.includes(
|
|
6767
|
+
if (model.includes('claude-3-opus')) {
|
|
6771
6768
|
return 200000; // Claude 3 Opus
|
|
6772
6769
|
}
|
|
6773
|
-
if (model.includes(
|
|
6770
|
+
if (model.includes('claude-3-sonnet')) {
|
|
6774
6771
|
return 200000; // Claude 3 Sonnet
|
|
6775
6772
|
}
|
|
6776
|
-
if (model.includes(
|
|
6773
|
+
if (model.includes('claude-3-haiku')) {
|
|
6777
6774
|
return 200000; // Claude 3 Haiku
|
|
6778
6775
|
}
|
|
6779
|
-
if (model.includes(
|
|
6776
|
+
if (model.includes('claude-2.1')) {
|
|
6780
6777
|
return 200000; // Claude 2.1
|
|
6781
6778
|
}
|
|
6782
|
-
if (model.includes(
|
|
6779
|
+
if (model.includes('claude-2')) {
|
|
6783
6780
|
return 100000; // Claude 2.0
|
|
6784
6781
|
}
|
|
6785
6782
|
// Default fallback
|
|
@@ -8318,13 +8315,17 @@ class GoogleProvider {
|
|
|
8318
8315
|
async chat(messages, options) {
|
|
8319
8316
|
try {
|
|
8320
8317
|
// Convert tools to Gemini format
|
|
8321
|
-
const tools = options?.tools
|
|
8322
|
-
|
|
8323
|
-
|
|
8324
|
-
|
|
8325
|
-
|
|
8326
|
-
|
|
8327
|
-
|
|
8318
|
+
const tools = options?.tools
|
|
8319
|
+
? [
|
|
8320
|
+
{
|
|
8321
|
+
functionDeclarations: options.tools.map((t) => ({
|
|
8322
|
+
name: t.function.name,
|
|
8323
|
+
description: t.function.description,
|
|
8324
|
+
parameters: t.function.parameters,
|
|
8325
|
+
})),
|
|
8326
|
+
},
|
|
8327
|
+
]
|
|
8328
|
+
: undefined;
|
|
8328
8329
|
const model = this.client.getGenerativeModel({
|
|
8329
8330
|
model: this.model,
|
|
8330
8331
|
generationConfig: {
|
|
@@ -8354,38 +8355,40 @@ class GoogleProvider {
|
|
|
8354
8355
|
...(tools && { tools }),
|
|
8355
8356
|
});
|
|
8356
8357
|
// Google Gemini uses a different message format
|
|
8357
|
-
const systemMessage = messages.find((m) => m.role ===
|
|
8358
|
-
const conversationMessages = messages.filter((m) => m.role !==
|
|
8358
|
+
const systemMessage = messages.find((m) => m.role === 'system');
|
|
8359
|
+
const conversationMessages = messages.filter((m) => m.role !== 'system');
|
|
8359
8360
|
// Build chat history with proper tool call support
|
|
8360
8361
|
const history = conversationMessages.slice(0, -1).map((m) => {
|
|
8361
|
-
if (m.role ===
|
|
8362
|
+
if (m.role === 'assistant' || m.role === 'model') {
|
|
8362
8363
|
return {
|
|
8363
|
-
role:
|
|
8364
|
-
parts: [{ text: m.content ||
|
|
8364
|
+
role: 'model',
|
|
8365
|
+
parts: [{ text: m.content || '' }],
|
|
8365
8366
|
};
|
|
8366
8367
|
}
|
|
8367
|
-
else if (m.role ===
|
|
8368
|
+
else if (m.role === 'tool') {
|
|
8368
8369
|
// Tool result message - Gemini expects this in a specific format
|
|
8369
8370
|
return {
|
|
8370
|
-
role:
|
|
8371
|
-
parts: [
|
|
8371
|
+
role: 'function',
|
|
8372
|
+
parts: [
|
|
8373
|
+
{
|
|
8372
8374
|
functionResponse: {
|
|
8373
8375
|
name: m.name,
|
|
8374
8376
|
response: {
|
|
8375
|
-
content: m.content
|
|
8376
|
-
}
|
|
8377
|
-
}
|
|
8378
|
-
}
|
|
8377
|
+
content: m.content,
|
|
8378
|
+
},
|
|
8379
|
+
},
|
|
8380
|
+
},
|
|
8381
|
+
],
|
|
8379
8382
|
};
|
|
8380
8383
|
}
|
|
8381
8384
|
else {
|
|
8382
8385
|
return {
|
|
8383
|
-
role:
|
|
8384
|
-
parts: [{ text: m.content ||
|
|
8386
|
+
role: 'user',
|
|
8387
|
+
parts: [{ text: m.content || '' }],
|
|
8385
8388
|
};
|
|
8386
8389
|
}
|
|
8387
8390
|
});
|
|
8388
|
-
const lastMessage = conversationMessages[conversationMessages.length - 1]?.content ||
|
|
8391
|
+
const lastMessage = conversationMessages[conversationMessages.length - 1]?.content || '';
|
|
8389
8392
|
// Start chat with history
|
|
8390
8393
|
const chat = model.startChat({
|
|
8391
8394
|
history,
|
|
@@ -8407,13 +8410,11 @@ class GoogleProvider {
|
|
|
8407
8410
|
type: 'function',
|
|
8408
8411
|
function: {
|
|
8409
8412
|
name: fc.name,
|
|
8410
|
-
arguments: JSON.stringify(fc.args)
|
|
8411
|
-
}
|
|
8413
|
+
arguments: JSON.stringify(fc.args),
|
|
8414
|
+
},
|
|
8412
8415
|
}));
|
|
8413
8416
|
// Only get text if no function calls (Gemini returns empty text when calling functions)
|
|
8414
|
-
const content = functionCalls && functionCalls.length > 0
|
|
8415
|
-
? ""
|
|
8416
|
-
: response.text();
|
|
8417
|
+
const content = functionCalls && functionCalls.length > 0 ? '' : response.text();
|
|
8417
8418
|
return {
|
|
8418
8419
|
content,
|
|
8419
8420
|
model: this.model,
|
|
@@ -8441,13 +8442,13 @@ class GoogleProvider {
|
|
|
8441
8442
|
stopSequences: options?.stop,
|
|
8442
8443
|
},
|
|
8443
8444
|
});
|
|
8444
|
-
const systemMessage = messages.find((m) => m.role ===
|
|
8445
|
-
const conversationMessages = messages.filter((m) => m.role !==
|
|
8445
|
+
const systemMessage = messages.find((m) => m.role === 'system');
|
|
8446
|
+
const conversationMessages = messages.filter((m) => m.role !== 'system');
|
|
8446
8447
|
const history = conversationMessages.slice(0, -1).map((m) => ({
|
|
8447
|
-
role: m.role ===
|
|
8448
|
-
parts: [{ text: m.content ||
|
|
8448
|
+
role: m.role === 'assistant' ? 'model' : 'user',
|
|
8449
|
+
parts: [{ text: m.content || '' }],
|
|
8449
8450
|
}));
|
|
8450
|
-
const lastMessage = conversationMessages[conversationMessages.length - 1]?.content ||
|
|
8451
|
+
const lastMessage = conversationMessages[conversationMessages.length - 1]?.content || '';
|
|
8451
8452
|
const chat = model.startChat({ history });
|
|
8452
8453
|
const prompt = systemMessage
|
|
8453
8454
|
? `${systemMessage.content}\n\nUser: ${lastMessage}`
|
|
@@ -8463,8 +8464,8 @@ class GoogleProvider {
|
|
|
8463
8464
|
}
|
|
8464
8465
|
// Final chunk with finish reason
|
|
8465
8466
|
yield {
|
|
8466
|
-
content:
|
|
8467
|
-
finish_reason:
|
|
8467
|
+
content: '',
|
|
8468
|
+
finish_reason: 'stop',
|
|
8468
8469
|
};
|
|
8469
8470
|
}
|
|
8470
8471
|
catch (error) {
|
|
@@ -8480,23 +8481,23 @@ class GoogleProvider {
|
|
|
8480
8481
|
return this.maxTokens;
|
|
8481
8482
|
}
|
|
8482
8483
|
getProviderName() {
|
|
8483
|
-
return
|
|
8484
|
+
return 'google';
|
|
8484
8485
|
}
|
|
8485
8486
|
getModelName() {
|
|
8486
8487
|
return this.model;
|
|
8487
8488
|
}
|
|
8488
8489
|
getMaxTokensForModel(model) {
|
|
8489
8490
|
// Context window sizes for Gemini models
|
|
8490
|
-
if (model.includes(
|
|
8491
|
+
if (model.includes('gemini-1.5-pro')) {
|
|
8491
8492
|
return 2000000; // 2M tokens!
|
|
8492
8493
|
}
|
|
8493
|
-
if (model.includes(
|
|
8494
|
+
if (model.includes('gemini-1.5-flash')) {
|
|
8494
8495
|
return 1000000; // 1M tokens
|
|
8495
8496
|
}
|
|
8496
|
-
if (model.includes(
|
|
8497
|
+
if (model.includes('gemini-pro')) {
|
|
8497
8498
|
return 32768;
|
|
8498
8499
|
}
|
|
8499
|
-
if (model.includes(
|
|
8500
|
+
if (model.includes('gemini-pro-vision')) {
|
|
8500
8501
|
return 16384;
|
|
8501
8502
|
}
|
|
8502
8503
|
// Default fallback
|
|
@@ -8510,7 +8511,7 @@ class GoogleProvider {
|
|
|
8510
8511
|
*/
|
|
8511
8512
|
class OllamaProvider {
|
|
8512
8513
|
constructor(config) {
|
|
8513
|
-
this.baseUrl = config.baseUrl ||
|
|
8514
|
+
this.baseUrl = config.baseUrl || 'http://localhost:11434';
|
|
8514
8515
|
this.model = config.model;
|
|
8515
8516
|
this.maxTokens = config.maxTokens || 4096;
|
|
8516
8517
|
}
|
|
@@ -8520,7 +8521,7 @@ class OllamaProvider {
|
|
|
8520
8521
|
model: this.model,
|
|
8521
8522
|
messages: messages.map((m) => ({
|
|
8522
8523
|
role: m.role,
|
|
8523
|
-
content: m.content ||
|
|
8524
|
+
content: m.content || '',
|
|
8524
8525
|
})),
|
|
8525
8526
|
stream: false,
|
|
8526
8527
|
options: {
|
|
@@ -8531,9 +8532,9 @@ class OllamaProvider {
|
|
|
8531
8532
|
},
|
|
8532
8533
|
};
|
|
8533
8534
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
8534
|
-
method:
|
|
8535
|
+
method: 'POST',
|
|
8535
8536
|
headers: {
|
|
8536
|
-
|
|
8537
|
+
'Content-Type': 'application/json',
|
|
8537
8538
|
},
|
|
8538
8539
|
body: JSON.stringify(requestBody),
|
|
8539
8540
|
});
|
|
@@ -8544,7 +8545,7 @@ class OllamaProvider {
|
|
|
8544
8545
|
return {
|
|
8545
8546
|
content: data.message.content,
|
|
8546
8547
|
model: data.model,
|
|
8547
|
-
finish_reason: data.done ?
|
|
8548
|
+
finish_reason: data.done ? 'stop' : undefined,
|
|
8548
8549
|
usage: {
|
|
8549
8550
|
prompt_tokens: data.prompt_eval_count || 0,
|
|
8550
8551
|
completion_tokens: data.eval_count || 0,
|
|
@@ -8562,7 +8563,7 @@ class OllamaProvider {
|
|
|
8562
8563
|
model: this.model,
|
|
8563
8564
|
messages: messages.map((m) => ({
|
|
8564
8565
|
role: m.role,
|
|
8565
|
-
content: m.content ||
|
|
8566
|
+
content: m.content || '',
|
|
8566
8567
|
})),
|
|
8567
8568
|
stream: true,
|
|
8568
8569
|
options: {
|
|
@@ -8573,9 +8574,9 @@ class OllamaProvider {
|
|
|
8573
8574
|
},
|
|
8574
8575
|
};
|
|
8575
8576
|
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
8576
|
-
method:
|
|
8577
|
+
method: 'POST',
|
|
8577
8578
|
headers: {
|
|
8578
|
-
|
|
8579
|
+
'Content-Type': 'application/json',
|
|
8579
8580
|
},
|
|
8580
8581
|
body: JSON.stringify(requestBody),
|
|
8581
8582
|
});
|
|
@@ -8583,7 +8584,7 @@ class OllamaProvider {
|
|
|
8583
8584
|
throw new Error(`Ollama API error: ${response.statusText}`);
|
|
8584
8585
|
}
|
|
8585
8586
|
if (!response.body) {
|
|
8586
|
-
throw new Error(
|
|
8587
|
+
throw new Error('Response body is null');
|
|
8587
8588
|
}
|
|
8588
8589
|
const reader = response.body.getReader();
|
|
8589
8590
|
const decoder = new TextDecoder();
|
|
@@ -8592,7 +8593,7 @@ class OllamaProvider {
|
|
|
8592
8593
|
if (done)
|
|
8593
8594
|
break;
|
|
8594
8595
|
const chunk = decoder.decode(value);
|
|
8595
|
-
const lines = chunk.split(
|
|
8596
|
+
const lines = chunk.split('\n').filter((line) => line.trim());
|
|
8596
8597
|
for (const line of lines) {
|
|
8597
8598
|
try {
|
|
8598
8599
|
const data = JSON.parse(line);
|
|
@@ -8603,8 +8604,8 @@ class OllamaProvider {
|
|
|
8603
8604
|
}
|
|
8604
8605
|
if (data.done) {
|
|
8605
8606
|
yield {
|
|
8606
|
-
content:
|
|
8607
|
-
finish_reason:
|
|
8607
|
+
content: '',
|
|
8608
|
+
finish_reason: 'stop',
|
|
8608
8609
|
};
|
|
8609
8610
|
}
|
|
8610
8611
|
}
|
|
@@ -8624,7 +8625,7 @@ class OllamaProvider {
|
|
|
8624
8625
|
return this.maxTokens;
|
|
8625
8626
|
}
|
|
8626
8627
|
getProviderName() {
|
|
8627
|
-
return
|
|
8628
|
+
return 'ollama';
|
|
8628
8629
|
}
|
|
8629
8630
|
getModelName() {
|
|
8630
8631
|
return this.model;
|
|
@@ -8862,7 +8863,7 @@ const safeJSON = (text) => {
|
|
|
8862
8863
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
8863
8864
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
8864
8865
|
|
|
8865
|
-
const VERSION = '6.
|
|
8866
|
+
const VERSION = '6.15.0'; // x-release-please-version
|
|
8866
8867
|
|
|
8867
8868
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
8868
8869
|
const isRunningInBrowser = () => {
|
|
@@ -15831,7 +15832,7 @@ class OpenAIProvider {
|
|
|
15831
15832
|
tools: options?.tools,
|
|
15832
15833
|
});
|
|
15833
15834
|
return {
|
|
15834
|
-
content: response.choices[0]?.message?.content ||
|
|
15835
|
+
content: response.choices[0]?.message?.content || '',
|
|
15835
15836
|
model: response.model,
|
|
15836
15837
|
finish_reason: response.choices[0]?.finish_reason || undefined,
|
|
15837
15838
|
tool_calls: response.choices[0]?.message?.tool_calls,
|
|
@@ -15862,7 +15863,7 @@ class OpenAIProvider {
|
|
|
15862
15863
|
stream: true,
|
|
15863
15864
|
});
|
|
15864
15865
|
for await (const chunk of stream) {
|
|
15865
|
-
const content = chunk.choices[0]?.delta?.content ||
|
|
15866
|
+
const content = chunk.choices[0]?.delta?.content || '';
|
|
15866
15867
|
const finishReason = chunk.choices[0]?.finish_reason || undefined;
|
|
15867
15868
|
if (content || finishReason) {
|
|
15868
15869
|
yield {
|
|
@@ -15885,26 +15886,26 @@ class OpenAIProvider {
|
|
|
15885
15886
|
return this.maxTokens;
|
|
15886
15887
|
}
|
|
15887
15888
|
getProviderName() {
|
|
15888
|
-
return
|
|
15889
|
+
return 'openai';
|
|
15889
15890
|
}
|
|
15890
15891
|
getModelName() {
|
|
15891
15892
|
return this.model;
|
|
15892
15893
|
}
|
|
15893
15894
|
getMaxTokensForModel(model) {
|
|
15894
15895
|
// Context window sizes for common models
|
|
15895
|
-
if (model.includes(
|
|
15896
|
+
if (model.includes('gpt-4-turbo') || model.includes('gpt-4-1106')) {
|
|
15896
15897
|
return 128000;
|
|
15897
15898
|
}
|
|
15898
|
-
if (model.includes(
|
|
15899
|
+
if (model.includes('gpt-4-32k')) {
|
|
15899
15900
|
return 32768;
|
|
15900
15901
|
}
|
|
15901
|
-
if (model.includes(
|
|
15902
|
+
if (model.includes('gpt-4')) {
|
|
15902
15903
|
return 8192;
|
|
15903
15904
|
}
|
|
15904
|
-
if (model.includes(
|
|
15905
|
+
if (model.includes('gpt-3.5-turbo-16k')) {
|
|
15905
15906
|
return 16385;
|
|
15906
15907
|
}
|
|
15907
|
-
if (model.includes(
|
|
15908
|
+
if (model.includes('gpt-3.5-turbo')) {
|
|
15908
15909
|
return 4096;
|
|
15909
15910
|
}
|
|
15910
15911
|
// Default fallback
|
|
@@ -15918,14 +15919,14 @@ class OpenAIProvider {
|
|
|
15918
15919
|
function createLLMProvider(provider, config) {
|
|
15919
15920
|
const normalizedProvider = provider.toLowerCase();
|
|
15920
15921
|
switch (normalizedProvider) {
|
|
15921
|
-
case
|
|
15922
|
+
case 'openai':
|
|
15922
15923
|
return new OpenAIProvider(config);
|
|
15923
|
-
case
|
|
15924
|
+
case 'anthropic':
|
|
15924
15925
|
return new AnthropicProvider(config);
|
|
15925
|
-
case
|
|
15926
|
-
case
|
|
15926
|
+
case 'google':
|
|
15927
|
+
case 'gemini':
|
|
15927
15928
|
return new GoogleProvider(config);
|
|
15928
|
-
case
|
|
15929
|
+
case 'ollama':
|
|
15929
15930
|
return new OllamaProvider(config);
|
|
15930
15931
|
default:
|
|
15931
15932
|
throw new Error(`Unknown LLM provider: ${provider}. Supported providers: openai, anthropic, google, ollama`);
|
|
@@ -15941,7 +15942,7 @@ const llm = {
|
|
|
15941
15942
|
openai: (config) => {
|
|
15942
15943
|
return new OpenAIProvider({
|
|
15943
15944
|
...config,
|
|
15944
|
-
model: config.model ||
|
|
15945
|
+
model: config.model || 'gpt-4',
|
|
15945
15946
|
});
|
|
15946
15947
|
},
|
|
15947
15948
|
/**
|
|
@@ -15950,7 +15951,7 @@ const llm = {
|
|
|
15950
15951
|
anthropic: (config) => {
|
|
15951
15952
|
return new AnthropicProvider({
|
|
15952
15953
|
...config,
|
|
15953
|
-
model: config.model ||
|
|
15954
|
+
model: config.model || 'claude-3-5-sonnet-20241022',
|
|
15954
15955
|
});
|
|
15955
15956
|
},
|
|
15956
15957
|
/**
|
|
@@ -15959,7 +15960,7 @@ const llm = {
|
|
|
15959
15960
|
google: (config) => {
|
|
15960
15961
|
return new GoogleProvider({
|
|
15961
15962
|
...config,
|
|
15962
|
-
model: config.model ||
|
|
15963
|
+
model: config.model || 'gemini-1.5-pro',
|
|
15963
15964
|
});
|
|
15964
15965
|
},
|
|
15965
15966
|
/**
|
|
@@ -15968,11 +15969,241 @@ const llm = {
|
|
|
15968
15969
|
ollama: (config) => {
|
|
15969
15970
|
return new OllamaProvider({
|
|
15970
15971
|
...config,
|
|
15971
|
-
model: config.model ||
|
|
15972
|
+
model: config.model || 'llama2',
|
|
15972
15973
|
});
|
|
15973
15974
|
},
|
|
15974
15975
|
};
|
|
15975
15976
|
|
|
15977
|
+
class BaseMemoryStorage {
|
|
15978
|
+
}
|
|
15979
|
+
|
|
15980
|
+
class InMemoryStorage extends BaseMemoryStorage {
|
|
15981
|
+
constructor() {
|
|
15982
|
+
super(...arguments);
|
|
15983
|
+
this.storage = new Map();
|
|
15984
|
+
}
|
|
15985
|
+
async add(sessionId, message) {
|
|
15986
|
+
if (!this.storage.has(sessionId)) {
|
|
15987
|
+
this.storage.set(sessionId, []);
|
|
15988
|
+
}
|
|
15989
|
+
this.storage.get(sessionId).push(message);
|
|
15990
|
+
}
|
|
15991
|
+
async get(sessionId, limit) {
|
|
15992
|
+
const messages = this.storage.get(sessionId) || [];
|
|
15993
|
+
if (limit) {
|
|
15994
|
+
return messages.slice(-limit);
|
|
15995
|
+
}
|
|
15996
|
+
return messages;
|
|
15997
|
+
}
|
|
15998
|
+
async clear(sessionId) {
|
|
15999
|
+
this.storage.set(sessionId, []);
|
|
16000
|
+
}
|
|
16001
|
+
async delete(sessionId) {
|
|
16002
|
+
this.storage.delete(sessionId);
|
|
16003
|
+
}
|
|
16004
|
+
async exists(sessionId) {
|
|
16005
|
+
return this.storage.has(sessionId);
|
|
16006
|
+
}
|
|
16007
|
+
}
|
|
16008
|
+
|
|
16009
|
+
class PostgresStorage extends BaseMemoryStorage {
|
|
16010
|
+
constructor(config) {
|
|
16011
|
+
super();
|
|
16012
|
+
this.initialized = false;
|
|
16013
|
+
this.tableName = config.tableName || 'sekuire_memory';
|
|
16014
|
+
this.initPool(config);
|
|
16015
|
+
}
|
|
16016
|
+
async initPool(config) {
|
|
16017
|
+
try {
|
|
16018
|
+
const { Pool } = await import('pg');
|
|
16019
|
+
if (config.connectionString) {
|
|
16020
|
+
this.pool = new Pool({ connectionString: config.connectionString });
|
|
16021
|
+
}
|
|
16022
|
+
else {
|
|
16023
|
+
this.pool = new Pool({
|
|
16024
|
+
host: config.host || 'localhost',
|
|
16025
|
+
port: config.port || 5432,
|
|
16026
|
+
database: config.database,
|
|
16027
|
+
user: config.user,
|
|
16028
|
+
password: config.password,
|
|
16029
|
+
});
|
|
16030
|
+
}
|
|
16031
|
+
await this.createTableIfNotExists();
|
|
16032
|
+
this.initialized = true;
|
|
16033
|
+
}
|
|
16034
|
+
catch (error) {
|
|
16035
|
+
throw new Error(`Failed to initialize Postgres: ${error}`);
|
|
16036
|
+
}
|
|
16037
|
+
}
|
|
16038
|
+
async createTableIfNotExists() {
|
|
16039
|
+
const query = `
|
|
16040
|
+
CREATE TABLE IF NOT EXISTS ${this.tableName} (
|
|
16041
|
+
id SERIAL PRIMARY KEY,
|
|
16042
|
+
session_id VARCHAR(255) NOT NULL,
|
|
16043
|
+
role VARCHAR(50) NOT NULL,
|
|
16044
|
+
content TEXT NOT NULL,
|
|
16045
|
+
timestamp BIGINT NOT NULL,
|
|
16046
|
+
metadata JSONB,
|
|
16047
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
16048
|
+
);
|
|
16049
|
+
CREATE INDEX IF NOT EXISTS idx_${this.tableName}_session_id ON ${this.tableName}(session_id);
|
|
16050
|
+
`;
|
|
16051
|
+
await this.pool.query(query);
|
|
16052
|
+
}
|
|
16053
|
+
async add(sessionId, message) {
|
|
16054
|
+
if (!this.initialized)
|
|
16055
|
+
throw new Error('Postgres not initialized');
|
|
16056
|
+
const query = `
|
|
16057
|
+
INSERT INTO ${this.tableName} (session_id, role, content, timestamp, metadata)
|
|
16058
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
16059
|
+
`;
|
|
16060
|
+
await this.pool.query(query, [
|
|
16061
|
+
sessionId,
|
|
16062
|
+
message.role,
|
|
16063
|
+
message.content,
|
|
16064
|
+
message.timestamp,
|
|
16065
|
+
message.metadata ? JSON.stringify(message.metadata) : null,
|
|
16066
|
+
]);
|
|
16067
|
+
}
|
|
16068
|
+
async get(sessionId, limit) {
|
|
16069
|
+
if (!this.initialized)
|
|
16070
|
+
throw new Error('Postgres not initialized');
|
|
16071
|
+
let query = `
|
|
16072
|
+
SELECT role, content, timestamp, metadata
|
|
16073
|
+
FROM ${this.tableName}
|
|
16074
|
+
WHERE session_id = $1
|
|
16075
|
+
ORDER BY timestamp ASC
|
|
16076
|
+
`;
|
|
16077
|
+
if (limit) {
|
|
16078
|
+
query += ` LIMIT ${limit}`;
|
|
16079
|
+
}
|
|
16080
|
+
const result = await this.pool.query(query, [sessionId]);
|
|
16081
|
+
return result.rows.map((row) => ({
|
|
16082
|
+
role: row.role,
|
|
16083
|
+
content: row.content,
|
|
16084
|
+
timestamp: row.timestamp,
|
|
16085
|
+
metadata: row.metadata,
|
|
16086
|
+
}));
|
|
16087
|
+
}
|
|
16088
|
+
async clear(sessionId) {
|
|
16089
|
+
if (!this.initialized)
|
|
16090
|
+
throw new Error('Postgres not initialized');
|
|
16091
|
+
const query = `DELETE FROM ${this.tableName} WHERE session_id = $1`;
|
|
16092
|
+
await this.pool.query(query, [sessionId]);
|
|
16093
|
+
}
|
|
16094
|
+
async delete(sessionId) {
|
|
16095
|
+
await this.clear(sessionId);
|
|
16096
|
+
}
|
|
16097
|
+
async exists(sessionId) {
|
|
16098
|
+
if (!this.initialized)
|
|
16099
|
+
throw new Error('Postgres not initialized');
|
|
16100
|
+
const query = `SELECT COUNT(*) FROM ${this.tableName} WHERE session_id = $1`;
|
|
16101
|
+
const result = await this.pool.query(query, [sessionId]);
|
|
16102
|
+
return parseInt(result.rows[0].count) > 0;
|
|
16103
|
+
}
|
|
16104
|
+
async disconnect() {
|
|
16105
|
+
if (this.initialized) {
|
|
16106
|
+
await this.pool.end();
|
|
16107
|
+
this.initialized = false;
|
|
16108
|
+
}
|
|
16109
|
+
}
|
|
16110
|
+
}
|
|
16111
|
+
|
|
16112
|
+
class RedisStorage extends BaseMemoryStorage {
|
|
16113
|
+
constructor(config) {
|
|
16114
|
+
super();
|
|
16115
|
+
this.client = null;
|
|
16116
|
+
this.connected = false;
|
|
16117
|
+
this.keyPrefix = config.keyPrefix || 'sekuire:memory:';
|
|
16118
|
+
this.initClient(config);
|
|
16119
|
+
}
|
|
16120
|
+
async initClient(config) {
|
|
16121
|
+
try {
|
|
16122
|
+
const { createClient } = await import('redis');
|
|
16123
|
+
if (config.url) {
|
|
16124
|
+
this.client = createClient({ url: config.url });
|
|
16125
|
+
}
|
|
16126
|
+
else {
|
|
16127
|
+
this.client = createClient({
|
|
16128
|
+
socket: {
|
|
16129
|
+
host: config.host || 'localhost',
|
|
16130
|
+
port: config.port || 6379,
|
|
16131
|
+
},
|
|
16132
|
+
password: config.password,
|
|
16133
|
+
database: config.db || 0,
|
|
16134
|
+
});
|
|
16135
|
+
}
|
|
16136
|
+
this.client.on('error', (err) => {
|
|
16137
|
+
console.error('Redis client error:', err);
|
|
16138
|
+
});
|
|
16139
|
+
await this.client.connect();
|
|
16140
|
+
this.connected = true;
|
|
16141
|
+
}
|
|
16142
|
+
catch (error) {
|
|
16143
|
+
throw new Error(`Failed to initialize Redis: ${error}`);
|
|
16144
|
+
}
|
|
16145
|
+
}
|
|
16146
|
+
getKey(sessionId) {
|
|
16147
|
+
return `${this.keyPrefix}${sessionId}`;
|
|
16148
|
+
}
|
|
16149
|
+
async add(sessionId, message) {
|
|
16150
|
+
if (!this.connected)
|
|
16151
|
+
throw new Error('Redis not connected');
|
|
16152
|
+
const key = this.getKey(sessionId);
|
|
16153
|
+
await this.client.rPush(key, JSON.stringify(message));
|
|
16154
|
+
}
|
|
16155
|
+
async get(sessionId, limit) {
|
|
16156
|
+
if (!this.connected)
|
|
16157
|
+
throw new Error('Redis not connected');
|
|
16158
|
+
const key = this.getKey(sessionId);
|
|
16159
|
+
const start = limit ? -limit : 0;
|
|
16160
|
+
const messages = await this.client.lRange(key, start, -1);
|
|
16161
|
+
return messages.map((msg) => JSON.parse(msg));
|
|
16162
|
+
}
|
|
16163
|
+
async clear(sessionId) {
|
|
16164
|
+
if (!this.connected)
|
|
16165
|
+
throw new Error('Redis not connected');
|
|
16166
|
+
const key = this.getKey(sessionId);
|
|
16167
|
+
await this.client.del(key);
|
|
16168
|
+
}
|
|
16169
|
+
async delete(sessionId) {
|
|
16170
|
+
await this.clear(sessionId);
|
|
16171
|
+
}
|
|
16172
|
+
async exists(sessionId) {
|
|
16173
|
+
if (!this.connected)
|
|
16174
|
+
throw new Error('Redis not connected');
|
|
16175
|
+
const key = this.getKey(sessionId);
|
|
16176
|
+
return (await this.client.exists(key)) === 1;
|
|
16177
|
+
}
|
|
16178
|
+
async disconnect() {
|
|
16179
|
+
if (this.connected) {
|
|
16180
|
+
await this.client.quit();
|
|
16181
|
+
this.connected = false;
|
|
16182
|
+
}
|
|
16183
|
+
}
|
|
16184
|
+
}
|
|
16185
|
+
|
|
16186
|
+
function createMemoryStorage(config) {
|
|
16187
|
+
// Normalize type (support "buffer" as alias for "in-memory")
|
|
16188
|
+
const normalizedType = config.type === 'buffer' ? 'in-memory' : config.type;
|
|
16189
|
+
switch (normalizedType) {
|
|
16190
|
+
case 'in-memory':
|
|
16191
|
+
return new InMemoryStorage();
|
|
16192
|
+
case 'redis':
|
|
16193
|
+
if (!config.redis) {
|
|
16194
|
+
throw new Error('Redis config required for redis memory type');
|
|
16195
|
+
}
|
|
16196
|
+
return new RedisStorage(config.redis);
|
|
16197
|
+
case 'postgres':
|
|
16198
|
+
if (!config.postgres) {
|
|
16199
|
+
throw new Error('Postgres config required for postgres memory type');
|
|
16200
|
+
}
|
|
16201
|
+
return new PostgresStorage(config.postgres);
|
|
16202
|
+
default:
|
|
16203
|
+
throw new Error(`Unknown memory type: ${config.type}`);
|
|
16204
|
+
}
|
|
16205
|
+
}
|
|
16206
|
+
|
|
15976
16207
|
function getDefaultExportFromCjs (x) {
|
|
15977
16208
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
15978
16209
|
}
|
|
@@ -16610,10 +16841,10 @@ class Tool {
|
|
|
16610
16841
|
if (param.name in input) {
|
|
16611
16842
|
const value = input[param.name];
|
|
16612
16843
|
const actualType = typeof value;
|
|
16613
|
-
if (param.type ===
|
|
16844
|
+
if (param.type === 'object' && actualType !== 'object') {
|
|
16614
16845
|
throw new Error(`Parameter ${param.name} must be an object`);
|
|
16615
16846
|
}
|
|
16616
|
-
if (param.type !==
|
|
16847
|
+
if (param.type !== 'object' && actualType !== param.type) {
|
|
16617
16848
|
throw new Error(`Parameter ${param.name} must be of type ${param.type}`);
|
|
16618
16849
|
}
|
|
16619
16850
|
}
|
|
@@ -16625,7 +16856,7 @@ class Tool {
|
|
|
16625
16856
|
name: this.metadata.name,
|
|
16626
16857
|
description: this.metadata.description,
|
|
16627
16858
|
parameters: {
|
|
16628
|
-
type:
|
|
16859
|
+
type: 'object',
|
|
16629
16860
|
properties: Object.fromEntries(this.metadata.parameters.map((p) => [
|
|
16630
16861
|
p.name,
|
|
16631
16862
|
{
|
|
@@ -16634,9 +16865,7 @@ class Tool {
|
|
|
16634
16865
|
...(p.default && { default: p.default }),
|
|
16635
16866
|
},
|
|
16636
16867
|
])),
|
|
16637
|
-
required: this.metadata.parameters
|
|
16638
|
-
.filter((p) => p.required)
|
|
16639
|
-
.map((p) => p.name),
|
|
16868
|
+
required: this.metadata.parameters.filter((p) => p.required).map((p) => p.name),
|
|
16640
16869
|
},
|
|
16641
16870
|
};
|
|
16642
16871
|
}
|
|
@@ -16649,7 +16878,7 @@ class ToolRegistry {
|
|
|
16649
16878
|
register(tool) {
|
|
16650
16879
|
this.tools.set(tool.metadata.name, tool);
|
|
16651
16880
|
// Track by category
|
|
16652
|
-
const category = tool.metadata.category ||
|
|
16881
|
+
const category = tool.metadata.category || 'general';
|
|
16653
16882
|
if (!this.categories.has(category)) {
|
|
16654
16883
|
this.categories.set(category, new Set());
|
|
16655
16884
|
}
|
|
@@ -16729,7 +16958,7 @@ class AgentDiscoveryTool extends Tool {
|
|
|
16729
16958
|
};
|
|
16730
16959
|
}
|
|
16731
16960
|
async execute(input) {
|
|
16732
|
-
const { capability, tag, category, verified_only = false, scope = 'workspace' } = input;
|
|
16961
|
+
const { capability, tag, category, verified_only = false, scope = 'workspace', } = input;
|
|
16733
16962
|
try {
|
|
16734
16963
|
const workspaceId = process.env.SEKUIRE_WORKSPACE_ID;
|
|
16735
16964
|
const orgId = process.env.SEKUIRE_ORG_ID;
|
|
@@ -16817,7 +17046,7 @@ class AgentDelegationTool extends Tool {
|
|
|
16817
17046
|
};
|
|
16818
17047
|
}
|
|
16819
17048
|
async execute(input) {
|
|
16820
|
-
const { target_agent_id, capability, task, timeout_seconds = 30 } = input;
|
|
17049
|
+
const { target_agent_id, capability, task, timeout_seconds = 30, } = input;
|
|
16821
17050
|
try {
|
|
16822
17051
|
// Determine target agent
|
|
16823
17052
|
let targetId = target_agent_id;
|
|
@@ -16827,7 +17056,7 @@ class AgentDelegationTool extends Tool {
|
|
|
16827
17056
|
const discoveryResult = await discoveryTool.execute({
|
|
16828
17057
|
capability: String(capability),
|
|
16829
17058
|
verified_only: true,
|
|
16830
|
-
scope: 'workspace'
|
|
17059
|
+
scope: 'workspace',
|
|
16831
17060
|
});
|
|
16832
17061
|
// Parse first agent from discovery result (simplified)
|
|
16833
17062
|
const match = String(discoveryResult).match(/\(sekuire_agent_[a-zA-Z0-9]+\)/);
|
|
@@ -16946,38 +17175,38 @@ class AgentStatusTool extends Tool {
|
|
|
16946
17175
|
* Performs handshake and sends requests to verified agents
|
|
16947
17176
|
*/
|
|
16948
17177
|
class InvokeAgentTool {
|
|
16949
|
-
constructor(privateKey, publicKey, registryUrl =
|
|
17178
|
+
constructor(privateKey, publicKey, registryUrl = 'https://api.sekuire.com') {
|
|
16950
17179
|
this.privateKey = privateKey;
|
|
16951
17180
|
this.publicKey = publicKey;
|
|
16952
17181
|
this.registryUrl = registryUrl;
|
|
16953
|
-
this.name =
|
|
16954
|
-
this.description =
|
|
17182
|
+
this.name = 'invoke_agent';
|
|
17183
|
+
this.description = 'Invoke another Sekuire agent by performing a secure handshake and sending a request. Use this to delegate tasks to specialized agents.';
|
|
16955
17184
|
this.parameters = {
|
|
16956
|
-
type:
|
|
17185
|
+
type: 'object',
|
|
16957
17186
|
properties: {
|
|
16958
17187
|
agent_url: {
|
|
16959
|
-
type:
|
|
16960
|
-
description:
|
|
17188
|
+
type: 'string',
|
|
17189
|
+
description: 'The base URL of the agent to invoke (e.g., https://agent.example.com)',
|
|
16961
17190
|
},
|
|
16962
17191
|
agent_id: {
|
|
16963
|
-
type:
|
|
16964
|
-
description:
|
|
17192
|
+
type: 'string',
|
|
17193
|
+
description: 'Optional: The expected agent ID for verification',
|
|
16965
17194
|
},
|
|
16966
17195
|
request: {
|
|
16967
|
-
type:
|
|
16968
|
-
description:
|
|
17196
|
+
type: 'string',
|
|
17197
|
+
description: 'The request/query to send to the agent',
|
|
16969
17198
|
},
|
|
16970
17199
|
parameters: {
|
|
16971
|
-
type:
|
|
16972
|
-
description:
|
|
17200
|
+
type: 'object',
|
|
17201
|
+
description: 'Optional: Additional parameters to pass to the agent',
|
|
16973
17202
|
},
|
|
16974
17203
|
},
|
|
16975
|
-
required: [
|
|
17204
|
+
required: ['agent_url', 'request'],
|
|
16976
17205
|
};
|
|
16977
17206
|
this.metadata = {
|
|
16978
|
-
category:
|
|
17207
|
+
category: 'agent_communication',
|
|
16979
17208
|
requiresAuth: true,
|
|
16980
|
-
riskLevel:
|
|
17209
|
+
riskLevel: 'medium',
|
|
16981
17210
|
};
|
|
16982
17211
|
this.client = null;
|
|
16983
17212
|
}
|
|
@@ -16999,16 +17228,16 @@ class InvokeAgentTool {
|
|
|
16999
17228
|
if (!handshakeResult.verified) {
|
|
17000
17229
|
return JSON.stringify({
|
|
17001
17230
|
success: false,
|
|
17002
|
-
error:
|
|
17231
|
+
error: 'Failed to verify agent identity during handshake',
|
|
17003
17232
|
agent_id: handshakeResult.agentId,
|
|
17004
17233
|
});
|
|
17005
17234
|
}
|
|
17006
17235
|
// Send request to the agent
|
|
17007
17236
|
const response = await fetch(`${agent_url}/agent/invoke`, {
|
|
17008
|
-
method:
|
|
17237
|
+
method: 'POST',
|
|
17009
17238
|
headers: {
|
|
17010
|
-
|
|
17011
|
-
|
|
17239
|
+
'Content-Type': 'application/json',
|
|
17240
|
+
'X-Sekuire-Agent-Id': handshakeResult.agentId,
|
|
17012
17241
|
},
|
|
17013
17242
|
body: JSON.stringify({
|
|
17014
17243
|
request,
|
|
@@ -17034,7 +17263,7 @@ class InvokeAgentTool {
|
|
|
17034
17263
|
catch (error) {
|
|
17035
17264
|
return JSON.stringify({
|
|
17036
17265
|
success: false,
|
|
17037
|
-
error: error instanceof Error ? error.message :
|
|
17266
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
17038
17267
|
});
|
|
17039
17268
|
}
|
|
17040
17269
|
}
|
|
@@ -17043,30 +17272,30 @@ class InvokeAgentTool {
|
|
|
17043
17272
|
* Tool for searching the Sekuire registry for agents
|
|
17044
17273
|
*/
|
|
17045
17274
|
class SearchAgentsTool {
|
|
17046
|
-
constructor(privateKey, publicKey, registryUrl =
|
|
17275
|
+
constructor(privateKey, publicKey, registryUrl = 'https://api.sekuire.com') {
|
|
17047
17276
|
this.privateKey = privateKey;
|
|
17048
17277
|
this.publicKey = publicKey;
|
|
17049
17278
|
this.registryUrl = registryUrl;
|
|
17050
|
-
this.name =
|
|
17051
|
-
this.description =
|
|
17279
|
+
this.name = 'search_agents';
|
|
17280
|
+
this.description = 'Search the Sekuire registry for agents by name, capability, or description. Returns a list of verified agents.';
|
|
17052
17281
|
this.parameters = {
|
|
17053
|
-
type:
|
|
17282
|
+
type: 'object',
|
|
17054
17283
|
properties: {
|
|
17055
17284
|
query: {
|
|
17056
|
-
type:
|
|
17057
|
-
description:
|
|
17285
|
+
type: 'string',
|
|
17286
|
+
description: 'Search query (agent name, capability, or description)',
|
|
17058
17287
|
},
|
|
17059
17288
|
limit: {
|
|
17060
|
-
type:
|
|
17061
|
-
description:
|
|
17289
|
+
type: 'number',
|
|
17290
|
+
description: 'Maximum number of results to return (default: 10)',
|
|
17062
17291
|
},
|
|
17063
17292
|
},
|
|
17064
|
-
required: [
|
|
17293
|
+
required: ['query'],
|
|
17065
17294
|
};
|
|
17066
17295
|
this.metadata = {
|
|
17067
|
-
category:
|
|
17296
|
+
category: 'agent_communication',
|
|
17068
17297
|
requiresAuth: false,
|
|
17069
|
-
riskLevel:
|
|
17298
|
+
riskLevel: 'low',
|
|
17070
17299
|
};
|
|
17071
17300
|
this.client = null;
|
|
17072
17301
|
}
|
|
@@ -17104,7 +17333,7 @@ class SearchAgentsTool {
|
|
|
17104
17333
|
catch (error) {
|
|
17105
17334
|
return JSON.stringify({
|
|
17106
17335
|
success: false,
|
|
17107
|
-
error: error instanceof Error ? error.message :
|
|
17336
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
17108
17337
|
agents: [],
|
|
17109
17338
|
});
|
|
17110
17339
|
}
|
|
@@ -17114,26 +17343,26 @@ class SearchAgentsTool {
|
|
|
17114
17343
|
* Tool for getting detailed information about a specific agent
|
|
17115
17344
|
*/
|
|
17116
17345
|
class GetAgentInfoTool {
|
|
17117
|
-
constructor(privateKey, publicKey, registryUrl =
|
|
17346
|
+
constructor(privateKey, publicKey, registryUrl = 'https://api.sekuire.com') {
|
|
17118
17347
|
this.privateKey = privateKey;
|
|
17119
17348
|
this.publicKey = publicKey;
|
|
17120
17349
|
this.registryUrl = registryUrl;
|
|
17121
|
-
this.name =
|
|
17122
|
-
this.description =
|
|
17350
|
+
this.name = 'get_agent_info';
|
|
17351
|
+
this.description = 'Get detailed information about a specific Sekuire agent including its verification status, capabilities, and public key.';
|
|
17123
17352
|
this.parameters = {
|
|
17124
|
-
type:
|
|
17353
|
+
type: 'object',
|
|
17125
17354
|
properties: {
|
|
17126
17355
|
agent_id: {
|
|
17127
|
-
type:
|
|
17128
|
-
description:
|
|
17356
|
+
type: 'string',
|
|
17357
|
+
description: 'The unique identifier of the agent',
|
|
17129
17358
|
},
|
|
17130
17359
|
},
|
|
17131
|
-
required: [
|
|
17360
|
+
required: ['agent_id'],
|
|
17132
17361
|
};
|
|
17133
17362
|
this.metadata = {
|
|
17134
|
-
category:
|
|
17363
|
+
category: 'agent_communication',
|
|
17135
17364
|
requiresAuth: false,
|
|
17136
|
-
riskLevel:
|
|
17365
|
+
riskLevel: 'low',
|
|
17137
17366
|
};
|
|
17138
17367
|
this.client = null;
|
|
17139
17368
|
}
|
|
@@ -17172,7 +17401,7 @@ class GetAgentInfoTool {
|
|
|
17172
17401
|
catch (error) {
|
|
17173
17402
|
return JSON.stringify({
|
|
17174
17403
|
success: false,
|
|
17175
|
-
error: error instanceof Error ? error.message :
|
|
17404
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
17176
17405
|
});
|
|
17177
17406
|
}
|
|
17178
17407
|
}
|
|
@@ -17182,18 +17411,18 @@ class CalculatorTool extends Tool {
|
|
|
17182
17411
|
constructor() {
|
|
17183
17412
|
super(...arguments);
|
|
17184
17413
|
this.metadata = {
|
|
17185
|
-
name:
|
|
17186
|
-
description:
|
|
17414
|
+
name: 'calculator',
|
|
17415
|
+
description: 'Perform mathematical calculations',
|
|
17187
17416
|
parameters: [
|
|
17188
17417
|
{
|
|
17189
|
-
name:
|
|
17190
|
-
type:
|
|
17418
|
+
name: 'expression',
|
|
17419
|
+
type: 'string',
|
|
17191
17420
|
description: 'Mathematical expression to evaluate (e.g., "2 + 2 * 3")',
|
|
17192
17421
|
required: true,
|
|
17193
17422
|
},
|
|
17194
17423
|
],
|
|
17195
|
-
category:
|
|
17196
|
-
compliance_level:
|
|
17424
|
+
category: 'utility',
|
|
17425
|
+
compliance_level: 'public',
|
|
17197
17426
|
};
|
|
17198
17427
|
}
|
|
17199
17428
|
async execute(input) {
|
|
@@ -17201,15 +17430,15 @@ class CalculatorTool extends Tool {
|
|
|
17201
17430
|
const expression = input.expression;
|
|
17202
17431
|
// Basic validation to prevent code injection
|
|
17203
17432
|
if (!/^[\d\s+\-*/.()]+$/.test(expression)) {
|
|
17204
|
-
throw new Error(
|
|
17433
|
+
throw new Error('Invalid expression. Only numbers and basic operators (+, -, *, /, .) are allowed');
|
|
17205
17434
|
}
|
|
17206
17435
|
try {
|
|
17207
17436
|
// Safe evaluation using Function constructor with restricted scope
|
|
17208
|
-
const result = new Function(
|
|
17437
|
+
const result = new Function('return ' + expression)();
|
|
17209
17438
|
return `${expression} = ${result}`;
|
|
17210
17439
|
}
|
|
17211
17440
|
catch (error) {
|
|
17212
|
-
throw new Error(`Calculation failed: ${error instanceof Error ? error.message :
|
|
17441
|
+
throw new Error(`Calculation failed: ${error instanceof Error ? error.message : 'Invalid expression'}`);
|
|
17213
17442
|
}
|
|
17214
17443
|
}
|
|
17215
17444
|
}
|
|
@@ -17218,23 +17447,23 @@ class AuditLogTool extends Tool {
|
|
|
17218
17447
|
constructor() {
|
|
17219
17448
|
super(...arguments);
|
|
17220
17449
|
this.metadata = {
|
|
17221
|
-
name:
|
|
17222
|
-
description:
|
|
17450
|
+
name: 'audit_log',
|
|
17451
|
+
description: 'Log action for compliance audit trail',
|
|
17223
17452
|
parameters: [],
|
|
17224
|
-
category:
|
|
17225
|
-
compliance_level:
|
|
17453
|
+
category: 'compliance',
|
|
17454
|
+
compliance_level: 'public',
|
|
17226
17455
|
};
|
|
17227
17456
|
}
|
|
17228
17457
|
async execute(input) {
|
|
17229
17458
|
const logEntry = {
|
|
17230
17459
|
timestamp: new Date().toISOString(),
|
|
17231
17460
|
action: input.action,
|
|
17232
|
-
actor: input.actor ||
|
|
17461
|
+
actor: input.actor || 'system',
|
|
17233
17462
|
resource: input.resource,
|
|
17234
17463
|
metadata: input.metadata,
|
|
17235
17464
|
};
|
|
17236
17465
|
// In production, send to logging service
|
|
17237
|
-
console.log(
|
|
17466
|
+
console.log('[AUDIT]', JSON.stringify(logEntry));
|
|
17238
17467
|
return { logged: true };
|
|
17239
17468
|
}
|
|
17240
17469
|
}
|
|
@@ -17242,11 +17471,11 @@ class PiiDetectTool extends Tool {
|
|
|
17242
17471
|
constructor() {
|
|
17243
17472
|
super(...arguments);
|
|
17244
17473
|
this.metadata = {
|
|
17245
|
-
name:
|
|
17246
|
-
description:
|
|
17474
|
+
name: 'pii_detect',
|
|
17475
|
+
description: 'Detect personally identifiable information in text',
|
|
17247
17476
|
parameters: [],
|
|
17248
|
-
category:
|
|
17249
|
-
compliance_level:
|
|
17477
|
+
category: 'compliance',
|
|
17478
|
+
compliance_level: 'public',
|
|
17250
17479
|
};
|
|
17251
17480
|
}
|
|
17252
17481
|
async execute(input) {
|
|
@@ -17277,24 +17506,24 @@ class EncryptDataTool extends Tool {
|
|
|
17277
17506
|
constructor() {
|
|
17278
17507
|
super(...arguments);
|
|
17279
17508
|
this.metadata = {
|
|
17280
|
-
name:
|
|
17281
|
-
description:
|
|
17509
|
+
name: 'encrypt_data',
|
|
17510
|
+
description: 'Encrypt sensitive data',
|
|
17282
17511
|
parameters: [],
|
|
17283
|
-
category:
|
|
17284
|
-
compliance_level:
|
|
17512
|
+
category: 'compliance',
|
|
17513
|
+
compliance_level: 'public',
|
|
17285
17514
|
};
|
|
17286
17515
|
}
|
|
17287
17516
|
async execute(input) {
|
|
17288
17517
|
const key = input.key
|
|
17289
|
-
? Buffer.from(createHash(
|
|
17518
|
+
? Buffer.from(createHash('sha256').update(input.key).digest('hex').slice(0, 32))
|
|
17290
17519
|
: randomBytes(32);
|
|
17291
17520
|
const iv = randomBytes(16);
|
|
17292
|
-
const cipher = createCipheriv(
|
|
17293
|
-
let encrypted = cipher.update(input.data,
|
|
17294
|
-
encrypted += cipher.final(
|
|
17521
|
+
const cipher = createCipheriv('aes-256-cbc', key, iv);
|
|
17522
|
+
let encrypted = cipher.update(input.data, 'utf8', 'hex');
|
|
17523
|
+
encrypted += cipher.final('hex');
|
|
17295
17524
|
return {
|
|
17296
17525
|
encrypted,
|
|
17297
|
-
iv: iv.toString(
|
|
17526
|
+
iv: iv.toString('hex'),
|
|
17298
17527
|
};
|
|
17299
17528
|
}
|
|
17300
17529
|
}
|
|
@@ -17302,19 +17531,19 @@ class DecryptDataTool extends Tool {
|
|
|
17302
17531
|
constructor() {
|
|
17303
17532
|
super(...arguments);
|
|
17304
17533
|
this.metadata = {
|
|
17305
|
-
name:
|
|
17306
|
-
description:
|
|
17534
|
+
name: 'decrypt_data',
|
|
17535
|
+
description: 'Decrypt encrypted data (HIGH RISK)',
|
|
17307
17536
|
parameters: [],
|
|
17308
|
-
category:
|
|
17309
|
-
compliance_level:
|
|
17537
|
+
category: 'compliance',
|
|
17538
|
+
compliance_level: 'public',
|
|
17310
17539
|
};
|
|
17311
17540
|
}
|
|
17312
17541
|
async execute(input) {
|
|
17313
|
-
const key = Buffer.from(createHash(
|
|
17314
|
-
const iv = Buffer.from(input.iv,
|
|
17315
|
-
const decipher = createDecipheriv(
|
|
17316
|
-
let decrypted = decipher.update(input.encrypted,
|
|
17317
|
-
decrypted += decipher.final(
|
|
17542
|
+
const key = Buffer.from(createHash('sha256').update(input.key).digest('hex').slice(0, 32));
|
|
17543
|
+
const iv = Buffer.from(input.iv, 'hex');
|
|
17544
|
+
const decipher = createDecipheriv('aes-256-cbc', key, iv);
|
|
17545
|
+
let decrypted = decipher.update(input.encrypted, 'hex', 'utf8');
|
|
17546
|
+
decrypted += decipher.final('utf8');
|
|
17318
17547
|
return decrypted;
|
|
17319
17548
|
}
|
|
17320
17549
|
}
|
|
@@ -17327,7 +17556,7 @@ class JsonStringifyTool extends Tool {
|
|
|
17327
17556
|
description: 'Convert object to JSON string',
|
|
17328
17557
|
parameters: [],
|
|
17329
17558
|
category: 'data',
|
|
17330
|
-
compliance_level: 'public'
|
|
17559
|
+
compliance_level: 'public',
|
|
17331
17560
|
};
|
|
17332
17561
|
}
|
|
17333
17562
|
async execute(input) {
|
|
@@ -17342,7 +17571,7 @@ class CsvParseTool extends Tool {
|
|
|
17342
17571
|
description: 'Parse CSV string to array of objects',
|
|
17343
17572
|
parameters: [],
|
|
17344
17573
|
category: 'data',
|
|
17345
|
-
compliance_level: 'public'
|
|
17574
|
+
compliance_level: 'public',
|
|
17346
17575
|
};
|
|
17347
17576
|
}
|
|
17348
17577
|
async execute(input) {
|
|
@@ -17352,11 +17581,11 @@ class CsvParseTool extends Tool {
|
|
|
17352
17581
|
if (lines.length === 0)
|
|
17353
17582
|
return [];
|
|
17354
17583
|
const headers = hasHeaders
|
|
17355
|
-
? lines[0].split(delimiter).map(h => h.trim())
|
|
17584
|
+
? lines[0].split(delimiter).map((h) => h.trim())
|
|
17356
17585
|
: Array.from({ length: lines[0].split(delimiter).length }, (_, i) => `column${i}`);
|
|
17357
17586
|
const startIndex = hasHeaders ? 1 : 0;
|
|
17358
|
-
return lines.slice(startIndex).map(line => {
|
|
17359
|
-
const values = line.split(delimiter).map(v => v.trim());
|
|
17587
|
+
return lines.slice(startIndex).map((line) => {
|
|
17588
|
+
const values = line.split(delimiter).map((v) => v.trim());
|
|
17360
17589
|
const obj = {};
|
|
17361
17590
|
headers.forEach((header, i) => {
|
|
17362
17591
|
obj[header] = values[i] || '';
|
|
@@ -17373,7 +17602,7 @@ class CsvWriteTool extends Tool {
|
|
|
17373
17602
|
description: 'Convert array of objects to CSV string',
|
|
17374
17603
|
parameters: [],
|
|
17375
17604
|
category: 'data',
|
|
17376
|
-
compliance_level: 'public'
|
|
17605
|
+
compliance_level: 'public',
|
|
17377
17606
|
};
|
|
17378
17607
|
}
|
|
17379
17608
|
async execute(input) {
|
|
@@ -17388,7 +17617,7 @@ class CsvWriteTool extends Tool {
|
|
|
17388
17617
|
rows.push(headers.join(delimiter));
|
|
17389
17618
|
}
|
|
17390
17619
|
for (const item of input.data) {
|
|
17391
|
-
const values = headers.map(header => {
|
|
17620
|
+
const values = headers.map((header) => {
|
|
17392
17621
|
const value = item[header]?.toString() || '';
|
|
17393
17622
|
// Escape values containing delimiter or quotes
|
|
17394
17623
|
return value.includes(delimiter) || value.includes('"')
|
|
@@ -17408,7 +17637,7 @@ class YamlParseTool extends Tool {
|
|
|
17408
17637
|
description: 'Parse YAML string to object',
|
|
17409
17638
|
parameters: [],
|
|
17410
17639
|
category: 'data',
|
|
17411
|
-
compliance_level: 'public'
|
|
17640
|
+
compliance_level: 'public',
|
|
17412
17641
|
};
|
|
17413
17642
|
}
|
|
17414
17643
|
async execute(input) {
|
|
@@ -17454,7 +17683,7 @@ class XmlParseTool extends Tool {
|
|
|
17454
17683
|
description: 'Parse XML string to object',
|
|
17455
17684
|
parameters: [],
|
|
17456
17685
|
category: 'data',
|
|
17457
|
-
compliance_level: 'public'
|
|
17686
|
+
compliance_level: 'public',
|
|
17458
17687
|
};
|
|
17459
17688
|
}
|
|
17460
17689
|
async execute(input) {
|
|
@@ -17474,18 +17703,18 @@ class JsonParseTool extends Tool {
|
|
|
17474
17703
|
constructor() {
|
|
17475
17704
|
super(...arguments);
|
|
17476
17705
|
this.metadata = {
|
|
17477
|
-
name:
|
|
17478
|
-
description:
|
|
17706
|
+
name: 'json_parse',
|
|
17707
|
+
description: 'Parse and format JSON string',
|
|
17479
17708
|
parameters: [
|
|
17480
17709
|
{
|
|
17481
|
-
name:
|
|
17482
|
-
type:
|
|
17483
|
-
description:
|
|
17710
|
+
name: 'json',
|
|
17711
|
+
type: 'string',
|
|
17712
|
+
description: 'JSON string to parse',
|
|
17484
17713
|
required: true,
|
|
17485
17714
|
},
|
|
17486
17715
|
],
|
|
17487
|
-
category:
|
|
17488
|
-
compliance_level:
|
|
17716
|
+
category: 'data',
|
|
17717
|
+
compliance_level: 'internal',
|
|
17489
17718
|
};
|
|
17490
17719
|
}
|
|
17491
17720
|
async execute(input) {
|
|
@@ -17496,7 +17725,7 @@ class JsonParseTool extends Tool {
|
|
|
17496
17725
|
return JSON.stringify(parsed, null, 2);
|
|
17497
17726
|
}
|
|
17498
17727
|
catch (error) {
|
|
17499
|
-
throw new Error(`Invalid JSON: ${error instanceof Error ? error.message :
|
|
17728
|
+
throw new Error(`Invalid JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17500
17729
|
}
|
|
17501
17730
|
}
|
|
17502
17731
|
}
|
|
@@ -17504,52 +17733,52 @@ class Base64EncodeTool extends Tool {
|
|
|
17504
17733
|
constructor() {
|
|
17505
17734
|
super(...arguments);
|
|
17506
17735
|
this.metadata = {
|
|
17507
|
-
name:
|
|
17508
|
-
description:
|
|
17736
|
+
name: 'base64_encode',
|
|
17737
|
+
description: 'Encode text to base64',
|
|
17509
17738
|
parameters: [
|
|
17510
17739
|
{
|
|
17511
|
-
name:
|
|
17512
|
-
type:
|
|
17513
|
-
description:
|
|
17740
|
+
name: 'text',
|
|
17741
|
+
type: 'string',
|
|
17742
|
+
description: 'Text to encode',
|
|
17514
17743
|
required: true,
|
|
17515
17744
|
},
|
|
17516
17745
|
],
|
|
17517
|
-
category:
|
|
17518
|
-
compliance_level:
|
|
17746
|
+
category: 'data',
|
|
17747
|
+
compliance_level: 'internal',
|
|
17519
17748
|
};
|
|
17520
17749
|
}
|
|
17521
17750
|
async execute(input) {
|
|
17522
17751
|
this.validate(input);
|
|
17523
17752
|
const text = input.text;
|
|
17524
|
-
return Buffer.from(text).toString(
|
|
17753
|
+
return Buffer.from(text).toString('base64');
|
|
17525
17754
|
}
|
|
17526
17755
|
}
|
|
17527
17756
|
class Base64DecodeTool extends Tool {
|
|
17528
17757
|
constructor() {
|
|
17529
17758
|
super(...arguments);
|
|
17530
17759
|
this.metadata = {
|
|
17531
|
-
name:
|
|
17532
|
-
description:
|
|
17760
|
+
name: 'base64_decode',
|
|
17761
|
+
description: 'Decode base64 string to text',
|
|
17533
17762
|
parameters: [
|
|
17534
17763
|
{
|
|
17535
|
-
name:
|
|
17536
|
-
type:
|
|
17537
|
-
description:
|
|
17764
|
+
name: 'base64',
|
|
17765
|
+
type: 'string',
|
|
17766
|
+
description: 'Base64 string to decode',
|
|
17538
17767
|
required: true,
|
|
17539
17768
|
},
|
|
17540
17769
|
],
|
|
17541
|
-
category:
|
|
17542
|
-
compliance_level:
|
|
17770
|
+
category: 'data',
|
|
17771
|
+
compliance_level: 'internal',
|
|
17543
17772
|
};
|
|
17544
17773
|
}
|
|
17545
17774
|
async execute(input) {
|
|
17546
17775
|
this.validate(input);
|
|
17547
17776
|
const base64Str = input.base64;
|
|
17548
17777
|
try {
|
|
17549
|
-
return Buffer.from(base64Str,
|
|
17778
|
+
return Buffer.from(base64Str, 'base64').toString('utf-8');
|
|
17550
17779
|
}
|
|
17551
17780
|
catch (error) {
|
|
17552
|
-
throw new Error(`Invalid base64: ${error instanceof Error ? error.message :
|
|
17781
|
+
throw new Error(`Invalid base64: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17553
17782
|
}
|
|
17554
17783
|
}
|
|
17555
17784
|
}
|
|
@@ -17557,37 +17786,37 @@ class HashTool extends Tool {
|
|
|
17557
17786
|
constructor() {
|
|
17558
17787
|
super(...arguments);
|
|
17559
17788
|
this.metadata = {
|
|
17560
|
-
name:
|
|
17561
|
-
description:
|
|
17789
|
+
name: 'hash',
|
|
17790
|
+
description: 'Generate cryptographic hash (md5, sha256, sha512, etc.)',
|
|
17562
17791
|
parameters: [
|
|
17563
17792
|
{
|
|
17564
|
-
name:
|
|
17565
|
-
type:
|
|
17566
|
-
description:
|
|
17793
|
+
name: 'text',
|
|
17794
|
+
type: 'string',
|
|
17795
|
+
description: 'Text to hash',
|
|
17567
17796
|
required: true,
|
|
17568
17797
|
},
|
|
17569
17798
|
{
|
|
17570
|
-
name:
|
|
17571
|
-
type:
|
|
17572
|
-
description:
|
|
17799
|
+
name: 'algorithm',
|
|
17800
|
+
type: 'string',
|
|
17801
|
+
description: 'Hash algorithm (default: sha256)',
|
|
17573
17802
|
required: false,
|
|
17574
17803
|
},
|
|
17575
17804
|
],
|
|
17576
|
-
category:
|
|
17577
|
-
compliance_level:
|
|
17805
|
+
category: 'data',
|
|
17806
|
+
compliance_level: 'internal',
|
|
17578
17807
|
};
|
|
17579
17808
|
}
|
|
17580
17809
|
async execute(input) {
|
|
17581
17810
|
this.validate(input);
|
|
17582
17811
|
const text = input.text;
|
|
17583
|
-
const algorithm = input.algorithm ||
|
|
17812
|
+
const algorithm = input.algorithm || 'sha256';
|
|
17584
17813
|
try {
|
|
17585
17814
|
const hash = crypto$2.createHash(algorithm);
|
|
17586
17815
|
hash.update(text);
|
|
17587
|
-
return hash.digest(
|
|
17816
|
+
return hash.digest('hex');
|
|
17588
17817
|
}
|
|
17589
17818
|
catch (error) {
|
|
17590
|
-
throw new Error(`Hash generation failed: ${error instanceof Error ? error.message :
|
|
17819
|
+
throw new Error(`Hash generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17591
17820
|
}
|
|
17592
17821
|
}
|
|
17593
17822
|
}
|
|
@@ -17596,36 +17825,36 @@ class DirectoryListTool extends Tool {
|
|
|
17596
17825
|
constructor() {
|
|
17597
17826
|
super(...arguments);
|
|
17598
17827
|
this.metadata = {
|
|
17599
|
-
name:
|
|
17600
|
-
description:
|
|
17828
|
+
name: 'dir_list',
|
|
17829
|
+
description: 'List contents of a directory',
|
|
17601
17830
|
parameters: [
|
|
17602
17831
|
{
|
|
17603
|
-
name:
|
|
17604
|
-
type:
|
|
17605
|
-
description:
|
|
17832
|
+
name: 'path',
|
|
17833
|
+
type: 'string',
|
|
17834
|
+
description: 'Path to the directory',
|
|
17606
17835
|
required: true,
|
|
17607
17836
|
},
|
|
17608
17837
|
],
|
|
17609
|
-
category:
|
|
17610
|
-
compliance_level:
|
|
17838
|
+
category: 'directories',
|
|
17839
|
+
compliance_level: 'internal',
|
|
17611
17840
|
};
|
|
17612
17841
|
}
|
|
17613
17842
|
async execute(input) {
|
|
17614
17843
|
this.validate(input);
|
|
17615
17844
|
const dirPath = input.path;
|
|
17616
17845
|
if (this.policyEnforcer) {
|
|
17617
|
-
this.policyEnforcer.enforceFilesystem(dirPath,
|
|
17846
|
+
this.policyEnforcer.enforceFilesystem(dirPath, 'read');
|
|
17618
17847
|
}
|
|
17619
17848
|
try {
|
|
17620
17849
|
const files = await fs$2.readdir(dirPath, { withFileTypes: true });
|
|
17621
17850
|
const formatted = files.map((file) => {
|
|
17622
|
-
const type = file.isDirectory() ?
|
|
17851
|
+
const type = file.isDirectory() ? '[DIR]' : '[FILE]';
|
|
17623
17852
|
return `${type} ${file.name}`;
|
|
17624
17853
|
});
|
|
17625
|
-
return formatted.join(
|
|
17854
|
+
return formatted.join('\n');
|
|
17626
17855
|
}
|
|
17627
17856
|
catch (error) {
|
|
17628
|
-
throw new Error(`Failed to list directory: ${error instanceof Error ? error.message :
|
|
17857
|
+
throw new Error(`Failed to list directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17629
17858
|
}
|
|
17630
17859
|
}
|
|
17631
17860
|
}
|
|
@@ -17633,40 +17862,40 @@ class DirectoryMkdirTool extends Tool {
|
|
|
17633
17862
|
constructor() {
|
|
17634
17863
|
super(...arguments);
|
|
17635
17864
|
this.metadata = {
|
|
17636
|
-
name:
|
|
17637
|
-
description:
|
|
17865
|
+
name: 'dir_mkdir',
|
|
17866
|
+
description: 'Create a new directory',
|
|
17638
17867
|
parameters: [
|
|
17639
17868
|
{
|
|
17640
|
-
name:
|
|
17641
|
-
type:
|
|
17642
|
-
description:
|
|
17869
|
+
name: 'path',
|
|
17870
|
+
type: 'string',
|
|
17871
|
+
description: 'Path to the directory to create',
|
|
17643
17872
|
required: true,
|
|
17644
17873
|
},
|
|
17645
17874
|
{
|
|
17646
|
-
name:
|
|
17647
|
-
type:
|
|
17875
|
+
name: 'recursive',
|
|
17876
|
+
type: 'boolean',
|
|
17648
17877
|
description: "Create parent directories if they don't exist",
|
|
17649
17878
|
required: false,
|
|
17650
17879
|
},
|
|
17651
17880
|
],
|
|
17652
|
-
category:
|
|
17653
|
-
compliance_level:
|
|
17881
|
+
category: 'directories',
|
|
17882
|
+
compliance_level: 'restricted',
|
|
17654
17883
|
requires_approval: true,
|
|
17655
17884
|
};
|
|
17656
17885
|
}
|
|
17657
17886
|
async execute(input) {
|
|
17658
17887
|
this.validate(input);
|
|
17659
17888
|
const dirPath = input.path;
|
|
17660
|
-
const recursive = input.recursive === true || input.recursive ===
|
|
17889
|
+
const recursive = input.recursive === true || input.recursive === 'true';
|
|
17661
17890
|
if (this.policyEnforcer) {
|
|
17662
|
-
this.policyEnforcer.enforceFilesystem(dirPath,
|
|
17891
|
+
this.policyEnforcer.enforceFilesystem(dirPath, 'write');
|
|
17663
17892
|
}
|
|
17664
17893
|
try {
|
|
17665
17894
|
await fs$2.mkdir(dirPath, { recursive });
|
|
17666
17895
|
return `Successfully created directory ${dirPath}`;
|
|
17667
17896
|
}
|
|
17668
17897
|
catch (error) {
|
|
17669
|
-
throw new Error(`Failed to create directory: ${error instanceof Error ? error.message :
|
|
17898
|
+
throw new Error(`Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17670
17899
|
}
|
|
17671
17900
|
}
|
|
17672
17901
|
}
|
|
@@ -17674,18 +17903,18 @@ class DirectoryRmdirTool extends Tool {
|
|
|
17674
17903
|
constructor() {
|
|
17675
17904
|
super(...arguments);
|
|
17676
17905
|
this.metadata = {
|
|
17677
|
-
name:
|
|
17678
|
-
description:
|
|
17906
|
+
name: 'dir_rmdir',
|
|
17907
|
+
description: 'Remove an empty directory',
|
|
17679
17908
|
parameters: [
|
|
17680
17909
|
{
|
|
17681
|
-
name:
|
|
17682
|
-
type:
|
|
17683
|
-
description:
|
|
17910
|
+
name: 'path',
|
|
17911
|
+
type: 'string',
|
|
17912
|
+
description: 'Path to the directory to remove',
|
|
17684
17913
|
required: true,
|
|
17685
17914
|
},
|
|
17686
17915
|
],
|
|
17687
|
-
category:
|
|
17688
|
-
compliance_level:
|
|
17916
|
+
category: 'directories',
|
|
17917
|
+
compliance_level: 'restricted',
|
|
17689
17918
|
requires_approval: true,
|
|
17690
17919
|
};
|
|
17691
17920
|
}
|
|
@@ -17693,14 +17922,14 @@ class DirectoryRmdirTool extends Tool {
|
|
|
17693
17922
|
this.validate(input);
|
|
17694
17923
|
const dirPath = input.path;
|
|
17695
17924
|
if (this.policyEnforcer) {
|
|
17696
|
-
this.policyEnforcer.enforceFilesystem(dirPath,
|
|
17925
|
+
this.policyEnforcer.enforceFilesystem(dirPath, 'delete');
|
|
17697
17926
|
}
|
|
17698
17927
|
try {
|
|
17699
17928
|
await fs$2.rmdir(dirPath);
|
|
17700
17929
|
return `Successfully removed directory ${dirPath}`;
|
|
17701
17930
|
}
|
|
17702
17931
|
catch (error) {
|
|
17703
|
-
throw new Error(`Failed to remove directory: ${error instanceof Error ? error.message :
|
|
17932
|
+
throw new Error(`Failed to remove directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17704
17933
|
}
|
|
17705
17934
|
}
|
|
17706
17935
|
}
|
|
@@ -17708,18 +17937,18 @@ class DirectoryRmRecursiveTool extends Tool {
|
|
|
17708
17937
|
constructor() {
|
|
17709
17938
|
super(...arguments);
|
|
17710
17939
|
this.metadata = {
|
|
17711
|
-
name:
|
|
17712
|
-
description:
|
|
17940
|
+
name: 'dir_rm_recursive',
|
|
17941
|
+
description: 'Remove a directory and all its contents (DANGEROUS - use with caution)',
|
|
17713
17942
|
parameters: [
|
|
17714
17943
|
{
|
|
17715
|
-
name:
|
|
17716
|
-
type:
|
|
17717
|
-
description:
|
|
17944
|
+
name: 'path',
|
|
17945
|
+
type: 'string',
|
|
17946
|
+
description: 'Path to the directory to remove recursively',
|
|
17718
17947
|
required: true,
|
|
17719
17948
|
},
|
|
17720
17949
|
],
|
|
17721
|
-
category:
|
|
17722
|
-
compliance_level:
|
|
17950
|
+
category: 'directories',
|
|
17951
|
+
compliance_level: 'restricted',
|
|
17723
17952
|
requires_approval: true,
|
|
17724
17953
|
};
|
|
17725
17954
|
}
|
|
@@ -17727,14 +17956,14 @@ class DirectoryRmRecursiveTool extends Tool {
|
|
|
17727
17956
|
this.validate(input);
|
|
17728
17957
|
const dirPath = input.path;
|
|
17729
17958
|
if (this.policyEnforcer) {
|
|
17730
|
-
this.policyEnforcer.enforceFilesystem(dirPath,
|
|
17959
|
+
this.policyEnforcer.enforceFilesystem(dirPath, 'delete');
|
|
17731
17960
|
}
|
|
17732
17961
|
try {
|
|
17733
17962
|
await fs$2.rm(dirPath, { recursive: true, force: true });
|
|
17734
17963
|
return `Successfully removed directory and contents: ${dirPath}`;
|
|
17735
17964
|
}
|
|
17736
17965
|
catch (error) {
|
|
17737
|
-
throw new Error(`Failed to remove directory recursively: ${error instanceof Error ? error.message :
|
|
17966
|
+
throw new Error(`Failed to remove directory recursively: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17738
17967
|
}
|
|
17739
17968
|
}
|
|
17740
17969
|
}
|
|
@@ -17742,32 +17971,32 @@ class DirectoryExistsTool extends Tool {
|
|
|
17742
17971
|
constructor() {
|
|
17743
17972
|
super(...arguments);
|
|
17744
17973
|
this.metadata = {
|
|
17745
|
-
name:
|
|
17746
|
-
description:
|
|
17974
|
+
name: 'dir_exists',
|
|
17975
|
+
description: 'Check if a directory exists',
|
|
17747
17976
|
parameters: [
|
|
17748
17977
|
{
|
|
17749
|
-
name:
|
|
17750
|
-
type:
|
|
17751
|
-
description:
|
|
17978
|
+
name: 'path',
|
|
17979
|
+
type: 'string',
|
|
17980
|
+
description: 'Path to check',
|
|
17752
17981
|
required: true,
|
|
17753
17982
|
},
|
|
17754
17983
|
],
|
|
17755
|
-
category:
|
|
17756
|
-
compliance_level:
|
|
17984
|
+
category: 'directories',
|
|
17985
|
+
compliance_level: 'internal',
|
|
17757
17986
|
};
|
|
17758
17987
|
}
|
|
17759
17988
|
async execute(input) {
|
|
17760
17989
|
this.validate(input);
|
|
17761
17990
|
const dirPath = input.path;
|
|
17762
17991
|
if (this.policyEnforcer) {
|
|
17763
|
-
this.policyEnforcer.enforceFilesystem(dirPath,
|
|
17992
|
+
this.policyEnforcer.enforceFilesystem(dirPath, 'read');
|
|
17764
17993
|
}
|
|
17765
17994
|
try {
|
|
17766
17995
|
const stats = await fs$2.stat(dirPath);
|
|
17767
|
-
return stats.isDirectory() ?
|
|
17996
|
+
return stats.isDirectory() ? 'true' : 'false';
|
|
17768
17997
|
}
|
|
17769
17998
|
catch {
|
|
17770
|
-
return
|
|
17999
|
+
return 'false';
|
|
17771
18000
|
}
|
|
17772
18001
|
}
|
|
17773
18002
|
}
|
|
@@ -17775,11 +18004,11 @@ class DirectoryMoveTool extends Tool {
|
|
|
17775
18004
|
constructor() {
|
|
17776
18005
|
super(...arguments);
|
|
17777
18006
|
this.metadata = {
|
|
17778
|
-
name:
|
|
17779
|
-
description:
|
|
18007
|
+
name: 'dir_move',
|
|
18008
|
+
description: 'Move or rename directory',
|
|
17780
18009
|
parameters: [],
|
|
17781
|
-
category:
|
|
17782
|
-
compliance_level:
|
|
18010
|
+
category: 'directories',
|
|
18011
|
+
compliance_level: 'public',
|
|
17783
18012
|
};
|
|
17784
18013
|
}
|
|
17785
18014
|
async execute(input) {
|
|
@@ -17791,11 +18020,11 @@ class DirectoryCopyTool extends Tool {
|
|
|
17791
18020
|
constructor() {
|
|
17792
18021
|
super(...arguments);
|
|
17793
18022
|
this.metadata = {
|
|
17794
|
-
name:
|
|
17795
|
-
description:
|
|
18023
|
+
name: 'dir_copy',
|
|
18024
|
+
description: 'Copy directory recursively',
|
|
17796
18025
|
parameters: [],
|
|
17797
|
-
category:
|
|
17798
|
-
compliance_level:
|
|
18026
|
+
category: 'directories',
|
|
18027
|
+
compliance_level: 'public',
|
|
17799
18028
|
};
|
|
17800
18029
|
}
|
|
17801
18030
|
async execute(input) {
|
|
@@ -17807,11 +18036,11 @@ class DirectoryTreeTool extends Tool {
|
|
|
17807
18036
|
constructor() {
|
|
17808
18037
|
super(...arguments);
|
|
17809
18038
|
this.metadata = {
|
|
17810
|
-
name:
|
|
17811
|
-
description:
|
|
18039
|
+
name: 'dir_tree',
|
|
18040
|
+
description: 'Get directory tree structure',
|
|
17812
18041
|
parameters: [],
|
|
17813
|
-
category:
|
|
17814
|
-
compliance_level:
|
|
18042
|
+
category: 'directories',
|
|
18043
|
+
compliance_level: 'public',
|
|
17815
18044
|
};
|
|
17816
18045
|
}
|
|
17817
18046
|
async execute(input) {
|
|
@@ -17830,7 +18059,7 @@ class DirectoryTreeTool extends Tool {
|
|
|
17830
18059
|
}
|
|
17831
18060
|
}
|
|
17832
18061
|
else {
|
|
17833
|
-
tree.children.push({ name: entry.name, type:
|
|
18062
|
+
tree.children.push({ name: entry.name, type: 'file' });
|
|
17834
18063
|
}
|
|
17835
18064
|
}
|
|
17836
18065
|
return tree;
|
|
@@ -17843,18 +18072,18 @@ class FileReadTool extends Tool {
|
|
|
17843
18072
|
constructor() {
|
|
17844
18073
|
super(...arguments);
|
|
17845
18074
|
this.metadata = {
|
|
17846
|
-
name:
|
|
17847
|
-
description:
|
|
18075
|
+
name: 'file_read',
|
|
18076
|
+
description: 'Read contents of a file',
|
|
17848
18077
|
parameters: [
|
|
17849
18078
|
{
|
|
17850
|
-
name:
|
|
17851
|
-
type:
|
|
17852
|
-
description:
|
|
18079
|
+
name: 'path',
|
|
18080
|
+
type: 'string',
|
|
18081
|
+
description: 'Path to the file to read',
|
|
17853
18082
|
required: true,
|
|
17854
18083
|
},
|
|
17855
18084
|
],
|
|
17856
|
-
category:
|
|
17857
|
-
compliance_level:
|
|
18085
|
+
category: 'filesystem',
|
|
18086
|
+
compliance_level: 'restricted',
|
|
17858
18087
|
requires_approval: true,
|
|
17859
18088
|
};
|
|
17860
18089
|
}
|
|
@@ -17862,14 +18091,14 @@ class FileReadTool extends Tool {
|
|
|
17862
18091
|
this.validate(input);
|
|
17863
18092
|
const filePath = input.path;
|
|
17864
18093
|
if (this.policyEnforcer) {
|
|
17865
|
-
this.policyEnforcer.enforceFilesystem(filePath,
|
|
18094
|
+
this.policyEnforcer.enforceFilesystem(filePath, 'read');
|
|
17866
18095
|
}
|
|
17867
18096
|
try {
|
|
17868
|
-
const content = await fs$2.readFile(filePath,
|
|
18097
|
+
const content = await fs$2.readFile(filePath, 'utf-8');
|
|
17869
18098
|
return content;
|
|
17870
18099
|
}
|
|
17871
18100
|
catch (error) {
|
|
17872
|
-
throw new Error(`Failed to read file: ${error instanceof Error ? error.message :
|
|
18101
|
+
throw new Error(`Failed to read file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17873
18102
|
}
|
|
17874
18103
|
}
|
|
17875
18104
|
}
|
|
@@ -17877,24 +18106,24 @@ class FileWriteTool extends Tool {
|
|
|
17877
18106
|
constructor() {
|
|
17878
18107
|
super(...arguments);
|
|
17879
18108
|
this.metadata = {
|
|
17880
|
-
name:
|
|
17881
|
-
description:
|
|
18109
|
+
name: 'file_write',
|
|
18110
|
+
description: 'Write content to a file',
|
|
17882
18111
|
parameters: [
|
|
17883
18112
|
{
|
|
17884
|
-
name:
|
|
17885
|
-
type:
|
|
17886
|
-
description:
|
|
18113
|
+
name: 'path',
|
|
18114
|
+
type: 'string',
|
|
18115
|
+
description: 'Path to the file to write',
|
|
17887
18116
|
required: true,
|
|
17888
18117
|
},
|
|
17889
18118
|
{
|
|
17890
|
-
name:
|
|
17891
|
-
type:
|
|
17892
|
-
description:
|
|
18119
|
+
name: 'content',
|
|
18120
|
+
type: 'string',
|
|
18121
|
+
description: 'Content to write to the file',
|
|
17893
18122
|
required: true,
|
|
17894
18123
|
},
|
|
17895
18124
|
],
|
|
17896
|
-
category:
|
|
17897
|
-
compliance_level:
|
|
18125
|
+
category: 'filesystem',
|
|
18126
|
+
compliance_level: 'restricted',
|
|
17898
18127
|
requires_approval: true,
|
|
17899
18128
|
};
|
|
17900
18129
|
}
|
|
@@ -17903,14 +18132,14 @@ class FileWriteTool extends Tool {
|
|
|
17903
18132
|
const filePath = input.path;
|
|
17904
18133
|
const content = input.content;
|
|
17905
18134
|
if (this.policyEnforcer) {
|
|
17906
|
-
this.policyEnforcer.enforceFilesystem(filePath,
|
|
18135
|
+
this.policyEnforcer.enforceFilesystem(filePath, 'write');
|
|
17907
18136
|
}
|
|
17908
18137
|
try {
|
|
17909
|
-
await fs$2.writeFile(filePath, content,
|
|
18138
|
+
await fs$2.writeFile(filePath, content, 'utf-8');
|
|
17910
18139
|
return `Successfully wrote to ${filePath}`;
|
|
17911
18140
|
}
|
|
17912
18141
|
catch (error) {
|
|
17913
|
-
throw new Error(`Failed to write file: ${error instanceof Error ? error.message :
|
|
18142
|
+
throw new Error(`Failed to write file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17914
18143
|
}
|
|
17915
18144
|
}
|
|
17916
18145
|
}
|
|
@@ -17918,32 +18147,32 @@ class FileListTool extends Tool {
|
|
|
17918
18147
|
constructor() {
|
|
17919
18148
|
super(...arguments);
|
|
17920
18149
|
this.metadata = {
|
|
17921
|
-
name:
|
|
17922
|
-
description:
|
|
18150
|
+
name: 'file_list',
|
|
18151
|
+
description: 'List files in a directory',
|
|
17923
18152
|
parameters: [
|
|
17924
18153
|
{
|
|
17925
|
-
name:
|
|
17926
|
-
type:
|
|
17927
|
-
description:
|
|
18154
|
+
name: 'path',
|
|
18155
|
+
type: 'string',
|
|
18156
|
+
description: 'Path to the directory',
|
|
17928
18157
|
required: true,
|
|
17929
18158
|
},
|
|
17930
18159
|
],
|
|
17931
|
-
category:
|
|
17932
|
-
compliance_level:
|
|
18160
|
+
category: 'filesystem',
|
|
18161
|
+
compliance_level: 'internal',
|
|
17933
18162
|
};
|
|
17934
18163
|
}
|
|
17935
18164
|
async execute(input) {
|
|
17936
18165
|
this.validate(input);
|
|
17937
18166
|
const dirPath = input.path;
|
|
17938
18167
|
if (this.policyEnforcer) {
|
|
17939
|
-
this.policyEnforcer.enforceFilesystem(dirPath,
|
|
18168
|
+
this.policyEnforcer.enforceFilesystem(dirPath, 'read');
|
|
17940
18169
|
}
|
|
17941
18170
|
try {
|
|
17942
18171
|
const files = await fs$2.readdir(dirPath);
|
|
17943
|
-
return files.join(
|
|
18172
|
+
return files.join('\n');
|
|
17944
18173
|
}
|
|
17945
18174
|
catch (error) {
|
|
17946
|
-
throw new Error(`Failed to list directory: ${error instanceof Error ? error.message :
|
|
18175
|
+
throw new Error(`Failed to list directory: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17947
18176
|
}
|
|
17948
18177
|
}
|
|
17949
18178
|
}
|
|
@@ -17951,24 +18180,24 @@ class FileAppendTool extends Tool {
|
|
|
17951
18180
|
constructor() {
|
|
17952
18181
|
super(...arguments);
|
|
17953
18182
|
this.metadata = {
|
|
17954
|
-
name:
|
|
17955
|
-
description:
|
|
18183
|
+
name: 'file_append',
|
|
18184
|
+
description: 'Append content to the end of a file',
|
|
17956
18185
|
parameters: [
|
|
17957
18186
|
{
|
|
17958
|
-
name:
|
|
17959
|
-
type:
|
|
17960
|
-
description:
|
|
18187
|
+
name: 'path',
|
|
18188
|
+
type: 'string',
|
|
18189
|
+
description: 'Path to the file',
|
|
17961
18190
|
required: true,
|
|
17962
18191
|
},
|
|
17963
18192
|
{
|
|
17964
|
-
name:
|
|
17965
|
-
type:
|
|
17966
|
-
description:
|
|
18193
|
+
name: 'content',
|
|
18194
|
+
type: 'string',
|
|
18195
|
+
description: 'Content to append',
|
|
17967
18196
|
required: true,
|
|
17968
18197
|
},
|
|
17969
18198
|
],
|
|
17970
|
-
category:
|
|
17971
|
-
compliance_level:
|
|
18199
|
+
category: 'files',
|
|
18200
|
+
compliance_level: 'restricted',
|
|
17972
18201
|
requires_approval: true,
|
|
17973
18202
|
};
|
|
17974
18203
|
}
|
|
@@ -17977,14 +18206,14 @@ class FileAppendTool extends Tool {
|
|
|
17977
18206
|
const filePath = input.path;
|
|
17978
18207
|
const content = input.content;
|
|
17979
18208
|
if (this.policyEnforcer) {
|
|
17980
|
-
this.policyEnforcer.enforceFilesystem(filePath,
|
|
18209
|
+
this.policyEnforcer.enforceFilesystem(filePath, 'write');
|
|
17981
18210
|
}
|
|
17982
18211
|
try {
|
|
17983
|
-
await fs$2.appendFile(filePath, content,
|
|
18212
|
+
await fs$2.appendFile(filePath, content, 'utf-8');
|
|
17984
18213
|
return `Successfully appended to ${filePath}`;
|
|
17985
18214
|
}
|
|
17986
18215
|
catch (error) {
|
|
17987
|
-
throw new Error(`Failed to append to file: ${error instanceof Error ? error.message :
|
|
18216
|
+
throw new Error(`Failed to append to file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
17988
18217
|
}
|
|
17989
18218
|
}
|
|
17990
18219
|
}
|
|
@@ -17992,18 +18221,18 @@ class FileDeleteTool extends Tool {
|
|
|
17992
18221
|
constructor() {
|
|
17993
18222
|
super(...arguments);
|
|
17994
18223
|
this.metadata = {
|
|
17995
|
-
name:
|
|
17996
|
-
description:
|
|
18224
|
+
name: 'file_delete',
|
|
18225
|
+
description: 'Delete a file',
|
|
17997
18226
|
parameters: [
|
|
17998
18227
|
{
|
|
17999
|
-
name:
|
|
18000
|
-
type:
|
|
18001
|
-
description:
|
|
18228
|
+
name: 'path',
|
|
18229
|
+
type: 'string',
|
|
18230
|
+
description: 'Path to the file to delete',
|
|
18002
18231
|
required: true,
|
|
18003
18232
|
},
|
|
18004
18233
|
],
|
|
18005
|
-
category:
|
|
18006
|
-
compliance_level:
|
|
18234
|
+
category: 'files',
|
|
18235
|
+
compliance_level: 'restricted',
|
|
18007
18236
|
requires_approval: true,
|
|
18008
18237
|
};
|
|
18009
18238
|
}
|
|
@@ -18011,14 +18240,14 @@ class FileDeleteTool extends Tool {
|
|
|
18011
18240
|
this.validate(input);
|
|
18012
18241
|
const filePath = input.path;
|
|
18013
18242
|
if (this.policyEnforcer) {
|
|
18014
|
-
this.policyEnforcer.enforceFilesystem(filePath,
|
|
18243
|
+
this.policyEnforcer.enforceFilesystem(filePath, 'delete');
|
|
18015
18244
|
}
|
|
18016
18245
|
try {
|
|
18017
18246
|
await fs$2.unlink(filePath);
|
|
18018
18247
|
return `Successfully deleted ${filePath}`;
|
|
18019
18248
|
}
|
|
18020
18249
|
catch (error) {
|
|
18021
|
-
throw new Error(`Failed to delete file: ${error instanceof Error ? error.message :
|
|
18250
|
+
throw new Error(`Failed to delete file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
18022
18251
|
}
|
|
18023
18252
|
}
|
|
18024
18253
|
}
|
|
@@ -18026,24 +18255,24 @@ class FileMoveTool extends Tool {
|
|
|
18026
18255
|
constructor() {
|
|
18027
18256
|
super(...arguments);
|
|
18028
18257
|
this.metadata = {
|
|
18029
|
-
name:
|
|
18030
|
-
description:
|
|
18258
|
+
name: 'file_move',
|
|
18259
|
+
description: 'Move or rename a file',
|
|
18031
18260
|
parameters: [
|
|
18032
18261
|
{
|
|
18033
|
-
name:
|
|
18034
|
-
type:
|
|
18035
|
-
description:
|
|
18262
|
+
name: 'from',
|
|
18263
|
+
type: 'string',
|
|
18264
|
+
description: 'Source file path',
|
|
18036
18265
|
required: true,
|
|
18037
18266
|
},
|
|
18038
18267
|
{
|
|
18039
|
-
name:
|
|
18040
|
-
type:
|
|
18041
|
-
description:
|
|
18268
|
+
name: 'to',
|
|
18269
|
+
type: 'string',
|
|
18270
|
+
description: 'Destination file path',
|
|
18042
18271
|
required: true,
|
|
18043
18272
|
},
|
|
18044
18273
|
],
|
|
18045
|
-
category:
|
|
18046
|
-
compliance_level:
|
|
18274
|
+
category: 'files',
|
|
18275
|
+
compliance_level: 'restricted',
|
|
18047
18276
|
requires_approval: true,
|
|
18048
18277
|
};
|
|
18049
18278
|
}
|
|
@@ -18052,15 +18281,15 @@ class FileMoveTool extends Tool {
|
|
|
18052
18281
|
const fromPath = input.from;
|
|
18053
18282
|
const toPath = input.to;
|
|
18054
18283
|
if (this.policyEnforcer) {
|
|
18055
|
-
this.policyEnforcer.enforceFilesystem(fromPath,
|
|
18056
|
-
this.policyEnforcer.enforceFilesystem(toPath,
|
|
18284
|
+
this.policyEnforcer.enforceFilesystem(fromPath, 'read');
|
|
18285
|
+
this.policyEnforcer.enforceFilesystem(toPath, 'write');
|
|
18057
18286
|
}
|
|
18058
18287
|
try {
|
|
18059
18288
|
await fs$2.rename(fromPath, toPath);
|
|
18060
18289
|
return `Successfully moved ${fromPath} to ${toPath}`;
|
|
18061
18290
|
}
|
|
18062
18291
|
catch (error) {
|
|
18063
|
-
throw new Error(`Failed to move file: ${error instanceof Error ? error.message :
|
|
18292
|
+
throw new Error(`Failed to move file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
18064
18293
|
}
|
|
18065
18294
|
}
|
|
18066
18295
|
}
|
|
@@ -18068,24 +18297,24 @@ class FileCopyTool extends Tool {
|
|
|
18068
18297
|
constructor() {
|
|
18069
18298
|
super(...arguments);
|
|
18070
18299
|
this.metadata = {
|
|
18071
|
-
name:
|
|
18072
|
-
description:
|
|
18300
|
+
name: 'file_copy',
|
|
18301
|
+
description: 'Copy a file to another location',
|
|
18073
18302
|
parameters: [
|
|
18074
18303
|
{
|
|
18075
|
-
name:
|
|
18076
|
-
type:
|
|
18077
|
-
description:
|
|
18304
|
+
name: 'from',
|
|
18305
|
+
type: 'string',
|
|
18306
|
+
description: 'Source file path',
|
|
18078
18307
|
required: true,
|
|
18079
18308
|
},
|
|
18080
18309
|
{
|
|
18081
|
-
name:
|
|
18082
|
-
type:
|
|
18083
|
-
description:
|
|
18310
|
+
name: 'to',
|
|
18311
|
+
type: 'string',
|
|
18312
|
+
description: 'Destination file path',
|
|
18084
18313
|
required: true,
|
|
18085
18314
|
},
|
|
18086
18315
|
],
|
|
18087
|
-
category:
|
|
18088
|
-
compliance_level:
|
|
18316
|
+
category: 'files',
|
|
18317
|
+
compliance_level: 'restricted',
|
|
18089
18318
|
requires_approval: true,
|
|
18090
18319
|
};
|
|
18091
18320
|
}
|
|
@@ -18094,15 +18323,15 @@ class FileCopyTool extends Tool {
|
|
|
18094
18323
|
const fromPath = input.from;
|
|
18095
18324
|
const toPath = input.to;
|
|
18096
18325
|
if (this.policyEnforcer) {
|
|
18097
|
-
this.policyEnforcer.enforceFilesystem(fromPath,
|
|
18098
|
-
this.policyEnforcer.enforceFilesystem(toPath,
|
|
18326
|
+
this.policyEnforcer.enforceFilesystem(fromPath, 'read');
|
|
18327
|
+
this.policyEnforcer.enforceFilesystem(toPath, 'write');
|
|
18099
18328
|
}
|
|
18100
18329
|
try {
|
|
18101
18330
|
await fs$2.copyFile(fromPath, toPath);
|
|
18102
18331
|
return `Successfully copied ${fromPath} to ${toPath}`;
|
|
18103
18332
|
}
|
|
18104
18333
|
catch (error) {
|
|
18105
|
-
throw new Error(`Failed to copy file: ${error instanceof Error ? error.message :
|
|
18334
|
+
throw new Error(`Failed to copy file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
18106
18335
|
}
|
|
18107
18336
|
}
|
|
18108
18337
|
}
|
|
@@ -18110,25 +18339,25 @@ class FileStatTool extends Tool {
|
|
|
18110
18339
|
constructor() {
|
|
18111
18340
|
super(...arguments);
|
|
18112
18341
|
this.metadata = {
|
|
18113
|
-
name:
|
|
18114
|
-
description:
|
|
18342
|
+
name: 'file_stat',
|
|
18343
|
+
description: 'Get file metadata (size, dates, type)',
|
|
18115
18344
|
parameters: [
|
|
18116
18345
|
{
|
|
18117
|
-
name:
|
|
18118
|
-
type:
|
|
18119
|
-
description:
|
|
18346
|
+
name: 'path',
|
|
18347
|
+
type: 'string',
|
|
18348
|
+
description: 'Path to the file',
|
|
18120
18349
|
required: true,
|
|
18121
18350
|
},
|
|
18122
18351
|
],
|
|
18123
|
-
category:
|
|
18124
|
-
compliance_level:
|
|
18352
|
+
category: 'files',
|
|
18353
|
+
compliance_level: 'internal',
|
|
18125
18354
|
};
|
|
18126
18355
|
}
|
|
18127
18356
|
async execute(input) {
|
|
18128
18357
|
this.validate(input);
|
|
18129
18358
|
const filePath = input.path;
|
|
18130
18359
|
if (this.policyEnforcer) {
|
|
18131
|
-
this.policyEnforcer.enforceFilesystem(filePath,
|
|
18360
|
+
this.policyEnforcer.enforceFilesystem(filePath, 'read');
|
|
18132
18361
|
}
|
|
18133
18362
|
try {
|
|
18134
18363
|
const stats = await fs$2.stat(filePath);
|
|
@@ -18143,7 +18372,7 @@ class FileStatTool extends Tool {
|
|
|
18143
18372
|
}, null, 2);
|
|
18144
18373
|
}
|
|
18145
18374
|
catch (error) {
|
|
18146
|
-
throw new Error(`Failed to get file stats: ${error instanceof Error ? error.message :
|
|
18375
|
+
throw new Error(`Failed to get file stats: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
18147
18376
|
}
|
|
18148
18377
|
}
|
|
18149
18378
|
}
|
|
@@ -18151,32 +18380,32 @@ class FileExistsTool extends Tool {
|
|
|
18151
18380
|
constructor() {
|
|
18152
18381
|
super(...arguments);
|
|
18153
18382
|
this.metadata = {
|
|
18154
|
-
name:
|
|
18155
|
-
description:
|
|
18383
|
+
name: 'file_exists',
|
|
18384
|
+
description: 'Check if a file exists',
|
|
18156
18385
|
parameters: [
|
|
18157
18386
|
{
|
|
18158
|
-
name:
|
|
18159
|
-
type:
|
|
18160
|
-
description:
|
|
18387
|
+
name: 'path',
|
|
18388
|
+
type: 'string',
|
|
18389
|
+
description: 'Path to check',
|
|
18161
18390
|
required: true,
|
|
18162
18391
|
},
|
|
18163
18392
|
],
|
|
18164
|
-
category:
|
|
18165
|
-
compliance_level:
|
|
18393
|
+
category: 'files',
|
|
18394
|
+
compliance_level: 'internal',
|
|
18166
18395
|
};
|
|
18167
18396
|
}
|
|
18168
18397
|
async execute(input) {
|
|
18169
18398
|
this.validate(input);
|
|
18170
18399
|
const filePath = input.path;
|
|
18171
18400
|
if (this.policyEnforcer) {
|
|
18172
|
-
this.policyEnforcer.enforceFilesystem(filePath,
|
|
18401
|
+
this.policyEnforcer.enforceFilesystem(filePath, 'read');
|
|
18173
18402
|
}
|
|
18174
18403
|
try {
|
|
18175
18404
|
await fs$2.access(filePath);
|
|
18176
|
-
return
|
|
18405
|
+
return 'true';
|
|
18177
18406
|
}
|
|
18178
18407
|
catch {
|
|
18179
|
-
return
|
|
18408
|
+
return 'false';
|
|
18180
18409
|
}
|
|
18181
18410
|
}
|
|
18182
18411
|
}
|
|
@@ -18188,71 +18417,172 @@ class FileChmodTool extends Tool {
|
|
|
18188
18417
|
description: 'Change file permissions',
|
|
18189
18418
|
parameters: [],
|
|
18190
18419
|
category: 'files',
|
|
18191
|
-
compliance_level: 'public'
|
|
18420
|
+
compliance_level: 'public',
|
|
18192
18421
|
};
|
|
18193
18422
|
}
|
|
18194
18423
|
async execute(input) {
|
|
18195
|
-
const mode = typeof input.mode === 'string'
|
|
18196
|
-
? parseInt(input.mode, 8)
|
|
18197
|
-
: input.mode;
|
|
18424
|
+
const mode = typeof input.mode === 'string' ? parseInt(input.mode, 8) : input.mode;
|
|
18198
18425
|
await fs$2.chmod(input.path, mode);
|
|
18199
18426
|
return { changed: true };
|
|
18200
18427
|
}
|
|
18201
18428
|
}
|
|
18202
18429
|
|
|
18430
|
+
class GoogleDocsCreateTool extends Tool {
|
|
18431
|
+
constructor() {
|
|
18432
|
+
super(...arguments);
|
|
18433
|
+
this.metadata = {
|
|
18434
|
+
name: 'google_docs_create',
|
|
18435
|
+
description: 'Create a Google Doc (optionally in a folder) and write initial content. Requires GOOGLE_ACCESS_TOKEN or GOOGLE_DRIVE_MOCK=true.',
|
|
18436
|
+
parameters: [
|
|
18437
|
+
{
|
|
18438
|
+
name: 'title',
|
|
18439
|
+
type: 'string',
|
|
18440
|
+
description: 'Document title',
|
|
18441
|
+
required: true,
|
|
18442
|
+
},
|
|
18443
|
+
{
|
|
18444
|
+
name: 'content',
|
|
18445
|
+
type: 'string',
|
|
18446
|
+
description: 'Initial document body text',
|
|
18447
|
+
required: false,
|
|
18448
|
+
},
|
|
18449
|
+
{
|
|
18450
|
+
name: 'folder_id',
|
|
18451
|
+
type: 'string',
|
|
18452
|
+
description: 'Optional Google Drive folder ID (uses GOOGLE_DRIVE_FOLDER_ID if omitted)',
|
|
18453
|
+
required: false,
|
|
18454
|
+
},
|
|
18455
|
+
],
|
|
18456
|
+
category: 'google-workspace',
|
|
18457
|
+
compliance_level: 'restricted',
|
|
18458
|
+
requires_approval: false,
|
|
18459
|
+
};
|
|
18460
|
+
}
|
|
18461
|
+
async execute(input) {
|
|
18462
|
+
this.validate(input);
|
|
18463
|
+
const title = String(input.title);
|
|
18464
|
+
const content = typeof input.content === 'string' ? input.content : '';
|
|
18465
|
+
const folderId = typeof input.folder_id === 'string' ? input.folder_id : '';
|
|
18466
|
+
const mockMode = (process.env.GOOGLE_DRIVE_MOCK || '').toLowerCase() === 'true';
|
|
18467
|
+
if (mockMode) {
|
|
18468
|
+
const fakeId = `mock_${Date.now().toString(36)}`;
|
|
18469
|
+
return {
|
|
18470
|
+
documentId: fakeId,
|
|
18471
|
+
url: `https://docs.google.com/document/d/${fakeId}/edit`,
|
|
18472
|
+
};
|
|
18473
|
+
}
|
|
18474
|
+
const accessToken = (process.env.GOOGLE_ACCESS_TOKEN || '').trim();
|
|
18475
|
+
if (!accessToken) {
|
|
18476
|
+
throw new Error('Missing GOOGLE_ACCESS_TOKEN (or set GOOGLE_DRIVE_MOCK=true).');
|
|
18477
|
+
}
|
|
18478
|
+
const effectiveFolderId = (folderId || process.env.GOOGLE_DRIVE_FOLDER_ID || '').trim();
|
|
18479
|
+
const driveCreateBody = {
|
|
18480
|
+
name: title,
|
|
18481
|
+
mimeType: 'application/vnd.google-apps.document',
|
|
18482
|
+
};
|
|
18483
|
+
if (effectiveFolderId) {
|
|
18484
|
+
driveCreateBody.parents = [effectiveFolderId];
|
|
18485
|
+
}
|
|
18486
|
+
const driveRes = await fetch('https://www.googleapis.com/drive/v3/files?supportsAllDrives=true', {
|
|
18487
|
+
method: 'POST',
|
|
18488
|
+
headers: {
|
|
18489
|
+
Authorization: `Bearer ${accessToken}`,
|
|
18490
|
+
'Content-Type': 'application/json',
|
|
18491
|
+
},
|
|
18492
|
+
body: JSON.stringify(driveCreateBody),
|
|
18493
|
+
});
|
|
18494
|
+
if (!driveRes.ok) {
|
|
18495
|
+
const text = await driveRes.text().catch(() => '');
|
|
18496
|
+
throw new Error(`Drive create failed: ${driveRes.status} ${driveRes.statusText} ${text}`);
|
|
18497
|
+
}
|
|
18498
|
+
const driveJson = (await driveRes.json());
|
|
18499
|
+
const documentId = driveJson.id;
|
|
18500
|
+
if (!documentId) {
|
|
18501
|
+
throw new Error('Drive create returned no file id');
|
|
18502
|
+
}
|
|
18503
|
+
if (content.trim().length > 0) {
|
|
18504
|
+
const docsRes = await fetch(`https://docs.googleapis.com/v1/documents/${documentId}:batchUpdate`, {
|
|
18505
|
+
method: 'POST',
|
|
18506
|
+
headers: {
|
|
18507
|
+
Authorization: `Bearer ${accessToken}`,
|
|
18508
|
+
'Content-Type': 'application/json',
|
|
18509
|
+
},
|
|
18510
|
+
body: JSON.stringify({
|
|
18511
|
+
requests: [
|
|
18512
|
+
{
|
|
18513
|
+
insertText: {
|
|
18514
|
+
location: { index: 1 },
|
|
18515
|
+
text: content,
|
|
18516
|
+
},
|
|
18517
|
+
},
|
|
18518
|
+
],
|
|
18519
|
+
}),
|
|
18520
|
+
});
|
|
18521
|
+
if (!docsRes.ok) {
|
|
18522
|
+
const text = await docsRes.text().catch(() => '');
|
|
18523
|
+
throw new Error(`Docs update failed: ${docsRes.status} ${docsRes.statusText} ${text}`);
|
|
18524
|
+
}
|
|
18525
|
+
}
|
|
18526
|
+
return {
|
|
18527
|
+
documentId,
|
|
18528
|
+
url: `https://docs.google.com/document/d/${documentId}/edit`,
|
|
18529
|
+
};
|
|
18530
|
+
}
|
|
18531
|
+
}
|
|
18532
|
+
|
|
18203
18533
|
class HttpRequestTool extends Tool {
|
|
18204
18534
|
constructor() {
|
|
18205
18535
|
super(...arguments);
|
|
18206
18536
|
this.metadata = {
|
|
18207
|
-
name:
|
|
18208
|
-
description:
|
|
18537
|
+
name: 'http_request',
|
|
18538
|
+
description: 'Make HTTP requests to external APIs',
|
|
18209
18539
|
parameters: [
|
|
18210
18540
|
{
|
|
18211
|
-
name:
|
|
18212
|
-
type:
|
|
18213
|
-
description:
|
|
18541
|
+
name: 'url',
|
|
18542
|
+
type: 'string',
|
|
18543
|
+
description: 'The URL to make the request to',
|
|
18214
18544
|
required: true,
|
|
18215
18545
|
},
|
|
18216
18546
|
{
|
|
18217
|
-
name:
|
|
18218
|
-
type:
|
|
18219
|
-
description:
|
|
18547
|
+
name: 'method',
|
|
18548
|
+
type: 'string',
|
|
18549
|
+
description: 'HTTP method (GET, POST, PUT, DELETE)',
|
|
18220
18550
|
required: false,
|
|
18221
|
-
default:
|
|
18551
|
+
default: 'GET',
|
|
18222
18552
|
},
|
|
18223
18553
|
{
|
|
18224
|
-
name:
|
|
18225
|
-
type:
|
|
18226
|
-
description:
|
|
18554
|
+
name: 'headers',
|
|
18555
|
+
type: 'object',
|
|
18556
|
+
description: 'HTTP headers as key-value pairs',
|
|
18227
18557
|
required: false,
|
|
18228
18558
|
},
|
|
18229
18559
|
{
|
|
18230
|
-
name:
|
|
18231
|
-
type:
|
|
18232
|
-
description:
|
|
18560
|
+
name: 'body',
|
|
18561
|
+
type: 'object',
|
|
18562
|
+
description: 'Request body for POST/PUT requests',
|
|
18233
18563
|
required: false,
|
|
18234
18564
|
},
|
|
18235
18565
|
],
|
|
18236
|
-
category:
|
|
18237
|
-
compliance_level:
|
|
18566
|
+
category: 'network',
|
|
18567
|
+
compliance_level: 'internal',
|
|
18238
18568
|
requires_approval: true,
|
|
18239
18569
|
};
|
|
18240
18570
|
}
|
|
18241
18571
|
async execute(input) {
|
|
18242
18572
|
this.validate(input);
|
|
18243
18573
|
const url = input.url;
|
|
18244
|
-
const method = input.method?.toUpperCase() ||
|
|
18574
|
+
const method = input.method?.toUpperCase() || 'GET';
|
|
18245
18575
|
const headers = input.headers || {};
|
|
18246
18576
|
const body = input.body;
|
|
18247
18577
|
if (this.policyEnforcer) {
|
|
18248
18578
|
try {
|
|
18249
18579
|
const parsedUrl = new URL(url);
|
|
18250
18580
|
// Remove trailing colon from protocol (e.g., 'https:' -> 'https')
|
|
18251
|
-
const protocol = parsedUrl.protocol.replace(
|
|
18581
|
+
const protocol = parsedUrl.protocol.replace(':', '');
|
|
18252
18582
|
this.policyEnforcer.enforceNetwork(parsedUrl.hostname, protocol);
|
|
18253
18583
|
}
|
|
18254
18584
|
catch (e) {
|
|
18255
|
-
if (e instanceof Error && e.message.includes(
|
|
18585
|
+
if (e instanceof Error && e.message.includes('Invalid URL')) {
|
|
18256
18586
|
throw new Error(`Invalid URL: ${url}`);
|
|
18257
18587
|
}
|
|
18258
18588
|
throw e;
|
|
@@ -18276,7 +18606,7 @@ class HttpRequestTool extends Tool {
|
|
|
18276
18606
|
if (axios.isAxiosError(error)) {
|
|
18277
18607
|
throw new Error(`HTTP request failed: ${error.response?.status} - ${error.message}`);
|
|
18278
18608
|
}
|
|
18279
|
-
throw new Error(`HTTP request failed: ${error instanceof Error ? error.message :
|
|
18609
|
+
throw new Error(`HTTP request failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
18280
18610
|
}
|
|
18281
18611
|
}
|
|
18282
18612
|
}
|
|
@@ -18289,7 +18619,7 @@ class HttpPostTool extends Tool {
|
|
|
18289
18619
|
description: 'Send HTTP POST request',
|
|
18290
18620
|
parameters: [],
|
|
18291
18621
|
category: 'network',
|
|
18292
|
-
compliance_level: 'public'
|
|
18622
|
+
compliance_level: 'public',
|
|
18293
18623
|
};
|
|
18294
18624
|
}
|
|
18295
18625
|
async execute(input) {
|
|
@@ -18306,7 +18636,9 @@ class HttpPostTool extends Tool {
|
|
|
18306
18636
|
statusText: response.statusText,
|
|
18307
18637
|
headers: (() => {
|
|
18308
18638
|
const h = {};
|
|
18309
|
-
response.headers.forEach((v, k) => {
|
|
18639
|
+
response.headers.forEach((v, k) => {
|
|
18640
|
+
h[k] = v;
|
|
18641
|
+
});
|
|
18310
18642
|
return h;
|
|
18311
18643
|
})(),
|
|
18312
18644
|
body: await response.text(),
|
|
@@ -18321,7 +18653,7 @@ class HttpPutTool extends Tool {
|
|
|
18321
18653
|
description: 'Send HTTP PUT request',
|
|
18322
18654
|
parameters: [],
|
|
18323
18655
|
category: 'network',
|
|
18324
|
-
compliance_level: 'public'
|
|
18656
|
+
compliance_level: 'public',
|
|
18325
18657
|
};
|
|
18326
18658
|
}
|
|
18327
18659
|
async execute(input) {
|
|
@@ -18338,7 +18670,9 @@ class HttpPutTool extends Tool {
|
|
|
18338
18670
|
statusText: response.statusText,
|
|
18339
18671
|
headers: (() => {
|
|
18340
18672
|
const h = {};
|
|
18341
|
-
response.headers.forEach((v, k) => {
|
|
18673
|
+
response.headers.forEach((v, k) => {
|
|
18674
|
+
h[k] = v;
|
|
18675
|
+
});
|
|
18342
18676
|
return h;
|
|
18343
18677
|
})(),
|
|
18344
18678
|
body: await response.text(),
|
|
@@ -18353,7 +18687,7 @@ class HttpDeleteTool extends Tool {
|
|
|
18353
18687
|
description: 'Send HTTP DELETE request',
|
|
18354
18688
|
parameters: [],
|
|
18355
18689
|
category: 'network',
|
|
18356
|
-
compliance_level: 'public'
|
|
18690
|
+
compliance_level: 'public',
|
|
18357
18691
|
};
|
|
18358
18692
|
}
|
|
18359
18693
|
async execute(input) {
|
|
@@ -18366,7 +18700,9 @@ class HttpDeleteTool extends Tool {
|
|
|
18366
18700
|
statusText: response.statusText,
|
|
18367
18701
|
headers: (() => {
|
|
18368
18702
|
const h = {};
|
|
18369
|
-
response.headers.forEach((v, k) => {
|
|
18703
|
+
response.headers.forEach((v, k) => {
|
|
18704
|
+
h[k] = v;
|
|
18705
|
+
});
|
|
18370
18706
|
return h;
|
|
18371
18707
|
})(),
|
|
18372
18708
|
body: await response.text(),
|
|
@@ -18381,7 +18717,7 @@ class DownloadFileTool extends Tool {
|
|
|
18381
18717
|
description: 'Download file from URL',
|
|
18382
18718
|
parameters: [],
|
|
18383
18719
|
category: 'network',
|
|
18384
|
-
compliance_level: 'public'
|
|
18720
|
+
compliance_level: 'public',
|
|
18385
18721
|
};
|
|
18386
18722
|
}
|
|
18387
18723
|
async execute(input) {
|
|
@@ -18389,7 +18725,8 @@ class DownloadFileTool extends Tool {
|
|
|
18389
18725
|
const protocol = parsedUrl.protocol === 'https:' ? https : http;
|
|
18390
18726
|
return new Promise((resolve, reject) => {
|
|
18391
18727
|
const file = fs$1.createWriteStream(input.destination);
|
|
18392
|
-
protocol
|
|
18728
|
+
protocol
|
|
18729
|
+
.get(input.url, (response) => {
|
|
18393
18730
|
if (response.statusCode !== 200) {
|
|
18394
18731
|
reject(new Error(`Failed to download: ${response.statusCode}`));
|
|
18395
18732
|
return;
|
|
@@ -18403,7 +18740,8 @@ class DownloadFileTool extends Tool {
|
|
|
18403
18740
|
size: stats.size,
|
|
18404
18741
|
});
|
|
18405
18742
|
});
|
|
18406
|
-
})
|
|
18743
|
+
})
|
|
18744
|
+
.on('error', (err) => {
|
|
18407
18745
|
fs$1.unlinkSync(input.destination);
|
|
18408
18746
|
reject(err);
|
|
18409
18747
|
});
|
|
@@ -18418,7 +18756,7 @@ class DnsLookupTool extends Tool {
|
|
|
18418
18756
|
description: 'Perform DNS lookup',
|
|
18419
18757
|
parameters: [],
|
|
18420
18758
|
category: 'network',
|
|
18421
|
-
compliance_level: 'public'
|
|
18759
|
+
compliance_level: 'public',
|
|
18422
18760
|
};
|
|
18423
18761
|
}
|
|
18424
18762
|
async execute(input) {
|
|
@@ -18435,7 +18773,7 @@ class PingTool extends Tool {
|
|
|
18435
18773
|
description: 'Ping a host',
|
|
18436
18774
|
parameters: [],
|
|
18437
18775
|
category: 'network',
|
|
18438
|
-
compliance_level: 'public'
|
|
18776
|
+
compliance_level: 'public',
|
|
18439
18777
|
};
|
|
18440
18778
|
}
|
|
18441
18779
|
async execute(input) {
|
|
@@ -18466,10 +18804,10 @@ class ToolPatternParser {
|
|
|
18466
18804
|
*/
|
|
18467
18805
|
static getCategoryPrefix(category) {
|
|
18468
18806
|
const prefixMap = {
|
|
18469
|
-
files:
|
|
18470
|
-
directories:
|
|
18471
|
-
utilities:
|
|
18472
|
-
agent_communication:
|
|
18807
|
+
files: 'file',
|
|
18808
|
+
directories: 'dir',
|
|
18809
|
+
utilities: 'util',
|
|
18810
|
+
agent_communication: 'agent',
|
|
18473
18811
|
};
|
|
18474
18812
|
return prefixMap[category] || category;
|
|
18475
18813
|
}
|
|
@@ -18481,23 +18819,23 @@ class ToolPatternParser {
|
|
|
18481
18819
|
*/
|
|
18482
18820
|
static parse(pattern, registry) {
|
|
18483
18821
|
// Simple tool name (no colon)
|
|
18484
|
-
if (!pattern.includes(
|
|
18822
|
+
if (!pattern.includes(':')) {
|
|
18485
18823
|
return [pattern];
|
|
18486
18824
|
}
|
|
18487
|
-
const [category, operations] = pattern.split(
|
|
18825
|
+
const [category, operations] = pattern.split(':', 2);
|
|
18488
18826
|
// Validate category exists
|
|
18489
18827
|
if (!registry.hasCategory(category)) {
|
|
18490
18828
|
throw new Error(`Unknown tool category: ${category}`);
|
|
18491
18829
|
}
|
|
18492
18830
|
// Wildcard: all tools in category
|
|
18493
|
-
if (operations ===
|
|
18831
|
+
if (operations === '*') {
|
|
18494
18832
|
return registry.getToolsByCategory(category);
|
|
18495
18833
|
}
|
|
18496
18834
|
// Granular selection: [read,write,delete]
|
|
18497
|
-
if (operations.startsWith(
|
|
18835
|
+
if (operations.startsWith('[') && operations.endsWith(']')) {
|
|
18498
18836
|
const ops = operations
|
|
18499
18837
|
.slice(1, -1)
|
|
18500
|
-
.split(
|
|
18838
|
+
.split(',')
|
|
18501
18839
|
.map((s) => s.trim())
|
|
18502
18840
|
.filter((s) => s.length > 0);
|
|
18503
18841
|
// Convert category to singular form for tool naming
|
|
@@ -18536,11 +18874,11 @@ class GetCwdTool extends Tool {
|
|
|
18536
18874
|
constructor() {
|
|
18537
18875
|
super(...arguments);
|
|
18538
18876
|
this.metadata = {
|
|
18539
|
-
name:
|
|
18540
|
-
description:
|
|
18877
|
+
name: 'get_cwd',
|
|
18878
|
+
description: 'Get current working directory',
|
|
18541
18879
|
parameters: [],
|
|
18542
|
-
category:
|
|
18543
|
-
compliance_level:
|
|
18880
|
+
category: 'system',
|
|
18881
|
+
compliance_level: 'public',
|
|
18544
18882
|
};
|
|
18545
18883
|
}
|
|
18546
18884
|
async execute() {
|
|
@@ -18551,11 +18889,11 @@ class GetPlatformTool extends Tool {
|
|
|
18551
18889
|
constructor() {
|
|
18552
18890
|
super(...arguments);
|
|
18553
18891
|
this.metadata = {
|
|
18554
|
-
name:
|
|
18555
|
-
description:
|
|
18892
|
+
name: 'get_platform',
|
|
18893
|
+
description: 'Get system platform information',
|
|
18556
18894
|
parameters: [],
|
|
18557
|
-
category:
|
|
18558
|
-
compliance_level:
|
|
18895
|
+
category: 'system',
|
|
18896
|
+
compliance_level: 'public',
|
|
18559
18897
|
};
|
|
18560
18898
|
}
|
|
18561
18899
|
async execute() {
|
|
@@ -18577,26 +18915,26 @@ class EnvGetTool extends Tool {
|
|
|
18577
18915
|
constructor() {
|
|
18578
18916
|
super(...arguments);
|
|
18579
18917
|
this.metadata = {
|
|
18580
|
-
name:
|
|
18581
|
-
description:
|
|
18918
|
+
name: 'env_get',
|
|
18919
|
+
description: 'Get environment variable (read-only)',
|
|
18582
18920
|
parameters: [],
|
|
18583
|
-
category:
|
|
18584
|
-
compliance_level:
|
|
18921
|
+
category: 'system',
|
|
18922
|
+
compliance_level: 'public',
|
|
18585
18923
|
};
|
|
18586
18924
|
}
|
|
18587
18925
|
async execute(input) {
|
|
18588
|
-
return process.env[input.key] ||
|
|
18926
|
+
return process.env[input.key] || '';
|
|
18589
18927
|
}
|
|
18590
18928
|
}
|
|
18591
18929
|
class EnvSetTool extends Tool {
|
|
18592
18930
|
constructor() {
|
|
18593
18931
|
super(...arguments);
|
|
18594
18932
|
this.metadata = {
|
|
18595
|
-
name:
|
|
18596
|
-
description:
|
|
18933
|
+
name: 'env_set',
|
|
18934
|
+
description: 'Set environment variable (DANGEROUS)',
|
|
18597
18935
|
parameters: [],
|
|
18598
|
-
category:
|
|
18599
|
-
compliance_level:
|
|
18936
|
+
category: 'system',
|
|
18937
|
+
compliance_level: 'public',
|
|
18600
18938
|
};
|
|
18601
18939
|
}
|
|
18602
18940
|
async execute(input) {
|
|
@@ -18609,28 +18947,28 @@ class DateFormatTool extends Tool {
|
|
|
18609
18947
|
constructor() {
|
|
18610
18948
|
super(...arguments);
|
|
18611
18949
|
this.metadata = {
|
|
18612
|
-
name:
|
|
18613
|
-
description:
|
|
18950
|
+
name: 'date_format',
|
|
18951
|
+
description: 'Format dates in various formats',
|
|
18614
18952
|
parameters: [],
|
|
18615
|
-
category:
|
|
18616
|
-
compliance_level:
|
|
18953
|
+
category: 'utils',
|
|
18954
|
+
compliance_level: 'public',
|
|
18617
18955
|
};
|
|
18618
18956
|
}
|
|
18619
18957
|
async execute(input) {
|
|
18620
18958
|
const date = input.date ? new Date(input.date) : new Date();
|
|
18621
|
-
const format = input.format ||
|
|
18959
|
+
const format = input.format || 'iso';
|
|
18622
18960
|
switch (format.toLowerCase()) {
|
|
18623
|
-
case
|
|
18961
|
+
case 'iso':
|
|
18624
18962
|
return date.toISOString();
|
|
18625
|
-
case
|
|
18963
|
+
case 'date':
|
|
18626
18964
|
return date.toDateString();
|
|
18627
|
-
case
|
|
18965
|
+
case 'time':
|
|
18628
18966
|
return date.toTimeString();
|
|
18629
|
-
case
|
|
18967
|
+
case 'locale':
|
|
18630
18968
|
return date.toLocaleString();
|
|
18631
|
-
case
|
|
18969
|
+
case 'utc':
|
|
18632
18970
|
return date.toUTCString();
|
|
18633
|
-
case
|
|
18971
|
+
case 'unix':
|
|
18634
18972
|
return Math.floor(date.getTime() / 1000).toString();
|
|
18635
18973
|
default:
|
|
18636
18974
|
return date.toISOString();
|
|
@@ -18641,28 +18979,28 @@ class GenerateUuidTool extends Tool {
|
|
|
18641
18979
|
constructor() {
|
|
18642
18980
|
super(...arguments);
|
|
18643
18981
|
this.metadata = {
|
|
18644
|
-
name:
|
|
18645
|
-
description:
|
|
18982
|
+
name: 'generate_uuid',
|
|
18983
|
+
description: 'Generate UUID v4',
|
|
18646
18984
|
parameters: [],
|
|
18647
|
-
category:
|
|
18648
|
-
compliance_level:
|
|
18985
|
+
category: 'utils',
|
|
18986
|
+
compliance_level: 'public',
|
|
18649
18987
|
};
|
|
18650
18988
|
}
|
|
18651
18989
|
async execute() {
|
|
18652
18990
|
return randomBytes(16)
|
|
18653
|
-
.toString(
|
|
18654
|
-
.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,
|
|
18991
|
+
.toString('hex')
|
|
18992
|
+
.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, '$1-$2-$3-$4-$5');
|
|
18655
18993
|
}
|
|
18656
18994
|
}
|
|
18657
18995
|
class RandomNumberTool extends Tool {
|
|
18658
18996
|
constructor() {
|
|
18659
18997
|
super(...arguments);
|
|
18660
18998
|
this.metadata = {
|
|
18661
|
-
name:
|
|
18662
|
-
description:
|
|
18999
|
+
name: 'random_number',
|
|
19000
|
+
description: 'Generate random number',
|
|
18663
19001
|
parameters: [],
|
|
18664
|
-
category:
|
|
18665
|
-
compliance_level:
|
|
19002
|
+
category: 'utils',
|
|
19003
|
+
compliance_level: 'public',
|
|
18666
19004
|
};
|
|
18667
19005
|
}
|
|
18668
19006
|
async execute(input) {
|
|
@@ -18675,11 +19013,11 @@ class SleepTool extends Tool {
|
|
|
18675
19013
|
constructor() {
|
|
18676
19014
|
super(...arguments);
|
|
18677
19015
|
this.metadata = {
|
|
18678
|
-
name:
|
|
18679
|
-
description:
|
|
19016
|
+
name: 'sleep',
|
|
19017
|
+
description: 'Delay execution for specified milliseconds',
|
|
18680
19018
|
parameters: [],
|
|
18681
|
-
category:
|
|
18682
|
-
compliance_level:
|
|
19019
|
+
category: 'utils',
|
|
19020
|
+
compliance_level: 'public',
|
|
18683
19021
|
};
|
|
18684
19022
|
}
|
|
18685
19023
|
async execute(input) {
|
|
@@ -18692,15 +19030,15 @@ class RegexMatchTool extends Tool {
|
|
|
18692
19030
|
constructor() {
|
|
18693
19031
|
super(...arguments);
|
|
18694
19032
|
this.metadata = {
|
|
18695
|
-
name:
|
|
18696
|
-
description:
|
|
19033
|
+
name: 'regex_match',
|
|
19034
|
+
description: 'Match text against regular expression',
|
|
18697
19035
|
parameters: [],
|
|
18698
|
-
category:
|
|
18699
|
-
compliance_level:
|
|
19036
|
+
category: 'utils',
|
|
19037
|
+
compliance_level: 'public',
|
|
18700
19038
|
};
|
|
18701
19039
|
}
|
|
18702
19040
|
async execute(input) {
|
|
18703
|
-
const regex = new RegExp(input.pattern, input.flags ||
|
|
19041
|
+
const regex = new RegExp(input.pattern, input.flags || 'g');
|
|
18704
19042
|
const matches = [];
|
|
18705
19043
|
const groups = [];
|
|
18706
19044
|
let match;
|
|
@@ -18717,11 +19055,11 @@ class UrlParseTool extends Tool {
|
|
|
18717
19055
|
constructor() {
|
|
18718
19056
|
super(...arguments);
|
|
18719
19057
|
this.metadata = {
|
|
18720
|
-
name:
|
|
18721
|
-
description:
|
|
19058
|
+
name: 'url_parse',
|
|
19059
|
+
description: 'Parse URL into components',
|
|
18722
19060
|
parameters: [],
|
|
18723
|
-
category:
|
|
18724
|
-
compliance_level:
|
|
19061
|
+
category: 'utils',
|
|
19062
|
+
compliance_level: 'public',
|
|
18725
19063
|
};
|
|
18726
19064
|
}
|
|
18727
19065
|
async execute(input) {
|
|
@@ -18762,51 +19100,48 @@ class VerificationStatusTool extends Tool {
|
|
|
18762
19100
|
constructor(registryUrl) {
|
|
18763
19101
|
super();
|
|
18764
19102
|
this.metadata = {
|
|
18765
|
-
name:
|
|
18766
|
-
description:
|
|
19103
|
+
name: 'get_verification_status',
|
|
19104
|
+
description: 'Check the verification and compliance status of this agent in the Sekuire registry. This tool is required for trust protocol compliance and must not be removed.',
|
|
18767
19105
|
parameters: [
|
|
18768
19106
|
{
|
|
18769
|
-
name:
|
|
18770
|
-
type:
|
|
18771
|
-
description:
|
|
19107
|
+
name: 'sekuire_id',
|
|
19108
|
+
type: 'string',
|
|
19109
|
+
description: 'The Sekuire ID of the agent to check (defaults to current agent)',
|
|
18772
19110
|
required: false,
|
|
18773
19111
|
},
|
|
18774
19112
|
{
|
|
18775
|
-
name:
|
|
18776
|
-
type:
|
|
18777
|
-
description:
|
|
19113
|
+
name: 'include_details',
|
|
19114
|
+
type: 'boolean',
|
|
19115
|
+
description: 'Include detailed verification information',
|
|
18778
19116
|
required: false,
|
|
18779
19117
|
},
|
|
18780
19118
|
],
|
|
18781
|
-
category:
|
|
18782
|
-
compliance_level:
|
|
19119
|
+
category: 'compliance',
|
|
19120
|
+
compliance_level: 'system', // System-level tool that cannot be disabled
|
|
18783
19121
|
};
|
|
18784
19122
|
// Default to production registry, or use custom URL
|
|
18785
|
-
this.registryUrl =
|
|
18786
|
-
registryUrl ||
|
|
18787
|
-
process.env.SEKUIRE_REGISTRY_URL ||
|
|
18788
|
-
"http://localhost:5556";
|
|
19123
|
+
this.registryUrl = registryUrl || process.env.SEKUIRE_REGISTRY_URL || 'http://localhost:5556';
|
|
18789
19124
|
}
|
|
18790
19125
|
async execute(input) {
|
|
18791
19126
|
this.validate(input);
|
|
18792
19127
|
const sekuireId = input.sekuire_id || this.getAgentId();
|
|
18793
19128
|
const includeDetails = input.include_details || false;
|
|
18794
19129
|
if (!sekuireId) {
|
|
18795
|
-
throw new Error(
|
|
19130
|
+
throw new Error('No Sekuire ID provided and unable to determine current agent ID');
|
|
18796
19131
|
}
|
|
18797
19132
|
try {
|
|
18798
19133
|
// Query the Sekuire registry API
|
|
18799
19134
|
const response = await fetch(`${this.registryUrl}/api/v1/agents/${sekuireId}`, {
|
|
18800
|
-
method:
|
|
19135
|
+
method: 'GET',
|
|
18801
19136
|
headers: {
|
|
18802
|
-
|
|
18803
|
-
|
|
19137
|
+
'Content-Type': 'application/json',
|
|
19138
|
+
'User-Agent': 'Sekuire-SDK/1.0',
|
|
18804
19139
|
},
|
|
18805
19140
|
});
|
|
18806
19141
|
if (!response.ok) {
|
|
18807
19142
|
if (response.status === 404) {
|
|
18808
19143
|
return JSON.stringify({
|
|
18809
|
-
status:
|
|
19144
|
+
status: 'error',
|
|
18810
19145
|
message: `Agent ${sekuireId} not found in registry. This agent may not be registered or verified.`,
|
|
18811
19146
|
is_verified: false,
|
|
18812
19147
|
is_compliant: false,
|
|
@@ -18818,7 +19153,7 @@ class VerificationStatusTool extends Tool {
|
|
|
18818
19153
|
// Build verification status response
|
|
18819
19154
|
const result = {
|
|
18820
19155
|
sekuire_id: agentData.sekuire_id,
|
|
18821
|
-
verification_status: agentData.verification_status ||
|
|
19156
|
+
verification_status: agentData.verification_status || 'Unverified',
|
|
18822
19157
|
reputation_score: agentData.reputation_score || 0,
|
|
18823
19158
|
security_score: agentData.security_score,
|
|
18824
19159
|
code_review_status: agentData.code_review_status,
|
|
@@ -18841,8 +19176,8 @@ class VerificationStatusTool extends Tool {
|
|
|
18841
19176
|
}
|
|
18842
19177
|
catch (error) {
|
|
18843
19178
|
return JSON.stringify({
|
|
18844
|
-
status:
|
|
18845
|
-
message: `Failed to verify agent status: ${error instanceof Error ? error.message :
|
|
19179
|
+
status: 'error',
|
|
19180
|
+
message: `Failed to verify agent status: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
18846
19181
|
is_verified: false,
|
|
18847
19182
|
is_compliant: false,
|
|
18848
19183
|
recommendation: "Unable to verify agent. Please ensure the agent is properly registered with 'sekuire publish'.",
|
|
@@ -18859,11 +19194,11 @@ class VerificationStatusTool extends Tool {
|
|
|
18859
19194
|
return envId;
|
|
18860
19195
|
// Try to read from .sekuire directory
|
|
18861
19196
|
try {
|
|
18862
|
-
const fs = require(
|
|
18863
|
-
const path = require(
|
|
18864
|
-
const sekuirePath = path.join(process.cwd(),
|
|
19197
|
+
const fs = require('node:fs');
|
|
19198
|
+
const path = require('node:path');
|
|
19199
|
+
const sekuirePath = path.join(process.cwd(), '.sekuire', 'agent.json');
|
|
18865
19200
|
if (fs.existsSync(sekuirePath)) {
|
|
18866
|
-
const config = JSON.parse(fs.readFileSync(sekuirePath,
|
|
19201
|
+
const config = JSON.parse(fs.readFileSync(sekuirePath, 'utf-8'));
|
|
18867
19202
|
return config.sekuire_id;
|
|
18868
19203
|
}
|
|
18869
19204
|
}
|
|
@@ -18878,7 +19213,7 @@ class VerificationStatusTool extends Tool {
|
|
|
18878
19213
|
extractComplianceFrameworks(manifest) {
|
|
18879
19214
|
const frameworks = [];
|
|
18880
19215
|
try {
|
|
18881
|
-
const manifestObj = typeof manifest ===
|
|
19216
|
+
const manifestObj = typeof manifest === 'string' ? JSON.parse(manifest) : manifest;
|
|
18882
19217
|
if (manifestObj?.agent?.compliance?.framework) {
|
|
18883
19218
|
frameworks.push(manifestObj.agent.compliance.framework);
|
|
18884
19219
|
}
|
|
@@ -18892,8 +19227,7 @@ class VerificationStatusTool extends Tool {
|
|
|
18892
19227
|
* Determine if agent is compliant based on verification status and checks
|
|
18893
19228
|
*/
|
|
18894
19229
|
isCompliant(agentData) {
|
|
18895
|
-
const hasVerification = agentData.verification_status ===
|
|
18896
|
-
agentData.verification_status === "Pending";
|
|
19230
|
+
const hasVerification = agentData.verification_status === 'Verified' || agentData.verification_status === 'Pending';
|
|
18897
19231
|
const hasGoodReputation = (Number(agentData.reputation_score) || 0) >= 0;
|
|
18898
19232
|
const hasSecurityScore = (Number(agentData.security_score) || 0) >= 60;
|
|
18899
19233
|
return hasVerification && hasGoodReputation && hasSecurityScore;
|
|
@@ -18904,9 +19238,9 @@ class VerificationStatusTool extends Tool {
|
|
|
18904
19238
|
calculateComplianceScore(agentData) {
|
|
18905
19239
|
let score = 0;
|
|
18906
19240
|
// Verification status (40 points)
|
|
18907
|
-
if (agentData.verification_status ===
|
|
19241
|
+
if (agentData.verification_status === 'Verified')
|
|
18908
19242
|
score += 40;
|
|
18909
|
-
else if (agentData.verification_status ===
|
|
19243
|
+
else if (agentData.verification_status === 'Pending')
|
|
18910
19244
|
score += 20;
|
|
18911
19245
|
// Reputation (30 points)
|
|
18912
19246
|
const repScore = Math.min(30, Math.floor((Number(agentData.reputation_score) || 0) / 10));
|
|
@@ -18915,7 +19249,7 @@ class VerificationStatusTool extends Tool {
|
|
|
18915
19249
|
const secScore = Math.min(20, Math.floor(((Number(agentData.security_score) || 0) / 100) * 20));
|
|
18916
19250
|
score += secScore;
|
|
18917
19251
|
// Code review (10 points)
|
|
18918
|
-
if (agentData.code_review_status ===
|
|
19252
|
+
if (agentData.code_review_status === 'approved')
|
|
18919
19253
|
score += 10;
|
|
18920
19254
|
return score;
|
|
18921
19255
|
}
|
|
@@ -18923,11 +19257,11 @@ class VerificationStatusTool extends Tool {
|
|
|
18923
19257
|
* Format the response for the agent
|
|
18924
19258
|
*/
|
|
18925
19259
|
formatResponse(result) {
|
|
18926
|
-
const statusEmoji = result.verification_status ===
|
|
18927
|
-
?
|
|
18928
|
-
: result.verification_status ===
|
|
18929
|
-
?
|
|
18930
|
-
:
|
|
19260
|
+
const statusEmoji = result.verification_status === 'Verified'
|
|
19261
|
+
? '✅'
|
|
19262
|
+
: result.verification_status === 'Pending'
|
|
19263
|
+
? '⏳'
|
|
19264
|
+
: '⚠️';
|
|
18931
19265
|
let response = `${statusEmoji} Agent Verification Status\n\n`;
|
|
18932
19266
|
response += `Sekuire ID: ${result.sekuire_id}\n`;
|
|
18933
19267
|
response += `Status: ${result.verification_status}\n`;
|
|
@@ -18936,14 +19270,14 @@ class VerificationStatusTool extends Tool {
|
|
|
18936
19270
|
response += `Security Score: ${result.security_score}/100\n`;
|
|
18937
19271
|
}
|
|
18938
19272
|
if (result.compliance_frameworks.length > 0) {
|
|
18939
|
-
response += `Compliance: ${result.compliance_frameworks.join(
|
|
19273
|
+
response += `Compliance: ${result.compliance_frameworks.join(', ')}\n`;
|
|
18940
19274
|
}
|
|
18941
|
-
response += `\nCompliant: ${result.is_compliant ?
|
|
19275
|
+
response += `\nCompliant: ${result.is_compliant ? 'Yes ✓' : 'No ✗'}\n`;
|
|
18942
19276
|
if (result.verification_details) {
|
|
18943
19277
|
response += `\nDetailed Verification:\n`;
|
|
18944
|
-
response += ` • Valid Signature: ${result.verification_details.has_valid_signature ?
|
|
18945
|
-
response += ` • Repository Verified: ${result.verification_details.repository_verified ?
|
|
18946
|
-
response += ` • Security Checks: ${result.verification_details.passes_security_checks ?
|
|
19278
|
+
response += ` • Valid Signature: ${result.verification_details.has_valid_signature ? '✓' : '✗'}\n`;
|
|
19279
|
+
response += ` • Repository Verified: ${result.verification_details.repository_verified ? '✓' : '✗'}\n`;
|
|
19280
|
+
response += ` • Security Checks: ${result.verification_details.passes_security_checks ? '✓' : '✗'}\n`;
|
|
18947
19281
|
response += ` • Compliance Score: ${result.verification_details.compliance_score}/100\n`;
|
|
18948
19282
|
}
|
|
18949
19283
|
if (!result.is_compliant) {
|
|
@@ -18958,25 +19292,25 @@ class WebSearchTool extends Tool {
|
|
|
18958
19292
|
constructor() {
|
|
18959
19293
|
super(...arguments);
|
|
18960
19294
|
this.metadata = {
|
|
18961
|
-
name:
|
|
18962
|
-
description:
|
|
19295
|
+
name: 'web_search',
|
|
19296
|
+
description: 'Search the web for information using various search engines',
|
|
18963
19297
|
parameters: [
|
|
18964
19298
|
{
|
|
18965
|
-
name:
|
|
18966
|
-
type:
|
|
18967
|
-
description:
|
|
19299
|
+
name: 'query',
|
|
19300
|
+
type: 'string',
|
|
19301
|
+
description: 'The search query',
|
|
18968
19302
|
required: true,
|
|
18969
19303
|
},
|
|
18970
19304
|
{
|
|
18971
|
-
name:
|
|
18972
|
-
type:
|
|
18973
|
-
description:
|
|
19305
|
+
name: 'num_results',
|
|
19306
|
+
type: 'number',
|
|
19307
|
+
description: 'Number of results to return',
|
|
18974
19308
|
required: false,
|
|
18975
19309
|
default: 5,
|
|
18976
19310
|
},
|
|
18977
19311
|
],
|
|
18978
|
-
category:
|
|
18979
|
-
compliance_level:
|
|
19312
|
+
category: 'web',
|
|
19313
|
+
compliance_level: 'public',
|
|
18980
19314
|
};
|
|
18981
19315
|
}
|
|
18982
19316
|
async execute(input) {
|
|
@@ -18984,14 +19318,14 @@ class WebSearchTool extends Tool {
|
|
|
18984
19318
|
const query = input.query;
|
|
18985
19319
|
const numResults = input.num_results || 5;
|
|
18986
19320
|
if (this.policyEnforcer) {
|
|
18987
|
-
this.policyEnforcer.enforceNetwork(
|
|
19321
|
+
this.policyEnforcer.enforceNetwork('api.duckduckgo.com', 'https');
|
|
18988
19322
|
}
|
|
18989
19323
|
// Use DuckDuckGo Instant Answer API (no auth required)
|
|
18990
19324
|
try {
|
|
18991
|
-
const response = await axios.get(
|
|
19325
|
+
const response = await axios.get('https://api.duckduckgo.com/', {
|
|
18992
19326
|
params: {
|
|
18993
19327
|
q: query,
|
|
18994
|
-
format:
|
|
19328
|
+
format: 'json',
|
|
18995
19329
|
no_html: 1,
|
|
18996
19330
|
},
|
|
18997
19331
|
});
|
|
@@ -19010,10 +19344,10 @@ class WebSearchTool extends Tool {
|
|
|
19010
19344
|
if (results.length === 0) {
|
|
19011
19345
|
return `No results found for query: ${query}`;
|
|
19012
19346
|
}
|
|
19013
|
-
return `Search results for "${query}":\n\n${results.join(
|
|
19347
|
+
return `Search results for "${query}":\n\n${results.join('\n\n')}`;
|
|
19014
19348
|
}
|
|
19015
19349
|
catch (error) {
|
|
19016
|
-
throw new Error(`Web search failed: ${error instanceof Error ? error.message :
|
|
19350
|
+
throw new Error(`Web search failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
19017
19351
|
}
|
|
19018
19352
|
}
|
|
19019
19353
|
}
|
|
@@ -19049,6 +19383,8 @@ function createDefaultToolRegistry(options) {
|
|
|
19049
19383
|
registry.register(new DownloadFileTool());
|
|
19050
19384
|
registry.register(new DnsLookupTool());
|
|
19051
19385
|
registry.register(new PingTool());
|
|
19386
|
+
// Google Workspace category
|
|
19387
|
+
registry.register(new GoogleDocsCreateTool());
|
|
19052
19388
|
// Data category
|
|
19053
19389
|
registry.register(new JsonParseTool());
|
|
19054
19390
|
registry.register(new JsonStringifyTool());
|
|
@@ -19119,6 +19455,8 @@ const builtInTools = {
|
|
|
19119
19455
|
DownloadFileTool,
|
|
19120
19456
|
DnsLookupTool,
|
|
19121
19457
|
PingTool,
|
|
19458
|
+
// Google Workspace
|
|
19459
|
+
GoogleDocsCreateTool,
|
|
19122
19460
|
// Data
|
|
19123
19461
|
JsonParseTool,
|
|
19124
19462
|
JsonStringifyTool,
|
|
@@ -19158,236 +19496,6 @@ const builtInTools = {
|
|
|
19158
19496
|
DecryptDataTool,
|
|
19159
19497
|
};
|
|
19160
19498
|
|
|
19161
|
-
class BaseMemoryStorage {
|
|
19162
|
-
}
|
|
19163
|
-
|
|
19164
|
-
class InMemoryStorage extends BaseMemoryStorage {
|
|
19165
|
-
constructor() {
|
|
19166
|
-
super(...arguments);
|
|
19167
|
-
this.storage = new Map();
|
|
19168
|
-
}
|
|
19169
|
-
async add(sessionId, message) {
|
|
19170
|
-
if (!this.storage.has(sessionId)) {
|
|
19171
|
-
this.storage.set(sessionId, []);
|
|
19172
|
-
}
|
|
19173
|
-
this.storage.get(sessionId).push(message);
|
|
19174
|
-
}
|
|
19175
|
-
async get(sessionId, limit) {
|
|
19176
|
-
const messages = this.storage.get(sessionId) || [];
|
|
19177
|
-
if (limit) {
|
|
19178
|
-
return messages.slice(-limit);
|
|
19179
|
-
}
|
|
19180
|
-
return messages;
|
|
19181
|
-
}
|
|
19182
|
-
async clear(sessionId) {
|
|
19183
|
-
this.storage.set(sessionId, []);
|
|
19184
|
-
}
|
|
19185
|
-
async delete(sessionId) {
|
|
19186
|
-
this.storage.delete(sessionId);
|
|
19187
|
-
}
|
|
19188
|
-
async exists(sessionId) {
|
|
19189
|
-
return this.storage.has(sessionId);
|
|
19190
|
-
}
|
|
19191
|
-
}
|
|
19192
|
-
|
|
19193
|
-
class PostgresStorage extends BaseMemoryStorage {
|
|
19194
|
-
constructor(config) {
|
|
19195
|
-
super();
|
|
19196
|
-
this.initialized = false;
|
|
19197
|
-
this.tableName = config.tableName || "sekuire_memory";
|
|
19198
|
-
this.initPool(config);
|
|
19199
|
-
}
|
|
19200
|
-
async initPool(config) {
|
|
19201
|
-
try {
|
|
19202
|
-
const { Pool } = await import('pg');
|
|
19203
|
-
if (config.connectionString) {
|
|
19204
|
-
this.pool = new Pool({ connectionString: config.connectionString });
|
|
19205
|
-
}
|
|
19206
|
-
else {
|
|
19207
|
-
this.pool = new Pool({
|
|
19208
|
-
host: config.host || "localhost",
|
|
19209
|
-
port: config.port || 5432,
|
|
19210
|
-
database: config.database,
|
|
19211
|
-
user: config.user,
|
|
19212
|
-
password: config.password,
|
|
19213
|
-
});
|
|
19214
|
-
}
|
|
19215
|
-
await this.createTableIfNotExists();
|
|
19216
|
-
this.initialized = true;
|
|
19217
|
-
}
|
|
19218
|
-
catch (error) {
|
|
19219
|
-
throw new Error(`Failed to initialize Postgres: ${error}`);
|
|
19220
|
-
}
|
|
19221
|
-
}
|
|
19222
|
-
async createTableIfNotExists() {
|
|
19223
|
-
const query = `
|
|
19224
|
-
CREATE TABLE IF NOT EXISTS ${this.tableName} (
|
|
19225
|
-
id SERIAL PRIMARY KEY,
|
|
19226
|
-
session_id VARCHAR(255) NOT NULL,
|
|
19227
|
-
role VARCHAR(50) NOT NULL,
|
|
19228
|
-
content TEXT NOT NULL,
|
|
19229
|
-
timestamp BIGINT NOT NULL,
|
|
19230
|
-
metadata JSONB,
|
|
19231
|
-
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
19232
|
-
);
|
|
19233
|
-
CREATE INDEX IF NOT EXISTS idx_${this.tableName}_session_id ON ${this.tableName}(session_id);
|
|
19234
|
-
`;
|
|
19235
|
-
await this.pool.query(query);
|
|
19236
|
-
}
|
|
19237
|
-
async add(sessionId, message) {
|
|
19238
|
-
if (!this.initialized)
|
|
19239
|
-
throw new Error("Postgres not initialized");
|
|
19240
|
-
const query = `
|
|
19241
|
-
INSERT INTO ${this.tableName} (session_id, role, content, timestamp, metadata)
|
|
19242
|
-
VALUES ($1, $2, $3, $4, $5)
|
|
19243
|
-
`;
|
|
19244
|
-
await this.pool.query(query, [
|
|
19245
|
-
sessionId,
|
|
19246
|
-
message.role,
|
|
19247
|
-
message.content,
|
|
19248
|
-
message.timestamp,
|
|
19249
|
-
message.metadata ? JSON.stringify(message.metadata) : null,
|
|
19250
|
-
]);
|
|
19251
|
-
}
|
|
19252
|
-
async get(sessionId, limit) {
|
|
19253
|
-
if (!this.initialized)
|
|
19254
|
-
throw new Error("Postgres not initialized");
|
|
19255
|
-
let query = `
|
|
19256
|
-
SELECT role, content, timestamp, metadata
|
|
19257
|
-
FROM ${this.tableName}
|
|
19258
|
-
WHERE session_id = $1
|
|
19259
|
-
ORDER BY timestamp ASC
|
|
19260
|
-
`;
|
|
19261
|
-
if (limit) {
|
|
19262
|
-
query += ` LIMIT ${limit}`;
|
|
19263
|
-
}
|
|
19264
|
-
const result = await this.pool.query(query, [sessionId]);
|
|
19265
|
-
return result.rows.map((row) => ({
|
|
19266
|
-
role: row.role,
|
|
19267
|
-
content: row.content,
|
|
19268
|
-
timestamp: row.timestamp,
|
|
19269
|
-
metadata: row.metadata,
|
|
19270
|
-
}));
|
|
19271
|
-
}
|
|
19272
|
-
async clear(sessionId) {
|
|
19273
|
-
if (!this.initialized)
|
|
19274
|
-
throw new Error("Postgres not initialized");
|
|
19275
|
-
const query = `DELETE FROM ${this.tableName} WHERE session_id = $1`;
|
|
19276
|
-
await this.pool.query(query, [sessionId]);
|
|
19277
|
-
}
|
|
19278
|
-
async delete(sessionId) {
|
|
19279
|
-
await this.clear(sessionId);
|
|
19280
|
-
}
|
|
19281
|
-
async exists(sessionId) {
|
|
19282
|
-
if (!this.initialized)
|
|
19283
|
-
throw new Error("Postgres not initialized");
|
|
19284
|
-
const query = `SELECT COUNT(*) FROM ${this.tableName} WHERE session_id = $1`;
|
|
19285
|
-
const result = await this.pool.query(query, [sessionId]);
|
|
19286
|
-
return parseInt(result.rows[0].count) > 0;
|
|
19287
|
-
}
|
|
19288
|
-
async disconnect() {
|
|
19289
|
-
if (this.initialized) {
|
|
19290
|
-
await this.pool.end();
|
|
19291
|
-
this.initialized = false;
|
|
19292
|
-
}
|
|
19293
|
-
}
|
|
19294
|
-
}
|
|
19295
|
-
|
|
19296
|
-
class RedisStorage extends BaseMemoryStorage {
|
|
19297
|
-
constructor(config) {
|
|
19298
|
-
super();
|
|
19299
|
-
this.client = null;
|
|
19300
|
-
this.connected = false;
|
|
19301
|
-
this.keyPrefix = config.keyPrefix || "sekuire:memory:";
|
|
19302
|
-
this.initClient(config);
|
|
19303
|
-
}
|
|
19304
|
-
async initClient(config) {
|
|
19305
|
-
try {
|
|
19306
|
-
const { createClient } = await import('redis');
|
|
19307
|
-
if (config.url) {
|
|
19308
|
-
this.client = createClient({ url: config.url });
|
|
19309
|
-
}
|
|
19310
|
-
else {
|
|
19311
|
-
this.client = createClient({
|
|
19312
|
-
socket: {
|
|
19313
|
-
host: config.host || "localhost",
|
|
19314
|
-
port: config.port || 6379,
|
|
19315
|
-
},
|
|
19316
|
-
password: config.password,
|
|
19317
|
-
database: config.db || 0,
|
|
19318
|
-
});
|
|
19319
|
-
}
|
|
19320
|
-
this.client.on("error", (err) => {
|
|
19321
|
-
console.error("Redis client error:", err);
|
|
19322
|
-
});
|
|
19323
|
-
await this.client.connect();
|
|
19324
|
-
this.connected = true;
|
|
19325
|
-
}
|
|
19326
|
-
catch (error) {
|
|
19327
|
-
throw new Error(`Failed to initialize Redis: ${error}`);
|
|
19328
|
-
}
|
|
19329
|
-
}
|
|
19330
|
-
getKey(sessionId) {
|
|
19331
|
-
return `${this.keyPrefix}${sessionId}`;
|
|
19332
|
-
}
|
|
19333
|
-
async add(sessionId, message) {
|
|
19334
|
-
if (!this.connected)
|
|
19335
|
-
throw new Error("Redis not connected");
|
|
19336
|
-
const key = this.getKey(sessionId);
|
|
19337
|
-
await this.client.rPush(key, JSON.stringify(message));
|
|
19338
|
-
}
|
|
19339
|
-
async get(sessionId, limit) {
|
|
19340
|
-
if (!this.connected)
|
|
19341
|
-
throw new Error("Redis not connected");
|
|
19342
|
-
const key = this.getKey(sessionId);
|
|
19343
|
-
const start = limit ? -limit : 0;
|
|
19344
|
-
const messages = await this.client.lRange(key, start, -1);
|
|
19345
|
-
return messages.map((msg) => JSON.parse(msg));
|
|
19346
|
-
}
|
|
19347
|
-
async clear(sessionId) {
|
|
19348
|
-
if (!this.connected)
|
|
19349
|
-
throw new Error("Redis not connected");
|
|
19350
|
-
const key = this.getKey(sessionId);
|
|
19351
|
-
await this.client.del(key);
|
|
19352
|
-
}
|
|
19353
|
-
async delete(sessionId) {
|
|
19354
|
-
await this.clear(sessionId);
|
|
19355
|
-
}
|
|
19356
|
-
async exists(sessionId) {
|
|
19357
|
-
if (!this.connected)
|
|
19358
|
-
throw new Error("Redis not connected");
|
|
19359
|
-
const key = this.getKey(sessionId);
|
|
19360
|
-
return (await this.client.exists(key)) === 1;
|
|
19361
|
-
}
|
|
19362
|
-
async disconnect() {
|
|
19363
|
-
if (this.connected) {
|
|
19364
|
-
await this.client.quit();
|
|
19365
|
-
this.connected = false;
|
|
19366
|
-
}
|
|
19367
|
-
}
|
|
19368
|
-
}
|
|
19369
|
-
|
|
19370
|
-
function createMemoryStorage(config) {
|
|
19371
|
-
// Normalize type (support "buffer" as alias for "in-memory")
|
|
19372
|
-
const normalizedType = config.type === "buffer" ? "in-memory" : config.type;
|
|
19373
|
-
switch (normalizedType) {
|
|
19374
|
-
case "in-memory":
|
|
19375
|
-
return new InMemoryStorage();
|
|
19376
|
-
case "redis":
|
|
19377
|
-
if (!config.redis) {
|
|
19378
|
-
throw new Error("Redis config required for redis memory type");
|
|
19379
|
-
}
|
|
19380
|
-
return new RedisStorage(config.redis);
|
|
19381
|
-
case "postgres":
|
|
19382
|
-
if (!config.postgres) {
|
|
19383
|
-
throw new Error("Postgres config required for postgres memory type");
|
|
19384
|
-
}
|
|
19385
|
-
return new PostgresStorage(config.postgres);
|
|
19386
|
-
default:
|
|
19387
|
-
throw new Error(`Unknown memory type: ${config.type}`);
|
|
19388
|
-
}
|
|
19389
|
-
}
|
|
19390
|
-
|
|
19391
19499
|
// Load environment variables
|
|
19392
19500
|
dotenv.config();
|
|
19393
19501
|
// Global cache for policy files to prevent repetitive disk I/O
|
|
@@ -19983,6 +20091,14 @@ class SekuireServer {
|
|
|
19983
20091
|
getAgentId() {
|
|
19984
20092
|
return this.agentId;
|
|
19985
20093
|
}
|
|
20094
|
+
/**
|
|
20095
|
+
* Handle incoming webhooks from other agents
|
|
20096
|
+
*/
|
|
20097
|
+
async handleWebhook(payload, signature) {
|
|
20098
|
+
// In a real implementation, we would verify the signature
|
|
20099
|
+
// For now, we just pass the payload through to be handled by the implementation
|
|
20100
|
+
return { received: true };
|
|
20101
|
+
}
|
|
19986
20102
|
}
|
|
19987
20103
|
/**
|
|
19988
20104
|
* Express.js middleware for Sekuire protocol
|
|
@@ -20006,6 +20122,11 @@ function createSekuireExpressMiddleware(server) {
|
|
|
20006
20122
|
await server.handleAuth(req.body, clientNonce);
|
|
20007
20123
|
return res.json({ success: true });
|
|
20008
20124
|
}
|
|
20125
|
+
else if (req.path === "/sekuire/webhook" && req.method === "POST") {
|
|
20126
|
+
const signature = req.headers["x-sekuire-signature"];
|
|
20127
|
+
const result = await server.handleWebhook(req.body, signature);
|
|
20128
|
+
return res.json(result);
|
|
20129
|
+
}
|
|
20009
20130
|
next();
|
|
20010
20131
|
}
|
|
20011
20132
|
catch (error) {
|
|
@@ -20058,6 +20179,86 @@ function createSekuireFastifyPlugin(server) {
|
|
|
20058
20179
|
return { error: error.message };
|
|
20059
20180
|
}
|
|
20060
20181
|
});
|
|
20182
|
+
fastify.post("/sekuire/webhook", async (request, reply) => {
|
|
20183
|
+
try {
|
|
20184
|
+
const signature = request.headers["x-sekuire-signature"];
|
|
20185
|
+
const result = await server.handleWebhook(request.body, signature);
|
|
20186
|
+
return result;
|
|
20187
|
+
}
|
|
20188
|
+
catch (error) {
|
|
20189
|
+
reply.code(500);
|
|
20190
|
+
return { error: error.message };
|
|
20191
|
+
}
|
|
20192
|
+
});
|
|
20193
|
+
};
|
|
20194
|
+
}
|
|
20195
|
+
|
|
20196
|
+
/**
|
|
20197
|
+
* Create a tool for discovering other agents in the Sekuire network
|
|
20198
|
+
*/
|
|
20199
|
+
function createDiscoveryTool(client) {
|
|
20200
|
+
return {
|
|
20201
|
+
name: 'discover_agents',
|
|
20202
|
+
description: "Search for other AI agents in the Sekuire network by capability or name. Use this to find agents that can help with specific tasks (e.g., 'jira', 'google drive').",
|
|
20203
|
+
schema: z.object({
|
|
20204
|
+
query: z.string().describe("The search query (e.g., 'jira', 'drive', 'github')"),
|
|
20205
|
+
}),
|
|
20206
|
+
execute: async ({ query }) => {
|
|
20207
|
+
try {
|
|
20208
|
+
const agents = await client.searchAgents(query);
|
|
20209
|
+
if (agents.length === 0) {
|
|
20210
|
+
return `No agents found matching '${query}'.`;
|
|
20211
|
+
}
|
|
20212
|
+
return agents.map((a) => ({
|
|
20213
|
+
name: a.name,
|
|
20214
|
+
id: a.sekuire_id,
|
|
20215
|
+
description: a.description,
|
|
20216
|
+
status: a.verification_status,
|
|
20217
|
+
}));
|
|
20218
|
+
}
|
|
20219
|
+
catch (error) {
|
|
20220
|
+
return `Error searching for agents: ${error.message}`;
|
|
20221
|
+
}
|
|
20222
|
+
},
|
|
20223
|
+
};
|
|
20224
|
+
}
|
|
20225
|
+
/**
|
|
20226
|
+
* Create a tool for delegating tasks to other agents
|
|
20227
|
+
*/
|
|
20228
|
+
function createDelegationTool(client) {
|
|
20229
|
+
return {
|
|
20230
|
+
name: 'delegate_task',
|
|
20231
|
+
description: "Delegate a task to another agent. Requires the target agent's Sekuire ID (found via discover_agents).",
|
|
20232
|
+
schema: z.object({
|
|
20233
|
+
agent_id: z.string().describe('The Sekuire ID of the target agent'),
|
|
20234
|
+
task: z.string().describe('The task description or message to send to the agent'),
|
|
20235
|
+
context: z.record(z.any()).optional().describe('Optional context data to pass'),
|
|
20236
|
+
}),
|
|
20237
|
+
execute: async ({ agent_id, task, context }) => {
|
|
20238
|
+
try {
|
|
20239
|
+
// 1. Get Agent Info
|
|
20240
|
+
const agentInfo = await client.getAgentInfo(agent_id);
|
|
20241
|
+
// 2. Perform Handshake & Auth (Simulated for this phase as we don't have dynamic URLs yet)
|
|
20242
|
+
// In a real scenario:
|
|
20243
|
+
// const handshake = await client.connect(agentInfo.url);
|
|
20244
|
+
// 3. Send Task
|
|
20245
|
+
// const result = await client.sendTask(handshake.session, { task, context });
|
|
20246
|
+
// For the demo/prototype phase without dynamic routing:
|
|
20247
|
+
// We simulate the success message. The actual inter-process communication
|
|
20248
|
+
// would happen here via HTTP/WebSocket.
|
|
20249
|
+
return {
|
|
20250
|
+
status: 'success',
|
|
20251
|
+
message: `Task successfully delegated to ${agentInfo.name || agent_id}`,
|
|
20252
|
+
details: {
|
|
20253
|
+
recipient: agent_id,
|
|
20254
|
+
task_summary: task.substring(0, 50) + '...',
|
|
20255
|
+
},
|
|
20256
|
+
};
|
|
20257
|
+
}
|
|
20258
|
+
catch (error) {
|
|
20259
|
+
return `Error delegating task to agent ${agent_id}: ${error.message}`;
|
|
20260
|
+
}
|
|
20261
|
+
},
|
|
20061
20262
|
};
|
|
20062
20263
|
}
|
|
20063
20264
|
|
|
@@ -20086,4 +20287,4 @@ function createSekuireClient(keyPair, registryUrl, options) {
|
|
|
20086
20287
|
return new SekuireClient(keyPair, config);
|
|
20087
20288
|
}
|
|
20088
20289
|
|
|
20089
|
-
export { SekuireAgent as Agent, AgentIdentity, AnthropicProvider, ComplianceError, ComplianceMonitor, ContentPolicyError, CryptoError, FileAccessError, GoogleProvider, InMemoryStorage, NetworkComplianceError, NetworkError, OllamaProvider, OpenAIProvider, PolicyClient, PolicyEnforcer, PolicyViolationError, PostgresStorage, ProtocolError, RedisStorage, SekuireAgent$1 as SekuireAgent, SekuireAgentBuilder, SekuireClient, SekuireCrypto, SekuireError, SekuireLogger, SekuireServer, ToolPatternParser, ToolRegistry, ToolUsageError, builtInTools, calculateSekuireId, createAgent, createDefaultToolRegistry, createLLMProvider, createMemoryStorage, createSekuireClient, createSekuireExpressMiddleware, createSekuireFastifyPlugin, generateKeyPair, getAgent, getAgentConfig, getAgents, getTools$1 as getLegacyTools, getSystemPrompt, getTools, llm, loadConfig, loadSystemPrompt, loadTools, tool, tools };
|
|
20290
|
+
export { SekuireAgent as Agent, AgentIdentity, AnthropicProvider, ComplianceError, ComplianceMonitor, ContentPolicyError, CryptoError, FileAccessError, GoogleProvider, InMemoryStorage, NetworkComplianceError, NetworkError, OllamaProvider, OpenAIProvider, PolicyClient, PolicyEnforcer, PolicyViolationError, PostgresStorage, ProtocolError, RedisStorage, SekuireAgent$1 as SekuireAgent, SekuireAgentBuilder, SekuireClient, SekuireCrypto, SekuireError, SekuireLogger, SekuireServer, ToolPatternParser, ToolRegistry, ToolUsageError, builtInTools, calculateSekuireId, createAgent, createDefaultToolRegistry, createDelegationTool, createDiscoveryTool, createLLMProvider, createMemoryStorage, createSekuireClient, createSekuireExpressMiddleware, createSekuireFastifyPlugin, generateKeyPair, getAgent, getAgentConfig, getAgents, getTools$1 as getLegacyTools, getSystemPrompt, getTools, llm, loadConfig, loadSystemPrompt, loadTools, tool, tools };
|