@0xmaxma/claude-gateway 1.6.8 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -20
- package/config.template.json +59 -1
- package/dist/agent/dreaming/accept.d.ts +43 -0
- package/dist/agent/dreaming/accept.d.ts.map +1 -0
- package/dist/agent/dreaming/accept.js +230 -0
- package/dist/agent/dreaming/accept.js.map +1 -0
- package/dist/agent/dreaming/applier.d.ts +77 -0
- package/dist/agent/dreaming/applier.d.ts.map +1 -0
- package/dist/agent/dreaming/applier.js +406 -0
- package/dist/agent/dreaming/applier.js.map +1 -0
- package/dist/agent/dreaming/audit.d.ts +27 -0
- package/dist/agent/dreaming/audit.d.ts.map +1 -0
- package/dist/agent/dreaming/audit.js +100 -0
- package/dist/agent/dreaming/audit.js.map +1 -0
- package/dist/agent/dreaming/compactor.d.ts +66 -0
- package/dist/agent/dreaming/compactor.d.ts.map +1 -0
- package/dist/agent/dreaming/compactor.js +306 -0
- package/dist/agent/dreaming/compactor.js.map +1 -0
- package/dist/agent/dreaming/config.d.ts +19 -0
- package/dist/agent/dreaming/config.d.ts.map +1 -0
- package/dist/agent/dreaming/config.js +107 -0
- package/dist/agent/dreaming/config.js.map +1 -0
- package/dist/agent/dreaming/episodic.d.ts +42 -0
- package/dist/agent/dreaming/episodic.d.ts.map +1 -0
- package/dist/agent/dreaming/episodic.js +116 -0
- package/dist/agent/dreaming/episodic.js.map +1 -0
- package/dist/agent/dreaming/gather.d.ts +31 -0
- package/dist/agent/dreaming/gather.d.ts.map +1 -0
- package/dist/agent/dreaming/gather.js +55 -0
- package/dist/agent/dreaming/gather.js.map +1 -0
- package/dist/agent/dreaming/index.d.ts +87 -0
- package/dist/agent/dreaming/index.d.ts.map +1 -0
- package/dist/agent/dreaming/index.js +377 -0
- package/dist/agent/dreaming/index.js.map +1 -0
- package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
- package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate-cli.js +42 -0
- package/dist/agent/dreaming/migrate-cli.js.map +1 -0
- package/dist/agent/dreaming/migrate.d.ts +72 -0
- package/dist/agent/dreaming/migrate.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate.js +374 -0
- package/dist/agent/dreaming/migrate.js.map +1 -0
- package/dist/agent/dreaming/report.d.ts +39 -0
- package/dist/agent/dreaming/report.d.ts.map +1 -0
- package/dist/agent/dreaming/report.js +121 -0
- package/dist/agent/dreaming/report.js.map +1 -0
- package/dist/agent/dreaming/reviewer.d.ts +43 -0
- package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
- package/dist/agent/dreaming/reviewer.js +249 -0
- package/dist/agent/dreaming/reviewer.js.map +1 -0
- package/dist/agent/dreaming/staleness.d.ts +68 -0
- package/dist/agent/dreaming/staleness.d.ts.map +1 -0
- package/dist/agent/dreaming/staleness.js +281 -0
- package/dist/agent/dreaming/staleness.js.map +1 -0
- package/dist/agent/dreaming/types.d.ts +130 -0
- package/dist/agent/dreaming/types.d.ts.map +1 -0
- package/dist/agent/dreaming/types.js +10 -0
- package/dist/agent/dreaming/types.js.map +1 -0
- package/dist/agent/knowledge/archive-db.d.ts +114 -0
- package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
- package/dist/agent/knowledge/archive-db.js +474 -0
- package/dist/agent/knowledge/archive-db.js.map +1 -0
- package/dist/agent/knowledge/chunk.d.ts +21 -0
- package/dist/agent/knowledge/chunk.d.ts.map +1 -0
- package/dist/agent/knowledge/chunk.js +67 -0
- package/dist/agent/knowledge/chunk.js.map +1 -0
- package/dist/agent/knowledge/config.d.ts +20 -0
- package/dist/agent/knowledge/config.d.ts.map +1 -0
- package/dist/agent/knowledge/config.js +143 -0
- package/dist/agent/knowledge/config.js.map +1 -0
- package/dist/agent/knowledge/graph-demo.d.ts +25 -0
- package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
- package/dist/agent/knowledge/graph-demo.js +132 -0
- package/dist/agent/knowledge/graph-demo.js.map +1 -0
- package/dist/agent/knowledge/index.d.ts +24 -0
- package/dist/agent/knowledge/index.d.ts.map +1 -0
- package/dist/agent/knowledge/index.js +50 -0
- package/dist/agent/knowledge/index.js.map +1 -0
- package/dist/agent/knowledge/indexer.d.ts +34 -0
- package/dist/agent/knowledge/indexer.d.ts.map +1 -0
- package/dist/agent/knowledge/indexer.js +271 -0
- package/dist/agent/knowledge/indexer.js.map +1 -0
- package/dist/agent/knowledge/lifecycle.d.ts +91 -0
- package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
- package/dist/agent/knowledge/lifecycle.js +205 -0
- package/dist/agent/knowledge/lifecycle.js.map +1 -0
- package/dist/agent/knowledge/provenance.d.ts +15 -0
- package/dist/agent/knowledge/provenance.d.ts.map +1 -0
- package/dist/agent/knowledge/provenance.js +37 -0
- package/dist/agent/knowledge/provenance.js.map +1 -0
- package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
- package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-cli.js +53 -0
- package/dist/agent/knowledge/reindex-cli.js.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.js +97 -0
- package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
- package/dist/agent/knowledge/shared-promote.d.ts +18 -0
- package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-promote.js +29 -0
- package/dist/agent/knowledge/shared-promote.js.map +1 -0
- package/dist/agent/knowledge/shared-writer.d.ts +24 -0
- package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-writer.js +97 -0
- package/dist/agent/knowledge/shared-writer.js.map +1 -0
- package/dist/agent/knowledge/types.d.ts +83 -0
- package/dist/agent/knowledge/types.d.ts.map +1 -0
- package/dist/agent/knowledge/types.js +12 -0
- package/dist/agent/knowledge/types.js.map +1 -0
- package/dist/agent/knowledge/wiki.d.ts +107 -0
- package/dist/agent/knowledge/wiki.d.ts.map +1 -0
- package/dist/agent/knowledge/wiki.js +415 -0
- package/dist/agent/knowledge/wiki.js.map +1 -0
- package/dist/agent/memory-metrics.d.ts +48 -0
- package/dist/agent/memory-metrics.d.ts.map +1 -0
- package/dist/agent/memory-metrics.js +156 -0
- package/dist/agent/memory-metrics.js.map +1 -0
- package/dist/agent/runner.d.ts +24 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +82 -6
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/skill-learning/config.d.ts +18 -0
- package/dist/agent/skill-learning/config.d.ts.map +1 -0
- package/dist/agent/skill-learning/config.js +71 -0
- package/dist/agent/skill-learning/config.js.map +1 -0
- package/dist/agent/skill-learning/curator.d.ts +45 -0
- package/dist/agent/skill-learning/curator.d.ts.map +1 -0
- package/dist/agent/skill-learning/curator.js +171 -0
- package/dist/agent/skill-learning/curator.js.map +1 -0
- package/dist/agent/skill-learning/index.d.ts +79 -0
- package/dist/agent/skill-learning/index.d.ts.map +1 -0
- package/dist/agent/skill-learning/index.js +308 -0
- package/dist/agent/skill-learning/index.js.map +1 -0
- package/dist/agent/skill-learning/metrics.d.ts +13 -0
- package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
- package/dist/agent/skill-learning/metrics.js +109 -0
- package/dist/agent/skill-learning/metrics.js.map +1 -0
- package/dist/agent/skill-learning/notifier.d.ts +111 -0
- package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
- package/dist/agent/skill-learning/notifier.js +398 -0
- package/dist/agent/skill-learning/notifier.js.map +1 -0
- package/dist/agent/skill-learning/reviewer.d.ts +61 -0
- package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
- package/dist/agent/skill-learning/reviewer.js +271 -0
- package/dist/agent/skill-learning/reviewer.js.map +1 -0
- package/dist/agent/skill-learning/telemetry.d.ts +22 -0
- package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
- package/dist/agent/skill-learning/telemetry.js +90 -0
- package/dist/agent/skill-learning/telemetry.js.map +1 -0
- package/dist/agent/skill-learning/trigger.d.ts +23 -0
- package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
- package/dist/agent/skill-learning/trigger.js +44 -0
- package/dist/agent/skill-learning/trigger.js.map +1 -0
- package/dist/agent/skill-learning/types.d.ts +165 -0
- package/dist/agent/skill-learning/types.d.ts.map +1 -0
- package/dist/agent/skill-learning/types.js +11 -0
- package/dist/agent/skill-learning/types.js.map +1 -0
- package/dist/agent/skill-learning/writer.d.ts +37 -0
- package/dist/agent/skill-learning/writer.d.ts.map +1 -0
- package/dist/agent/skill-learning/writer.js +223 -0
- package/dist/agent/skill-learning/writer.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +83 -6
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +207 -14
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/gateway-router.d.ts +2 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +293 -6
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +27 -1
- package/dist/api/share-router.js.map +1 -1
- package/dist/api/skills-router.d.ts +2 -2
- package/dist/api/skills-router.d.ts.map +1 -1
- package/dist/api/skills-router.js +61 -1
- package/dist/api/skills-router.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +7 -0
- package/dist/apps/agent-manager.d.ts.map +1 -1
- package/dist/apps/agent-manager.js +13 -1
- package/dist/apps/agent-manager.js.map +1 -1
- package/dist/config/migrator.d.ts +2 -0
- package/dist/config/migrator.d.ts.map +1 -1
- package/dist/config/migrator.js +72 -1
- package/dist/config/migrator.js.map +1 -1
- package/dist/history/cleanup.d.ts +7 -0
- package/dist/history/cleanup.d.ts.map +1 -1
- package/dist/history/cleanup.js +27 -0
- package/dist/history/cleanup.js.map +1 -1
- package/dist/history/db.d.ts +65 -0
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +261 -0
- package/dist/history/db.js.map +1 -1
- package/dist/index.js +122 -20
- package/dist/index.js.map +1 -1
- package/dist/session/process.d.ts +10 -0
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +86 -1
- package/dist/session/process.js.map +1 -1
- package/dist/share/share-store.d.ts +11 -0
- package/dist/share/share-store.d.ts.map +1 -1
- package/dist/share/share-store.js +3 -1
- package/dist/share/share-store.js.map +1 -1
- package/dist/skills/loader.d.ts +8 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +29 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +1126 -3
- package/dist/ui/web-ui.js.map +1 -1
- package/mcp/package.json +2 -1
- package/mcp/server.ts +2 -0
- package/mcp/tools/image/module.ts +114 -9
- package/mcp/tools/memory/archive-reader.test.ts +212 -0
- package/mcp/tools/memory/archive-reader.ts +253 -0
- package/mcp/tools/memory/module.ts +152 -0
- package/mcp/tools/memory/retrieval-recorder.ts +66 -0
- package/mcp/tools/shared/share-client.ts +20 -1
- package/mcp/tools/skills/module.ts +28 -0
- package/package.json +1 -1
- package/resource/claude_gateway.svg +1038 -112
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Episodic note writer (planning-65) — routes task-log OUT of the injected core
|
|
4
|
+
* (MEMORY.md) into the searchable `memory/<topic>.md` archive tier.
|
|
5
|
+
*
|
|
6
|
+
* MEMORY.md is injected into every prompt (expensive); episodic records of "what
|
|
7
|
+
* happened" belong in `memory/*.md`, which the knowledge indexer already walks
|
|
8
|
+
* (`indexer.ts` → `walkMarkdown('memory')`) so the note stays retrievable via
|
|
9
|
+
* `memory_search` — recall is preserved, the prompt stays small.
|
|
10
|
+
*
|
|
11
|
+
* Security: the transcript that drives the dreaming reviewer is untrusted
|
|
12
|
+
* (prompt-injection surface), so the topic slug is validated against a strict
|
|
13
|
+
* regex AND the resolved path is realpath-confined under `<ws>/<episodicDir>/`.
|
|
14
|
+
* A topic that fails validation or escapes the directory is rejected — never
|
|
15
|
+
* written. Append-only (a dated bullet); never rewrites existing content, so it
|
|
16
|
+
* cannot destroy prior notes.
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.DEFAULT_EPISODIC_DIR = exports.EPISODIC_SLUG_RE = void 0;
|
|
53
|
+
exports.isValidTopicSlug = isValidTopicSlug;
|
|
54
|
+
exports.resolveEpisodicPath = resolveEpisodicPath;
|
|
55
|
+
exports.appendEpisodicNote = appendEpisodicNote;
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
/** Lowercase-kebab slug, 1..64 chars. No slashes/dots ⇒ cannot escape the dir. */
|
|
59
|
+
exports.EPISODIC_SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
60
|
+
const MAX_SLUG_LEN = 64;
|
|
61
|
+
/** Default episodic archive directory (relative to the agent workspace). */
|
|
62
|
+
exports.DEFAULT_EPISODIC_DIR = 'memory';
|
|
63
|
+
function isValidTopicSlug(topic) {
|
|
64
|
+
return (typeof topic === 'string' &&
|
|
65
|
+
topic.length >= 1 &&
|
|
66
|
+
topic.length <= MAX_SLUG_LEN &&
|
|
67
|
+
exports.EPISODIC_SLUG_RE.test(topic));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve `<ws>/<episodicDir>/<topic>.md`, confined under `<ws>/<episodicDir>`.
|
|
71
|
+
* Returns null for an invalid slug or any path that would escape the base dir
|
|
72
|
+
* (defense-in-depth on top of the slug regex).
|
|
73
|
+
*/
|
|
74
|
+
function resolveEpisodicPath(workspaceDir, episodicDir, topic) {
|
|
75
|
+
if (!isValidTopicSlug(topic))
|
|
76
|
+
return null;
|
|
77
|
+
const baseDir = path.resolve(workspaceDir, episodicDir);
|
|
78
|
+
const target = path.resolve(baseDir, `${topic}.md`);
|
|
79
|
+
const rel = path.relative(baseDir, target);
|
|
80
|
+
// Must be a direct child file `<topic>.md` — no separators, no `..`, not absolute.
|
|
81
|
+
if (rel !== `${topic}.md` || rel.startsWith('..') || path.isAbsolute(rel))
|
|
82
|
+
return null;
|
|
83
|
+
return target;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Append a dated bullet to `memory/<topic>.md` (creating dir + file on first
|
|
87
|
+
* write). One entry per line — internal newlines are collapsed so a note stays a
|
|
88
|
+
* single searchable bullet. Never throws; a rejected/failed write returns
|
|
89
|
+
* `ok:false` and touches nothing.
|
|
90
|
+
*/
|
|
91
|
+
function appendEpisodicNote(workspaceDir, episodicDir, topic, content, now) {
|
|
92
|
+
const fail = { topic: String(topic ?? ''), path: '', ok: false, bytesAppended: 0 };
|
|
93
|
+
const abs = resolveEpisodicPath(workspaceDir, episodicDir, topic);
|
|
94
|
+
if (!abs)
|
|
95
|
+
return fail;
|
|
96
|
+
const text = (content ?? '').trim();
|
|
97
|
+
if (!text)
|
|
98
|
+
return fail;
|
|
99
|
+
try {
|
|
100
|
+
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
101
|
+
const date = new Date(now).toISOString().slice(0, 10);
|
|
102
|
+
const existing = fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : '';
|
|
103
|
+
const header = existing
|
|
104
|
+
? ''
|
|
105
|
+
: `# ${topic}\n\nEpisodic task-log routed out of MEMORY.md (planning-65). Searchable via \`memory_search\`.\n\n`;
|
|
106
|
+
const bullet = `- [${date}] ${text.replace(/\s*\n\s*/g, ' ')}`;
|
|
107
|
+
const sep = existing && !existing.endsWith('\n') ? '\n' : '';
|
|
108
|
+
const payload = `${header}${sep}${bullet}\n`;
|
|
109
|
+
fs.appendFileSync(abs, payload, 'utf8');
|
|
110
|
+
return { topic, path: abs, ok: true, bytesAppended: payload.length };
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return fail;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=episodic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"episodic.js","sourceRoot":"","sources":["../../../src/agent/dreaming/episodic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gather the lookback transcript slice for a dream run from the agent's own
|
|
3
|
+
* HistoryDB. Read-only; bounded in size. Best-effort — DB errors degrade to an
|
|
4
|
+
* empty slice rather than throwing (the daemon must never wedge on a dream).
|
|
5
|
+
*/
|
|
6
|
+
import type { ResolvedDreamingCfg } from './types';
|
|
7
|
+
/** The subset of HistoryDB the dreamer reads (injectable for tests). */
|
|
8
|
+
export interface DreamHistoryDb {
|
|
9
|
+
listSessions(chatId?: string): Array<{
|
|
10
|
+
sessionId: string;
|
|
11
|
+
lastActivity: number;
|
|
12
|
+
}>;
|
|
13
|
+
getSessionTranscript(sessionId: string, limit?: number): Array<{
|
|
14
|
+
role: string;
|
|
15
|
+
content: string;
|
|
16
|
+
ts: number;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export interface GatherResult {
|
|
20
|
+
transcript: string;
|
|
21
|
+
sessionCount: number;
|
|
22
|
+
/** Most recent activity across ALL sessions (ms), 0 if none. For the quiet-window check. */
|
|
23
|
+
lastActivityMs: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the transcript slice for sessions active within the lookback window.
|
|
27
|
+
* Sessions are ordered oldest→newest; if the concatenation exceeds the char
|
|
28
|
+
* cap, the most-recent tail is kept.
|
|
29
|
+
*/
|
|
30
|
+
export declare function gatherTranscript(db: DreamHistoryDb, cfg: ResolvedDreamingCfg, now: number): GatherResult;
|
|
31
|
+
//# sourceMappingURL=gather.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/agent/dreaming/gather.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/G;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAsCxG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gather the lookback transcript slice for a dream run from the agent's own
|
|
4
|
+
* HistoryDB. Read-only; bounded in size. Best-effort — DB errors degrade to an
|
|
5
|
+
* empty slice rather than throwing (the daemon must never wedge on a dream).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.gatherTranscript = gatherTranscript;
|
|
9
|
+
const PER_SESSION_LIMIT = 200;
|
|
10
|
+
const MAX_TRANSCRIPT_CHARS = 40000;
|
|
11
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
12
|
+
/**
|
|
13
|
+
* Build the transcript slice for sessions active within the lookback window.
|
|
14
|
+
* Sessions are ordered oldest→newest; if the concatenation exceeds the char
|
|
15
|
+
* cap, the most-recent tail is kept.
|
|
16
|
+
*/
|
|
17
|
+
function gatherTranscript(db, cfg, now) {
|
|
18
|
+
const cutoff = now - cfg.lookbackDays * MS_PER_DAY;
|
|
19
|
+
let sessions;
|
|
20
|
+
try {
|
|
21
|
+
sessions = db.listSessions();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { transcript: '', sessionCount: 0, lastActivityMs: 0 };
|
|
25
|
+
}
|
|
26
|
+
const lastActivityMs = sessions.reduce((max, s) => Math.max(max, s.lastActivity ?? 0), 0);
|
|
27
|
+
const recent = sessions
|
|
28
|
+
.filter((s) => (s.lastActivity ?? 0) >= cutoff)
|
|
29
|
+
.sort((a, b) => (a.lastActivity ?? 0) - (b.lastActivity ?? 0));
|
|
30
|
+
if (recent.length === 0) {
|
|
31
|
+
return { transcript: '', sessionCount: 0, lastActivityMs };
|
|
32
|
+
}
|
|
33
|
+
const blocks = [];
|
|
34
|
+
for (const s of recent) {
|
|
35
|
+
let rows;
|
|
36
|
+
try {
|
|
37
|
+
rows = db.getSessionTranscript(s.sessionId, PER_SESSION_LIMIT);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
rows = [];
|
|
41
|
+
}
|
|
42
|
+
const text = rows
|
|
43
|
+
.map((r) => `${r.role}: ${r.content}`)
|
|
44
|
+
.join('\n')
|
|
45
|
+
.trim();
|
|
46
|
+
if (text)
|
|
47
|
+
blocks.push(`<session id="${s.sessionId}">\n${text}\n</session>`);
|
|
48
|
+
}
|
|
49
|
+
let transcript = blocks.join('\n\n');
|
|
50
|
+
if (transcript.length > MAX_TRANSCRIPT_CHARS) {
|
|
51
|
+
transcript = transcript.slice(transcript.length - MAX_TRANSCRIPT_CHARS);
|
|
52
|
+
}
|
|
53
|
+
return { transcript, sessionCount: blocks.length, lastActivityMs };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=gather.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/agent/dreaming/gather.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0BH,4CAsCC;AA/CD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,oBAAoB,GAAG,KAAM,CAAC;AACpC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,EAAkB,EAAE,GAAwB,EAAE,GAAW;IACxF,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC;IACnD,IAAI,QAA4D,CAAC;IACjE,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,QAAQ;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;SAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,IAA0D,CAAC;QAC/D,IAAI,CAAC;YACH,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI;aACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACrC,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QACV,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,SAAS,OAAO,IAAI,cAAc,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QAC7C,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DreamingManager — nightly memory consolidation, propose (dry-run) slice.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates: gather lookback transcript → print-only reviewer proposes memory
|
|
5
|
+
* ops → write DREAMS.md diary + JSONL audit. In propose mode (the only mode
|
|
6
|
+
* implemented here) NO memory file is mutated. The `auto` applier is a P3
|
|
7
|
+
* follow-up; until it lands, `auto` behaves like `propose` (logs proposals only).
|
|
8
|
+
*/
|
|
9
|
+
import type { ClaudeSpawnFn } from '../skill-learning/reviewer';
|
|
10
|
+
import { type DreamHistoryDb } from './gather';
|
|
11
|
+
import type { DreamingConfig, DreamProposal, DreamRunResult, ResolvedDreamingCfg } from './types';
|
|
12
|
+
export interface DreamingManagerDeps {
|
|
13
|
+
db: DreamHistoryDb;
|
|
14
|
+
agentId: string;
|
|
15
|
+
workspaceDir: string;
|
|
16
|
+
globalCfg?: DreamingConfig;
|
|
17
|
+
agentCfg?: DreamingConfig;
|
|
18
|
+
logger?: {
|
|
19
|
+
info: (msg: string, data?: Record<string, unknown>) => void;
|
|
20
|
+
warn?: (msg: string, data?: Record<string, unknown>) => void;
|
|
21
|
+
};
|
|
22
|
+
/** Injectable reviewer spawn for tests (defaults to a real print-only claude -p). */
|
|
23
|
+
spawnFn?: ClaudeSpawnFn;
|
|
24
|
+
/** Soft memory budgets for the K4 auto-applier's net-negative gate (defaults 8000/3000). */
|
|
25
|
+
memoryBudgetChars?: number;
|
|
26
|
+
userBudgetChars?: number;
|
|
27
|
+
/**
|
|
28
|
+
* planning-65 write routing. When true, the reviewer is told the two-tier
|
|
29
|
+
* contract and may emit episodic ops; `episodicArchiveDir` is where those
|
|
30
|
+
* `memory/<topic>.md` notes are written. When false/absent, durable-only
|
|
31
|
+
* (exact prior behavior).
|
|
32
|
+
*/
|
|
33
|
+
writeRouting?: boolean;
|
|
34
|
+
episodicArchiveDir?: string;
|
|
35
|
+
/**
|
|
36
|
+
* planning-67: injected route-out classifier for the embedded auto-migrate
|
|
37
|
+
* stage. Given the current MEMORY.md, returns episodic-move proposals. The
|
|
38
|
+
* gateway wires it (reviewer-backed spawn) only when write routing is on;
|
|
39
|
+
* tests inject a stub. Absent ⇒ the stage is skipped (durable-only behavior).
|
|
40
|
+
*/
|
|
41
|
+
routeOutFn?: (memory: string) => Promise<DreamProposal[]> | DreamProposal[];
|
|
42
|
+
/**
|
|
43
|
+
* Optional per-agent→shared promotion hook (K3↔K4). When provided (the gateway
|
|
44
|
+
* wires it only when the shared KB is enabled AND `shared.mode:auto`), each
|
|
45
|
+
* durable `add` the dream promotes is also contributed to the shared vault.
|
|
46
|
+
* Injected as a callback so the manager stays decoupled from shared-config
|
|
47
|
+
* resolution and is easy to test. Best-effort; must not throw.
|
|
48
|
+
*/
|
|
49
|
+
sharedPromote?: (proposal: DreamProposal) => void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Select which proposals to apply this run (#337). Under budget: the classic
|
|
53
|
+
* first-N cap. Over budget (overageFactor > 1): keep the non-shrink (add/grow)
|
|
54
|
+
* cap at `maxChanges`, but allow proportionally MORE shrink ops (remove /
|
|
55
|
+
* length-reducing replace) so an over-budget file converges instead of trickling
|
|
56
|
+
* at `maxChanges`/night. Capped at MAX_SHRINK_OPS_PER_RUN.
|
|
57
|
+
*/
|
|
58
|
+
export declare function selectProposals(proposals: DreamProposal[], maxChanges: number, overageFactor: number): DreamProposal[];
|
|
59
|
+
/**
|
|
60
|
+
* planning-68 — deterministic per-agent jitter (ms) added to the nightly delay so
|
|
61
|
+
* agents don't all fire at `dreamHour:00` together (thundering herd → concurrent
|
|
62
|
+
* `claude -p` spawns). A stable string hash of `agentId` mapped into
|
|
63
|
+
* `[0, windowMinutes*60_000)`; NOT `Math.random`, so the offset is the same across
|
|
64
|
+
* reschedules and is unit-testable. Non-finite or `<= 0` window ⇒ 0 (feature off).
|
|
65
|
+
*/
|
|
66
|
+
export declare function agentJitterMs(agentId: string, windowMinutes: number): number;
|
|
67
|
+
export declare class DreamingManager {
|
|
68
|
+
readonly cfg: ResolvedDreamingCfg;
|
|
69
|
+
private readonly deps;
|
|
70
|
+
private timer;
|
|
71
|
+
constructor(deps: DreamingManagerDeps);
|
|
72
|
+
private log;
|
|
73
|
+
/**
|
|
74
|
+
* Run one dream cycle. Never throws. In propose mode it writes only the diary
|
|
75
|
+
* + audit and mutates no memory file.
|
|
76
|
+
*/
|
|
77
|
+
dreamOnce(now?: number): Promise<DreamRunResult>;
|
|
78
|
+
private audit;
|
|
79
|
+
/**
|
|
80
|
+
* Start the nightly dream scheduler (mirror `startCurator`): a self-rescheduling
|
|
81
|
+
* unref'd timer at `dreamHour` in `dreamTimezone`. Best-effort; never throws at
|
|
82
|
+
* boot (invalid tz already normalized to UTC in resolveDreamingConfig).
|
|
83
|
+
*/
|
|
84
|
+
startDreaming(): void;
|
|
85
|
+
stop(): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/dreaming/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAOjE,OAAO,KAAK,EACV,cAAc,EAEd,aAAa,EACb,cAAc,EACd,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC5D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KAC9D,CAAC;IACF,qFAAqF;IACrF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,4FAA4F;IAC5F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;IAC5E;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;CACnD;AAgBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,aAAa,EAAE,EAC1B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,aAAa,EAAE,CAiBjB;AAUD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAS5E;AAED,qBAAa,eAAe;IAC1B,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,KAAK,CAA4C;gBAE7C,IAAI,EAAE,mBAAmB;IAKrC,OAAO,CAAC,GAAG;IAIX;;;OAGG;IACG,SAAS,CAAC,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA+MlE,OAAO,CAAC,KAAK;IAuBb;;;;OAIG;IACH,aAAa,IAAI,IAAI;IAsBrB,IAAI,IAAI,IAAI;CAGb"}
|