aura-code 0.3.7 → 0.6.3
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 +56 -4
- package/dist/agent/compactor.d.ts +26 -0
- package/dist/agent/compactor.js +156 -0
- package/dist/agent/compactor.js.map +1 -0
- package/dist/agent/context.d.ts +4 -0
- package/dist/agent/context.js +38 -0
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/design.d.ts +17 -0
- package/dist/agent/design.js +175 -0
- package/dist/agent/design.js.map +1 -0
- package/dist/agent/loop.js +24 -1
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/agent/system-prompt.js +14 -3
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/cli/display.js +46 -5
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/index.js +323 -46
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.js +8 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/project-config.d.ts +6 -0
- package/dist/config/project-config.js +2 -0
- package/dist/config/project-config.js.map +1 -1
- package/dist/dream/dream.d.ts +71 -0
- package/dist/dream/dream.js +217 -0
- package/dist/dream/dream.js.map +1 -0
- package/dist/dream/okf.d.ts +10 -0
- package/dist/dream/okf.js +280 -0
- package/dist/dream/okf.js.map +1 -0
- package/dist/dream/parser.d.ts +60 -0
- package/dist/dream/parser.js +176 -0
- package/dist/dream/parser.js.map +1 -0
- package/dist/dream/reconcile.d.ts +69 -0
- package/dist/dream/reconcile.js +303 -0
- package/dist/dream/reconcile.js.map +1 -0
- package/dist/kanban/index.d.ts +5 -0
- package/dist/kanban/index.js +11 -0
- package/dist/kanban/index.js.map +1 -0
- package/dist/kanban/pipeline.d.ts +16 -0
- package/dist/kanban/pipeline.js +910 -0
- package/dist/kanban/pipeline.js.map +1 -0
- package/dist/kanban/server.d.ts +5 -0
- package/dist/kanban/server.js +820 -0
- package/dist/kanban/server.js.map +1 -0
- package/dist/kanban/types.d.ts +75 -0
- package/dist/kanban/types.js +6 -0
- package/dist/kanban/types.js.map +1 -0
- package/dist/learnlight/driven.d.ts +2 -0
- package/dist/learnlight/driven.js +109 -0
- package/dist/learnlight/driven.js.map +1 -0
- package/dist/learnlight/index.d.ts +4 -0
- package/dist/learnlight/index.js +32 -0
- package/dist/learnlight/index.js.map +1 -0
- package/dist/learnlight/lesson-prep.d.ts +36 -0
- package/dist/learnlight/lesson-prep.js +224 -0
- package/dist/learnlight/lesson-prep.js.map +1 -0
- package/dist/learnlight/report.d.ts +2 -0
- package/dist/learnlight/report.js +37 -0
- package/dist/learnlight/report.js.map +1 -0
- package/dist/learnlight/types.d.ts +72 -0
- package/dist/learnlight/types.js +6 -0
- package/dist/learnlight/types.js.map +1 -0
- package/dist/machina/index.d.ts +16 -0
- package/dist/machina/index.js +61 -0
- package/dist/machina/index.js.map +1 -0
- package/dist/machina/render-html.d.ts +2 -0
- package/dist/machina/render-html.js +189 -0
- package/dist/machina/render-html.js.map +1 -0
- package/dist/machina/render-terminal.d.ts +2 -0
- package/dist/machina/render-terminal.js +92 -0
- package/dist/machina/render-terminal.js.map +1 -0
- package/dist/machina/spec.d.ts +61 -0
- package/dist/machina/spec.js +124 -0
- package/dist/machina/spec.js.map +1 -0
- package/dist/machina/verify.d.ts +27 -0
- package/dist/machina/verify.js +85 -0
- package/dist/machina/verify.js.map +1 -0
- package/dist/perception/graph-store.d.ts +11 -0
- package/dist/perception/graph-store.js +33 -0
- package/dist/perception/graph-store.js.map +1 -1
- package/dist/perception/index.d.ts +1 -1
- package/dist/perception/index.js +2 -1
- package/dist/perception/index.js.map +1 -1
- package/dist/providers/anthropic.js +1 -1
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +49 -0
- package/dist/providers/factory.js +99 -0
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +1 -1
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/openai-compatible.js +81 -50
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/rem/graph.d.ts +72 -0
- package/dist/rem/graph.js +139 -0
- package/dist/rem/graph.js.map +1 -0
- package/dist/rem/index.d.ts +16 -0
- package/dist/rem/index.js +60 -0
- package/dist/rem/index.js.map +1 -0
- package/dist/rem/render-html.d.ts +2 -0
- package/dist/rem/render-html.js +189 -0
- package/dist/rem/render-html.js.map +1 -0
- package/dist/rem/render-terminal.d.ts +4 -0
- package/dist/rem/render-terminal.js +94 -0
- package/dist/rem/render-terminal.js.map +1 -0
- package/dist/research/council.d.ts +27 -0
- package/dist/research/council.js +263 -0
- package/dist/research/council.js.map +1 -0
- package/dist/research/research.d.ts +24 -0
- package/dist/research/research.js +116 -0
- package/dist/research/research.js.map +1 -0
- package/dist/ruby/alternator.d.ts +36 -1
- package/dist/ruby/alternator.js +40 -31
- package/dist/ruby/alternator.js.map +1 -1
- package/dist/ruby/stats.js +10 -11
- package/dist/ruby/stats.js.map +1 -1
- package/dist/ruby/types.js +1 -1
- package/dist/ruby/types.js.map +1 -1
- package/dist/safety/permissions.d.ts +8 -0
- package/dist/safety/permissions.js +12 -0
- package/dist/safety/permissions.js.map +1 -1
- package/dist/setup/provider-registry.js +14 -0
- package/dist/setup/provider-registry.js.map +1 -1
- package/dist/setup/provider-test.js +24 -2
- package/dist/setup/provider-test.js.map +1 -1
- package/dist/setup/telegram-wizard.d.ts +57 -0
- package/dist/setup/telegram-wizard.js +343 -0
- package/dist/setup/telegram-wizard.js.map +1 -0
- package/dist/tools/audio-transcribe.d.ts +20 -0
- package/dist/tools/audio-transcribe.js +39 -28
- package/dist/tools/audio-transcribe.js.map +1 -1
- package/dist/tools/browser.js +8 -10
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/gmail-tool.d.ts +15 -0
- package/dist/tools/gmail-tool.js +361 -0
- package/dist/tools/gmail-tool.js.map +1 -0
- package/dist/tools/read-file.js +13 -0
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/telegram-bot.js +103 -20
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/tools/telegram-voice.d.ts +22 -0
- package/dist/tools/telegram-voice.js +203 -0
- package/dist/tools/telegram-voice.js.map +1 -0
- package/dist/tools/telegram.d.ts +6 -1
- package/dist/tools/telegram.js +115 -5
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/video-render.d.ts +11 -0
- package/dist/tools/video-render.js +189 -0
- package/dist/tools/video-render.js.map +1 -0
- package/dist/tools/web-search.d.ts +20 -0
- package/dist/tools/web-search.js +134 -38
- package/dist/tools/web-search.js.map +1 -1
- package/dist/util/errors.js +6 -0
- package/dist/util/errors.js.map +1 -1
- package/dist/viz/index.js +816 -30
- package/dist/viz/index.js.map +1 -1
- package/dist/viz/reader.d.ts +33 -0
- package/dist/viz/reader.js +343 -0
- package/dist/viz/reader.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.lastDreamTimestamp = lastDreamTimestamp;
|
|
37
|
+
exports.runDream = runDream;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const episode_capture_js_1 = require("../ruby/episode-capture.js");
|
|
41
|
+
const factory_js_1 = require("../providers/factory.js");
|
|
42
|
+
const parser_js_1 = require("./parser.js");
|
|
43
|
+
const reconcile_js_1 = require("./reconcile.js");
|
|
44
|
+
const okf_js_1 = require("./okf.js");
|
|
45
|
+
const DREAMS_DIRNAME = 'dreams';
|
|
46
|
+
const STATE_FILENAME = '.last.json';
|
|
47
|
+
function dreamsDir(projectRoot) {
|
|
48
|
+
return path.join(projectRoot, DREAMS_DIRNAME);
|
|
49
|
+
}
|
|
50
|
+
/** Timestamp (ms) of the last dream for this project, or 0 if never. */
|
|
51
|
+
function lastDreamTimestamp(projectRoot) {
|
|
52
|
+
try {
|
|
53
|
+
const raw = fs.readFileSync(path.join(dreamsDir(projectRoot), STATE_FILENAME), 'utf8');
|
|
54
|
+
const parsed = JSON.parse(raw);
|
|
55
|
+
return typeof parsed.lastDreamTs === 'number' ? parsed.lastDreamTs : 0;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function writeState(projectRoot, lastDreamTs) {
|
|
62
|
+
const dir = dreamsDir(projectRoot);
|
|
63
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
64
|
+
fs.writeFileSync(path.join(dir, STATE_FILENAME), JSON.stringify({ lastDreamTs }, null, 2));
|
|
65
|
+
}
|
|
66
|
+
/** Compact, low-token digest of one episode for the consolidation prompt. */
|
|
67
|
+
function digestEpisode(ep) {
|
|
68
|
+
const tier = ep.rubySucceeded ? 'ruby' : ep.largeModelUsed ? `large(${ep.largeModelUsed})` : 'none';
|
|
69
|
+
const ok = ep.reviewerApproved ? 'approved' : 'unreviewed';
|
|
70
|
+
const secs = Math.round(ep.durationMs / 1000);
|
|
71
|
+
return `- [${ep.taskCategory}] "${ep.task.slice(0, 140)}" — tier=${tier}, ${ok}, ${secs}s`;
|
|
72
|
+
}
|
|
73
|
+
function buildConsolidationPrompt(episodes) {
|
|
74
|
+
const system = 'You are Aura consolidating a day of work into durable memory, like a brain dreaming. ' +
|
|
75
|
+
'You are given digests of today\'s task episodes. Produce concise, reusable knowledge — ' +
|
|
76
|
+
'not a transcript. Be specific and tagged. Respond in GitHub Markdown with EXACTLY these ' +
|
|
77
|
+
'sections and nothing else:\n\n' +
|
|
78
|
+
'## Lessons\n(bullet list; each line starts with a [tag] in brackets, e.g. [routing], [tooling], [bug]. ' +
|
|
79
|
+
'State what was learned, generalised beyond the single task.)\n\n' +
|
|
80
|
+
'## Patterns\n(bullet list of recurring task shapes or failure modes seen across episodes.)\n\n' +
|
|
81
|
+
'## Open threads\n(bullet list of unresolved problems worth picking up tomorrow; ' +
|
|
82
|
+
'prefix each with [todo]. Empty bullet "- none" if nothing.)\n\n' +
|
|
83
|
+
'## Tomorrow brief\n(2–4 sentences: what Aura should be ready for next session.)';
|
|
84
|
+
const user = `Today's episodes (${episodes.length}):\n\n` +
|
|
85
|
+
episodes.map(digestEpisode).join('\n');
|
|
86
|
+
return { system, user };
|
|
87
|
+
}
|
|
88
|
+
function header(date, episodes, since) {
|
|
89
|
+
const succeeded = episodes.filter(e => e.reviewerApproved).length;
|
|
90
|
+
const rubyWins = episodes.filter(e => e.rubySucceeded).length;
|
|
91
|
+
const sinceStr = since > 0 ? new Date(since).toISOString() : 'beginning';
|
|
92
|
+
const cats = [...new Set(episodes.map(e => e.taskCategory))].join(', ') || '—';
|
|
93
|
+
return (`# Dream — ${date}\n\n` +
|
|
94
|
+
`> ${episodes.length} episodes recalled since ${sinceStr} · ` +
|
|
95
|
+
`${succeeded} approved · ${rubyWins} ruby wins\n` +
|
|
96
|
+
`> Categories: ${cats}\n`);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Run a dream. Pure with respect to I/O sources: caller supplies the provider.
|
|
100
|
+
* Never throws on an empty day — returns { skipped: true }.
|
|
101
|
+
*
|
|
102
|
+
* IMPORTANT: the `.last.json` state cutoff is only advanced when the LLM
|
|
103
|
+
* consolidation succeeds. If the primary provider fails, a single retry on a
|
|
104
|
+
* local Ollama instance is attempted before giving up gracefully. Episodes are
|
|
105
|
+
* NEVER burned (cut off) when the provider is unreachable.
|
|
106
|
+
*
|
|
107
|
+
* After a successful dream write, memory reconciliation runs (if ≥3 dreams
|
|
108
|
+
* exist). If reconciliation succeeds, an OKF knowledge bundle is also
|
|
109
|
+
* written to `knowledge/`. Both are best-effort — if either fails, the
|
|
110
|
+
* dream file and cutoff are already committed.
|
|
111
|
+
*/
|
|
112
|
+
async function runDream(opts) {
|
|
113
|
+
const { projectRoot, provider } = opts;
|
|
114
|
+
const ollamaFallbackModel = opts.ollamaFallbackModel === undefined ? 'llama3.2' : opts.ollamaFallbackModel;
|
|
115
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
116
|
+
const since = opts.full ? 0 : (opts.since ?? lastDreamTimestamp(projectRoot));
|
|
117
|
+
const all = await (0, episode_capture_js_1.loadEpisodes)(projectRoot);
|
|
118
|
+
const episodes = all.filter(e => e.timestamp > since);
|
|
119
|
+
if (episodes.length === 0) {
|
|
120
|
+
return { path: '', date, episodeCount: 0, recalledSince: since, skipped: true, reason: 'no new episodes since last dream' };
|
|
121
|
+
}
|
|
122
|
+
// ── Consolidate via the LLM ──────────────────────────────────────────────
|
|
123
|
+
// Critical invariant: we do NOT advance the cutoff unless this succeeds.
|
|
124
|
+
const { system, user } = buildConsolidationPrompt(episodes);
|
|
125
|
+
let body;
|
|
126
|
+
let providerError;
|
|
127
|
+
const tryComplete = async (p) => {
|
|
128
|
+
const res = await p.complete(system, [{ role: 'user', content: user }], []);
|
|
129
|
+
const text = (res.text ?? '').trim();
|
|
130
|
+
if (!text)
|
|
131
|
+
throw new Error('Provider returned an empty response');
|
|
132
|
+
return text;
|
|
133
|
+
};
|
|
134
|
+
// Primary attempt
|
|
135
|
+
try {
|
|
136
|
+
body = await tryComplete(provider);
|
|
137
|
+
}
|
|
138
|
+
catch (primaryErr) {
|
|
139
|
+
const primaryMsg = primaryErr instanceof Error ? primaryErr.message : String(primaryErr);
|
|
140
|
+
// ── Ollama fallback ───────────────────────────────────────────────────
|
|
141
|
+
if (ollamaFallbackModel) {
|
|
142
|
+
const ollamaBaseUrl = 'http://localhost:11434/v1';
|
|
143
|
+
const ollamaHealthy = await (0, factory_js_1.checkOllamaHealth)('http://localhost:11434').catch(() => false);
|
|
144
|
+
if (ollamaHealthy) {
|
|
145
|
+
try {
|
|
146
|
+
const ollamaProvider = (0, factory_js_1.createProvider)({
|
|
147
|
+
model: `ollama/${ollamaFallbackModel}`,
|
|
148
|
+
baseUrl: ollamaBaseUrl,
|
|
149
|
+
maxTokens: 2048,
|
|
150
|
+
});
|
|
151
|
+
body = await tryComplete(ollamaProvider);
|
|
152
|
+
providerError = undefined;
|
|
153
|
+
}
|
|
154
|
+
catch (ollamaErr) {
|
|
155
|
+
const ollamaMsg = ollamaErr instanceof Error ? ollamaErr.message : String(ollamaErr);
|
|
156
|
+
providerError = `primary: ${primaryMsg}; ollama fallback: ${ollamaMsg}`;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
providerError = `${primaryMsg} (Ollama not reachable at ${ollamaBaseUrl})`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
providerError = primaryMsg;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ── Provider failed — preserve episodes, return without writing state ─────
|
|
168
|
+
if (providerError !== undefined) {
|
|
169
|
+
return {
|
|
170
|
+
path: '',
|
|
171
|
+
date,
|
|
172
|
+
episodeCount: episodes.length,
|
|
173
|
+
recalledSince: since,
|
|
174
|
+
skipped: true,
|
|
175
|
+
reason: 'provider error — episodes preserved for next :dream run',
|
|
176
|
+
providerError,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// ── Write dream file ──────────────────────────────────────────────────────
|
|
180
|
+
const md = `${header(date, episodes, since)}\n${body}\n`;
|
|
181
|
+
const dir = dreamsDir(projectRoot);
|
|
182
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
183
|
+
const outPath = path.join(dir, `${date}.md`);
|
|
184
|
+
fs.writeFileSync(outPath, md);
|
|
185
|
+
// Advance the cutoff ONLY on success.
|
|
186
|
+
const newest = Math.max(...episodes.map(e => e.timestamp));
|
|
187
|
+
writeState(projectRoot, newest);
|
|
188
|
+
// ── Reconciliation (best-effort) ──────────────────────────────────────────
|
|
189
|
+
let reconciled = false;
|
|
190
|
+
let okfBundlePath;
|
|
191
|
+
try {
|
|
192
|
+
const allDreams = (0, parser_js_1.loadExistingDreams)(projectRoot);
|
|
193
|
+
const result = await (0, reconcile_js_1.reconcileDreams)({
|
|
194
|
+
projectRoot,
|
|
195
|
+
provider,
|
|
196
|
+
dreams: allDreams,
|
|
197
|
+
});
|
|
198
|
+
if (result) {
|
|
199
|
+
// Append reconciliation log to today's dream file for traceability.
|
|
200
|
+
fs.appendFileSync(outPath, result.logSection);
|
|
201
|
+
reconciled = true;
|
|
202
|
+
// ── OKF bundle (best-effort) ────────────────────────────────────────
|
|
203
|
+
// Write the portable knowledge bundle from the same reconciled data.
|
|
204
|
+
try {
|
|
205
|
+
okfBundlePath = (0, okf_js_1.writeOkfBundle)(result.bullets, result.totalDreams, projectRoot);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// OKF write failure is silent — reconciled.md is already committed.
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Reconciliation failure is silent — dream is already saved.
|
|
214
|
+
}
|
|
215
|
+
return { path: outPath, date, episodeCount: episodes.length, recalledSince: since, skipped: false, reconciled, okfBundlePath };
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=dream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream.js","sourceRoot":"","sources":["../../src/dream/dream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ReconciledBullet } from './reconcile.js';
|
|
2
|
+
/**
|
|
3
|
+
* Write an OKF v0.1 knowledge bundle from reconciled bullets.
|
|
4
|
+
*
|
|
5
|
+
* Called after reconciliation succeeds. Best-effort — if this fails,
|
|
6
|
+
* .reconciled.md is already written and the dream is safe.
|
|
7
|
+
*
|
|
8
|
+
* The bundle directory is wiped and rebuilt each time (it's a projection).
|
|
9
|
+
*/
|
|
10
|
+
export declare function writeOkfBundle(bullets: ReconciledBullet[], totalDreams: number, projectRoot: string): string;
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.writeOkfBundle = writeOkfBundle;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* OKF (Open Knowledge Format) v0.1 bundle writer.
|
|
41
|
+
*
|
|
42
|
+
* Takes the reconciled bullets from Aura's dream system and writes them
|
|
43
|
+
* as a portable OKF knowledge bundle under `<projectRoot>/knowledge/`.
|
|
44
|
+
*
|
|
45
|
+
* OKF spec: https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md
|
|
46
|
+
*
|
|
47
|
+
* Why both .reconciled.md AND an OKF bundle?
|
|
48
|
+
* - `.reconciled.md` is Aura's internal format — compact, fast, injected
|
|
49
|
+
* into the system prompt for Aura's own use.
|
|
50
|
+
* - `knowledge/` is the portable output — any other agent, tool, or human
|
|
51
|
+
* can read it. Cursor, Claude Code, LangChain agents, Obsidian, MkDocs,
|
|
52
|
+
* or any OKF consumer can consume Aura's accumulated knowledge without
|
|
53
|
+
* understanding Aura's dream format.
|
|
54
|
+
*
|
|
55
|
+
* The bundle is regenerated on every reconciliation pass. It's a projection,
|
|
56
|
+
* just like .reconciled.md — delete it and the next :dream rebuilds it.
|
|
57
|
+
*
|
|
58
|
+
* Concept types used:
|
|
59
|
+
* - "lesson" — from ## Lessons
|
|
60
|
+
* - "pattern" — from ## Patterns
|
|
61
|
+
* - "open-thread" — from ## Open threads
|
|
62
|
+
* - "conflict" — CONFLICT verdicts get their own concepts
|
|
63
|
+
*
|
|
64
|
+
* Directory structure:
|
|
65
|
+
* knowledge/
|
|
66
|
+
* index.md — bundle root index (okf_version: "0.1")
|
|
67
|
+
* log.md — reconciliation changelog
|
|
68
|
+
* lessons/
|
|
69
|
+
* index.md
|
|
70
|
+
* <slug>.md
|
|
71
|
+
* patterns/
|
|
72
|
+
* index.md
|
|
73
|
+
* <slug>.md
|
|
74
|
+
* open-threads/
|
|
75
|
+
* index.md
|
|
76
|
+
* <slug>.md
|
|
77
|
+
*/
|
|
78
|
+
const KNOWLEDGE_DIR = 'knowledge';
|
|
79
|
+
const OKF_VERSION = '0.1';
|
|
80
|
+
const SECTION_DIR = {
|
|
81
|
+
lessons: 'lessons',
|
|
82
|
+
patterns: 'patterns',
|
|
83
|
+
openThreads: 'open-threads',
|
|
84
|
+
};
|
|
85
|
+
const SECTION_TYPE = {
|
|
86
|
+
lessons: 'lesson',
|
|
87
|
+
patterns: 'pattern',
|
|
88
|
+
openThreads: 'open-thread',
|
|
89
|
+
};
|
|
90
|
+
const SECTION_LABEL = {
|
|
91
|
+
lessons: 'Lessons',
|
|
92
|
+
patterns: 'Patterns',
|
|
93
|
+
openThreads: 'Open Threads',
|
|
94
|
+
};
|
|
95
|
+
function slugify(text, tag) {
|
|
96
|
+
const base = tag ? `${tag}-${text}` : text;
|
|
97
|
+
return base
|
|
98
|
+
.toLowerCase()
|
|
99
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
100
|
+
.replace(/^-+|-+$/g, '')
|
|
101
|
+
.slice(0, 60) || 'concept';
|
|
102
|
+
}
|
|
103
|
+
function deduplicateSlug(slug, existing) {
|
|
104
|
+
if (!existing.has(slug)) {
|
|
105
|
+
existing.add(slug);
|
|
106
|
+
return slug;
|
|
107
|
+
}
|
|
108
|
+
let i = 2;
|
|
109
|
+
while (existing.has(`${slug}-${i}`))
|
|
110
|
+
i++;
|
|
111
|
+
const unique = `${slug}-${i}`;
|
|
112
|
+
existing.add(unique);
|
|
113
|
+
return unique;
|
|
114
|
+
}
|
|
115
|
+
function buildFrontmatter(fields) {
|
|
116
|
+
const lines = ['---'];
|
|
117
|
+
for (const [key, val] of Object.entries(fields)) {
|
|
118
|
+
if (val === undefined)
|
|
119
|
+
continue;
|
|
120
|
+
if (Array.isArray(val)) {
|
|
121
|
+
if (val.length > 0)
|
|
122
|
+
lines.push(`${key}: [${val.map(v => `"${v}"`).join(', ')}]`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Quote strings that contain colons or special chars
|
|
126
|
+
const needsQuote = /[:#\[\]{}"']/.test(val) || val.includes('\n');
|
|
127
|
+
lines.push(`${key}: ${needsQuote ? `"${val.replace(/"/g, '\\"')}"` : val}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
lines.push('---');
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
function buildConceptFile(bullet, totalDreams) {
|
|
134
|
+
const type = bullet.action === 'CONFLICT' ? 'conflict' : SECTION_TYPE[bullet.section];
|
|
135
|
+
const title = bullet.text.slice(0, 120);
|
|
136
|
+
const tags = bullet.tag ? [bullet.tag] : [];
|
|
137
|
+
if (bullet.action !== 'KEEP')
|
|
138
|
+
tags.push(bullet.action.toLowerCase());
|
|
139
|
+
const latestDate = bullet.sourceDates.length > 0
|
|
140
|
+
? bullet.sourceDates[bullet.sourceDates.length - 1]
|
|
141
|
+
: new Date().toISOString().slice(0, 10);
|
|
142
|
+
const timestamp = `${latestDate}T00:00:00Z`;
|
|
143
|
+
const frontmatter = buildFrontmatter({
|
|
144
|
+
type,
|
|
145
|
+
title,
|
|
146
|
+
description: bullet.text,
|
|
147
|
+
tags,
|
|
148
|
+
timestamp,
|
|
149
|
+
});
|
|
150
|
+
const bodyLines = [];
|
|
151
|
+
bodyLines.push(`# ${title}`);
|
|
152
|
+
bodyLines.push('');
|
|
153
|
+
bodyLines.push(bullet.text);
|
|
154
|
+
bodyLines.push('');
|
|
155
|
+
bodyLines.push(`*${bullet.annotation}* · confidence: ${bullet.confidence}`);
|
|
156
|
+
if (bullet.action === 'CONFLICT' && bullet.conflictsWith) {
|
|
157
|
+
bodyLines.push('');
|
|
158
|
+
bodyLines.push('## Opposing claim');
|
|
159
|
+
bodyLines.push('');
|
|
160
|
+
bodyLines.push(`> ${bullet.conflictsWith.text}`);
|
|
161
|
+
bodyLines.push(`> — *${bullet.conflictsWith.date}*`);
|
|
162
|
+
}
|
|
163
|
+
bodyLines.push('');
|
|
164
|
+
bodyLines.push(`Source dreams: ${bullet.sourceDates.join(', ')}`);
|
|
165
|
+
return `${frontmatter}\n\n${bodyLines.join('\n')}\n`;
|
|
166
|
+
}
|
|
167
|
+
function buildSectionIndex(sectionLabel, concepts) {
|
|
168
|
+
const lines = [`# ${sectionLabel}`];
|
|
169
|
+
lines.push('');
|
|
170
|
+
if (concepts.length === 0) {
|
|
171
|
+
lines.push('*No concepts in this section yet.*');
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
for (const c of concepts) {
|
|
175
|
+
lines.push(`* [${c.title}](${c.slug}.md)`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
lines.push('');
|
|
179
|
+
return lines.join('\n');
|
|
180
|
+
}
|
|
181
|
+
function buildRootIndex(sections, totalDreams, totalConcepts) {
|
|
182
|
+
const frontmatter = buildFrontmatter({ okf_version: OKF_VERSION });
|
|
183
|
+
const lines = [frontmatter, ''];
|
|
184
|
+
lines.push('# Aura Code — Knowledge Bundle');
|
|
185
|
+
lines.push('');
|
|
186
|
+
lines.push(`> OKF v${OKF_VERSION} · ${totalConcepts} concepts from ${totalDreams} dream(s)`);
|
|
187
|
+
lines.push('');
|
|
188
|
+
lines.push('This bundle is generated by [Aura Code](https://github.com/milodule3-debug/aura-code)\'s');
|
|
189
|
+
lines.push('dream reconciliation system. It contains the agent\'s accumulated knowledge about');
|
|
190
|
+
lines.push('this project — lessons learned, patterns observed, and open threads — in the');
|
|
191
|
+
lines.push('[Open Knowledge Format](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md).');
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push('Any OKF-compatible agent, tool, or viewer can consume this bundle.');
|
|
194
|
+
lines.push('');
|
|
195
|
+
for (const [dirName, concepts] of Object.entries(sections)) {
|
|
196
|
+
const label = dirName.charAt(0).toUpperCase() + dirName.slice(1).replace(/-/g, ' ');
|
|
197
|
+
lines.push(`# ${label}`);
|
|
198
|
+
lines.push('');
|
|
199
|
+
if (concepts.length === 0) {
|
|
200
|
+
lines.push('*None yet.*');
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
for (const c of concepts) {
|
|
204
|
+
lines.push(`* [${c.title}](${dirName}/${c.slug}.md)`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
lines.push('');
|
|
208
|
+
}
|
|
209
|
+
return lines.join('\n');
|
|
210
|
+
}
|
|
211
|
+
function buildLog(totalDreams, totalConcepts, actionCounts) {
|
|
212
|
+
const now = new Date().toISOString().slice(0, 10);
|
|
213
|
+
const stats = Object.entries(actionCounts)
|
|
214
|
+
.map(([k, v]) => `${v} ${k}`)
|
|
215
|
+
.join(', ');
|
|
216
|
+
return [
|
|
217
|
+
'# Change Log',
|
|
218
|
+
'',
|
|
219
|
+
`## ${now}`,
|
|
220
|
+
'',
|
|
221
|
+
`Reconciled ${totalDreams} dream(s) into ${totalConcepts} concepts: ${stats}.`,
|
|
222
|
+
'',
|
|
223
|
+
'Generated by Aura Code · dream reconciliation · OKF v0.1.',
|
|
224
|
+
'',
|
|
225
|
+
].join('\n');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Write an OKF v0.1 knowledge bundle from reconciled bullets.
|
|
229
|
+
*
|
|
230
|
+
* Called after reconciliation succeeds. Best-effort — if this fails,
|
|
231
|
+
* .reconciled.md is already written and the dream is safe.
|
|
232
|
+
*
|
|
233
|
+
* The bundle directory is wiped and rebuilt each time (it's a projection).
|
|
234
|
+
*/
|
|
235
|
+
function writeOkfBundle(bullets, totalDreams, projectRoot) {
|
|
236
|
+
const bundleRoot = path.join(projectRoot, KNOWLEDGE_DIR);
|
|
237
|
+
// Clean and recreate
|
|
238
|
+
if (fs.existsSync(bundleRoot)) {
|
|
239
|
+
fs.rmSync(bundleRoot, { recursive: true, force: true });
|
|
240
|
+
}
|
|
241
|
+
const sections = ['lessons', 'patterns', 'openThreads'];
|
|
242
|
+
const sectionConcepts = {};
|
|
243
|
+
const slugSets = {};
|
|
244
|
+
const actionCounts = {};
|
|
245
|
+
for (const section of sections) {
|
|
246
|
+
const dirName = SECTION_DIR[section];
|
|
247
|
+
const dirPath = path.join(bundleRoot, dirName);
|
|
248
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
249
|
+
sectionConcepts[dirName] = [];
|
|
250
|
+
slugSets[dirName] = new Set();
|
|
251
|
+
}
|
|
252
|
+
// Write concept files
|
|
253
|
+
for (const bullet of bullets) {
|
|
254
|
+
const dirName = SECTION_DIR[bullet.section];
|
|
255
|
+
const dirPath = path.join(bundleRoot, dirName);
|
|
256
|
+
const rawSlug = slugify(bullet.text, bullet.tag);
|
|
257
|
+
const slug = deduplicateSlug(rawSlug, slugSets[dirName]);
|
|
258
|
+
const title = bullet.text.slice(0, 120);
|
|
259
|
+
const content = buildConceptFile(bullet, totalDreams);
|
|
260
|
+
fs.writeFileSync(path.join(dirPath, `${slug}.md`), content);
|
|
261
|
+
sectionConcepts[dirName].push({ slug, title });
|
|
262
|
+
actionCounts[bullet.action] = (actionCounts[bullet.action] ?? 0) + 1;
|
|
263
|
+
}
|
|
264
|
+
// Write section index files
|
|
265
|
+
for (const section of sections) {
|
|
266
|
+
const dirName = SECTION_DIR[section];
|
|
267
|
+
const dirPath = path.join(bundleRoot, dirName);
|
|
268
|
+
const indexContent = buildSectionIndex(SECTION_LABEL[section], sectionConcepts[dirName]);
|
|
269
|
+
fs.writeFileSync(path.join(dirPath, 'index.md'), indexContent);
|
|
270
|
+
}
|
|
271
|
+
// Write root index
|
|
272
|
+
const totalConcepts = bullets.length;
|
|
273
|
+
const rootIndex = buildRootIndex(sectionConcepts, totalDreams, totalConcepts);
|
|
274
|
+
fs.writeFileSync(path.join(bundleRoot, 'index.md'), rootIndex);
|
|
275
|
+
// Write log.md
|
|
276
|
+
const log = buildLog(totalDreams, totalConcepts, actionCounts);
|
|
277
|
+
fs.writeFileSync(path.join(bundleRoot, 'log.md'), log);
|
|
278
|
+
return bundleRoot;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=okf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okf.js","sourceRoot":"","sources":["../../src/dream/okf.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8NA,wCA0DC;AAxRD,uCAAyB;AACzB,2CAA6B;AAG7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,MAAM,WAAW,GAAG,KAAK,CAAC;AAI1B,MAAM,WAAW,GAA4B;IAC3C,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,cAAc;CAC5B,CAAC;AAEF,MAAM,YAAY,GAA4B;IAC5C,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF,MAAM,aAAa,GAA4B;IAC7C,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,cAAc;CAC5B,CAAC;AAEF,SAAS,OAAO,CAAC,IAAY,EAAE,GAAY;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAqB;IAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAAE,CAAC,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqD;IAC7E,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAwB,EAAE,WAAmB;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,GAAG,UAAU,YAAY,CAAC;IAE5C,MAAM,WAAW,GAAG,gBAAgB,CAAC;QACnC,IAAI;QACJ,KAAK;QACL,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,IAAI;QACJ,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC7B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,mBAAmB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,SAAS,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,SAAS,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElE,OAAO,GAAG,WAAW,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAoB,EACpB,QAAgD;IAEhD,MAAM,KAAK,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CACrB,QAAgE,EAChE,WAAmB,EACnB,aAAqB;IAErB,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,MAAM,aAAa,kBAAkB,WAAW,WAAW,CAAC,CAAC;IAC7F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0FAA0F,CAAC,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,0GAA0G,CAAC,CAAC;IACvH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,WAAmB,EAAE,aAAqB,EAAE,YAAoC;IAChG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,cAAc;QACd,EAAE;QACF,MAAM,GAAG,EAAE;QACX,EAAE;QACF,cAAc,WAAW,kBAAkB,aAAa,cAAc,KAAK,GAAG;QAC9E,EAAE;QACF,2DAA2D;QAC3D,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,OAA2B,EAC3B,WAAmB,EACnB,WAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEzD,qBAAqB;IACrB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAc,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,eAAe,GAA2D,EAAE,CAAC;IACnF,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,YAAY,GAA2B,EAAE,CAAC;IAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAE5D,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACzF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IACrC,MAAM,SAAS,GAAG,cAAc,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC9E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IAE/D,eAAe;IACf,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;IAEvD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dream parser — turns a dream markdown file back into a structured
|
|
3
|
+
* `ParsedDream` so reconciliation can dedupe, conflict-check, and project
|
|
4
|
+
* bullets across multiple days.
|
|
5
|
+
*
|
|
6
|
+
* Round-trips files written by `runDream()` in dream.ts. The contract with
|
|
7
|
+
* the writer is fixed: four sections in a fixed order, each containing
|
|
8
|
+
* bullets that may or may not start with a `[tag]` prefix. Bullets may be
|
|
9
|
+
* separated by blank lines, may have trailing whitespace, and may use
|
|
10
|
+
* either `-` or `*` markers — all real artifacts seen in production dreams.
|
|
11
|
+
*
|
|
12
|
+
* This is the FOUNDATION for memory reconciliation (CONFLICT/STRENGTHEN/
|
|
13
|
+
* SUPERSEDE/MERGE/KEEP/DROP). The reconciler reads many ParsedDreams,
|
|
14
|
+
* groups bullets by section, then asks the LLM to reconcile. The parser
|
|
15
|
+
* must be permissive on input (real dream files vary) and lossless on
|
|
16
|
+
* structure (every bullet kept, with its source date attached).
|
|
17
|
+
*
|
|
18
|
+
* What the parser does NOT do:
|
|
19
|
+
* - Validate tag values. `[foo]` is fine even if it's not a known category.
|
|
20
|
+
* - Drop empty sections — they round-trip as empty arrays.
|
|
21
|
+
* - Interpret bullet semantics. That's the reconciler's job.
|
|
22
|
+
*/
|
|
23
|
+
/** A single bullet from a dream section, with its source for annotation. */
|
|
24
|
+
export interface DreamBullet {
|
|
25
|
+
/** Optional `[tag]` prefix at the start of the bullet (e.g. "tooling"). */
|
|
26
|
+
tag?: string;
|
|
27
|
+
/** Bullet text with tag prefix and bullet marker stripped, whitespace trimmed. */
|
|
28
|
+
text: string;
|
|
29
|
+
/** Source dream date (YYYY-MM-DD), set by `parseDreamFile` from the filename. */
|
|
30
|
+
sourceDate: string;
|
|
31
|
+
}
|
|
32
|
+
/** A dream file parsed into its four canonical sections. */
|
|
33
|
+
export interface ParsedDream {
|
|
34
|
+
/** YYYY-MM-DD from the filename (e.g. "2026-06-26"). */
|
|
35
|
+
date: string;
|
|
36
|
+
/** Absolute path the dream was read from. */
|
|
37
|
+
path: string;
|
|
38
|
+
lessons: DreamBullet[];
|
|
39
|
+
patterns: DreamBullet[];
|
|
40
|
+
openThreads: DreamBullet[];
|
|
41
|
+
/** "Tomorrow brief" — free prose, not bullets. Stored as one string or empty. */
|
|
42
|
+
tomorrowBrief: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse dream markdown content. Caller supplies the source date (preferred
|
|
46
|
+
* from filename for cross-OS consistency); falls back to the title line if
|
|
47
|
+
* the filename doesn't encode it.
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseDreamMarkdown(md: string, sourceDate: string): Omit<ParsedDream, 'path'>;
|
|
50
|
+
/** Read and parse a single dream file from disk. */
|
|
51
|
+
export declare function parseDreamFile(filePath: string): ParsedDream;
|
|
52
|
+
/**
|
|
53
|
+
* Load and parse every `YYYY-MM-DD.md` dream file in `<projectRoot>/dreams/`.
|
|
54
|
+
* Returned oldest-first (chronological), so reconciliation can iterate
|
|
55
|
+
* forward in time when reasoning about strengthening / conflicts.
|
|
56
|
+
*
|
|
57
|
+
* Ignores `.last.json` and `.reconciled.md` (handled separately).
|
|
58
|
+
* Returns `[]` if the dreams directory doesn't exist yet.
|
|
59
|
+
*/
|
|
60
|
+
export declare function loadExistingDreams(projectRoot: string): ParsedDream[];
|