natroc 0.0.5 → 0.0.7
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/package.json +1 -1
- package/server/dist/agent/auto-improver.d.ts +33 -0
- package/server/dist/agent/auto-improver.js +125 -0
- package/server/dist/agent/auto-improver.js.map +1 -0
- package/server/dist/agent/home-context.d.ts +11 -1
- package/server/dist/agent/home-context.js +124 -14
- package/server/dist/agent/home-context.js.map +1 -1
- package/server/dist/agent/improvement-engine.d.ts +1 -0
- package/server/dist/agent/improvement-engine.js +18 -0
- package/server/dist/agent/improvement-engine.js.map +1 -1
- package/server/dist/agent/tools/types.d.ts +6 -0
- package/server/dist/agent/tools/write-file.js +11 -1
- package/server/dist/agent/tools/write-file.js.map +1 -1
- package/server/dist/config/natroc-config.d.ts +41 -0
- package/server/dist/config/natroc-config.js +160 -0
- package/server/dist/config/natroc-config.js.map +1 -0
- package/server/dist/gateway/agent-service.d.ts +15 -1
- package/server/dist/gateway/agent-service.js +59 -7
- package/server/dist/gateway/agent-service.js.map +1 -1
- package/server/dist/gateway/gateway.js +9 -1
- package/server/dist/gateway/gateway.js.map +1 -1
- package/server/dist/gateway/index.js +2 -0
- package/server/dist/gateway/index.js.map +1 -1
- package/server/dist/gateway/rpc/agent.js +47 -0
- package/server/dist/gateway/rpc/agent.js.map +1 -1
- package/server/dist/gateway/rpc/auth.js +4 -0
- package/server/dist/gateway/rpc/auth.js.map +1 -1
- package/server/dist/gateway/rpc/conversations.js +11 -2
- package/server/dist/gateway/rpc/conversations.js.map +1 -1
- package/server/dist/gateway/rpc/home.d.ts +2 -0
- package/server/dist/gateway/rpc/home.js +45 -0
- package/server/dist/gateway/rpc/home.js.map +1 -0
- package/server/dist/local-runtime.d.ts +2 -0
- package/server/dist/local-runtime.js +5 -1
- package/server/dist/local-runtime.js.map +1 -1
- package/server/dist/runtime.d.ts +5 -1
- package/server/dist/runtime.js +2 -1
- package/server/dist/runtime.js.map +1 -1
- package/server/dist/server.js +6 -3
- package/server/dist/server.js.map +1 -1
- package/server/dist/storage/auth-repository.d.ts +5 -0
- package/server/dist/storage/auth-repository.js +6 -0
- package/server/dist/storage/auth-repository.js.map +1 -1
- package/server/dist/storage/memory-repository.d.ts +8 -0
- package/server/dist/storage/memory-repository.js +49 -26
- package/server/dist/storage/memory-repository.js.map +1 -1
- package/ui/dist/assets/{index-BiVH3g6R.js → index-C9vuE6UQ.js} +2 -2
- package/ui/dist/assets/index-DHIA01cO.css +2 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-DOfPcjx3.css +0 -2
package/package.json
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RuntimeState } from "../runtime.js";
|
|
2
|
+
export type AutoImproveStatus = {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
killSwitch: boolean;
|
|
5
|
+
intervalMs: number;
|
|
6
|
+
runAfterEachConversation: boolean;
|
|
7
|
+
lastCycleAt: string | null;
|
|
8
|
+
lastCycleDurationMs: number | null;
|
|
9
|
+
lastCycleStatus: "ok" | "skipped" | "error" | null;
|
|
10
|
+
lastCycleReason: string | null;
|
|
11
|
+
lastCycleUserId: string | null;
|
|
12
|
+
inFlightUserIds: string[];
|
|
13
|
+
};
|
|
14
|
+
export declare class AutoImprover {
|
|
15
|
+
private readonly runtime;
|
|
16
|
+
private timer;
|
|
17
|
+
private readonly inFlight;
|
|
18
|
+
private lastCycleAt;
|
|
19
|
+
private lastCycleDurationMs;
|
|
20
|
+
private lastCycleStatus;
|
|
21
|
+
private lastCycleReason;
|
|
22
|
+
private lastCycleUserId;
|
|
23
|
+
constructor(runtime: RuntimeState);
|
|
24
|
+
start(): void;
|
|
25
|
+
stop(): void;
|
|
26
|
+
status(): AutoImproveStatus;
|
|
27
|
+
runAllUsers(): Promise<void>;
|
|
28
|
+
runForUser(userId: string): Promise<void>;
|
|
29
|
+
private recordSuccess;
|
|
30
|
+
private recordError;
|
|
31
|
+
private recordSkipped;
|
|
32
|
+
private broadcast;
|
|
33
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { runReflectionTurn } from "../gateway/agent-service.js";
|
|
3
|
+
export class AutoImprover {
|
|
4
|
+
runtime;
|
|
5
|
+
timer = null;
|
|
6
|
+
inFlight = new Set();
|
|
7
|
+
lastCycleAt = null;
|
|
8
|
+
lastCycleDurationMs = null;
|
|
9
|
+
lastCycleStatus = null;
|
|
10
|
+
lastCycleReason = null;
|
|
11
|
+
lastCycleUserId = null;
|
|
12
|
+
constructor(runtime) {
|
|
13
|
+
this.runtime = runtime;
|
|
14
|
+
}
|
|
15
|
+
start() {
|
|
16
|
+
this.stop();
|
|
17
|
+
const config = this.runtime.config?.autoImprove;
|
|
18
|
+
if (!config?.enabled)
|
|
19
|
+
return;
|
|
20
|
+
const intervalMs = Math.max(10_000, config.intervalMs);
|
|
21
|
+
this.timer = setInterval(() => {
|
|
22
|
+
void this.runAllUsers().catch(() => undefined);
|
|
23
|
+
}, intervalMs);
|
|
24
|
+
if (typeof this.timer.unref === "function")
|
|
25
|
+
this.timer.unref();
|
|
26
|
+
}
|
|
27
|
+
stop() {
|
|
28
|
+
if (this.timer) {
|
|
29
|
+
clearInterval(this.timer);
|
|
30
|
+
this.timer = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
status() {
|
|
34
|
+
const config = this.runtime.config?.autoImprove;
|
|
35
|
+
return {
|
|
36
|
+
enabled: config?.enabled ?? false,
|
|
37
|
+
killSwitch: config?.killSwitch ?? false,
|
|
38
|
+
intervalMs: config?.intervalMs ?? 0,
|
|
39
|
+
runAfterEachConversation: config?.runAfterEachConversation ?? false,
|
|
40
|
+
lastCycleAt: this.lastCycleAt,
|
|
41
|
+
lastCycleDurationMs: this.lastCycleDurationMs,
|
|
42
|
+
lastCycleStatus: this.lastCycleStatus,
|
|
43
|
+
lastCycleReason: this.lastCycleReason,
|
|
44
|
+
lastCycleUserId: this.lastCycleUserId,
|
|
45
|
+
inFlightUserIds: Array.from(this.inFlight),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async runAllUsers() {
|
|
49
|
+
const config = this.runtime.config?.autoImprove;
|
|
50
|
+
if (!config?.enabled || config.killSwitch) {
|
|
51
|
+
this.recordSkipped(null, config?.killSwitch ? "kill_switch" : "disabled");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const users = this.runtime.auth.listUsers();
|
|
55
|
+
for (const user of users) {
|
|
56
|
+
await this.runForUser(user.id).catch(() => undefined);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async runForUser(userId) {
|
|
60
|
+
const config = this.runtime.config?.autoImprove;
|
|
61
|
+
if (!config?.enabled || config.killSwitch) {
|
|
62
|
+
this.recordSkipped(userId, config?.killSwitch ? "kill_switch" : "disabled");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (this.inFlight.has(userId)) {
|
|
66
|
+
this.recordSkipped(userId, "concurrent");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.inFlight.add(userId);
|
|
70
|
+
const cycleId = randomUUID();
|
|
71
|
+
const startedAtMs = Date.now();
|
|
72
|
+
this.broadcast({ cycleId, userId, status: "started" });
|
|
73
|
+
try {
|
|
74
|
+
const result = await runReflectionTurn(this.runtime, userId);
|
|
75
|
+
this.recordSuccess(userId, Date.now() - startedAtMs);
|
|
76
|
+
this.broadcast({
|
|
77
|
+
cycleId,
|
|
78
|
+
userId,
|
|
79
|
+
status: "ok",
|
|
80
|
+
durationMs: Date.now() - startedAtMs,
|
|
81
|
+
toolCalls: result?.toolCallsCount ?? 0,
|
|
82
|
+
workspaceWrites: result?.workspaceWrites ?? 0,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const reason = error instanceof Error ? error.message : "unknown_error";
|
|
87
|
+
this.recordError(userId, Date.now() - startedAtMs, reason);
|
|
88
|
+
this.broadcast({
|
|
89
|
+
cycleId,
|
|
90
|
+
userId,
|
|
91
|
+
status: "error",
|
|
92
|
+
durationMs: Date.now() - startedAtMs,
|
|
93
|
+
reason,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
this.inFlight.delete(userId);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
recordSuccess(userId, durationMs) {
|
|
101
|
+
this.lastCycleAt = new Date().toISOString();
|
|
102
|
+
this.lastCycleDurationMs = durationMs;
|
|
103
|
+
this.lastCycleStatus = "ok";
|
|
104
|
+
this.lastCycleReason = null;
|
|
105
|
+
this.lastCycleUserId = userId;
|
|
106
|
+
}
|
|
107
|
+
recordError(userId, durationMs, reason) {
|
|
108
|
+
this.lastCycleAt = new Date().toISOString();
|
|
109
|
+
this.lastCycleDurationMs = durationMs;
|
|
110
|
+
this.lastCycleStatus = "error";
|
|
111
|
+
this.lastCycleReason = reason;
|
|
112
|
+
this.lastCycleUserId = userId;
|
|
113
|
+
}
|
|
114
|
+
recordSkipped(userId, reason) {
|
|
115
|
+
this.lastCycleAt = new Date().toISOString();
|
|
116
|
+
this.lastCycleDurationMs = 0;
|
|
117
|
+
this.lastCycleStatus = "skipped";
|
|
118
|
+
this.lastCycleReason = reason;
|
|
119
|
+
this.lastCycleUserId = userId;
|
|
120
|
+
}
|
|
121
|
+
broadcast(payload) {
|
|
122
|
+
this.runtime.broadcaster?.broadcast("auto-improve", payload);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=auto-improver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-improver.js","sourceRoot":"","sources":["../../src/agent/auto-improver.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,4 +26,14 @@ export declare function loadHomeContext(paths: NatrocPaths | undefined, options?
|
|
|
26
26
|
}): Promise<HomeContext>;
|
|
27
27
|
export declare function listHomeContextFiles(paths: NatrocPaths | undefined): Promise<string[]>;
|
|
28
28
|
export declare function resolveHomeFilePath(paths: NatrocPaths, fileName: string): string;
|
|
29
|
-
export
|
|
29
|
+
export type HomeFileEntry = {
|
|
30
|
+
name: string;
|
|
31
|
+
sizeBytes: number;
|
|
32
|
+
modifiedAt: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function listHomeFiles(paths: NatrocPaths): Promise<HomeFileEntry[]>;
|
|
35
|
+
export declare function readHomeFile(paths: NatrocPaths, fileName: string): Promise<string>;
|
|
36
|
+
export declare function writeHomeFile(paths: NatrocPaths, fileName: string, content: string): Promise<HomeFileEntry>;
|
|
37
|
+
export declare function buildAgentSystemPrompt(context: HomeContext, memories?: AgentSystemMemory[], conversationThreads?: AgentConversationRecall[], options?: {
|
|
38
|
+
workspacePath?: string;
|
|
39
|
+
}): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
-
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
1
|
+
import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
3
3
|
import { natrocHomeFileNames } from "../config/natroc-home.js";
|
|
4
4
|
export const defaultHomeContextFileNames = natrocHomeFileNames;
|
|
5
5
|
export async function loadHomeContext(paths, options = {}) {
|
|
@@ -7,7 +7,9 @@ export async function loadHomeContext(paths, options = {}) {
|
|
|
7
7
|
throw new Error("Natroc home path is not configured.");
|
|
8
8
|
}
|
|
9
9
|
const homeDir = resolve(paths.homeDir);
|
|
10
|
-
|
|
10
|
+
// Default ~16 KB (~4k tokens) so canonical files (BOOTSTRAP/AGENTS/USER/…)
|
|
11
|
+
// are injected in full; truncation only kicks in for unusually large files.
|
|
12
|
+
const maxFileCharacters = options.maxFileCharacters ?? 16000;
|
|
11
13
|
const homeFiles = await listHomeMarkdownFiles(homeDir);
|
|
12
14
|
const files = await Promise.all(homeFiles.map(async ({ absolutePath, name }) => {
|
|
13
15
|
assertInsideHome(homeDir, absolutePath);
|
|
@@ -40,16 +42,124 @@ export function resolveHomeFilePath(paths, fileName) {
|
|
|
40
42
|
assertInsideHome(homeDir, absolutePath);
|
|
41
43
|
return absolutePath;
|
|
42
44
|
}
|
|
43
|
-
export function
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
export async function listHomeFiles(paths) {
|
|
46
|
+
const homeDir = resolve(paths.homeDir);
|
|
47
|
+
const files = await listHomeMarkdownFiles(homeDir);
|
|
48
|
+
return await Promise.all(files.map(async ({ absolutePath, name }) => {
|
|
49
|
+
const stats = await stat(absolutePath);
|
|
50
|
+
return {
|
|
51
|
+
name,
|
|
52
|
+
sizeBytes: stats.size,
|
|
53
|
+
modifiedAt: stats.mtime.toISOString(),
|
|
54
|
+
};
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
export async function readHomeFile(paths, fileName) {
|
|
58
|
+
const absolutePath = resolveHomeFilePath(paths, fileName);
|
|
59
|
+
if (!fileName.toLowerCase().endsWith(".md")) {
|
|
60
|
+
throw new Error("Only markdown (.md) files are supported.");
|
|
61
|
+
}
|
|
62
|
+
return await readFile(absolutePath, "utf8");
|
|
63
|
+
}
|
|
64
|
+
export async function writeHomeFile(paths, fileName, content) {
|
|
65
|
+
if (!fileName.toLowerCase().endsWith(".md")) {
|
|
66
|
+
throw new Error("Only markdown (.md) files are supported.");
|
|
67
|
+
}
|
|
68
|
+
const absolutePath = resolveHomeFilePath(paths, fileName);
|
|
69
|
+
await mkdir(dirname(absolutePath), { recursive: true });
|
|
70
|
+
await writeFile(absolutePath, content, "utf8");
|
|
71
|
+
const stats = await stat(absolutePath);
|
|
72
|
+
return {
|
|
73
|
+
name: fileName,
|
|
74
|
+
sizeBytes: stats.size,
|
|
75
|
+
modifiedAt: stats.mtime.toISOString(),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Canonical workspace files that get dedicated sections in the system prompt. */
|
|
79
|
+
const CANONICAL_FILES = {
|
|
80
|
+
bootstrap: "BOOTSTRAP.md",
|
|
81
|
+
agents: "AGENTS.md",
|
|
82
|
+
identity: "IDENTITY.md",
|
|
83
|
+
soul: "SOUL.md",
|
|
84
|
+
user: "USER.md",
|
|
85
|
+
memory: "MEMORY.md",
|
|
86
|
+
};
|
|
87
|
+
function bucketWorkspaceFiles(files) {
|
|
88
|
+
const bucket = { other: [] };
|
|
89
|
+
for (const file of files) {
|
|
90
|
+
const upper = file.name.toUpperCase();
|
|
91
|
+
if (upper === CANONICAL_FILES.bootstrap.toUpperCase())
|
|
92
|
+
bucket.bootstrap = file;
|
|
93
|
+
else if (upper === CANONICAL_FILES.agents.toUpperCase())
|
|
94
|
+
bucket.agents = file;
|
|
95
|
+
else if (upper === CANONICAL_FILES.identity.toUpperCase())
|
|
96
|
+
bucket.identity = file;
|
|
97
|
+
else if (upper === CANONICAL_FILES.soul.toUpperCase())
|
|
98
|
+
bucket.soul = file;
|
|
99
|
+
else if (upper === CANONICAL_FILES.user.toUpperCase())
|
|
100
|
+
bucket.user = file;
|
|
101
|
+
else if (upper === CANONICAL_FILES.memory.toUpperCase())
|
|
102
|
+
bucket.memory = file;
|
|
103
|
+
else
|
|
104
|
+
bucket.other.push(file);
|
|
105
|
+
}
|
|
106
|
+
return bucket;
|
|
107
|
+
}
|
|
108
|
+
export function buildAgentSystemPrompt(context, memories = [], conversationThreads = [], options = {}) {
|
|
109
|
+
const bucket = bucketWorkspaceFiles(context.files);
|
|
110
|
+
const sections = [];
|
|
111
|
+
sections.push([
|
|
112
|
+
"## Your Identity & Purpose",
|
|
113
|
+
"You are this user's **personal AI assistant**, running locally on their machine via Natroc — a private, always-on agent runtime they own and operate.",
|
|
114
|
+
"You are NOT a generic chatbot. You serve this specific user across sessions: drafting, planning, code, decisions, lookups, and operating on their local workspace.",
|
|
115
|
+
"You remember them through stored memory and the workspace files below; you continue threads across days.",
|
|
116
|
+
"Be honest, direct, concise. Do not claim to have changed memory, files, services, commits, processes, or external state unless the runtime actually performed the change.",
|
|
117
|
+
].join("\n"));
|
|
118
|
+
if (options.workspacePath || context.files.length > 0) {
|
|
119
|
+
const workspaceLines = ["## Workspace"];
|
|
120
|
+
if (options.workspacePath) {
|
|
121
|
+
workspaceLines.push(`Your personal workspace lives at: \`${options.workspacePath}\``);
|
|
122
|
+
}
|
|
123
|
+
if (context.files.length > 0) {
|
|
124
|
+
workspaceLines.push("Files currently present (each is part of your operating context):", ...context.files.map((file) => `- ${file.name}`));
|
|
125
|
+
}
|
|
126
|
+
workspaceLines.push("Use the `list_directory`, `read_file`, and `write_file` tools to inspect or modify any file in this workspace.", "If a file's instructions imply it is one-time (for example anything saying \"remove me after applying\"), follow it and delete the file when done.");
|
|
127
|
+
sections.push(workspaceLines.join("\n"));
|
|
128
|
+
}
|
|
129
|
+
if (bucket.bootstrap) {
|
|
130
|
+
sections.push([
|
|
131
|
+
"## ⚠ ACTIVE BOOTSTRAP — DO THIS FIRST",
|
|
132
|
+
"Your workspace is **not fully initialized**. `BOOTSTRAP.md` exists and is your one-time initialization script.",
|
|
133
|
+
"**Before doing any other task, walk through `BOOTSTRAP.md` step by step.** Ask the user only for the minimum information you need to fill the workspace files it lists. When every step is complete, delete `BOOTSTRAP.md` (it explicitly tells you to).",
|
|
134
|
+
"",
|
|
135
|
+
"### BOOTSTRAP.md",
|
|
136
|
+
bucket.bootstrap.content,
|
|
137
|
+
].join("\n"));
|
|
138
|
+
}
|
|
139
|
+
if (bucket.agents) {
|
|
140
|
+
sections.push([
|
|
141
|
+
"## Operating Rules",
|
|
142
|
+
"The following is your authoritative operating policy for this workspace. It outranks personality, memory, and conversation history (but never user intent or safety).",
|
|
143
|
+
"",
|
|
144
|
+
"### AGENTS.md",
|
|
145
|
+
bucket.agents.content,
|
|
146
|
+
].join("\n"));
|
|
147
|
+
}
|
|
148
|
+
if (bucket.identity) {
|
|
149
|
+
sections.push(["## Agent Identity", "", bucket.identity.content].join("\n"));
|
|
150
|
+
}
|
|
151
|
+
if (bucket.soul) {
|
|
152
|
+
sections.push(["## Personality & Tone", "", bucket.soul.content].join("\n"));
|
|
153
|
+
}
|
|
154
|
+
if (bucket.user) {
|
|
155
|
+
sections.push(["## User Profile", "", bucket.user.content].join("\n"));
|
|
156
|
+
}
|
|
157
|
+
if (bucket.memory) {
|
|
158
|
+
sections.push(["## Long-term Memory", "", bucket.memory.content].join("\n"));
|
|
159
|
+
}
|
|
160
|
+
if (bucket.other.length > 0) {
|
|
161
|
+
sections.push("## Other Workspace Files");
|
|
162
|
+
for (const file of bucket.other) {
|
|
53
163
|
sections.push(`### ${file.name}`, file.content);
|
|
54
164
|
}
|
|
55
165
|
}
|
|
@@ -60,7 +170,7 @@ export function buildAgentSystemPrompt(context, memories = [], conversationThrea
|
|
|
60
170
|
}
|
|
61
171
|
}
|
|
62
172
|
if (conversationThreads.length > 0) {
|
|
63
|
-
sections.push("## Prior Conversation Threads", "
|
|
173
|
+
sections.push("## Prior Conversation Threads", "Bounded snippets from prior Natroc conversations across sessions. Use them as recall, but treat Approved Agent Memory and the current user message as higher priority on conflict.");
|
|
64
174
|
for (const thread of conversationThreads) {
|
|
65
175
|
sections.push(formatConversationThread(thread));
|
|
66
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home-context.js","sourceRoot":"","sources":["../../src/agent/home-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"home-context.js","sourceRoot":"","sources":["../../src/agent/home-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export declare function buildHeuristicImprovementProposals(input: {
|
|
|
8
8
|
assistantMessage: string;
|
|
9
9
|
conversationId?: string | null;
|
|
10
10
|
}): ImprovementDraft[];
|
|
11
|
+
export declare function buildReflectionPrompt(): string;
|
|
11
12
|
export declare function generateImprovementProposals(input: {
|
|
12
13
|
adapter: ProviderAdapter;
|
|
13
14
|
model?: string;
|
|
@@ -24,6 +24,24 @@ export function buildHeuristicImprovementProposals(input) {
|
|
|
24
24
|
}
|
|
25
25
|
];
|
|
26
26
|
}
|
|
27
|
+
export function buildReflectionPrompt() {
|
|
28
|
+
return [
|
|
29
|
+
"You are running your scheduled self-improvement cycle. This is YOUR cycle — no user is waiting on you.",
|
|
30
|
+
"",
|
|
31
|
+
"Inspect, in order:",
|
|
32
|
+
"1. Recent conversations and tool calls since your previous cycle.",
|
|
33
|
+
"2. Your workspace files (AGENTS.md, USER.md, MEMORY.md, IDENTITY.md, SOUL.md, and anything else in the workspace).",
|
|
34
|
+
"3. Optionally, files elsewhere on the host filesystem if relevant context lives there.",
|
|
35
|
+
"",
|
|
36
|
+
"Decide what is worth keeping:",
|
|
37
|
+
"- Distill durable insights about this user, their tools, and their projects.",
|
|
38
|
+
"- Update workspace files via `write_file` to reflect what you learned. Writes are sandboxed to your workspace; writes outside will fail.",
|
|
39
|
+
"- Append a one-line summary of every change to `CHANGELOG.md` (create it if missing).",
|
|
40
|
+
"- If there is nothing meaningful to add this cycle, simply reply \"no changes this cycle\".",
|
|
41
|
+
"",
|
|
42
|
+
"You have full read access to the filesystem. ALL persisted state of your improvements must stay inside your workspace.",
|
|
43
|
+
].join("\n");
|
|
44
|
+
}
|
|
27
45
|
export async function generateImprovementProposals(input) {
|
|
28
46
|
const transcript = input.messages
|
|
29
47
|
.map((message) => `${message.role.toUpperCase()}: ${message.content}`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"improvement-engine.js","sourceRoot":"","sources":["../../src/agent/improvement-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"improvement-engine.js","sourceRoot":"","sources":["../../src/agent/improvement-engine.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;AAE7E,MAAM,UAAU,gCAAgC,CAC9C,QAAgB;IAEhB,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAErD,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QACpC,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QAEnD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAIlD;IACC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;IAE5C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,WAAW;iBACjB,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;iBAChD,IAAI,EAAE;YACT,MAAM,EAAE,uDAAuD;YAC/D,oBAAoB,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;SACnD;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,wGAAwG;QACxG,EAAE;QACF,oBAAoB;QACpB,mEAAmE;QACnE,oHAAoH;QACpH,wFAAwF;QACxF,EAAE;QACF,+BAA+B;QAC/B,8EAA8E;QAC9E,0IAA0I;QAC1I,uFAAuF;QACvF,6FAA6F;QAC7F,EAAE;QACF,wHAAwH;KACzH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,KAKlD;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ;SAC9B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;SACrE,IAAI,CAAC,MAAM,CAAC,CAAA;IAEf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,OAAO,EAAE,kEAAkE;QAC3E,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EACL,0WAA0W;aAC7W;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,UAAU;aACpB;SACF;KACF,CAAC,CAAA;IAEF,OAAO,gCAAgC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3E,GAAG,QAAQ;QACX,oBAAoB,EAClB,QAAQ,CAAC,oBAAoB,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI;KAChE,CAAC,CAAC,CAAA;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,2DAA2D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA8B;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAA;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAEvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;QAClC,OAAO;QACP,MAAM,EAAE,MAAM,IAAI,8CAA8C;QAChE,oBAAoB,EAAE,IAAI;KACA,CAAA;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,IAAqB;IACzC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,uBAAuB,CAAA;IACxD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAA;IAChD,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,GAAG,GAAG,MAAM,IAAI,KAAK,CAAA;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAEjC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAChD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,KAAc,EACd,GAAW;IAEX,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IAE7B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
|
|
@@ -3,6 +3,12 @@ export type ToolMode = "auto" | "readonly";
|
|
|
3
3
|
export type ToolContext = {
|
|
4
4
|
/** Default working directory used to resolve relative paths. */
|
|
5
5
|
cwd: string;
|
|
6
|
+
/**
|
|
7
|
+
* Optional sandbox for write-class tools. When set, writes outside this
|
|
8
|
+
* absolute directory are rejected. Self-improvement cycles use this to
|
|
9
|
+
* keep persisted state inside `~/.natroc/home/`.
|
|
10
|
+
*/
|
|
11
|
+
writeSandbox?: string;
|
|
6
12
|
};
|
|
7
13
|
export type ToolResult = {
|
|
8
14
|
ok: boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
-
import { dirname } from "node:path";
|
|
2
|
+
import { dirname, relative, resolve } from "node:path";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { resolveUserPath } from "./util.js";
|
|
5
5
|
const schema = z.object({
|
|
@@ -14,6 +14,16 @@ export const writeFileTool = {
|
|
|
14
14
|
execute: async (args, context) => {
|
|
15
15
|
const { path, content } = schema.parse(args);
|
|
16
16
|
const target = resolveUserPath(path, context.cwd);
|
|
17
|
+
if (context.writeSandbox) {
|
|
18
|
+
const sandbox = resolve(context.writeSandbox);
|
|
19
|
+
const rel = relative(sandbox, target);
|
|
20
|
+
if (rel.startsWith("..") || rel === "" || /^([a-zA-Z]:)?[\\/]/.test(rel)) {
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
output: `Write rejected: ${target} is outside the sandbox ${sandbox}.`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
17
27
|
await mkdir(dirname(target), { recursive: true });
|
|
18
28
|
await writeFile(target, content, "utf8");
|
|
19
29
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../../src/agent/tools/write-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../../src/agent/tools/write-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,2HAA2H;IAC7H,UAAU,EAAE,uCAAuC;IACnD,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QAEjD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACrC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzE,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,mBAAmB,MAAM,2BAA2B,OAAO,GAAG;iBACvE,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACjD,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAExC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,SAAS,OAAO,CAAC,MAAM,kBAAkB,MAAM,GAAG;SAC3D,CAAA;IACH,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { NatrocPaths } from "./natroc-home.js";
|
|
2
|
+
export type DmPolicy = "pairing" | "allowlist" | "open" | "disabled";
|
|
3
|
+
export type GroupPolicy = "allowlist" | "open" | "disabled";
|
|
4
|
+
export type NatrocConfig = {
|
|
5
|
+
server: {
|
|
6
|
+
host: string;
|
|
7
|
+
port: number;
|
|
8
|
+
};
|
|
9
|
+
gateway: {
|
|
10
|
+
tickIntervalMs: number;
|
|
11
|
+
};
|
|
12
|
+
channels: {
|
|
13
|
+
telegramDefaults: {
|
|
14
|
+
dmPolicy: DmPolicy;
|
|
15
|
+
groupPolicy: GroupPolicy;
|
|
16
|
+
requireMention: boolean;
|
|
17
|
+
textChunkLimit: number;
|
|
18
|
+
};
|
|
19
|
+
whatsappDefaults: {
|
|
20
|
+
dmPolicy: DmPolicy;
|
|
21
|
+
groupPolicy: GroupPolicy;
|
|
22
|
+
requireMention: boolean;
|
|
23
|
+
textChunkLimit: number;
|
|
24
|
+
mediaMaxMb: number;
|
|
25
|
+
sendReadReceipts: boolean;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
autoImprove: {
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
intervalMs: number;
|
|
31
|
+
runAfterEachConversation: boolean;
|
|
32
|
+
killSwitch: boolean;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export declare const DEFAULT_NATROC_CONFIG: NatrocConfig;
|
|
36
|
+
export declare function getConfigPath(paths: NatrocPaths): string;
|
|
37
|
+
/** Load and merge with defaults. Missing or invalid file returns defaults. */
|
|
38
|
+
export declare function loadNatrocConfig(paths: NatrocPaths): Promise<NatrocConfig>;
|
|
39
|
+
/** Write defaults if the file does not exist yet. */
|
|
40
|
+
export declare function ensureNatrocConfig(paths: NatrocPaths): Promise<void>;
|
|
41
|
+
export declare function writeNatrocConfig(paths: NatrocPaths, config: NatrocConfig): Promise<void>;
|