psadk 1.1.1 → 1.1.2
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/build/main/lib/PSAgentLogger.js +3 -3
- package/build/main/lib/tools/PSMemoryTool.d.ts +45 -0
- package/build/main/lib/tools/PSMemoryTool.js +485 -0
- package/build/main/lib/utils/debuglogger.d.ts +7 -0
- package/build/main/lib/utils/debuglogger.js +25 -0
- package/build/module/lib/PSAgentLogger.js +3 -3
- package/build/module/lib/tools/PSMemoryTool.d.ts +45 -0
- package/build/module/lib/tools/PSMemoryTool.js +487 -0
- package/build/module/lib/utils/debuglogger.d.ts +7 -0
- package/build/module/lib/utils/debuglogger.js +25 -0
- package/package.json +1 -1
|
@@ -24,9 +24,9 @@ class PSAgentLogger {
|
|
|
24
24
|
const duration = now - this.lastTimestamp;
|
|
25
25
|
this.lastTimestamp = duration === 0 ? now + 1 : this.lastTimestamp;
|
|
26
26
|
if (this.logFilePath) {
|
|
27
|
-
node_fs_1.default.appendFileSync(this.logFilePath, `data: ${JSON.stringify({ ts: type === 'todo' ? 0 :
|
|
27
|
+
node_fs_1.default.appendFileSync(this.logFilePath, `data: ${JSON.stringify({ ts: type === 'todo' ? 0 : this.lastTimestamp, type, taskId: this.taskId, task: this.task, message })}\n\n`, { encoding: 'utf-8' });
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
this.logFn(`[${type.toUpperCase()}] ${message}`, ...optionalParams);
|
|
30
30
|
}
|
|
31
31
|
debug(message, ...optionalParams) {
|
|
32
32
|
this.log('debug', message, ...optionalParams);
|
|
@@ -45,4 +45,4 @@ class PSAgentLogger {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
exports.PSAgentLogger = PSAgentLogger;
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBZ2VudExvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvUFNBZ2VudExvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsc0RBQXlCO0FBRXpCLGtEQUEwQjtBQUcxQixNQUFhLGFBQWE7SUFNeEIsWUFBWSxPQUErRTtRQUxuRixVQUFLLEdBQUcsSUFBQSxlQUFLLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUIsa0JBQWEsR0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFJL0IsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLGVBQUssRUFBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLENBQUE7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVksRUFBRSxPQUFXLEVBQUUsR0FBRyxjQUFvQjtRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLGlCQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBRyxNQUFNLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0wsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ00sS0FBSyxDQUFDLE9BQWUsRUFBRSxHQUFHLGNBQW9CO1FBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDTSxJQUFJLENBQUMsT0FBZSxFQUFFLEdBQUcsY0FBb0I7UUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNNLEtBQUssQ0FBQyxPQUFlLEVBQUUsR0FBRyxjQUFvQjtRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ00sSUFBSSxDQUFDLE9BQWUsRUFBRSxHQUFHLGNBQW9CO1FBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDTSxJQUFJLENBQUMsVUFBa0IsRUFBRSxFQUFFLEdBQUcsY0FBb0I7UUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBeENELHNDQXdDQyJ9
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PSAgentLogger } from "../PSAgentLogger";
|
|
2
|
+
import { PSAgentTool } from "../PSAgentTool";
|
|
3
|
+
export interface Memory {
|
|
4
|
+
path: string;
|
|
5
|
+
content?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface IMemoryStore {
|
|
8
|
+
viewMemories(withContent?: boolean): Promise<Memory[]>;
|
|
9
|
+
getMemoryByPath(relativePath: string): Promise<Memory | undefined>;
|
|
10
|
+
setMemory(mem: Memory): Promise<void>;
|
|
11
|
+
deleteMemory(relativePath: string): Promise<boolean>;
|
|
12
|
+
renameMemory(oldRelativePath: string, newRelativePath: string): Promise<boolean>;
|
|
13
|
+
insertIntoMemory(relativePath: string, lineNumber: number, text: string): Promise<boolean>;
|
|
14
|
+
replaceInMemory(relativePath: string, oldStr: string, newStr: string): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
export declare class MemoryStore implements IMemoryStore {
|
|
17
|
+
private lastModified;
|
|
18
|
+
private directory;
|
|
19
|
+
constructor(options?: {
|
|
20
|
+
initialmemories?: Memory[];
|
|
21
|
+
directory?: string;
|
|
22
|
+
});
|
|
23
|
+
viewMemories(withContent?: boolean): Promise<Memory[]>;
|
|
24
|
+
getMemoryByPath(relativePath: string): Promise<Memory | undefined>;
|
|
25
|
+
setMemory(mem: Memory): Promise<void>;
|
|
26
|
+
deleteMemory(relativePath: string): Promise<boolean>;
|
|
27
|
+
renameMemory(oldRelativePath: string, newRelativePath: string): Promise<boolean>;
|
|
28
|
+
insertIntoMemory(relativePath: string, lineNumber: number, text: string): Promise<boolean>;
|
|
29
|
+
replaceInMemory(relativePath: string, oldStr: string, newStr: string): Promise<boolean>;
|
|
30
|
+
get LastModified(): string;
|
|
31
|
+
}
|
|
32
|
+
export declare class PSMemoryTool extends PSAgentTool {
|
|
33
|
+
static readonly toolName = "memory_tool";
|
|
34
|
+
private store;
|
|
35
|
+
constructor(options: {
|
|
36
|
+
store: MemoryStore;
|
|
37
|
+
});
|
|
38
|
+
run(_input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
39
|
+
private run_view;
|
|
40
|
+
private run_create;
|
|
41
|
+
private run_str_replace;
|
|
42
|
+
private run_insert;
|
|
43
|
+
private run_delete;
|
|
44
|
+
private run_rename;
|
|
45
|
+
}
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PSMemoryTool = exports.MemoryStore = void 0;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const uuid_1 = require("uuid");
|
|
12
|
+
const v4_1 = require("zod/v4");
|
|
13
|
+
const PSAgentTool_1 = require("../PSAgentTool");
|
|
14
|
+
const debuglogger_1 = __importDefault(require("../utils/debuglogger"));
|
|
15
|
+
const dlog = (0, debuglogger_1.default)('PSAgent:MemoryTool');
|
|
16
|
+
class MemoryStore {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.lastModified = new Date().toISOString();
|
|
19
|
+
this.lastModified = new Date().toISOString();
|
|
20
|
+
this.directory = (options === null || options === void 0 ? void 0 : options.directory) || node_path_1.default.join(node_os_1.default.tmpdir(), (0, uuid_1.v4)());
|
|
21
|
+
if (!node_fs_1.default.existsSync(this.directory)) {
|
|
22
|
+
node_fs_1.default.mkdirSync(this.directory, { recursive: true });
|
|
23
|
+
dlog.info(`Created memory directory at ${this.directory}`);
|
|
24
|
+
}
|
|
25
|
+
if (this.directory) {
|
|
26
|
+
try {
|
|
27
|
+
if (options === null || options === void 0 ? void 0 : options.initialmemories) {
|
|
28
|
+
for (const mem of options.initialmemories) {
|
|
29
|
+
const filePath = node_path_1.default.join(this.directory, `${mem.path}`);
|
|
30
|
+
node_fs_1.default.writeFileSync(filePath, mem.content || '', { encoding: 'utf-8' });
|
|
31
|
+
mem.path = filePath;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const files = node_fs_1.default.readdirSync(this.directory, { recursive: true });
|
|
35
|
+
dlog.info(`Found memories from directory: ${this.directory}, found ${files.length} files.`);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
dlog.error("Unable to load memories from directory:", error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async viewMemories(withContent) {
|
|
43
|
+
if (!this.directory)
|
|
44
|
+
return [];
|
|
45
|
+
const files = node_fs_1.default.readdirSync(this.directory);
|
|
46
|
+
const memories = files.map(f => {
|
|
47
|
+
let filePath = node_path_1.default.join(this.directory, f);
|
|
48
|
+
const content = withContent ? node_fs_1.default.readFileSync(filePath, 'utf-8') : undefined;
|
|
49
|
+
filePath = filePath.replace(this.directory, '');
|
|
50
|
+
filePath = filePath.startsWith('/') ? filePath : filePath = '/' + filePath;
|
|
51
|
+
return { path: filePath, content };
|
|
52
|
+
});
|
|
53
|
+
return memories;
|
|
54
|
+
}
|
|
55
|
+
async getMemoryByPath(relativePath) {
|
|
56
|
+
if (!this.directory)
|
|
57
|
+
return undefined;
|
|
58
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
59
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
60
|
+
const content = node_fs_1.default.readFileSync(filePath, 'utf-8');
|
|
61
|
+
return { path: relativePath, content };
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
async setMemory(mem) {
|
|
66
|
+
if (!this.directory)
|
|
67
|
+
return;
|
|
68
|
+
const filePath = node_path_1.default.join(this.directory, mem.path);
|
|
69
|
+
node_fs_1.default.writeFileSync(filePath, mem.content || '', { encoding: 'utf-8' });
|
|
70
|
+
this.lastModified = new Date().toISOString();
|
|
71
|
+
}
|
|
72
|
+
async deleteMemory(relativePath) {
|
|
73
|
+
if (!this.directory)
|
|
74
|
+
return false;
|
|
75
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
76
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
77
|
+
node_fs_1.default.unlinkSync(filePath);
|
|
78
|
+
this.lastModified = new Date().toISOString();
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
async renameMemory(oldRelativePath, newRelativePath) {
|
|
84
|
+
if (!this.directory)
|
|
85
|
+
return false;
|
|
86
|
+
const oldFilePath = node_path_1.default.join(this.directory, oldRelativePath);
|
|
87
|
+
const newFilePath = node_path_1.default.join(this.directory, newRelativePath);
|
|
88
|
+
if (node_fs_1.default.existsSync(oldFilePath)) {
|
|
89
|
+
node_fs_1.default.renameSync(oldFilePath, newFilePath);
|
|
90
|
+
this.lastModified = new Date().toISOString();
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
async insertIntoMemory(relativePath, lineNumber, text) {
|
|
96
|
+
if (!this.directory)
|
|
97
|
+
return false;
|
|
98
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
99
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
100
|
+
const content = node_fs_1.default.readFileSync(filePath, 'utf-8');
|
|
101
|
+
const lines = content.split('\n');
|
|
102
|
+
const index = Math.max(0, Math.min(lines.length, lineNumber - 1));
|
|
103
|
+
lines.splice(index, 0, text);
|
|
104
|
+
node_fs_1.default.writeFileSync(filePath, lines.join('\n'), { encoding: 'utf-8' });
|
|
105
|
+
this.lastModified = new Date().toISOString();
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
async replaceInMemory(relativePath, oldStr, newStr) {
|
|
111
|
+
if (!this.directory)
|
|
112
|
+
return false;
|
|
113
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
114
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
115
|
+
let content = node_fs_1.default.readFileSync(filePath, 'utf-8');
|
|
116
|
+
//use regex to find all instances of oldStr and replace it with newStr
|
|
117
|
+
const regex = new RegExp(oldStr, 'g');
|
|
118
|
+
content = content.replace(regex, newStr);
|
|
119
|
+
node_fs_1.default.writeFileSync(filePath, content, { encoding: 'utf-8' });
|
|
120
|
+
this.lastModified = new Date().toISOString();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
get LastModified() {
|
|
126
|
+
return this.lastModified;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.MemoryStore = MemoryStore;
|
|
130
|
+
class PSMemoryTool extends PSAgentTool_1.PSAgentTool {
|
|
131
|
+
constructor(options) {
|
|
132
|
+
super({
|
|
133
|
+
name: PSMemoryTool.toolName,
|
|
134
|
+
description: `Use this tool to manage the agent's memory files.
|
|
135
|
+
Commands:
|
|
136
|
+
- view: Shows the memory directory contents or memory file contents with optional line ranges.
|
|
137
|
+
- create: Create a new memory file with a unique path and specified content.
|
|
138
|
+
- str_replace: Replace a specific string in a memory file with another string.
|
|
139
|
+
- insert: Adds text to a memory, Insert text at a specific line.
|
|
140
|
+
- delete: Remove a memory file by path, Delete a file or directory.
|
|
141
|
+
- rename: Rename a memory file by its path.
|
|
142
|
+
|
|
143
|
+
Details and examples for \`view\` command:
|
|
144
|
+
Shows the memory directory contents or memory file contents with optional line ranges.
|
|
145
|
+
Parameters:
|
|
146
|
+
- command: view
|
|
147
|
+
- path: (optional) The path of the memory file to view. If omitted, lists all memory files.
|
|
148
|
+
- view_range: (optional) Line range to view as array of two numbers representing start and end (e.g., [10,20]). If omitted, shows the entire file.
|
|
149
|
+
Example:
|
|
150
|
+
\`\`\`json
|
|
151
|
+
{
|
|
152
|
+
"command": "view",
|
|
153
|
+
"path": "/memories",
|
|
154
|
+
"view_range": [1, 10] // Optional: view specific lines
|
|
155
|
+
}
|
|
156
|
+
\`\`\`
|
|
157
|
+
|
|
158
|
+
Details and examples for \`create\` command:
|
|
159
|
+
Create or overwrite a new memory file with a unique path and specified content.
|
|
160
|
+
Parameters:
|
|
161
|
+
- command: create
|
|
162
|
+
- path: The unique path for the new memory file (e.g., "/memories/memory1.txt").
|
|
163
|
+
- flie_text: The content to write into the new memory file.
|
|
164
|
+
Example:
|
|
165
|
+
\`\`\`json
|
|
166
|
+
{
|
|
167
|
+
"command": "create",
|
|
168
|
+
"path": "/memories/notes.txt",
|
|
169
|
+
"file_text": "Meeting notes:\n- Discussed project timeline\n- Next steps defined\n"
|
|
170
|
+
}
|
|
171
|
+
\`\`\`
|
|
172
|
+
|
|
173
|
+
Details and examples for \`str_replace\` command:
|
|
174
|
+
Replace a specific string in a memory file with another string.
|
|
175
|
+
Parameters:
|
|
176
|
+
- command: str_replace
|
|
177
|
+
- path: The path of the memory file to modify (e.g., "/memories/memory1.txt").
|
|
178
|
+
- old_str: The string to be replaced.
|
|
179
|
+
- new_str: The string to replace with.
|
|
180
|
+
Example:
|
|
181
|
+
\`\`\`json
|
|
182
|
+
{
|
|
183
|
+
"command": "str_replace",
|
|
184
|
+
"path": "/memories/preferences.txt",
|
|
185
|
+
"old_str": "Favorite color: blue",
|
|
186
|
+
"new_str": "Favorite color: green"
|
|
187
|
+
}
|
|
188
|
+
\`\`\`
|
|
189
|
+
|
|
190
|
+
Details and examples for \`insert\` command:
|
|
191
|
+
Insert text at a specific line in a memory file.
|
|
192
|
+
Parameters:
|
|
193
|
+
- command: insert
|
|
194
|
+
- path: The path of the memory file to modify (e.g., "/memories/memory1.txt").
|
|
195
|
+
- insert_line: The line number to insert the text at (1-based index).
|
|
196
|
+
- insert_text: The text to insert.
|
|
197
|
+
Example:
|
|
198
|
+
\`\`\`json
|
|
199
|
+
{
|
|
200
|
+
"command": "insert",
|
|
201
|
+
"path": "/memories/todo.txt",
|
|
202
|
+
"insert_line": 2,
|
|
203
|
+
"insert_text": "- Review memory tool documentation\n"
|
|
204
|
+
}
|
|
205
|
+
\`\`\`
|
|
206
|
+
|
|
207
|
+
Details and examples for \`delete\` command:
|
|
208
|
+
Remove a memory file by path, Delete a file or directory.
|
|
209
|
+
Parameters:
|
|
210
|
+
- command: delete
|
|
211
|
+
- path: The path of the memory file or directory to delete (e.g., "/memories/memory1.txt" or "/memories/old_notes").
|
|
212
|
+
Example:
|
|
213
|
+
\`\`\`json
|
|
214
|
+
{
|
|
215
|
+
"command": "delete",
|
|
216
|
+
"path": "/memories/old_file.txt"
|
|
217
|
+
}
|
|
218
|
+
\`\`\`
|
|
219
|
+
|
|
220
|
+
Details and examples for \`rename\` command:
|
|
221
|
+
Rename a memory file by its path.
|
|
222
|
+
Parameters:
|
|
223
|
+
- command: rename
|
|
224
|
+
- old_path: The current path of the memory file to rename (e.g., "/memories/memory1.txt").
|
|
225
|
+
- new_path: The new path for the memory file (e.g., "/memories/updated_memory1.txt").
|
|
226
|
+
Example:
|
|
227
|
+
\`\`\`json
|
|
228
|
+
{
|
|
229
|
+
"command": "rename",
|
|
230
|
+
"old_path": "/memories/draft.txt",
|
|
231
|
+
"new_path": "/memories/final.txt"
|
|
232
|
+
}
|
|
233
|
+
\`\`\`
|
|
234
|
+
Note: when editing your memory folder, always try to keep its content up-to-date, coherent and organized.
|
|
235
|
+
You can rename or delete files that are no longer relevant.
|
|
236
|
+
Do not create new files unless necessary.
|
|
237
|
+
|
|
238
|
+
IMPORTANT: ALWAYS VIEW YOUR MEMORY DIRECTORY BEFORE DOING ANYTHING ELSE.
|
|
239
|
+
MEMORY PROTOCOL:
|
|
240
|
+
1. Use the \`view\` command of your \`memory\` tool to check for earlier progress.
|
|
241
|
+
2. ... (work on the task) ...
|
|
242
|
+
- As you make progress, record status / progress / thoughts etc in your memory.
|
|
243
|
+
ASSUME INTERRUPTION: Your context window might be reset at any moment, so you risk losing any progress that is not recorded in your memory directory.
|
|
244
|
+
`,
|
|
245
|
+
type: "API",
|
|
246
|
+
local_execution: true,
|
|
247
|
+
hitl: true,
|
|
248
|
+
inputschema: {
|
|
249
|
+
url: `http://localhost/${PSMemoryTool.toolName}`,
|
|
250
|
+
method: "POST",
|
|
251
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
252
|
+
command: v4_1.z.enum(['view', 'create', 'str_replace', 'insert', 'delete', 'rename']).meta({
|
|
253
|
+
title: "command",
|
|
254
|
+
description: "The memory command to execute."
|
|
255
|
+
}),
|
|
256
|
+
path: v4_1.z.string().optional().meta({
|
|
257
|
+
title: "path",
|
|
258
|
+
description: "The path of the memory file to operate on. For 'view' command, can be omitted only for view command, which then returns all files representing the memory ."
|
|
259
|
+
}),
|
|
260
|
+
file_text: v4_1.z.string().optional().meta({
|
|
261
|
+
title: "file_text",
|
|
262
|
+
description: "The content to write into the new memory file. Required for 'create' command."
|
|
263
|
+
}),
|
|
264
|
+
view_range: v4_1.z.array(v4_1.z.number().int().nonnegative()).length(2).optional().meta({
|
|
265
|
+
title: "view_range",
|
|
266
|
+
description: "Line range to view as array of two numbers representing start and end (e.g., [10,20]). Optional, only for 'view' command."
|
|
267
|
+
}),
|
|
268
|
+
old_str: v4_1.z.string().optional().meta({
|
|
269
|
+
title: "old_str",
|
|
270
|
+
description: "The string to be replaced. Required for 'str_replace' command."
|
|
271
|
+
}),
|
|
272
|
+
new_str: v4_1.z.string().optional().meta({
|
|
273
|
+
title: "new_str",
|
|
274
|
+
description: "The string to replace with. Required for 'str_replace' command."
|
|
275
|
+
}),
|
|
276
|
+
insert_line: v4_1.z.number().int().nonnegative().optional().meta({
|
|
277
|
+
title: "insert_line",
|
|
278
|
+
description: "The line number to insert the text at (1-based index). Required for 'insert' command."
|
|
279
|
+
}),
|
|
280
|
+
insert_text: v4_1.z.string().optional().meta({
|
|
281
|
+
title: "insert_text",
|
|
282
|
+
description: "The text to insert. Required for 'insert' command."
|
|
283
|
+
}),
|
|
284
|
+
old_path: v4_1.z.string().optional().meta({
|
|
285
|
+
title: "old_path",
|
|
286
|
+
description: "The current path of the memory file to rename. Required for 'rename' command."
|
|
287
|
+
}),
|
|
288
|
+
new_path: v4_1.z.string().optional().meta({
|
|
289
|
+
title: "new_path",
|
|
290
|
+
description: "The new path for the memory file. Required for 'rename' command."
|
|
291
|
+
}),
|
|
292
|
+
}).meta({
|
|
293
|
+
title: `${PSMemoryTool.toolName}_request_body`,
|
|
294
|
+
description: `The request body parameters for the ${PSMemoryTool.toolName} tool.`,
|
|
295
|
+
}), { "io": "input" }),
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
this.store = options.store || new MemoryStore();
|
|
299
|
+
}
|
|
300
|
+
async run(_input, log) {
|
|
301
|
+
const command = _input.command;
|
|
302
|
+
if (!command || typeof command !== "string") {
|
|
303
|
+
throw new Error("Invalid or missing command provided.");
|
|
304
|
+
}
|
|
305
|
+
switch (command) {
|
|
306
|
+
case 'view': return this.run_view(_input, log);
|
|
307
|
+
case 'create': return this.run_create(_input, log);
|
|
308
|
+
case 'str_replace': return this.run_str_replace(_input, log);
|
|
309
|
+
case 'insert': return this.run_insert(_input, log);
|
|
310
|
+
case 'delete': return this.run_delete(_input, log);
|
|
311
|
+
case 'rename': return this.run_rename(_input, log);
|
|
312
|
+
default: throw new Error(`Unsupported command: ${command}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async run_view(input, log) {
|
|
316
|
+
const logger = log || dlog;
|
|
317
|
+
try {
|
|
318
|
+
const path = input.path;
|
|
319
|
+
const view_range = input.view_range;
|
|
320
|
+
if (path && typeof path === "string") {
|
|
321
|
+
// View specific file
|
|
322
|
+
const mem = await this.store.getMemoryByPath(path);
|
|
323
|
+
if (!mem) {
|
|
324
|
+
throw new Error(`Memory file not found at path: ${path}`);
|
|
325
|
+
}
|
|
326
|
+
let content = mem.content || '';
|
|
327
|
+
if (view_range && Array.isArray(view_range) && view_range.length === 2) {
|
|
328
|
+
const start = Math.max(0, view_range[0] - 1); // Convert to 0-based index
|
|
329
|
+
const end = Math.min(content.split('\n').length, view_range[1]);
|
|
330
|
+
const lines = content.split('\n').slice(start, end);
|
|
331
|
+
content = lines.join('\n');
|
|
332
|
+
}
|
|
333
|
+
logger.info(`📋 Viewing memory file: ${mem.path}\n\`\`\`text\n${content}\n\`\`\``);
|
|
334
|
+
return {
|
|
335
|
+
status: 'success',
|
|
336
|
+
output: content,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
// List all memory files
|
|
341
|
+
const files = this.store.viewMemories(false);
|
|
342
|
+
logger.info(`📋 Memory directory contents:\n\`\`\`json\n${JSON.stringify(files, null, 2)}\n\`\`\``);
|
|
343
|
+
return {
|
|
344
|
+
status: 'success',
|
|
345
|
+
output: files,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
logger.error('Error viewing memory:', error);
|
|
351
|
+
throw error;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async run_create(input, log) {
|
|
355
|
+
const logger = log || dlog;
|
|
356
|
+
try {
|
|
357
|
+
const path = input.path;
|
|
358
|
+
const file_text = input.file_text;
|
|
359
|
+
if (!path || typeof path !== "string") {
|
|
360
|
+
throw new Error("Invalid or missing path provided for create command.");
|
|
361
|
+
}
|
|
362
|
+
if (typeof file_text !== "string") {
|
|
363
|
+
throw new Error("Invalid or missing file_text provided for create command.");
|
|
364
|
+
}
|
|
365
|
+
this.store.setMemory({ path, content: file_text });
|
|
366
|
+
logger.info(`📝 Created memory file at path: ${path}`);
|
|
367
|
+
return {
|
|
368
|
+
status: 'success',
|
|
369
|
+
output: `Memory file created at path: ${path}`,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
logger.error('Error creating memory file:', error);
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async run_str_replace(input, log) {
|
|
378
|
+
const logger = log || dlog;
|
|
379
|
+
try {
|
|
380
|
+
const path = input.path;
|
|
381
|
+
const old_str = input.old_str;
|
|
382
|
+
const new_str = input.new_str;
|
|
383
|
+
if (!path || typeof path !== "string") {
|
|
384
|
+
throw new Error("Invalid or missing path provided for str_replace command.");
|
|
385
|
+
}
|
|
386
|
+
if (typeof old_str !== "string" || typeof new_str !== "string") {
|
|
387
|
+
throw new Error("Invalid or missing old_str or new_str provided for str_replace command.");
|
|
388
|
+
}
|
|
389
|
+
const success = this.store.replaceInMemory(path, old_str, new_str);
|
|
390
|
+
if (!success) {
|
|
391
|
+
throw new Error(`Failed to replace string in memory file at path: ${path}. File may not exist.`);
|
|
392
|
+
}
|
|
393
|
+
logger.info(`🔄 Replaced string in memory file at path: ${path}`);
|
|
394
|
+
return {
|
|
395
|
+
status: 'success',
|
|
396
|
+
output: `String replaced in memory file at path: ${path}`,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
logger.error('Error replacing string in memory file:', error);
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
async run_insert(input, log) {
|
|
405
|
+
const logger = log || dlog;
|
|
406
|
+
try {
|
|
407
|
+
const path = input.path;
|
|
408
|
+
const insert_line = input.insert_line;
|
|
409
|
+
const insert_text = input.insert_text;
|
|
410
|
+
if (!path || typeof path !== "string") {
|
|
411
|
+
throw new Error("Invalid or missing path provided for insert command.");
|
|
412
|
+
}
|
|
413
|
+
if (typeof insert_line !== "number" || insert_line < 1) {
|
|
414
|
+
throw new Error("Invalid or missing insert_line provided for insert command. Must be a positive integer.");
|
|
415
|
+
}
|
|
416
|
+
if (typeof insert_text !== "string") {
|
|
417
|
+
throw new Error("Invalid or missing insert_text provided for insert command.");
|
|
418
|
+
}
|
|
419
|
+
const success = this.store.insertIntoMemory(path, insert_line, insert_text);
|
|
420
|
+
if (!success) {
|
|
421
|
+
throw new Error(`Failed to insert text into memory file at path: ${path}. File may not exist.`);
|
|
422
|
+
}
|
|
423
|
+
logger.info(`➕ Inserted text into memory file at path: ${path} at line ${insert_line}`);
|
|
424
|
+
return {
|
|
425
|
+
status: 'success',
|
|
426
|
+
output: `Text inserted into memory file at path: ${path} at line ${insert_line}`,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
logger.error('Error inserting text into memory file:', error);
|
|
431
|
+
throw error;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
async run_delete(input, log) {
|
|
435
|
+
const logger = log || dlog;
|
|
436
|
+
try {
|
|
437
|
+
const path = input.path;
|
|
438
|
+
if (!path || typeof path !== "string") {
|
|
439
|
+
throw new Error("Invalid or missing path provided for delete command.");
|
|
440
|
+
}
|
|
441
|
+
const success = this.store.deleteMemory(path);
|
|
442
|
+
if (!success) {
|
|
443
|
+
throw new Error(`Failed to delete memory file at path: ${path}. File may not exist.`);
|
|
444
|
+
}
|
|
445
|
+
logger.info(`🗑️ Deleted memory file at path: ${path}`);
|
|
446
|
+
return {
|
|
447
|
+
status: 'success',
|
|
448
|
+
output: `Memory file deleted at path: ${path}`,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
catch (error) {
|
|
452
|
+
logger.error('Error deleting memory file:', error);
|
|
453
|
+
throw error;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
async run_rename(input, log) {
|
|
457
|
+
const logger = log || dlog;
|
|
458
|
+
try {
|
|
459
|
+
const old_path = input.old_path;
|
|
460
|
+
const new_path = input.new_path;
|
|
461
|
+
if (!old_path || typeof old_path !== "string") {
|
|
462
|
+
throw new Error("Invalid or missing old_path provided for rename command.");
|
|
463
|
+
}
|
|
464
|
+
if (!new_path || typeof new_path !== "string") {
|
|
465
|
+
throw new Error("Invalid or missing new_path provided for rename command.");
|
|
466
|
+
}
|
|
467
|
+
const success = this.store.renameMemory(old_path, new_path);
|
|
468
|
+
if (!success) {
|
|
469
|
+
new Error(`Failed to rename memory file from ${old_path} to ${new_path}. File may not exist.`);
|
|
470
|
+
}
|
|
471
|
+
logger.info(`✏️ Renamed memory file from ${old_path} to ${new_path}`);
|
|
472
|
+
return {
|
|
473
|
+
status: 'success',
|
|
474
|
+
output: `Memory file renamed from ${old_path} to ${new_path}`,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
logger.error('Error renaming memory file:', error);
|
|
479
|
+
throw error;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
exports.PSMemoryTool = PSMemoryTool;
|
|
484
|
+
PSMemoryTool.toolName = "memory_tool";
|
|
485
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNNZW1vcnlUb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29scy9QU01lbW9yeVRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDs7Ozs7O0FBRXZELHNEQUF5QjtBQUN6QixzREFBeUI7QUFDekIsMERBQTZCO0FBRTdCLCtCQUFvQztBQUNwQywrQkFBMkI7QUFHM0IsZ0RBQTZDO0FBQzdDLHVFQUErQztBQUUvQyxNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFXLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQWlCL0MsTUFBYSxXQUFXO0lBR3BCLFlBQVksT0FBd0Q7UUFGNUQsaUJBQVksR0FBVyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBR3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFNBQVMsS0FBSSxtQkFBSSxDQUFDLElBQUksQ0FBQyxpQkFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUEsU0FBTSxHQUFFLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsaUJBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsaUJBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENB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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export default function debugLogger(prefix: string): {
|
|
2
|
+
debug: (msg: string, ...args: any[]) => void;
|
|
3
|
+
info: (msg: string, ...args: any[]) => void;
|
|
4
|
+
warn: (msg: string, ...args: any[]) => void;
|
|
5
|
+
error: (msg: string, ...args: any[]) => void;
|
|
6
|
+
done: (msg: string, ...args: any[]) => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.default = debugLogger;
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
function debugLogger(prefix) {
|
|
10
|
+
const logFn = (0, debug_1.default)(prefix);
|
|
11
|
+
logFn.enabled = true;
|
|
12
|
+
const debugLog = logFn.extend('debug');
|
|
13
|
+
const infoLog = logFn.extend('info');
|
|
14
|
+
const warnLog = logFn.extend('warn');
|
|
15
|
+
const errorLog = logFn.extend('error');
|
|
16
|
+
const doneLog = logFn.extend('done');
|
|
17
|
+
return {
|
|
18
|
+
debug: (msg, ...args) => debugLog(msg, ...args),
|
|
19
|
+
info: (msg, ...args) => infoLog(msg, ...args),
|
|
20
|
+
warn: (msg, ...args) => warnLog(msg, ...args),
|
|
21
|
+
error: (msg, ...args) => errorLog(msg, ...args),
|
|
22
|
+
done: (msg, ...args) => doneLog(msg, ...args),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWdsb2dnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzL2RlYnVnbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7Ozs7O0FBSXZELDhCQWVDO0FBakJELGtEQUEwQjtBQUUxQixTQUF3QixXQUFXLENBQUMsTUFBYztJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQUssRUFBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsT0FBTztRQUNMLEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDNUQsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVELEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7S0FDN0QsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -27,9 +27,9 @@ class PSAgentLogger {
|
|
|
27
27
|
const duration = now - this.lastTimestamp;
|
|
28
28
|
this.lastTimestamp = duration === 0 ? now + 1 : this.lastTimestamp;
|
|
29
29
|
if (this.logFilePath) {
|
|
30
|
-
node_fs_1.default.appendFileSync(this.logFilePath, `data: ${JSON.stringify({ ts: type === 'todo' ? 0 :
|
|
30
|
+
node_fs_1.default.appendFileSync(this.logFilePath, `data: ${JSON.stringify({ ts: type === 'todo' ? 0 : this.lastTimestamp, type, taskId: this.taskId, task: this.task, message })}\n\n`, { encoding: 'utf-8' });
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
this.logFn(`[${type.toUpperCase()}] ${message}`, ...optionalParams);
|
|
33
33
|
}
|
|
34
34
|
debug(message, ...optionalParams) {
|
|
35
35
|
this.log('debug', message, ...optionalParams);
|
|
@@ -48,4 +48,4 @@ class PSAgentLogger {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
exports.PSAgentLogger = PSAgentLogger;
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBZ2VudExvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvUFNBZ2VudExvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsc0RBQXlCO0FBRXpCLGtEQUEwQjtBQUcxQixNQUFhLGFBQWE7SUFDaEIsS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pCLFdBQVcsQ0FBbUI7SUFDdkMsYUFBYSxHQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QixNQUFNLENBQVU7SUFDaEIsSUFBSSxDQUFVO0lBQ3RCLFlBQVksT0FBK0U7UUFDekYsSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLGVBQUssRUFBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxXQUFXLENBQUE7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVksRUFBRSxPQUFXLEVBQUUsR0FBRyxjQUFvQjtRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLGlCQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBRyxNQUFNLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0wsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ00sS0FBSyxDQUFDLE9BQWUsRUFBRSxHQUFHLGNBQW9CO1FBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDTSxJQUFJLENBQUMsT0FBZSxFQUFFLEdBQUcsY0FBb0I7UUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNNLEtBQUssQ0FBQyxPQUFlLEVBQUUsR0FBRyxjQUFvQjtRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ00sSUFBSSxDQUFDLE9BQWUsRUFBRSxHQUFHLGNBQW9CO1FBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDTSxJQUFJLENBQUMsVUFBa0IsRUFBRSxFQUFFLEdBQUcsY0FBb0I7UUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBeENELHNDQXdDQyJ9
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PSAgentLogger } from "../PSAgentLogger";
|
|
2
|
+
import { PSAgentTool } from "../PSAgentTool";
|
|
3
|
+
export interface Memory {
|
|
4
|
+
path: string;
|
|
5
|
+
content?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface IMemoryStore {
|
|
8
|
+
viewMemories(withContent?: boolean): Promise<Memory[]>;
|
|
9
|
+
getMemoryByPath(relativePath: string): Promise<Memory | undefined>;
|
|
10
|
+
setMemory(mem: Memory): Promise<void>;
|
|
11
|
+
deleteMemory(relativePath: string): Promise<boolean>;
|
|
12
|
+
renameMemory(oldRelativePath: string, newRelativePath: string): Promise<boolean>;
|
|
13
|
+
insertIntoMemory(relativePath: string, lineNumber: number, text: string): Promise<boolean>;
|
|
14
|
+
replaceInMemory(relativePath: string, oldStr: string, newStr: string): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
export declare class MemoryStore implements IMemoryStore {
|
|
17
|
+
private lastModified;
|
|
18
|
+
private directory;
|
|
19
|
+
constructor(options?: {
|
|
20
|
+
initialmemories?: Memory[];
|
|
21
|
+
directory?: string;
|
|
22
|
+
});
|
|
23
|
+
viewMemories(withContent?: boolean): Promise<Memory[]>;
|
|
24
|
+
getMemoryByPath(relativePath: string): Promise<Memory | undefined>;
|
|
25
|
+
setMemory(mem: Memory): Promise<void>;
|
|
26
|
+
deleteMemory(relativePath: string): Promise<boolean>;
|
|
27
|
+
renameMemory(oldRelativePath: string, newRelativePath: string): Promise<boolean>;
|
|
28
|
+
insertIntoMemory(relativePath: string, lineNumber: number, text: string): Promise<boolean>;
|
|
29
|
+
replaceInMemory(relativePath: string, oldStr: string, newStr: string): Promise<boolean>;
|
|
30
|
+
get LastModified(): string;
|
|
31
|
+
}
|
|
32
|
+
export declare class PSMemoryTool extends PSAgentTool {
|
|
33
|
+
static readonly toolName = "memory_tool";
|
|
34
|
+
private store;
|
|
35
|
+
constructor(options: {
|
|
36
|
+
store: MemoryStore;
|
|
37
|
+
});
|
|
38
|
+
run(_input: Record<string, any>, log?: PSAgentLogger): Promise<Record<string, any>>;
|
|
39
|
+
private run_view;
|
|
40
|
+
private run_create;
|
|
41
|
+
private run_str_replace;
|
|
42
|
+
private run_insert;
|
|
43
|
+
private run_delete;
|
|
44
|
+
private run_rename;
|
|
45
|
+
}
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PSMemoryTool = exports.MemoryStore = void 0;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const uuid_1 = require("uuid");
|
|
12
|
+
const v4_1 = require("zod/v4");
|
|
13
|
+
const PSAgentTool_1 = require("../PSAgentTool");
|
|
14
|
+
const debuglogger_1 = __importDefault(require("../utils/debuglogger"));
|
|
15
|
+
const dlog = (0, debuglogger_1.default)('PSAgent:MemoryTool');
|
|
16
|
+
class MemoryStore {
|
|
17
|
+
lastModified = new Date().toISOString();
|
|
18
|
+
directory;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.lastModified = new Date().toISOString();
|
|
21
|
+
this.directory = options?.directory || node_path_1.default.join(node_os_1.default.tmpdir(), (0, uuid_1.v4)());
|
|
22
|
+
if (!node_fs_1.default.existsSync(this.directory)) {
|
|
23
|
+
node_fs_1.default.mkdirSync(this.directory, { recursive: true });
|
|
24
|
+
dlog.info(`Created memory directory at ${this.directory}`);
|
|
25
|
+
}
|
|
26
|
+
if (this.directory) {
|
|
27
|
+
try {
|
|
28
|
+
if (options?.initialmemories) {
|
|
29
|
+
for (const mem of options.initialmemories) {
|
|
30
|
+
const filePath = node_path_1.default.join(this.directory, `${mem.path}`);
|
|
31
|
+
node_fs_1.default.writeFileSync(filePath, mem.content || '', { encoding: 'utf-8' });
|
|
32
|
+
mem.path = filePath;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const files = node_fs_1.default.readdirSync(this.directory, { recursive: true });
|
|
36
|
+
dlog.info(`Found memories from directory: ${this.directory}, found ${files.length} files.`);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
dlog.error("Unable to load memories from directory:", error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async viewMemories(withContent) {
|
|
44
|
+
if (!this.directory)
|
|
45
|
+
return [];
|
|
46
|
+
const files = node_fs_1.default.readdirSync(this.directory);
|
|
47
|
+
const memories = files.map(f => {
|
|
48
|
+
let filePath = node_path_1.default.join(this.directory, f);
|
|
49
|
+
const content = withContent ? node_fs_1.default.readFileSync(filePath, 'utf-8') : undefined;
|
|
50
|
+
filePath = filePath.replace(this.directory, '');
|
|
51
|
+
filePath = filePath.startsWith('/') ? filePath : filePath = '/' + filePath;
|
|
52
|
+
return { path: filePath, content };
|
|
53
|
+
});
|
|
54
|
+
return memories;
|
|
55
|
+
}
|
|
56
|
+
async getMemoryByPath(relativePath) {
|
|
57
|
+
if (!this.directory)
|
|
58
|
+
return undefined;
|
|
59
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
60
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
61
|
+
const content = node_fs_1.default.readFileSync(filePath, 'utf-8');
|
|
62
|
+
return { path: relativePath, content };
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
async setMemory(mem) {
|
|
67
|
+
if (!this.directory)
|
|
68
|
+
return;
|
|
69
|
+
const filePath = node_path_1.default.join(this.directory, mem.path);
|
|
70
|
+
node_fs_1.default.writeFileSync(filePath, mem.content || '', { encoding: 'utf-8' });
|
|
71
|
+
this.lastModified = new Date().toISOString();
|
|
72
|
+
}
|
|
73
|
+
async deleteMemory(relativePath) {
|
|
74
|
+
if (!this.directory)
|
|
75
|
+
return false;
|
|
76
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
77
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
78
|
+
node_fs_1.default.unlinkSync(filePath);
|
|
79
|
+
this.lastModified = new Date().toISOString();
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
async renameMemory(oldRelativePath, newRelativePath) {
|
|
85
|
+
if (!this.directory)
|
|
86
|
+
return false;
|
|
87
|
+
const oldFilePath = node_path_1.default.join(this.directory, oldRelativePath);
|
|
88
|
+
const newFilePath = node_path_1.default.join(this.directory, newRelativePath);
|
|
89
|
+
if (node_fs_1.default.existsSync(oldFilePath)) {
|
|
90
|
+
node_fs_1.default.renameSync(oldFilePath, newFilePath);
|
|
91
|
+
this.lastModified = new Date().toISOString();
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
async insertIntoMemory(relativePath, lineNumber, text) {
|
|
97
|
+
if (!this.directory)
|
|
98
|
+
return false;
|
|
99
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
100
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
101
|
+
const content = node_fs_1.default.readFileSync(filePath, 'utf-8');
|
|
102
|
+
const lines = content.split('\n');
|
|
103
|
+
const index = Math.max(0, Math.min(lines.length, lineNumber - 1));
|
|
104
|
+
lines.splice(index, 0, text);
|
|
105
|
+
node_fs_1.default.writeFileSync(filePath, lines.join('\n'), { encoding: 'utf-8' });
|
|
106
|
+
this.lastModified = new Date().toISOString();
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
async replaceInMemory(relativePath, oldStr, newStr) {
|
|
112
|
+
if (!this.directory)
|
|
113
|
+
return false;
|
|
114
|
+
const filePath = node_path_1.default.join(this.directory, relativePath);
|
|
115
|
+
if (node_fs_1.default.existsSync(filePath)) {
|
|
116
|
+
let content = node_fs_1.default.readFileSync(filePath, 'utf-8');
|
|
117
|
+
//use regex to find all instances of oldStr and replace it with newStr
|
|
118
|
+
const regex = new RegExp(oldStr, 'g');
|
|
119
|
+
content = content.replace(regex, newStr);
|
|
120
|
+
node_fs_1.default.writeFileSync(filePath, content, { encoding: 'utf-8' });
|
|
121
|
+
this.lastModified = new Date().toISOString();
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
get LastModified() {
|
|
127
|
+
return this.lastModified;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.MemoryStore = MemoryStore;
|
|
131
|
+
class PSMemoryTool extends PSAgentTool_1.PSAgentTool {
|
|
132
|
+
static toolName = "memory_tool";
|
|
133
|
+
store;
|
|
134
|
+
constructor(options) {
|
|
135
|
+
super({
|
|
136
|
+
name: PSMemoryTool.toolName,
|
|
137
|
+
description: `Use this tool to manage the agent's memory files.
|
|
138
|
+
Commands:
|
|
139
|
+
- view: Shows the memory directory contents or memory file contents with optional line ranges.
|
|
140
|
+
- create: Create a new memory file with a unique path and specified content.
|
|
141
|
+
- str_replace: Replace a specific string in a memory file with another string.
|
|
142
|
+
- insert: Adds text to a memory, Insert text at a specific line.
|
|
143
|
+
- delete: Remove a memory file by path, Delete a file or directory.
|
|
144
|
+
- rename: Rename a memory file by its path.
|
|
145
|
+
|
|
146
|
+
Details and examples for \`view\` command:
|
|
147
|
+
Shows the memory directory contents or memory file contents with optional line ranges.
|
|
148
|
+
Parameters:
|
|
149
|
+
- command: view
|
|
150
|
+
- path: (optional) The path of the memory file to view. If omitted, lists all memory files.
|
|
151
|
+
- view_range: (optional) Line range to view as array of two numbers representing start and end (e.g., [10,20]). If omitted, shows the entire file.
|
|
152
|
+
Example:
|
|
153
|
+
\`\`\`json
|
|
154
|
+
{
|
|
155
|
+
"command": "view",
|
|
156
|
+
"path": "/memories",
|
|
157
|
+
"view_range": [1, 10] // Optional: view specific lines
|
|
158
|
+
}
|
|
159
|
+
\`\`\`
|
|
160
|
+
|
|
161
|
+
Details and examples for \`create\` command:
|
|
162
|
+
Create or overwrite a new memory file with a unique path and specified content.
|
|
163
|
+
Parameters:
|
|
164
|
+
- command: create
|
|
165
|
+
- path: The unique path for the new memory file (e.g., "/memories/memory1.txt").
|
|
166
|
+
- flie_text: The content to write into the new memory file.
|
|
167
|
+
Example:
|
|
168
|
+
\`\`\`json
|
|
169
|
+
{
|
|
170
|
+
"command": "create",
|
|
171
|
+
"path": "/memories/notes.txt",
|
|
172
|
+
"file_text": "Meeting notes:\n- Discussed project timeline\n- Next steps defined\n"
|
|
173
|
+
}
|
|
174
|
+
\`\`\`
|
|
175
|
+
|
|
176
|
+
Details and examples for \`str_replace\` command:
|
|
177
|
+
Replace a specific string in a memory file with another string.
|
|
178
|
+
Parameters:
|
|
179
|
+
- command: str_replace
|
|
180
|
+
- path: The path of the memory file to modify (e.g., "/memories/memory1.txt").
|
|
181
|
+
- old_str: The string to be replaced.
|
|
182
|
+
- new_str: The string to replace with.
|
|
183
|
+
Example:
|
|
184
|
+
\`\`\`json
|
|
185
|
+
{
|
|
186
|
+
"command": "str_replace",
|
|
187
|
+
"path": "/memories/preferences.txt",
|
|
188
|
+
"old_str": "Favorite color: blue",
|
|
189
|
+
"new_str": "Favorite color: green"
|
|
190
|
+
}
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
Details and examples for \`insert\` command:
|
|
194
|
+
Insert text at a specific line in a memory file.
|
|
195
|
+
Parameters:
|
|
196
|
+
- command: insert
|
|
197
|
+
- path: The path of the memory file to modify (e.g., "/memories/memory1.txt").
|
|
198
|
+
- insert_line: The line number to insert the text at (1-based index).
|
|
199
|
+
- insert_text: The text to insert.
|
|
200
|
+
Example:
|
|
201
|
+
\`\`\`json
|
|
202
|
+
{
|
|
203
|
+
"command": "insert",
|
|
204
|
+
"path": "/memories/todo.txt",
|
|
205
|
+
"insert_line": 2,
|
|
206
|
+
"insert_text": "- Review memory tool documentation\n"
|
|
207
|
+
}
|
|
208
|
+
\`\`\`
|
|
209
|
+
|
|
210
|
+
Details and examples for \`delete\` command:
|
|
211
|
+
Remove a memory file by path, Delete a file or directory.
|
|
212
|
+
Parameters:
|
|
213
|
+
- command: delete
|
|
214
|
+
- path: The path of the memory file or directory to delete (e.g., "/memories/memory1.txt" or "/memories/old_notes").
|
|
215
|
+
Example:
|
|
216
|
+
\`\`\`json
|
|
217
|
+
{
|
|
218
|
+
"command": "delete",
|
|
219
|
+
"path": "/memories/old_file.txt"
|
|
220
|
+
}
|
|
221
|
+
\`\`\`
|
|
222
|
+
|
|
223
|
+
Details and examples for \`rename\` command:
|
|
224
|
+
Rename a memory file by its path.
|
|
225
|
+
Parameters:
|
|
226
|
+
- command: rename
|
|
227
|
+
- old_path: The current path of the memory file to rename (e.g., "/memories/memory1.txt").
|
|
228
|
+
- new_path: The new path for the memory file (e.g., "/memories/updated_memory1.txt").
|
|
229
|
+
Example:
|
|
230
|
+
\`\`\`json
|
|
231
|
+
{
|
|
232
|
+
"command": "rename",
|
|
233
|
+
"old_path": "/memories/draft.txt",
|
|
234
|
+
"new_path": "/memories/final.txt"
|
|
235
|
+
}
|
|
236
|
+
\`\`\`
|
|
237
|
+
Note: when editing your memory folder, always try to keep its content up-to-date, coherent and organized.
|
|
238
|
+
You can rename or delete files that are no longer relevant.
|
|
239
|
+
Do not create new files unless necessary.
|
|
240
|
+
|
|
241
|
+
IMPORTANT: ALWAYS VIEW YOUR MEMORY DIRECTORY BEFORE DOING ANYTHING ELSE.
|
|
242
|
+
MEMORY PROTOCOL:
|
|
243
|
+
1. Use the \`view\` command of your \`memory\` tool to check for earlier progress.
|
|
244
|
+
2. ... (work on the task) ...
|
|
245
|
+
- As you make progress, record status / progress / thoughts etc in your memory.
|
|
246
|
+
ASSUME INTERRUPTION: Your context window might be reset at any moment, so you risk losing any progress that is not recorded in your memory directory.
|
|
247
|
+
`,
|
|
248
|
+
type: "API",
|
|
249
|
+
local_execution: true,
|
|
250
|
+
hitl: true,
|
|
251
|
+
inputschema: {
|
|
252
|
+
url: `http://localhost/${PSMemoryTool.toolName}`,
|
|
253
|
+
method: "POST",
|
|
254
|
+
requestBody: v4_1.z.toJSONSchema(v4_1.z.object({
|
|
255
|
+
command: v4_1.z.enum(['view', 'create', 'str_replace', 'insert', 'delete', 'rename']).meta({
|
|
256
|
+
title: "command",
|
|
257
|
+
description: "The memory command to execute."
|
|
258
|
+
}),
|
|
259
|
+
path: v4_1.z.string().optional().meta({
|
|
260
|
+
title: "path",
|
|
261
|
+
description: "The path of the memory file to operate on. For 'view' command, can be omitted only for view command, which then returns all files representing the memory ."
|
|
262
|
+
}),
|
|
263
|
+
file_text: v4_1.z.string().optional().meta({
|
|
264
|
+
title: "file_text",
|
|
265
|
+
description: "The content to write into the new memory file. Required for 'create' command."
|
|
266
|
+
}),
|
|
267
|
+
view_range: v4_1.z.array(v4_1.z.number().int().nonnegative()).length(2).optional().meta({
|
|
268
|
+
title: "view_range",
|
|
269
|
+
description: "Line range to view as array of two numbers representing start and end (e.g., [10,20]). Optional, only for 'view' command."
|
|
270
|
+
}),
|
|
271
|
+
old_str: v4_1.z.string().optional().meta({
|
|
272
|
+
title: "old_str",
|
|
273
|
+
description: "The string to be replaced. Required for 'str_replace' command."
|
|
274
|
+
}),
|
|
275
|
+
new_str: v4_1.z.string().optional().meta({
|
|
276
|
+
title: "new_str",
|
|
277
|
+
description: "The string to replace with. Required for 'str_replace' command."
|
|
278
|
+
}),
|
|
279
|
+
insert_line: v4_1.z.number().int().nonnegative().optional().meta({
|
|
280
|
+
title: "insert_line",
|
|
281
|
+
description: "The line number to insert the text at (1-based index). Required for 'insert' command."
|
|
282
|
+
}),
|
|
283
|
+
insert_text: v4_1.z.string().optional().meta({
|
|
284
|
+
title: "insert_text",
|
|
285
|
+
description: "The text to insert. Required for 'insert' command."
|
|
286
|
+
}),
|
|
287
|
+
old_path: v4_1.z.string().optional().meta({
|
|
288
|
+
title: "old_path",
|
|
289
|
+
description: "The current path of the memory file to rename. Required for 'rename' command."
|
|
290
|
+
}),
|
|
291
|
+
new_path: v4_1.z.string().optional().meta({
|
|
292
|
+
title: "new_path",
|
|
293
|
+
description: "The new path for the memory file. Required for 'rename' command."
|
|
294
|
+
}),
|
|
295
|
+
}).meta({
|
|
296
|
+
title: `${PSMemoryTool.toolName}_request_body`,
|
|
297
|
+
description: `The request body parameters for the ${PSMemoryTool.toolName} tool.`,
|
|
298
|
+
}), { "io": "input" }),
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
this.store = options.store || new MemoryStore();
|
|
302
|
+
}
|
|
303
|
+
async run(_input, log) {
|
|
304
|
+
const command = _input.command;
|
|
305
|
+
if (!command || typeof command !== "string") {
|
|
306
|
+
throw new Error("Invalid or missing command provided.");
|
|
307
|
+
}
|
|
308
|
+
switch (command) {
|
|
309
|
+
case 'view': return this.run_view(_input, log);
|
|
310
|
+
case 'create': return this.run_create(_input, log);
|
|
311
|
+
case 'str_replace': return this.run_str_replace(_input, log);
|
|
312
|
+
case 'insert': return this.run_insert(_input, log);
|
|
313
|
+
case 'delete': return this.run_delete(_input, log);
|
|
314
|
+
case 'rename': return this.run_rename(_input, log);
|
|
315
|
+
default: throw new Error(`Unsupported command: ${command}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async run_view(input, log) {
|
|
319
|
+
const logger = log || dlog;
|
|
320
|
+
try {
|
|
321
|
+
const path = input.path;
|
|
322
|
+
const view_range = input.view_range;
|
|
323
|
+
if (path && typeof path === "string") {
|
|
324
|
+
// View specific file
|
|
325
|
+
const mem = await this.store.getMemoryByPath(path);
|
|
326
|
+
if (!mem) {
|
|
327
|
+
throw new Error(`Memory file not found at path: ${path}`);
|
|
328
|
+
}
|
|
329
|
+
let content = mem.content || '';
|
|
330
|
+
if (view_range && Array.isArray(view_range) && view_range.length === 2) {
|
|
331
|
+
const start = Math.max(0, view_range[0] - 1); // Convert to 0-based index
|
|
332
|
+
const end = Math.min(content.split('\n').length, view_range[1]);
|
|
333
|
+
const lines = content.split('\n').slice(start, end);
|
|
334
|
+
content = lines.join('\n');
|
|
335
|
+
}
|
|
336
|
+
logger.info(`📋 Viewing memory file: ${mem.path}\n\`\`\`text\n${content}\n\`\`\``);
|
|
337
|
+
return {
|
|
338
|
+
status: 'success',
|
|
339
|
+
output: content,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
// List all memory files
|
|
344
|
+
const files = this.store.viewMemories(false);
|
|
345
|
+
logger.info(`📋 Memory directory contents:\n\`\`\`json\n${JSON.stringify(files, null, 2)}\n\`\`\``);
|
|
346
|
+
return {
|
|
347
|
+
status: 'success',
|
|
348
|
+
output: files,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
logger.error('Error viewing memory:', error);
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
async run_create(input, log) {
|
|
358
|
+
const logger = log || dlog;
|
|
359
|
+
try {
|
|
360
|
+
const path = input.path;
|
|
361
|
+
const file_text = input.file_text;
|
|
362
|
+
if (!path || typeof path !== "string") {
|
|
363
|
+
throw new Error("Invalid or missing path provided for create command.");
|
|
364
|
+
}
|
|
365
|
+
if (typeof file_text !== "string") {
|
|
366
|
+
throw new Error("Invalid or missing file_text provided for create command.");
|
|
367
|
+
}
|
|
368
|
+
this.store.setMemory({ path, content: file_text });
|
|
369
|
+
logger.info(`📝 Created memory file at path: ${path}`);
|
|
370
|
+
return {
|
|
371
|
+
status: 'success',
|
|
372
|
+
output: `Memory file created at path: ${path}`,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
logger.error('Error creating memory file:', error);
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
async run_str_replace(input, log) {
|
|
381
|
+
const logger = log || dlog;
|
|
382
|
+
try {
|
|
383
|
+
const path = input.path;
|
|
384
|
+
const old_str = input.old_str;
|
|
385
|
+
const new_str = input.new_str;
|
|
386
|
+
if (!path || typeof path !== "string") {
|
|
387
|
+
throw new Error("Invalid or missing path provided for str_replace command.");
|
|
388
|
+
}
|
|
389
|
+
if (typeof old_str !== "string" || typeof new_str !== "string") {
|
|
390
|
+
throw new Error("Invalid or missing old_str or new_str provided for str_replace command.");
|
|
391
|
+
}
|
|
392
|
+
const success = this.store.replaceInMemory(path, old_str, new_str);
|
|
393
|
+
if (!success) {
|
|
394
|
+
throw new Error(`Failed to replace string in memory file at path: ${path}. File may not exist.`);
|
|
395
|
+
}
|
|
396
|
+
logger.info(`🔄 Replaced string in memory file at path: ${path}`);
|
|
397
|
+
return {
|
|
398
|
+
status: 'success',
|
|
399
|
+
output: `String replaced in memory file at path: ${path}`,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
logger.error('Error replacing string in memory file:', error);
|
|
404
|
+
throw error;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
async run_insert(input, log) {
|
|
408
|
+
const logger = log || dlog;
|
|
409
|
+
try {
|
|
410
|
+
const path = input.path;
|
|
411
|
+
const insert_line = input.insert_line;
|
|
412
|
+
const insert_text = input.insert_text;
|
|
413
|
+
if (!path || typeof path !== "string") {
|
|
414
|
+
throw new Error("Invalid or missing path provided for insert command.");
|
|
415
|
+
}
|
|
416
|
+
if (typeof insert_line !== "number" || insert_line < 1) {
|
|
417
|
+
throw new Error("Invalid or missing insert_line provided for insert command. Must be a positive integer.");
|
|
418
|
+
}
|
|
419
|
+
if (typeof insert_text !== "string") {
|
|
420
|
+
throw new Error("Invalid or missing insert_text provided for insert command.");
|
|
421
|
+
}
|
|
422
|
+
const success = this.store.insertIntoMemory(path, insert_line, insert_text);
|
|
423
|
+
if (!success) {
|
|
424
|
+
throw new Error(`Failed to insert text into memory file at path: ${path}. File may not exist.`);
|
|
425
|
+
}
|
|
426
|
+
logger.info(`➕ Inserted text into memory file at path: ${path} at line ${insert_line}`);
|
|
427
|
+
return {
|
|
428
|
+
status: 'success',
|
|
429
|
+
output: `Text inserted into memory file at path: ${path} at line ${insert_line}`,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
logger.error('Error inserting text into memory file:', error);
|
|
434
|
+
throw error;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
async run_delete(input, log) {
|
|
438
|
+
const logger = log || dlog;
|
|
439
|
+
try {
|
|
440
|
+
const path = input.path;
|
|
441
|
+
if (!path || typeof path !== "string") {
|
|
442
|
+
throw new Error("Invalid or missing path provided for delete command.");
|
|
443
|
+
}
|
|
444
|
+
const success = this.store.deleteMemory(path);
|
|
445
|
+
if (!success) {
|
|
446
|
+
throw new Error(`Failed to delete memory file at path: ${path}. File may not exist.`);
|
|
447
|
+
}
|
|
448
|
+
logger.info(`🗑️ Deleted memory file at path: ${path}`);
|
|
449
|
+
return {
|
|
450
|
+
status: 'success',
|
|
451
|
+
output: `Memory file deleted at path: ${path}`,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
logger.error('Error deleting memory file:', error);
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
async run_rename(input, log) {
|
|
460
|
+
const logger = log || dlog;
|
|
461
|
+
try {
|
|
462
|
+
const old_path = input.old_path;
|
|
463
|
+
const new_path = input.new_path;
|
|
464
|
+
if (!old_path || typeof old_path !== "string") {
|
|
465
|
+
throw new Error("Invalid or missing old_path provided for rename command.");
|
|
466
|
+
}
|
|
467
|
+
if (!new_path || typeof new_path !== "string") {
|
|
468
|
+
throw new Error("Invalid or missing new_path provided for rename command.");
|
|
469
|
+
}
|
|
470
|
+
const success = this.store.renameMemory(old_path, new_path);
|
|
471
|
+
if (!success) {
|
|
472
|
+
new Error(`Failed to rename memory file from ${old_path} to ${new_path}. File may not exist.`);
|
|
473
|
+
}
|
|
474
|
+
logger.info(`✏️ Renamed memory file from ${old_path} to ${new_path}`);
|
|
475
|
+
return {
|
|
476
|
+
status: 'success',
|
|
477
|
+
output: `Memory file renamed from ${old_path} to ${new_path}`,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
logger.error('Error renaming memory file:', error);
|
|
482
|
+
throw error;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
exports.PSMemoryTool = PSMemoryTool;
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNNZW1vcnlUb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29scy9QU01lbW9yeVRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDs7Ozs7O0FBRXZELHNEQUF5QjtBQUN6QixzREFBeUI7QUFDekIsMERBQTZCO0FBRTdCLCtCQUFvQztBQUNwQywrQkFBMkI7QUFHM0IsZ0RBQTZDO0FBQzdDLHVFQUErQztBQUUvQyxNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFXLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQWlCL0MsTUFBYSxXQUFXO0lBQ1osWUFBWSxHQUFXLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEQsU0FBUyxDQUFRO0lBQ3pCLFlBQVksT0FBd0Q7UUFDaEUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSxtQkFBSSxDQUFDLElBQUksQ0FBQyxpQkFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUEsU0FBTSxHQUFFLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsaUJBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsaUJBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7b0JBQzdCLEtBQUssTUFB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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export default function debugLogger(prefix: string): {
|
|
2
|
+
debug: (msg: string, ...args: any[]) => void;
|
|
3
|
+
info: (msg: string, ...args: any[]) => void;
|
|
4
|
+
warn: (msg: string, ...args: any[]) => void;
|
|
5
|
+
error: (msg: string, ...args: any[]) => void;
|
|
6
|
+
done: (msg: string, ...args: any[]) => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.default = debugLogger;
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
function debugLogger(prefix) {
|
|
10
|
+
const logFn = (0, debug_1.default)(prefix);
|
|
11
|
+
logFn.enabled = true;
|
|
12
|
+
const debugLog = logFn.extend('debug');
|
|
13
|
+
const infoLog = logFn.extend('info');
|
|
14
|
+
const warnLog = logFn.extend('warn');
|
|
15
|
+
const errorLog = logFn.extend('error');
|
|
16
|
+
const doneLog = logFn.extend('done');
|
|
17
|
+
return {
|
|
18
|
+
debug: (msg, ...args) => debugLog(msg, ...args),
|
|
19
|
+
info: (msg, ...args) => infoLog(msg, ...args),
|
|
20
|
+
warn: (msg, ...args) => warnLog(msg, ...args),
|
|
21
|
+
error: (msg, ...args) => errorLog(msg, ...args),
|
|
22
|
+
done: (msg, ...args) => doneLog(msg, ...args),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWdsb2dnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzL2RlYnVnbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7Ozs7O0FBSXZELDhCQWVDO0FBakJELGtEQUEwQjtBQUUxQixTQUF3QixXQUFXLENBQUMsTUFBYztJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQUssRUFBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsT0FBTztRQUNMLEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDNUQsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVELEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7S0FDN0QsQ0FBQztBQUNKLENBQUMifQ==
|