@roackb2/heddle 0.0.28 → 0.0.29
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/README.md +51 -17
- package/dist/examples/programmatic-loop.js +12 -0
- package/dist/examples/programmatic-loop.js.map +1 -1
- package/dist/src/cli/ask.d.ts.map +1 -1
- package/dist/src/cli/ask.js +27 -5
- package/dist/src/cli/ask.js.map +1 -1
- package/dist/src/cli/chat/App.js +5 -3
- package/dist/src/cli/chat/App.js.map +1 -1
- package/dist/src/cli/chat/hooks/useAgentRun.d.ts +1 -0
- package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
- package/dist/src/cli/chat/hooks/useAgentRun.js +73 -0
- package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
- package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts +1 -0
- package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts.map +1 -1
- package/dist/src/cli/chat/hooks/useApprovalFlow.js +3 -0
- package/dist/src/cli/chat/hooks/useApprovalFlow.js.map +1 -1
- package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
- package/dist/src/cli/chat/utils/format.js +8 -0
- package/dist/src/cli/chat/utils/format.js.map +1 -1
- package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
- package/dist/src/cli/chat/utils/runtime.js +7 -3
- package/dist/src/cli/chat/utils/runtime.js.map +1 -1
- package/dist/src/cli/main.js +223 -1
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/remote/control-plane-client.d.ts +43 -0
- package/dist/src/cli/remote/control-plane-client.d.ts.map +1 -1
- package/dist/src/core/agent/mutation-tracking.d.ts.map +1 -1
- package/dist/src/core/agent/mutation-tracking.js +3 -0
- package/dist/src/core/agent/mutation-tracking.js.map +1 -1
- package/dist/src/core/agent/post-mutation.js +2 -2
- package/dist/src/core/agent/post-mutation.js.map +1 -1
- package/dist/src/core/agent/run-agent.d.ts.map +1 -1
- package/dist/src/core/agent/run-agent.js +132 -28
- package/dist/src/core/agent/run-agent.js.map +1 -1
- package/dist/src/core/chat/conversation-lines.d.ts.map +1 -1
- package/dist/src/core/chat/conversation-lines.js +1 -26
- package/dist/src/core/chat/conversation-lines.js.map +1 -1
- package/dist/src/core/chat/session-lease.d.ts +4 -0
- package/dist/src/core/chat/session-lease.d.ts.map +1 -1
- package/dist/src/core/chat/session-lease.js +29 -1
- package/dist/src/core/chat/session-lease.js.map +1 -1
- package/dist/src/core/chat/session-submit.d.ts +2 -0
- package/dist/src/core/chat/session-submit.d.ts.map +1 -1
- package/dist/src/core/chat/session-submit.js +120 -15
- package/dist/src/core/chat/session-submit.js.map +1 -1
- package/dist/src/core/chat/trace-summary.d.ts.map +1 -1
- package/dist/src/core/chat/trace-summary.js +10 -0
- package/dist/src/core/chat/trace-summary.js.map +1 -1
- package/dist/src/core/memory/catalog.d.ts +46 -0
- package/dist/src/core/memory/catalog.d.ts.map +1 -0
- package/dist/src/core/memory/catalog.js +230 -0
- package/dist/src/core/memory/catalog.js.map +1 -0
- package/dist/src/core/memory/domain-prompt.d.ts +2 -0
- package/dist/src/core/memory/domain-prompt.d.ts.map +1 -0
- package/dist/src/core/memory/domain-prompt.js +35 -0
- package/dist/src/core/memory/domain-prompt.js.map +1 -0
- package/dist/src/core/memory/maintainer-tools.d.ts +5 -0
- package/dist/src/core/memory/maintainer-tools.d.ts.map +1 -0
- package/dist/src/core/memory/maintainer-tools.js +10 -0
- package/dist/src/core/memory/maintainer-tools.js.map +1 -0
- package/dist/src/core/memory/maintainer.d.ts +45 -0
- package/dist/src/core/memory/maintainer.d.ts.map +1 -0
- package/dist/src/core/memory/maintainer.js +204 -0
- package/dist/src/core/memory/maintainer.js.map +1 -0
- package/dist/src/core/memory/maintenance-integration.d.ts +20 -0
- package/dist/src/core/memory/maintenance-integration.d.ts.map +1 -0
- package/dist/src/core/memory/maintenance-integration.js +189 -0
- package/dist/src/core/memory/maintenance-integration.js.map +1 -0
- package/dist/src/core/memory/templates.d.ts +9 -0
- package/dist/src/core/memory/templates.d.ts.map +1 -0
- package/dist/src/core/memory/templates.js +32 -0
- package/dist/src/core/memory/templates.js.map +1 -0
- package/dist/src/core/memory/validation.d.ts +39 -0
- package/dist/src/core/memory/validation.d.ts.map +1 -0
- package/dist/src/core/memory/validation.js +94 -0
- package/dist/src/core/memory/validation.js.map +1 -0
- package/dist/src/core/memory/visibility.d.ts +42 -0
- package/dist/src/core/memory/visibility.d.ts.map +1 -0
- package/dist/src/core/memory/visibility.js +156 -0
- package/dist/src/core/memory/visibility.js.map +1 -0
- package/dist/src/core/prompts/system-prompt.d.ts.map +1 -1
- package/dist/src/core/prompts/system-prompt.js +0 -10
- package/dist/src/core/prompts/system-prompt.js.map +1 -1
- package/dist/src/core/runtime/default-tools.d.ts +1 -0
- package/dist/src/core/runtime/default-tools.d.ts.map +1 -1
- package/dist/src/core/runtime/default-tools.js +22 -4
- package/dist/src/core/runtime/default-tools.js.map +1 -1
- package/dist/src/core/runtime/heartbeat.d.ts.map +1 -1
- package/dist/src/core/runtime/heartbeat.js +9 -2
- package/dist/src/core/runtime/heartbeat.js.map +1 -1
- package/dist/src/core/tools/file-edit-core.d.ts +1 -0
- package/dist/src/core/tools/file-edit-core.d.ts.map +1 -1
- package/dist/src/core/tools/file-edit-core.js +10 -0
- package/dist/src/core/tools/file-edit-core.js.map +1 -1
- package/dist/src/core/tools/memory-checkpoint.d.ts +8 -0
- package/dist/src/core/tools/memory-checkpoint.d.ts.map +1 -0
- package/dist/src/core/tools/memory-checkpoint.js +131 -0
- package/dist/src/core/tools/memory-checkpoint.js.map +1 -0
- package/dist/src/core/tools/memory-notes.d.ts.map +1 -1
- package/dist/src/core/tools/memory-notes.js +4 -3
- package/dist/src/core/tools/memory-notes.js.map +1 -1
- package/dist/src/core/tools/record-knowledge.d.ts +9 -0
- package/dist/src/core/tools/record-knowledge.d.ts.map +1 -0
- package/dist/src/core/tools/record-knowledge.js +177 -0
- package/dist/src/core/tools/record-knowledge.js.map +1 -0
- package/dist/src/core/types.d.ts +33 -0
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/server/features/control-plane/router.d.ts +43 -0
- package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/router.js +36 -0
- package/dist/src/server/features/control-plane/router.js.map +1 -1
- package/dist/src/server/features/control-plane/services/ask.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/services/ask.js +23 -5
- package/dist/src/server/features/control-plane/services/ask.js.map +1 -1
- package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +2 -0
- package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/services/chat-sessions.js +1 -0
- package/dist/src/server/features/control-plane/services/chat-sessions.js.map +1 -1
- package/dist/src/server/features/control-plane/services/control-plane-state.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/services/control-plane-state.js +4 -1
- package/dist/src/server/features/control-plane/services/control-plane-state.js.map +1 -1
- package/dist/src/server/features/control-plane/services/memory.d.ts +22 -0
- package/dist/src/server/features/control-plane/services/memory.d.ts.map +1 -0
- package/dist/src/server/features/control-plane/services/memory.js +36 -0
- package/dist/src/server/features/control-plane/services/memory.js.map +1 -0
- package/dist/src/server/features/control-plane/types.d.ts +2 -0
- package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
- package/dist/src/server/router.d.ts +43 -0
- package/dist/src/server/router.d.ts.map +1 -1
- package/dist/src/web/assets/index-BCCIDJRN.js +52 -0
- package/dist/src/web/assets/{index-COAJyPuH.css → index-DarVaee6.css} +1 -1
- package/dist/src/web/index.html +2 -2
- package/package.json +13 -2
- package/dist/src/web/assets/index-DxGlp0Wk.js +0 -52
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { mkdir, open, readFile, rm } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { readPendingKnowledgeCandidates, runKnowledgeMaintenance, } from './maintainer.js';
|
|
4
|
+
const DEFAULT_LOCK_STALE_AFTER_MS = 10 * 60 * 1000;
|
|
5
|
+
const DEFAULT_LOCK_POLL_MS = 250;
|
|
6
|
+
const DEFAULT_LOCK_TIMEOUT_MS = 30 * 1000;
|
|
7
|
+
const maintenanceQueues = new Map();
|
|
8
|
+
export async function runMaintenanceForRecordedCandidates(options) {
|
|
9
|
+
return await enqueueMaintenance(options.memoryRoot, () => runMaintenanceForRecordedCandidatesNow(options));
|
|
10
|
+
}
|
|
11
|
+
async function runMaintenanceForRecordedCandidatesNow(options) {
|
|
12
|
+
const candidateIds = [...new Set(options.trace
|
|
13
|
+
.filter((event) => event.type === 'memory.candidate_recorded')
|
|
14
|
+
.map((event) => event.candidateId))];
|
|
15
|
+
if (candidateIds.length === 0) {
|
|
16
|
+
return { candidateIds, events: [] };
|
|
17
|
+
}
|
|
18
|
+
const pending = await readPendingKnowledgeCandidates({ memoryRoot: options.memoryRoot });
|
|
19
|
+
const observations = pending.filter((candidate) => candidateIds.includes(candidate.id));
|
|
20
|
+
if (observations.length === 0) {
|
|
21
|
+
return { candidateIds, events: [] };
|
|
22
|
+
}
|
|
23
|
+
const runId = `memory-run-${Date.now()}`;
|
|
24
|
+
const started = createEvent({
|
|
25
|
+
type: 'memory.maintenance_started',
|
|
26
|
+
runId,
|
|
27
|
+
candidateIds: observations.map((candidate) => candidate.id),
|
|
28
|
+
step: nextMemoryStep(options.trace),
|
|
29
|
+
});
|
|
30
|
+
options.onTraceEvent?.(started);
|
|
31
|
+
let lock;
|
|
32
|
+
try {
|
|
33
|
+
lock = await acquireMemoryMaintenanceLock({
|
|
34
|
+
memoryRoot: options.memoryRoot,
|
|
35
|
+
staleAfterMs: options.lockStaleAfterMs,
|
|
36
|
+
timeoutMs: options.lockTimeoutMs,
|
|
37
|
+
});
|
|
38
|
+
const maintenance = await runKnowledgeMaintenance({
|
|
39
|
+
memoryRoot: options.memoryRoot,
|
|
40
|
+
observations,
|
|
41
|
+
llm: options.llm,
|
|
42
|
+
source: options.source,
|
|
43
|
+
maxSteps: options.maxSteps,
|
|
44
|
+
nextRunId: () => runId,
|
|
45
|
+
});
|
|
46
|
+
if (maintenance.run.outcome === 'error' || maintenance.run.outcome === 'max_steps' || maintenance.run.outcome === 'interrupted') {
|
|
47
|
+
const failed = createEvent({
|
|
48
|
+
type: 'memory.maintenance_failed',
|
|
49
|
+
runId: maintenance.run.id,
|
|
50
|
+
error: maintenance.run.summary,
|
|
51
|
+
candidateIds: observations.map((candidate) => candidate.id),
|
|
52
|
+
step: nextMemoryStep(options.trace),
|
|
53
|
+
});
|
|
54
|
+
options.onTraceEvent?.(failed);
|
|
55
|
+
return { candidateIds, maintenance, events: [started, failed] };
|
|
56
|
+
}
|
|
57
|
+
const finished = createEvent({
|
|
58
|
+
type: 'memory.maintenance_finished',
|
|
59
|
+
runId: maintenance.run.id,
|
|
60
|
+
outcome: maintenance.run.outcome,
|
|
61
|
+
summary: maintenance.run.summary,
|
|
62
|
+
processedCandidateIds: maintenance.run.processedCandidateIds,
|
|
63
|
+
failedCandidateIds: maintenance.run.failedCandidateIds,
|
|
64
|
+
step: nextMemoryStep(options.trace),
|
|
65
|
+
});
|
|
66
|
+
options.onTraceEvent?.(finished);
|
|
67
|
+
return { candidateIds, maintenance, events: [started, finished] };
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const failed = createEvent({
|
|
71
|
+
type: 'memory.maintenance_failed',
|
|
72
|
+
runId,
|
|
73
|
+
error: error instanceof Error ? error.message : String(error),
|
|
74
|
+
candidateIds: observations.map((candidate) => candidate.id),
|
|
75
|
+
step: nextMemoryStep(options.trace),
|
|
76
|
+
});
|
|
77
|
+
options.onTraceEvent?.(failed);
|
|
78
|
+
return { candidateIds, events: [started, failed] };
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await lock?.release();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function acquireMemoryMaintenanceLock(options) {
|
|
85
|
+
const memoryRoot = resolve(options.memoryRoot);
|
|
86
|
+
const lockPath = join(memoryRoot, '_maintenance', 'maintenance.lock');
|
|
87
|
+
const lockId = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
88
|
+
const startedAt = Date.now();
|
|
89
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
90
|
+
const staleAfterMs = options.staleAfterMs ?? DEFAULT_LOCK_STALE_AFTER_MS;
|
|
91
|
+
await mkdir(dirname(lockPath), { recursive: true });
|
|
92
|
+
while (true) {
|
|
93
|
+
try {
|
|
94
|
+
const handle = await open(lockPath, 'wx');
|
|
95
|
+
await handle.writeFile(JSON.stringify({
|
|
96
|
+
id: lockId,
|
|
97
|
+
pid: process.pid,
|
|
98
|
+
acquiredAt: new Date().toISOString(),
|
|
99
|
+
}) + '\n', 'utf8');
|
|
100
|
+
await handle.close();
|
|
101
|
+
return {
|
|
102
|
+
async release() {
|
|
103
|
+
await releaseMemoryMaintenanceLock(lockPath, lockId);
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST') {
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
if (await removeStaleMemoryMaintenanceLock(lockPath, staleAfterMs)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (Date.now() - startedAt >= timeoutMs) {
|
|
115
|
+
throw new Error(`Memory maintenance lock is busy: ${lockPath}`);
|
|
116
|
+
}
|
|
117
|
+
await sleep(DEFAULT_LOCK_POLL_MS);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function releaseMemoryMaintenanceLock(lockPath, lockId) {
|
|
122
|
+
const current = await readMemoryMaintenanceLock(lockPath);
|
|
123
|
+
if (current?.id !== lockId) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
await rm(lockPath, { force: true });
|
|
127
|
+
}
|
|
128
|
+
async function removeStaleMemoryMaintenanceLock(lockPath, staleAfterMs) {
|
|
129
|
+
const current = await readMemoryMaintenanceLock(lockPath);
|
|
130
|
+
if (!current) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const acquiredAt = Date.parse(current.acquiredAt);
|
|
134
|
+
if (!Number.isFinite(acquiredAt) || Date.now() - acquiredAt < staleAfterMs) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
await rm(lockPath, { force: true });
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
async function readMemoryMaintenanceLock(lockPath) {
|
|
141
|
+
try {
|
|
142
|
+
const parsed = JSON.parse(await readFile(lockPath, 'utf8'));
|
|
143
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
const candidate = parsed;
|
|
147
|
+
return typeof candidate.id === 'string' && typeof candidate.acquiredAt === 'string' ?
|
|
148
|
+
{ id: candidate.id, acquiredAt: candidate.acquiredAt }
|
|
149
|
+
: undefined;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function sleep(ms) {
|
|
159
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
160
|
+
}
|
|
161
|
+
async function enqueueMaintenance(memoryRoot, run) {
|
|
162
|
+
const previous = maintenanceQueues.get(memoryRoot) ?? Promise.resolve();
|
|
163
|
+
let release;
|
|
164
|
+
const current = new Promise((resolve) => {
|
|
165
|
+
release = resolve;
|
|
166
|
+
});
|
|
167
|
+
const queued = previous.then(() => current, () => current);
|
|
168
|
+
maintenanceQueues.set(memoryRoot, queued);
|
|
169
|
+
await previous.catch(() => undefined);
|
|
170
|
+
try {
|
|
171
|
+
return await run();
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
release();
|
|
175
|
+
if (maintenanceQueues.get(memoryRoot) === queued) {
|
|
176
|
+
maintenanceQueues.delete(memoryRoot);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function createEvent(event) {
|
|
181
|
+
return {
|
|
182
|
+
...event,
|
|
183
|
+
timestamp: new Date().toISOString(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function nextMemoryStep(trace) {
|
|
187
|
+
return trace.reduce((max, event) => 'step' in event ? Math.max(max, event.step) : max, 0) + 1;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=maintenance-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance-integration.js","sourceRoot":"","sources":["../../../../src/core/memory/maintenance-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function createMemoryNoteTemplate(options: {
|
|
2
|
+
title: string;
|
|
3
|
+
summary: string;
|
|
4
|
+
confidence?: string;
|
|
5
|
+
sourceRefs?: string[];
|
|
6
|
+
now?: Date;
|
|
7
|
+
}): string;
|
|
8
|
+
export declare function slugifyMemoryTitle(value: string): string;
|
|
9
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/templates.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,MAAM,CAiBT;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function createMemoryNoteTemplate(options) {
|
|
2
|
+
const updatedAt = (options.now ?? new Date()).toISOString();
|
|
3
|
+
const sourceRefs = options.sourceRefs && options.sourceRefs.length > 0 ? options.sourceRefs : undefined;
|
|
4
|
+
return [
|
|
5
|
+
'---',
|
|
6
|
+
`title: ${quoteYaml(options.title)}`,
|
|
7
|
+
`updated: ${quoteYaml(updatedAt)}`,
|
|
8
|
+
options.confidence ? `confidence: ${quoteYaml(options.confidence)}` : undefined,
|
|
9
|
+
sourceRefs ? 'sourceRefs:' : undefined,
|
|
10
|
+
...(sourceRefs?.map((sourceRef) => ` - ${quoteYaml(sourceRef)}`) ?? []),
|
|
11
|
+
'---',
|
|
12
|
+
'',
|
|
13
|
+
`# ${options.title}`,
|
|
14
|
+
'',
|
|
15
|
+
options.summary,
|
|
16
|
+
'',
|
|
17
|
+
].filter((line) => line !== undefined).join('\n');
|
|
18
|
+
}
|
|
19
|
+
export function slugifyMemoryTitle(value) {
|
|
20
|
+
const slug = value
|
|
21
|
+
.toLowerCase()
|
|
22
|
+
.replace(/[`'"]/g, '')
|
|
23
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
24
|
+
.replace(/^-+|-+$/g, '')
|
|
25
|
+
.slice(0, 80)
|
|
26
|
+
.replace(/-+$/g, '');
|
|
27
|
+
return slug || 'memory-note';
|
|
28
|
+
}
|
|
29
|
+
function quoteYaml(value) {
|
|
30
|
+
return JSON.stringify(value);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/core/memory/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB,CAAC,OAMxC;IACC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,OAAO;QACL,KAAK;QACL,UAAU,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACpC,YAAY,SAAS,CAAC,SAAS,CAAC,EAAE;QAClC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAC/E,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;QACtC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACxE,KAAK;QACL,EAAE;QACF,KAAK,OAAO,CAAC,KAAK,EAAE;QACpB,EAAE;QACF,OAAO,CAAC,OAAO;QACf,EAAE;KACH,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG,KAAK;SACf,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,aAAa,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type MemoryValidationIssue = {
|
|
2
|
+
type: 'missing_catalog';
|
|
3
|
+
severity: 'error';
|
|
4
|
+
path: string;
|
|
5
|
+
message: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: 'oversized_catalog';
|
|
8
|
+
severity: 'warning';
|
|
9
|
+
path: string;
|
|
10
|
+
sizeBytes: number;
|
|
11
|
+
maxBytes: number;
|
|
12
|
+
message: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'orphan_note';
|
|
15
|
+
severity: 'warning';
|
|
16
|
+
path: string;
|
|
17
|
+
message: string;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'pending_candidates';
|
|
20
|
+
severity: 'info';
|
|
21
|
+
count: number;
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
export type MemoryValidationResult = {
|
|
25
|
+
memoryRoot: string;
|
|
26
|
+
ok: boolean;
|
|
27
|
+
issueCount: number;
|
|
28
|
+
issues: MemoryValidationIssue[];
|
|
29
|
+
};
|
|
30
|
+
export declare function validateMemoryWorkspace(options: {
|
|
31
|
+
memoryRoot: string;
|
|
32
|
+
}): Promise<MemoryValidationResult>;
|
|
33
|
+
export declare function repairMissingMemoryCatalogs(options: {
|
|
34
|
+
memoryRoot: string;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
memoryRoot: string;
|
|
37
|
+
createdPaths: string[];
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/validation.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,qBAAqB,GAC7B;IACA,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GACC;IACA,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,GACC;IACA,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GACC;IACA,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEJ,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiC9G;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAE1I"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { DEFAULT_MEMORY_FOLDER_CATALOG_MAX_BYTES, DEFAULT_MEMORY_ROOT_CATALOG_MAX_BYTES, bootstrapMemoryWorkspace, validateMemoryCatalogShape, } from './catalog.js';
|
|
4
|
+
import { readPendingKnowledgeCandidates } from './maintainer.js';
|
|
5
|
+
import { listMemoryNotePaths } from './visibility.js';
|
|
6
|
+
export async function validateMemoryWorkspace(options) {
|
|
7
|
+
const memoryRoot = resolve(options.memoryRoot);
|
|
8
|
+
const issues = [];
|
|
9
|
+
const shape = validateMemoryCatalogShape({ memoryRoot });
|
|
10
|
+
for (const path of shape.missing) {
|
|
11
|
+
issues.push({
|
|
12
|
+
type: 'missing_catalog',
|
|
13
|
+
severity: 'error',
|
|
14
|
+
path,
|
|
15
|
+
message: `Missing required memory catalog: ${path}`,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const notes = await listMemoryNotePaths({ memoryRoot });
|
|
19
|
+
await appendOversizedCatalogIssues(memoryRoot, notes, issues);
|
|
20
|
+
await appendOrphanNoteIssues(memoryRoot, notes, issues);
|
|
21
|
+
const pending = await readPendingKnowledgeCandidates({ memoryRoot });
|
|
22
|
+
if (pending.length > 0) {
|
|
23
|
+
issues.push({
|
|
24
|
+
type: 'pending_candidates',
|
|
25
|
+
severity: 'info',
|
|
26
|
+
count: pending.length,
|
|
27
|
+
message: `${pending.length} pending memory candidate${pending.length === 1 ? '' : 's'} waiting for maintenance.`,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
memoryRoot,
|
|
32
|
+
ok: issues.every((issue) => issue.severity !== 'error'),
|
|
33
|
+
issueCount: issues.length,
|
|
34
|
+
issues,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export async function repairMissingMemoryCatalogs(options) {
|
|
38
|
+
return bootstrapMemoryWorkspace({ memoryRoot: options.memoryRoot });
|
|
39
|
+
}
|
|
40
|
+
async function appendOversizedCatalogIssues(memoryRoot, notes, issues) {
|
|
41
|
+
for (const path of notes.filter((note) => basename(note).toLowerCase() === 'readme.md')) {
|
|
42
|
+
const fullPath = join(memoryRoot, path);
|
|
43
|
+
const info = await stat(fullPath);
|
|
44
|
+
const maxBytes = path === 'README.md' ? DEFAULT_MEMORY_ROOT_CATALOG_MAX_BYTES : DEFAULT_MEMORY_FOLDER_CATALOG_MAX_BYTES;
|
|
45
|
+
if (info.size <= maxBytes) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
issues.push({
|
|
49
|
+
type: 'oversized_catalog',
|
|
50
|
+
severity: 'warning',
|
|
51
|
+
path,
|
|
52
|
+
sizeBytes: info.size,
|
|
53
|
+
maxBytes,
|
|
54
|
+
message: `Memory catalog ${path} is ${info.size} bytes, above the ${maxBytes} byte cap.`,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function appendOrphanNoteIssues(memoryRoot, notes, issues) {
|
|
59
|
+
const catalogPaths = notes.filter((note) => basename(note).toLowerCase() === 'readme.md');
|
|
60
|
+
const catalogTextByPath = new Map();
|
|
61
|
+
for (const catalogPath of catalogPaths) {
|
|
62
|
+
catalogTextByPath.set(catalogPath, await readFile(join(memoryRoot, catalogPath), 'utf8'));
|
|
63
|
+
}
|
|
64
|
+
for (const note of notes) {
|
|
65
|
+
if (basename(note).toLowerCase() === 'readme.md') {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const folderCatalog = catalogPathForNote(note);
|
|
69
|
+
const folderCatalogText = catalogTextByPath.get(folderCatalog) ?? '';
|
|
70
|
+
const rootCatalogText = catalogTextByPath.get('README.md') ?? '';
|
|
71
|
+
const localName = basename(note);
|
|
72
|
+
const linkedFromFolder = folderCatalogText.includes(localName) || folderCatalogText.includes(note);
|
|
73
|
+
const linkedFromRoot = rootCatalogText.includes(note);
|
|
74
|
+
if (linkedFromFolder || linkedFromRoot) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
issues.push({
|
|
78
|
+
type: 'orphan_note',
|
|
79
|
+
severity: 'warning',
|
|
80
|
+
path: note,
|
|
81
|
+
message: orphanNoteMessage(note, folderCatalog),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function catalogPathForNote(path) {
|
|
86
|
+
const folder = dirname(path);
|
|
87
|
+
return folder === '.' ? 'README.md' : join(folder, 'README.md');
|
|
88
|
+
}
|
|
89
|
+
function orphanNoteMessage(note, folderCatalog) {
|
|
90
|
+
return folderCatalog === 'README.md' ?
|
|
91
|
+
`Memory note ${note} is not linked from README.md.`
|
|
92
|
+
: `Memory note ${note} is not linked from ${folderCatalog} or README.md.`;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/core/memory/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type KnowledgeMaintenanceRunRecord } from './maintainer.js';
|
|
2
|
+
export type MemoryStatusView = {
|
|
3
|
+
memoryRoot: string;
|
|
4
|
+
catalog: {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
missing: string[];
|
|
7
|
+
};
|
|
8
|
+
notes: {
|
|
9
|
+
count: number;
|
|
10
|
+
};
|
|
11
|
+
candidates: {
|
|
12
|
+
pending: number;
|
|
13
|
+
};
|
|
14
|
+
runs: {
|
|
15
|
+
latest: KnowledgeMaintenanceRunRecord[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare function loadMemoryStatus(options: {
|
|
19
|
+
memoryRoot: string;
|
|
20
|
+
recentRunLimit?: number;
|
|
21
|
+
}): Promise<MemoryStatusView>;
|
|
22
|
+
export declare function listMemoryNotePaths(options: {
|
|
23
|
+
memoryRoot: string;
|
|
24
|
+
path?: string;
|
|
25
|
+
}): Promise<string[]>;
|
|
26
|
+
export declare function readMemoryNote(options: {
|
|
27
|
+
memoryRoot: string;
|
|
28
|
+
path: string;
|
|
29
|
+
offset?: number;
|
|
30
|
+
maxLines?: number;
|
|
31
|
+
}): Promise<string>;
|
|
32
|
+
export declare function searchMemoryNotes(options: {
|
|
33
|
+
memoryRoot: string;
|
|
34
|
+
query: string;
|
|
35
|
+
path?: string;
|
|
36
|
+
maxResults?: number;
|
|
37
|
+
}): Promise<string>;
|
|
38
|
+
export declare function readRecentMemoryMaintenanceRuns(options: {
|
|
39
|
+
memoryRoot: string;
|
|
40
|
+
limit?: number;
|
|
41
|
+
}): Promise<KnowledgeMaintenanceRunRecord[]>;
|
|
42
|
+
//# sourceMappingURL=visibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/visibility.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkC,KAAK,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAErG,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QACP,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,IAAI,EAAE;QACJ,MAAM,EAAE,6BAA6B,EAAE,CAAC;KACzC,CAAC;CACH,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyB5B;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAa3G;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlB;AAED,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAc3C"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { access, readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, relative, resolve } from 'node:path';
|
|
3
|
+
import { createReadMemoryNoteTool, createSearchMemoryNotesTool } from '../tools/memory-notes.js';
|
|
4
|
+
import { validateMemoryCatalogShape } from './catalog.js';
|
|
5
|
+
import { readPendingKnowledgeCandidates } from './maintainer.js';
|
|
6
|
+
export async function loadMemoryStatus(options) {
|
|
7
|
+
const memoryRoot = resolve(options.memoryRoot);
|
|
8
|
+
const [notes, pending, latestRuns] = await Promise.all([
|
|
9
|
+
listMemoryNotePaths({ memoryRoot }),
|
|
10
|
+
readPendingKnowledgeCandidates({ memoryRoot }),
|
|
11
|
+
readRecentMemoryMaintenanceRuns({ memoryRoot, limit: options.recentRunLimit ?? 5 }),
|
|
12
|
+
]);
|
|
13
|
+
const catalog = validateMemoryCatalogShape({ memoryRoot });
|
|
14
|
+
return {
|
|
15
|
+
memoryRoot,
|
|
16
|
+
catalog: {
|
|
17
|
+
ok: catalog.ok,
|
|
18
|
+
missing: catalog.missing,
|
|
19
|
+
},
|
|
20
|
+
notes: {
|
|
21
|
+
count: notes.length,
|
|
22
|
+
},
|
|
23
|
+
candidates: {
|
|
24
|
+
pending: pending.length,
|
|
25
|
+
},
|
|
26
|
+
runs: {
|
|
27
|
+
latest: latestRuns,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function listMemoryNotePaths(options) {
|
|
32
|
+
const memoryRoot = resolve(options.memoryRoot);
|
|
33
|
+
const target = resolveMemoryPath(memoryRoot, options.path ?? '.');
|
|
34
|
+
if (!target.ok) {
|
|
35
|
+
throw new Error(target.error);
|
|
36
|
+
}
|
|
37
|
+
if (!await pathExists(target.path)) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const notes = await listMarkdownNotes(target.path);
|
|
41
|
+
return notes.map((path) => toMemoryRelativePath(memoryRoot, path)).sort();
|
|
42
|
+
}
|
|
43
|
+
export async function readMemoryNote(options) {
|
|
44
|
+
const result = await createReadMemoryNoteTool({ memoryRoot: options.memoryRoot }).execute({
|
|
45
|
+
path: options.path,
|
|
46
|
+
offset: options.offset,
|
|
47
|
+
maxLines: options.maxLines,
|
|
48
|
+
});
|
|
49
|
+
if (!result.ok) {
|
|
50
|
+
throw new Error(result.error);
|
|
51
|
+
}
|
|
52
|
+
return typeof result.output === 'string' ? result.output : JSON.stringify(result.output, null, 2);
|
|
53
|
+
}
|
|
54
|
+
export async function searchMemoryNotes(options) {
|
|
55
|
+
const result = await createSearchMemoryNotesTool({ memoryRoot: options.memoryRoot }).execute({
|
|
56
|
+
query: options.query,
|
|
57
|
+
path: options.path,
|
|
58
|
+
maxResults: options.maxResults,
|
|
59
|
+
});
|
|
60
|
+
if (!result.ok) {
|
|
61
|
+
throw new Error(result.error);
|
|
62
|
+
}
|
|
63
|
+
return typeof result.output === 'string' ? result.output : JSON.stringify(result.output, null, 2);
|
|
64
|
+
}
|
|
65
|
+
export async function readRecentMemoryMaintenanceRuns(options) {
|
|
66
|
+
const memoryRoot = resolve(options.memoryRoot);
|
|
67
|
+
const raw = await readTextIfExists(resolve(memoryRoot, '_maintenance', 'runs.jsonl'));
|
|
68
|
+
if (!raw) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
return raw
|
|
72
|
+
.split(/\r?\n/u)
|
|
73
|
+
.filter((line) => line.trim())
|
|
74
|
+
.map(parseRunRecord)
|
|
75
|
+
.filter((run) => Boolean(run))
|
|
76
|
+
.slice(-(options.limit ?? 5))
|
|
77
|
+
.reverse();
|
|
78
|
+
}
|
|
79
|
+
function resolveMemoryPath(memoryRoot, requestedPath) {
|
|
80
|
+
if (!requestedPath.trim()) {
|
|
81
|
+
return { ok: false, error: `Memory note paths must be non-empty and stay inside ${memoryRoot}.` };
|
|
82
|
+
}
|
|
83
|
+
const targetPath = resolve(memoryRoot, requestedPath);
|
|
84
|
+
const rel = relative(memoryRoot, targetPath);
|
|
85
|
+
if (rel.startsWith('..') || isAbsolute(rel)) {
|
|
86
|
+
return { ok: false, error: `Memory note paths must stay inside ${memoryRoot}. Refusing to access ${targetPath}.` };
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, path: targetPath };
|
|
89
|
+
}
|
|
90
|
+
async function listMarkdownNotes(root) {
|
|
91
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
92
|
+
const results = [];
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
if (entry.name === '_maintenance') {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const nextPath = resolve(root, entry.name);
|
|
98
|
+
if (entry.isDirectory()) {
|
|
99
|
+
results.push(...await listMarkdownNotes(nextPath));
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (entry.isFile() && /\.md$/iu.test(entry.name)) {
|
|
103
|
+
results.push(nextPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
108
|
+
async function pathExists(path) {
|
|
109
|
+
try {
|
|
110
|
+
await access(path);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function readTextIfExists(path) {
|
|
118
|
+
try {
|
|
119
|
+
return await readFile(path, 'utf8');
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function parseRunRecord(line) {
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(line);
|
|
131
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const record = parsed;
|
|
135
|
+
return typeof record.id === 'string'
|
|
136
|
+
&& typeof record.startedAt === 'string'
|
|
137
|
+
&& typeof record.finishedAt === 'string'
|
|
138
|
+
&& typeof record.source === 'string'
|
|
139
|
+
&& typeof record.outcome === 'string'
|
|
140
|
+
&& typeof record.summary === 'string'
|
|
141
|
+
&& Array.isArray(record.candidateIds)
|
|
142
|
+
&& Array.isArray(record.processedCandidateIds)
|
|
143
|
+
&& Array.isArray(record.failedCandidateIds)
|
|
144
|
+
&& typeof record.catalogValid === 'boolean'
|
|
145
|
+
&& Array.isArray(record.catalogMissing) ?
|
|
146
|
+
record
|
|
147
|
+
: undefined;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function toMemoryRelativePath(memoryRoot, filePath) {
|
|
154
|
+
return relative(memoryRoot, filePath) || '.';
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visibility.js","sourceRoot":"","sources":["../../../../src/core/memory/visibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../../src/core/prompts/system-prompt.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../../src/core/prompts/system-prompt.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CA6GpG"}
|
|
@@ -67,16 +67,6 @@ If you recorded a plan, do not stop after only one small slice unless the remain
|
|
|
67
67
|
Summarize what you found or did in a readable form.
|
|
68
68
|
If the task involved changes or verification, prefer a short summary followed by high-level bullets over a vague “done”.
|
|
69
69
|
|
|
70
|
-
## Knowledge Persistence
|
|
71
|
-
|
|
72
|
-
- Treat persistent memory as durable workspace knowledge, not scratch space.
|
|
73
|
-
- Maintain useful memory proactively when you confirm a stable fact that is likely to save future rediscovery.
|
|
74
|
-
- Good times to update memory include: after a verified architectural finding, after resolving a recurring repo quirk, after learning stable build/test workflow details, or after completing meaningful implementation work that future sessions will need to understand.
|
|
75
|
-
- Do not write speculative guesses, one-turn plans, temporary hypotheses, or ephemeral observations into persistent memory.
|
|
76
|
-
- Prefer updating an existing memory note over scattering many tiny notes.
|
|
77
|
-
- Memory writes do not require user approval. Use them intentionally at sensible checkpoints without waiting to be asked every time.
|
|
78
|
-
- Prefer memory-specific tools for durable note maintenance, but if retrieval or editing needs a more flexible workflow, it is acceptable to use mature shell tools against the memory directory.
|
|
79
|
-
|
|
80
70
|
## Tool Use Rules
|
|
81
71
|
|
|
82
72
|
- Use tools purposefully. Each tool call should have a clear reason.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../../../src/core/prompts/system-prompt.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wBAAwB;AACxB,uCAAuC;AACvC,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAmB,EAAE,cAAuB;IAC1F,OAAO;;;;;;;;EAQP,IAAI;;;;;;;;;;;;kCAY4B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;EAEpD,cAAc,CAAC,CAAC,CAAC,yBAAyB,cAAc,MAAM,CAAC,CAAC,CAAC,EAAE
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../../../src/core/prompts/system-prompt.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wBAAwB;AACxB,uCAAuC;AACvC,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAmB,EAAE,cAAuB;IAC1F,OAAO;;;;;;;;EAQP,IAAI;;;;;;;;;;;;kCAY4B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;EAEpD,cAAc,CAAC,CAAC,CAAC,yBAAyB,cAAc,MAAM,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wQAqFmM,CAAC;AACzQ,CAAC"}
|