aura-code 0.5.0 → 0.10.1
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 +47 -164
- package/dist/agent/affect.d.ts +13 -0
- package/dist/agent/affect.js +34 -0
- package/dist/agent/affect.js.map +1 -0
- package/dist/agent/compactor.d.ts +27 -4
- package/dist/agent/compactor.js +185 -54
- package/dist/agent/compactor.js.map +1 -1
- package/dist/agent/confess.d.ts +35 -0
- package/dist/agent/confess.js +296 -0
- package/dist/agent/confess.js.map +1 -0
- package/dist/agent/domain-expertise.d.ts +22 -0
- package/dist/agent/domain-expertise.js +110 -0
- package/dist/agent/domain-expertise.js.map +1 -0
- package/dist/agent/executive-queue.d.ts +26 -0
- package/dist/agent/executive-queue.js +50 -0
- package/dist/agent/executive-queue.js.map +1 -0
- package/dist/agent/generational-flush.d.ts +28 -0
- package/dist/agent/generational-flush.js +48 -0
- package/dist/agent/generational-flush.js.map +1 -0
- package/dist/agent/loop-profile.d.ts +50 -0
- package/dist/agent/loop-profile.js +88 -0
- package/dist/agent/loop-profile.js.map +1 -0
- package/dist/agent/loop.d.ts +14 -5
- package/dist/agent/loop.js +167 -23
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/memory-consolidate.d.ts +14 -0
- package/dist/agent/memory-consolidate.js +141 -0
- package/dist/agent/memory-consolidate.js.map +1 -0
- package/dist/agent/mixture.d.ts +33 -0
- package/dist/agent/mixture.js +138 -0
- package/dist/agent/mixture.js.map +1 -0
- package/dist/agent/spawner.js +2 -2
- package/dist/agent/spawner.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/agent/system-prompt.js +49 -13
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/unified-memory.d.ts +15 -0
- package/dist/agent/unified-memory.js +164 -0
- package/dist/agent/unified-memory.js.map +1 -0
- package/dist/checkpoints/engine.d.ts +44 -0
- package/dist/checkpoints/engine.js +324 -0
- package/dist/checkpoints/engine.js.map +1 -0
- package/dist/cli/command-palette.d.ts +26 -0
- package/dist/cli/command-palette.js +133 -0
- package/dist/cli/command-palette.js.map +1 -0
- package/dist/cli/context-health.d.ts +51 -0
- package/dist/cli/context-health.js +187 -0
- package/dist/cli/context-health.js.map +1 -0
- package/dist/cli/diamond.d.ts +67 -0
- package/dist/cli/diamond.js +222 -12
- package/dist/cli/diamond.js.map +1 -1
- package/dist/cli/dic.d.ts +2 -0
- package/dist/cli/dic.js +106 -0
- package/dist/cli/dic.js.map +1 -0
- package/dist/cli/diff-view.d.ts +18 -0
- package/dist/cli/diff-view.js +114 -0
- package/dist/cli/diff-view.js.map +1 -0
- package/dist/cli/display.d.ts +18 -4
- package/dist/cli/display.js +74 -146
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/help-data.d.ts +7 -0
- package/dist/cli/help-data.js +80 -0
- package/dist/cli/help-data.js.map +1 -0
- package/dist/cli/index.js +1001 -788
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/markdown.d.ts +5 -0
- package/dist/cli/markdown.js +128 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/model-select.d.ts +39 -0
- package/dist/cli/model-select.js +65 -0
- package/dist/cli/model-select.js.map +1 -0
- package/dist/cli/tui.d.ts +34 -0
- package/dist/cli/tui.js +1176 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -17
- package/dist/config/defaults.js +25 -39
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/project-config.d.ts +2 -6
- package/dist/config/project-config.js +2 -2
- package/dist/config/project-config.js.map +1 -1
- package/dist/doctor/checks.d.ts +18 -0
- package/dist/doctor/checks.js +524 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/index.d.ts +4 -0
- package/dist/doctor/index.js +229 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/repair.d.ts +19 -0
- package/dist/doctor/repair.js +126 -0
- package/dist/doctor/repair.js.map +1 -0
- package/dist/doctor/types.d.ts +38 -0
- package/dist/doctor/types.js +10 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/dream/dream.d.ts +79 -36
- package/dist/dream/dream.js +327 -117
- package/dist/dream/dream.js.map +1 -1
- package/dist/dream/episode.d.ts +17 -0
- package/dist/dream/episode.js +116 -0
- package/dist/dream/episode.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/engine.d.ts +26 -0
- package/dist/kanban/engine.js +208 -0
- package/dist/kanban/engine.js.map +1 -0
- package/dist/kanban/types.d.ts +19 -0
- package/dist/kanban/types.js +9 -1
- package/dist/kanban/types.js.map +1 -1
- 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 +191 -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 +99 -0
- package/dist/machina/render-terminal.js.map +1 -0
- package/dist/machina/repair.d.ts +23 -0
- package/dist/machina/repair.js +98 -0
- package/dist/machina/repair.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 +39 -0
- package/dist/machina/verify.js +95 -0
- package/dist/machina/verify.js.map +1 -0
- package/dist/mining/extract.d.ts +34 -0
- package/dist/mining/extract.js +229 -0
- package/dist/mining/extract.js.map +1 -0
- package/dist/mining/refine.d.ts +28 -0
- package/dist/mining/refine.js +256 -0
- package/dist/mining/refine.js.map +1 -0
- package/dist/perception/extractor.js +5 -3
- package/dist/perception/extractor.js.map +1 -1
- package/dist/perception/graph-store.d.ts +0 -11
- package/dist/perception/graph-store.js +0 -33
- package/dist/perception/graph-store.js.map +1 -1
- package/dist/perception/index.d.ts +1 -1
- package/dist/perception/index.js +1 -2
- package/dist/perception/index.js.map +1 -1
- package/dist/plugins/commands.d.ts +38 -0
- package/dist/plugins/commands.js +134 -0
- package/dist/plugins/commands.js.map +1 -0
- package/dist/plugins/frontmatter.d.ts +14 -0
- package/dist/plugins/frontmatter.js +78 -0
- package/dist/plugins/frontmatter.js.map +1 -0
- package/dist/plugins/hooks.d.ts +12 -0
- package/dist/plugins/hooks.js +148 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/loader.d.ts +7 -0
- package/dist/plugins/loader.js +255 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/market.d.ts +23 -0
- package/dist/plugins/market.js +281 -0
- package/dist/plugins/market.js.map +1 -0
- package/dist/plugins/types.d.ts +90 -0
- package/dist/plugins/types.js +20 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
- package/dist/providers/anthropic-oauth-draft.js +414 -0
- package/dist/providers/anthropic-oauth-draft.js.map +1 -0
- package/dist/providers/anthropic.d.ts +4 -1
- package/dist/providers/anthropic.js +34 -6
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +71 -14
- package/dist/providers/factory.js +205 -124
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +8 -21
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/live-models.d.ts +23 -0
- package/dist/providers/live-models.js +145 -0
- package/dist/providers/live-models.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +1 -12
- package/dist/providers/openai-compatible.js +71 -108
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/providers/resilient-factory.js +1 -1
- package/dist/providers/resilient-factory.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/repl/queue.d.ts +22 -0
- package/dist/repl/queue.js +165 -0
- package/dist/repl/queue.js.map +1 -0
- package/dist/repl/side-channel.d.ts +23 -0
- package/dist/repl/side-channel.js +63 -0
- package/dist/repl/side-channel.js.map +1 -0
- package/dist/research/council.d.ts +5 -2
- package/dist/research/council.js +73 -10
- package/dist/research/council.js.map +1 -1
- package/dist/ruby/alternator.d.ts +11 -30
- package/dist/ruby/alternator.js +59 -38
- package/dist/ruby/alternator.js.map +1 -1
- package/dist/ruby/episode-capture.d.ts +0 -10
- package/dist/ruby/episode-capture.js +0 -33
- package/dist/ruby/episode-capture.js.map +1 -1
- package/dist/ruby/types.js +1 -1
- package/dist/ruby/types.js.map +1 -1
- package/dist/safety/path-jail.d.ts +17 -0
- package/dist/safety/path-jail.js +100 -0
- package/dist/safety/path-jail.js.map +1 -0
- package/dist/safety/permissions.d.ts +12 -21
- package/dist/safety/permissions.js +81 -216
- package/dist/safety/permissions.js.map +1 -1
- package/dist/safety/ssrf.d.ts +29 -0
- package/dist/safety/ssrf.js +185 -0
- package/dist/safety/ssrf.js.map +1 -0
- package/dist/server/index.js +64 -10
- package/dist/server/index.js.map +1 -1
- package/dist/setup/first-run.d.ts +0 -24
- package/dist/setup/first-run.js +10 -344
- package/dist/setup/first-run.js.map +1 -1
- package/dist/setup/key-store.d.ts +12 -0
- package/dist/setup/key-store.js +108 -0
- package/dist/setup/key-store.js.map +1 -0
- package/dist/setup/provider-registry.js +31 -18
- package/dist/setup/provider-registry.js.map +1 -1
- package/dist/setup/provider-test.d.ts +7 -0
- package/dist/setup/provider-test.js +73 -10
- package/dist/setup/provider-test.js.map +1 -1
- package/dist/setup/provider-wizard.d.ts +4 -1
- package/dist/setup/provider-wizard.js +92 -26
- package/dist/setup/provider-wizard.js.map +1 -1
- package/dist/setup/xiaomi.d.ts +1 -1
- package/dist/setup/xiaomi.js +3 -3
- package/dist/setup/xiaomi.js.map +1 -1
- package/dist/tools/browser.js +6 -4
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/clipboard.js +7 -1
- package/dist/tools/clipboard.js.map +1 -1
- package/dist/tools/dictate.d.ts +60 -0
- package/dist/tools/dictate.js +983 -0
- package/dist/tools/dictate.js.map +1 -0
- package/dist/tools/dictate_patched.js +1057 -0
- package/dist/tools/edit-file.js +10 -2
- package/dist/tools/edit-file.js.map +1 -1
- package/dist/tools/gmail-tool.d.ts +5 -1
- package/dist/tools/gmail-tool.js +151 -11
- package/dist/tools/gmail-tool.js.map +1 -1
- package/dist/tools/http-request.js +14 -4
- package/dist/tools/http-request.js.map +1 -1
- package/dist/tools/image-read.js +34 -2
- package/dist/tools/image-read.js.map +1 -1
- package/dist/tools/index.d.ts +16 -1
- package/dist/tools/index.js +59 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp.js +12 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/read-file.js +10 -14
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/telegram-audio-policy.d.ts +30 -0
- package/dist/tools/telegram-audio-policy.js +49 -0
- package/dist/tools/telegram-audio-policy.js.map +1 -0
- package/dist/tools/telegram-bot.js +1136 -539
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/tools/telegram-voice.d.ts +18 -5
- package/dist/tools/telegram-voice.js +54 -12
- package/dist/tools/telegram-voice.js.map +1 -1
- package/dist/tools/telegram.d.ts +3 -3
- package/dist/tools/telegram.js +5 -84
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/tools.d.ts +2 -14
- package/dist/tools/tools.js +79 -144
- package/dist/tools/tools.js.map +1 -1
- package/dist/tools/web-fetch.js +39 -7
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.js +2 -3
- package/dist/tools/web-search.js.map +1 -1
- package/dist/util/errors.js +1 -15
- package/dist/util/errors.js.map +1 -1
- package/dist/util/json-repair.d.ts +11 -0
- package/dist/util/json-repair.js +31 -0
- package/dist/util/json-repair.js.map +1 -0
- package/dist/util/rate-limiter.js +2 -8
- package/dist/util/rate-limiter.js.map +1 -1
- package/dist/viz/index.js +793 -792
- 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 +13 -32
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `:rem` — parses the entity-tagged dream files under `<projectRoot>/dreams/`
|
|
3
|
+
* into a relations graph, so patterns across MANY nights become visible
|
|
4
|
+
* (not just the latest night's raw text, which is all the old `:rem` did).
|
|
5
|
+
*
|
|
6
|
+
* Parsing contract (must stay in sync with `src/dream/dream.ts`'s
|
|
7
|
+
* `buildConsolidationPrompt` — see that file's header comment too):
|
|
8
|
+
* - Each dream file starts with `# Dream — <date>`.
|
|
9
|
+
* - `## Lessons` and `## Open threads` sections contain bullets of the form
|
|
10
|
+
* `- [tag] free text`. Tags are free-form, lowercase-by-convention
|
|
11
|
+
* (e.g. [routing], [todo], [bug]) — NOT a fixed enum, so the parser must
|
|
12
|
+
* not assume a closed tag set.
|
|
13
|
+
* - `## Patterns` bullets are untagged prose; we don't graph these, but we
|
|
14
|
+
* do count them as a per-night weight signal.
|
|
15
|
+
*
|
|
16
|
+
* Graph model: two node kinds —
|
|
17
|
+
* - a `night` node per dream file (one per date)
|
|
18
|
+
* - a `tag` node per distinct `[tag]` seen anywhere
|
|
19
|
+
* An edge connects a night to every tag that appeared in it, weighted by how
|
|
20
|
+
* many times that tag appeared that night. This is deliberately simple
|
|
21
|
+
* (bipartite, not a general knowledge graph) — it's meant to answer "what
|
|
22
|
+
* keeps coming up, and when", not model deep semantic relations.
|
|
23
|
+
*/
|
|
24
|
+
export interface TagOccurrence {
|
|
25
|
+
tag: string;
|
|
26
|
+
text: string;
|
|
27
|
+
/** Which section the bullet came from. */
|
|
28
|
+
section: 'lessons' | 'open-threads';
|
|
29
|
+
}
|
|
30
|
+
export interface DreamNight {
|
|
31
|
+
date: string;
|
|
32
|
+
file: string;
|
|
33
|
+
episodeCount: number;
|
|
34
|
+
occurrences: TagOccurrence[];
|
|
35
|
+
patternCount: number;
|
|
36
|
+
}
|
|
37
|
+
export interface GraphNode {
|
|
38
|
+
id: string;
|
|
39
|
+
kind: 'night' | 'tag';
|
|
40
|
+
/** For tag nodes: total occurrences across all nights. For night nodes: episodeCount. */
|
|
41
|
+
weight: number;
|
|
42
|
+
}
|
|
43
|
+
export interface GraphEdge {
|
|
44
|
+
night: string;
|
|
45
|
+
tag: string;
|
|
46
|
+
weight: number;
|
|
47
|
+
}
|
|
48
|
+
export interface RemGraph {
|
|
49
|
+
nights: DreamNight[];
|
|
50
|
+
nodes: GraphNode[];
|
|
51
|
+
edges: GraphEdge[];
|
|
52
|
+
/** Tags sorted by total occurrence, descending — the "what keeps coming up" view. */
|
|
53
|
+
topTags: {
|
|
54
|
+
tag: string;
|
|
55
|
+
count: number;
|
|
56
|
+
nights: number;
|
|
57
|
+
}[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parse a single dream markdown file into its structured night record.
|
|
61
|
+
* Tolerant of missing sections — a malformed or hand-edited file degrades to
|
|
62
|
+
* an empty occurrence list rather than throwing, since dream files are
|
|
63
|
+
* sometimes hand-edited (e.g. the 2026-06-22 provider-failure dream had only
|
|
64
|
+
* a one-line [error] lesson and no Patterns).
|
|
65
|
+
*/
|
|
66
|
+
export declare function parseDreamFile(filePath: string): DreamNight;
|
|
67
|
+
/** Load and parse every `*.md` dream file in `<projectRoot>/dreams/`, oldest first. */
|
|
68
|
+
export declare function loadDreamNights(projectRoot: string): DreamNight[];
|
|
69
|
+
/** Build the bipartite night↔tag relations graph from a set of parsed nights. */
|
|
70
|
+
export declare function buildRemGraph(nights: DreamNight[]): RemGraph;
|
|
71
|
+
/** Convenience: load + build in one call for the given project root. */
|
|
72
|
+
export declare function loadRemGraph(projectRoot: string): RemGraph;
|
|
@@ -0,0 +1,139 @@
|
|
|
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.parseDreamFile = parseDreamFile;
|
|
37
|
+
exports.loadDreamNights = loadDreamNights;
|
|
38
|
+
exports.buildRemGraph = buildRemGraph;
|
|
39
|
+
exports.loadRemGraph = loadRemGraph;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const TAG_BULLET = /^-\s*\[([^\]]+)\]\s*(.+)$/;
|
|
43
|
+
const HEADER_META = /^>\s*(\d+)\s+episodes?\b/i;
|
|
44
|
+
/**
|
|
45
|
+
* Parse a single dream markdown file into its structured night record.
|
|
46
|
+
* Tolerant of missing sections — a malformed or hand-edited file degrades to
|
|
47
|
+
* an empty occurrence list rather than throwing, since dream files are
|
|
48
|
+
* sometimes hand-edited (e.g. the 2026-06-22 provider-failure dream had only
|
|
49
|
+
* a one-line [error] lesson and no Patterns).
|
|
50
|
+
*/
|
|
51
|
+
function parseDreamFile(filePath) {
|
|
52
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
53
|
+
const lines = raw.split('\n');
|
|
54
|
+
const base = path.basename(filePath, '.md');
|
|
55
|
+
const dateMatch = base.match(/\d{4}-\d{2}-\d{2}/);
|
|
56
|
+
const date = dateMatch ? dateMatch[0] : base;
|
|
57
|
+
let episodeCount = 0;
|
|
58
|
+
let section = 'other';
|
|
59
|
+
const occurrences = [];
|
|
60
|
+
let patternCount = 0;
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
const metaMatch = line.match(HEADER_META);
|
|
63
|
+
if (metaMatch)
|
|
64
|
+
episodeCount = parseInt(metaMatch[1], 10);
|
|
65
|
+
const h = line.match(/^##\s+(.+)$/);
|
|
66
|
+
if (h) {
|
|
67
|
+
const title = h[1].trim().toLowerCase();
|
|
68
|
+
if (title === 'lessons')
|
|
69
|
+
section = 'lessons';
|
|
70
|
+
else if (title === 'open threads')
|
|
71
|
+
section = 'open-threads';
|
|
72
|
+
else if (title === 'patterns')
|
|
73
|
+
section = 'patterns';
|
|
74
|
+
else
|
|
75
|
+
section = 'other';
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (section === 'patterns') {
|
|
79
|
+
if (/^-\s+/.test(line) && !/^-\s*none\s*$/i.test(line.trim()))
|
|
80
|
+
patternCount++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (section !== 'lessons' && section !== 'open-threads')
|
|
84
|
+
continue;
|
|
85
|
+
const m = line.match(TAG_BULLET);
|
|
86
|
+
if (!m)
|
|
87
|
+
continue;
|
|
88
|
+
const tag = m[1].trim().toLowerCase();
|
|
89
|
+
const text = m[2].trim();
|
|
90
|
+
if (!tag)
|
|
91
|
+
continue;
|
|
92
|
+
occurrences.push({ tag, text, section });
|
|
93
|
+
}
|
|
94
|
+
return { date, file: filePath, episodeCount, occurrences, patternCount };
|
|
95
|
+
}
|
|
96
|
+
/** Load and parse every `*.md` dream file in `<projectRoot>/dreams/`, oldest first. */
|
|
97
|
+
function loadDreamNights(projectRoot) {
|
|
98
|
+
const dir = path.join(projectRoot, 'dreams');
|
|
99
|
+
let files = [];
|
|
100
|
+
try {
|
|
101
|
+
files = fs.readdirSync(dir).filter(f => f.endsWith('.md')).sort();
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
return files.map(f => parseDreamFile(path.join(dir, f)));
|
|
107
|
+
}
|
|
108
|
+
/** Build the bipartite night↔tag relations graph from a set of parsed nights. */
|
|
109
|
+
function buildRemGraph(nights) {
|
|
110
|
+
const tagTotals = new Map();
|
|
111
|
+
const tagNightCounts = new Map();
|
|
112
|
+
const edges = [];
|
|
113
|
+
for (const night of nights) {
|
|
114
|
+
const perNightCounts = new Map();
|
|
115
|
+
for (const occ of night.occurrences) {
|
|
116
|
+
perNightCounts.set(occ.tag, (perNightCounts.get(occ.tag) ?? 0) + 1);
|
|
117
|
+
}
|
|
118
|
+
for (const [tag, count] of perNightCounts) {
|
|
119
|
+
edges.push({ night: night.date, tag, weight: count });
|
|
120
|
+
tagTotals.set(tag, (tagTotals.get(tag) ?? 0) + count);
|
|
121
|
+
if (!tagNightCounts.has(tag))
|
|
122
|
+
tagNightCounts.set(tag, new Set());
|
|
123
|
+
tagNightCounts.get(tag).add(night.date);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const nodes = [
|
|
127
|
+
...nights.map(n => ({ id: n.date, kind: 'night', weight: n.episodeCount })),
|
|
128
|
+
...[...tagTotals.entries()].map(([tag, weight]) => ({ id: tag, kind: 'tag', weight })),
|
|
129
|
+
];
|
|
130
|
+
const topTags = [...tagTotals.entries()]
|
|
131
|
+
.map(([tag, count]) => ({ tag, count, nights: tagNightCounts.get(tag)?.size ?? 0 }))
|
|
132
|
+
.sort((a, b) => b.count - a.count || a.tag.localeCompare(b.tag));
|
|
133
|
+
return { nights, nodes, edges, topTags };
|
|
134
|
+
}
|
|
135
|
+
/** Convenience: load + build in one call for the given project root. */
|
|
136
|
+
function loadRemGraph(projectRoot) {
|
|
137
|
+
return buildRemGraph(loadDreamNights(projectRoot));
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/rem/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RemGraph } from './graph.js';
|
|
2
|
+
export interface RemRunResult {
|
|
3
|
+
graph: RemGraph;
|
|
4
|
+
terminalOutput: string;
|
|
5
|
+
htmlPath?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Run `:rem` — load every dream file, build the relations graph, and render
|
|
9
|
+
* it for the terminal. If `writeHtml` is true, also write a standalone
|
|
10
|
+
* `dreams/rem.html` (overwritten each run — it's a current snapshot, not a
|
|
11
|
+
* dated artifact like dream/research/council files).
|
|
12
|
+
*/
|
|
13
|
+
export declare function runRem(opts: {
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
writeHtml?: boolean;
|
|
16
|
+
}): RemRunResult;
|
|
@@ -0,0 +1,60 @@
|
|
|
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.runRem = runRem;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const graph_js_1 = require("./graph.js");
|
|
40
|
+
const render_terminal_js_1 = require("./render-terminal.js");
|
|
41
|
+
const render_html_js_1 = require("./render-html.js");
|
|
42
|
+
/**
|
|
43
|
+
* Run `:rem` — load every dream file, build the relations graph, and render
|
|
44
|
+
* it for the terminal. If `writeHtml` is true, also write a standalone
|
|
45
|
+
* `dreams/rem.html` (overwritten each run — it's a current snapshot, not a
|
|
46
|
+
* dated artifact like dream/research/council files).
|
|
47
|
+
*/
|
|
48
|
+
function runRem(opts) {
|
|
49
|
+
const graph = (0, graph_js_1.loadRemGraph)(opts.projectRoot);
|
|
50
|
+
const terminalOutput = (0, render_terminal_js_1.renderRemTerminal)(graph);
|
|
51
|
+
if (!opts.writeHtml) {
|
|
52
|
+
return { graph, terminalOutput };
|
|
53
|
+
}
|
|
54
|
+
const dir = path.join(opts.projectRoot, 'dreams');
|
|
55
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
56
|
+
const htmlPath = path.join(dir, 'rem.html');
|
|
57
|
+
fs.writeFileSync(htmlPath, (0, render_html_js_1.wrapRemHtml)(graph));
|
|
58
|
+
return { graph, terminalOutput, htmlPath };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rem/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wBAcC;AAhCD,uCAAyB;AACzB,2CAA6B;AAC7B,yCAAyD;AACzD,6DAAyD;AACzD,qDAA+C;AAQ/C;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,IAAkD;IACvE,MAAM,KAAK,GAAG,IAAA,uBAAY,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,IAAA,sCAAiB,EAAC,KAAK,CAAC,CAAC;IAEhD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC;IAE/C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapRemHtml = wrapRemHtml;
|
|
4
|
+
/**
|
|
5
|
+
* Renders a `RemGraph` as a standalone themed HTML file containing a real
|
|
6
|
+
* SVG node-and-edge graph (night nodes in a row, tag nodes arranged around
|
|
7
|
+
* them, edges weighted by occurrence count) plus a ranked tag list below it.
|
|
8
|
+
*
|
|
9
|
+
* Visually matches the warm/cream "Aura" theme used by :research / :council
|
|
10
|
+
* (see src/research/council.ts's wrapHtml) so output feels consistent
|
|
11
|
+
* across the agent's generated docs, with a dark-mode variant via
|
|
12
|
+
* prefers-color-scheme.
|
|
13
|
+
*
|
|
14
|
+
* Layout is a deterministic two-row bipartite layout (nights on top,
|
|
15
|
+
* tags on bottom, both sorted), NOT a physics-simulated force layout —
|
|
16
|
+
* this keeps the SVG static, dependency-free, and stable across renders of
|
|
17
|
+
* the same data (no jitter, no client-side JS layout pass required).
|
|
18
|
+
*/
|
|
19
|
+
function esc(s) {
|
|
20
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
21
|
+
}
|
|
22
|
+
const PALETTE = [
|
|
23
|
+
'#cc785c', '#5a9e6e', '#b15439', '#7a8ecc', '#c2a35a', '#9e6ecc', '#5aa3a8',
|
|
24
|
+
];
|
|
25
|
+
function colorFor(index) {
|
|
26
|
+
return PALETTE[index % PALETTE.length];
|
|
27
|
+
}
|
|
28
|
+
function buildSvg(graph) {
|
|
29
|
+
const nightIds = graph.nights.map(n => n.date);
|
|
30
|
+
const tagIds = graph.topTags.map(t => t.tag);
|
|
31
|
+
const width = Math.max(720, Math.max(nightIds.length, tagIds.length) * 110 + 80);
|
|
32
|
+
const nightY = 90;
|
|
33
|
+
const tagY = 330;
|
|
34
|
+
const height = tagY + 90;
|
|
35
|
+
const nightX = new Map();
|
|
36
|
+
nightIds.forEach((id, i) => {
|
|
37
|
+
const gap = nightIds.length > 1 ? (width - 120) / (nightIds.length - 1) : 0;
|
|
38
|
+
nightX.set(id, 60 + gap * i);
|
|
39
|
+
});
|
|
40
|
+
const tagX = new Map();
|
|
41
|
+
tagIds.forEach((id, i) => {
|
|
42
|
+
const gap = tagIds.length > 1 ? (width - 120) / (tagIds.length - 1) : 0;
|
|
43
|
+
tagX.set(id, 60 + gap * i);
|
|
44
|
+
});
|
|
45
|
+
const maxEpisodes = Math.max(...graph.nights.map(n => n.episodeCount), 1);
|
|
46
|
+
const maxTagCount = graph.topTags[0]?.count ?? 1;
|
|
47
|
+
const maxEdgeWeight = Math.max(...graph.edges.map(e => e.weight), 1);
|
|
48
|
+
const edgeLines = graph.edges.map(e => {
|
|
49
|
+
const x1 = nightX.get(e.night);
|
|
50
|
+
const y1 = nightY;
|
|
51
|
+
const x2 = tagX.get(e.tag);
|
|
52
|
+
const y2 = tagY;
|
|
53
|
+
if (x1 === undefined || x2 === undefined)
|
|
54
|
+
return '';
|
|
55
|
+
const strokeW = 1 + (e.weight / maxEdgeWeight) * 3.5;
|
|
56
|
+
const tagIdx = tagIds.indexOf(e.tag);
|
|
57
|
+
const color = colorFor(tagIdx);
|
|
58
|
+
return `<line x1="${x1}" y1="${y1 + 14}" x2="${x2}" y2="${y2 - 22}" stroke="${color}" stroke-width="${strokeW.toFixed(2)}" stroke-opacity="0.45" />`;
|
|
59
|
+
}).join('\n ');
|
|
60
|
+
const nightNodes = nightIds.map(id => {
|
|
61
|
+
const night = graph.nights.find(n => n.date === id);
|
|
62
|
+
const r = 8 + (night.episodeCount / maxEpisodes) * 14;
|
|
63
|
+
const x = nightX.get(id);
|
|
64
|
+
return `
|
|
65
|
+
<g class="node night-node">
|
|
66
|
+
<circle cx="${x}" cy="${nightY}" r="${r.toFixed(1)}" class="night-circle" />
|
|
67
|
+
<text x="${x}" y="${nightY - r - 8}" class="night-label" text-anchor="middle">${esc(id)}</text>
|
|
68
|
+
<text x="${x}" y="${nightY + r + 16}" class="night-sub" text-anchor="middle">${night.episodeCount} ep</text>
|
|
69
|
+
</g>`;
|
|
70
|
+
}).join('');
|
|
71
|
+
const tagNodes = tagIds.map((id, i) => {
|
|
72
|
+
const t = graph.topTags[i];
|
|
73
|
+
const r = 6 + (t.count / maxTagCount) * 16;
|
|
74
|
+
const x = tagX.get(id);
|
|
75
|
+
const color = colorFor(i);
|
|
76
|
+
return `
|
|
77
|
+
<g class="node tag-node">
|
|
78
|
+
<circle cx="${x}" cy="${tagY}" r="${r.toFixed(1)}" fill="${color}" fill-opacity="0.85" />
|
|
79
|
+
<text x="${x}" y="${tagY + r + 18}" class="tag-label" text-anchor="middle" fill="${color}">[${esc(id)}]</text>
|
|
80
|
+
<text x="${x}" y="${tagY + r + 34}" class="tag-sub" text-anchor="middle">${t.count}×</text>
|
|
81
|
+
</g>`;
|
|
82
|
+
}).join('');
|
|
83
|
+
return `<svg viewBox="0 0 ${width} ${height}" xmlns="http://www.w3.org/2000/svg" class="rem-graph">
|
|
84
|
+
<g class="edges">
|
|
85
|
+
${edgeLines}
|
|
86
|
+
</g>
|
|
87
|
+
<g class="nights">${nightNodes}
|
|
88
|
+
</g>
|
|
89
|
+
<g class="tags">${tagNodes}
|
|
90
|
+
</g>
|
|
91
|
+
</svg>`;
|
|
92
|
+
}
|
|
93
|
+
function buildTopTagsTable(graph) {
|
|
94
|
+
const rows = graph.topTags.slice(0, 20).map((t, i) => {
|
|
95
|
+
const color = colorFor(i);
|
|
96
|
+
const pct = graph.topTags[0] ? Math.round((t.count / graph.topTags[0].count) * 100) : 0;
|
|
97
|
+
return `<tr>
|
|
98
|
+
<td class="tag-cell"><span class="dot" style="background:${color}"></span>[${esc(t.tag)}]</td>
|
|
99
|
+
<td><div class="bar-track"><div class="bar-fill" style="width:${pct}%;background:${color}"></div></div></td>
|
|
100
|
+
<td class="num-cell">${t.count}</td>
|
|
101
|
+
<td class="num-cell">${t.nights}</td>
|
|
102
|
+
</tr>`;
|
|
103
|
+
}).join('\n');
|
|
104
|
+
return `<table class="tag-table">
|
|
105
|
+
<thead><tr><th>Tag</th><th>Frequency</th><th>Count</th><th>Nights</th></tr></thead>
|
|
106
|
+
<tbody>${rows}</tbody>
|
|
107
|
+
</table>`;
|
|
108
|
+
}
|
|
109
|
+
function wrapRemHtml(graph) {
|
|
110
|
+
const dateRange = graph.nights.length
|
|
111
|
+
? `${graph.nights[0].date} → ${graph.nights[graph.nights.length - 1].date}`
|
|
112
|
+
: '—';
|
|
113
|
+
return `<!DOCTYPE html>
|
|
114
|
+
<html lang="en">
|
|
115
|
+
<head>
|
|
116
|
+
<meta charset="UTF-8">
|
|
117
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
118
|
+
<title>Rem — Aura Dream Graph</title>
|
|
119
|
+
<style>
|
|
120
|
+
:root {
|
|
121
|
+
--bg: #fdf6f0; --card: #fffaf5; --text: #3e2f24; --muted: #8a7768;
|
|
122
|
+
--accent: #cc785c; --accent-2: #5a9e6e; --border: #e8d5c8;
|
|
123
|
+
--code-bg: #f4ede6; --hr: #e0cebc;
|
|
124
|
+
--shadow: 0 2px 12px rgba(62,47,36,0.06); --radius: 12px;
|
|
125
|
+
--serif: 'Georgia', 'Times New Roman', serif;
|
|
126
|
+
--sans: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
127
|
+
--mono: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
|
|
128
|
+
}
|
|
129
|
+
@media (prefers-color-scheme: dark) {
|
|
130
|
+
:root {
|
|
131
|
+
--bg: #1e1b18; --card: #26221e; --text: #ede0cc; --muted: #9e8e80;
|
|
132
|
+
--accent: #e08a6e; --accent-2: #6db880; --border: #3a322a;
|
|
133
|
+
--code-bg: #2c2722; --hr: #3a322a;
|
|
134
|
+
--shadow: 0 2px 12px rgba(0,0,0,0.25);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
138
|
+
body { background: var(--bg); color: var(--text); font-family: var(--serif); line-height: 1.7; font-size: 17px; }
|
|
139
|
+
.container { max-width: 980px; margin: 0 auto; padding: 3rem 1.5rem 5rem; }
|
|
140
|
+
.hero { text-align: center; padding: 2.5rem 0 2rem; border-bottom: 2px solid var(--border); margin-bottom: 2.5rem; }
|
|
141
|
+
.hero .badge { display: inline-block; background: var(--accent); color: #fff; font-family: var(--sans); font-size: 0.7rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; padding: 0.3em 1em; border-radius: 100px; margin-bottom: 1.25rem; }
|
|
142
|
+
.hero h1 { font-family: var(--sans); font-size: 2.2rem; font-weight: 700; line-height: 1.25; letter-spacing: -0.02em; margin-bottom: 0.5rem; }
|
|
143
|
+
.hero .meta { font-family: var(--sans); font-size: 0.85rem; color: var(--muted); }
|
|
144
|
+
.card { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: var(--shadow); padding: 2rem 2.5rem; margin-bottom: 2rem; }
|
|
145
|
+
@media (max-width: 720px) { .card { padding: 1.25rem; border-radius: 8px; } .hero h1 { font-size: 1.6rem; } .container { padding: 1.5rem 0.75rem 3rem; } }
|
|
146
|
+
.card h2 { font-family: var(--sans); font-size: 1.3rem; color: var(--accent); border-bottom: 2px solid var(--border); padding-bottom: 0.5rem; margin-bottom: 1.25rem; }
|
|
147
|
+
.rem-graph { width: 100%; height: auto; display: block; }
|
|
148
|
+
.night-circle { fill: var(--card); stroke: var(--accent); stroke-width: 2; }
|
|
149
|
+
.night-label { font-family: var(--sans); font-size: 12px; font-weight: 700; fill: var(--text); }
|
|
150
|
+
.night-sub, .tag-sub { font-family: var(--sans); font-size: 10px; fill: var(--muted); }
|
|
151
|
+
.tag-label { font-family: var(--sans); font-size: 11px; font-weight: 600; }
|
|
152
|
+
.tag-table { width: 100%; border-collapse: collapse; font-family: var(--sans); font-size: 0.9rem; }
|
|
153
|
+
.tag-table th { text-align: left; color: var(--muted); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.06em; padding: 0.5rem 0.75rem; border-bottom: 2px solid var(--border); }
|
|
154
|
+
.tag-table td { padding: 0.55rem 0.75rem; border-bottom: 1px solid var(--hr); vertical-align: middle; }
|
|
155
|
+
.tag-cell { white-space: nowrap; font-weight: 600; }
|
|
156
|
+
.dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-right: 0.5em; }
|
|
157
|
+
.num-cell { text-align: right; color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
158
|
+
.bar-track { background: var(--code-bg); border-radius: 6px; height: 8px; overflow: hidden; min-width: 100px; }
|
|
159
|
+
.bar-fill { height: 100%; border-radius: 6px; }
|
|
160
|
+
.footer { text-align: center; margin-top: 1rem; font-family: var(--sans); font-size: 0.8rem; color: var(--muted); opacity: 0.7; }
|
|
161
|
+
.empty { text-align: center; color: var(--muted); font-family: var(--sans); padding: 3rem 1rem; }
|
|
162
|
+
</style>
|
|
163
|
+
</head>
|
|
164
|
+
<body>
|
|
165
|
+
<div class="container">
|
|
166
|
+
<header class="hero">
|
|
167
|
+
<div class="badge">Aura · Rem</div>
|
|
168
|
+
<h1>Dream Relations Graph</h1>
|
|
169
|
+
<div class="meta">${esc(dateRange)} · ${graph.nights.length} night(s) · ${graph.topTags.length} tag(s)</div>
|
|
170
|
+
</header>
|
|
171
|
+
|
|
172
|
+
${graph.nights.length === 0
|
|
173
|
+
? '<div class="card"><p class="empty">No dreams yet. Run :dream after some work, then :rem --html again.</p></div>'
|
|
174
|
+
: `<section class="card">
|
|
175
|
+
<h2>Nights · Tags</h2>
|
|
176
|
+
${buildSvg(graph)}
|
|
177
|
+
</section>
|
|
178
|
+
|
|
179
|
+
<section class="card">
|
|
180
|
+
<h2>What keeps coming up</h2>
|
|
181
|
+
${buildTopTagsTable(graph)}
|
|
182
|
+
</section>`}
|
|
183
|
+
|
|
184
|
+
<footer class="footer"><p>Generated by Aura Code · :rem · parsed from dreams/*.md</p></footer>
|
|
185
|
+
</div>
|
|
186
|
+
</body>
|
|
187
|
+
</html>`;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=render-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-html.js","sourceRoot":"","sources":["../../src/rem/render-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderRemTerminal = renderRemTerminal;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
/**
|
|
9
|
+
* Renders a `RemGraph` as terminal text using Aura's existing warm palette
|
|
10
|
+
* (the same hex set used throughout src/cli/index.ts) so `:rem` looks native
|
|
11
|
+
* next to `:dream`, `:design`, etc.
|
|
12
|
+
*
|
|
13
|
+
* Layout, top to bottom:
|
|
14
|
+
* 1. A timeline strip — one row per night, oldest→newest, with a small bar
|
|
15
|
+
* sized by episode count.
|
|
16
|
+
* 2. "What keeps coming up" — top tags ranked by total occurrence, with a
|
|
17
|
+
* horizontal bar and the count of distinct nights it appeared in.
|
|
18
|
+
* 3. Per-night detail — for the most recent N nights, which tags fired.
|
|
19
|
+
*
|
|
20
|
+
* Deliberately not a literal node-and-edge ASCII graph (boxes-and-arrows in
|
|
21
|
+
* a terminal degrade badly past ~6 nodes); a ranked/timeline view answers
|
|
22
|
+
* the actual question ("what keeps coming up, and when") more legibly than
|
|
23
|
+
* a force-directed layout would in 80 columns.
|
|
24
|
+
*/
|
|
25
|
+
const C = {
|
|
26
|
+
heading: chalk_1.default.hex('#cc785c').bold,
|
|
27
|
+
text: chalk_1.default.hex('#ede0cc'),
|
|
28
|
+
muted: chalk_1.default.hex('#8a7768'),
|
|
29
|
+
dim: chalk_1.default.hex('#4e3d30'),
|
|
30
|
+
good: chalk_1.default.hex('#5a9e6e'),
|
|
31
|
+
warn: chalk_1.default.hex('#b15439'),
|
|
32
|
+
};
|
|
33
|
+
const BAR_CHAR = '█';
|
|
34
|
+
const BAR_WIDTH = 24;
|
|
35
|
+
function bar(value, max, width = BAR_WIDTH) {
|
|
36
|
+
if (max <= 0)
|
|
37
|
+
return '';
|
|
38
|
+
const filled = Math.max(1, Math.round((value / max) * width));
|
|
39
|
+
return BAR_CHAR.repeat(Math.min(filled, width));
|
|
40
|
+
}
|
|
41
|
+
function renderRemTerminal(graph, opts = {}) {
|
|
42
|
+
const recentNights = opts.recentNights ?? 5;
|
|
43
|
+
const lines = [];
|
|
44
|
+
if (graph.nights.length === 0) {
|
|
45
|
+
return C.muted('\n No dreams yet. Run :dream after some work.\n');
|
|
46
|
+
}
|
|
47
|
+
lines.push('');
|
|
48
|
+
lines.push(C.heading(` Rem — ${graph.nights.length} night(s), ${graph.topTags.length} recurring tag(s)`));
|
|
49
|
+
lines.push('');
|
|
50
|
+
// ── 1. Timeline strip ──────────────────────────────────────────────────
|
|
51
|
+
lines.push(C.muted(' Timeline'));
|
|
52
|
+
const maxEpisodes = Math.max(...graph.nights.map(n => n.episodeCount), 1);
|
|
53
|
+
for (const night of graph.nights) {
|
|
54
|
+
const tagCount = new Set(night.occurrences.map(o => o.tag)).size;
|
|
55
|
+
lines.push(` ${C.text(night.date)} ${C.dim(bar(night.episodeCount, maxEpisodes, 16))} ` +
|
|
56
|
+
C.muted(`${night.episodeCount} ep · ${tagCount} tag(s)`));
|
|
57
|
+
}
|
|
58
|
+
lines.push('');
|
|
59
|
+
// ── 2. Top tags ranked by total occurrence ─────────────────────────────
|
|
60
|
+
lines.push(C.muted(' What keeps coming up'));
|
|
61
|
+
const maxCount = graph.topTags[0]?.count ?? 1;
|
|
62
|
+
for (const t of graph.topTags.slice(0, 12)) {
|
|
63
|
+
const label = `[${t.tag}]`.padEnd(20);
|
|
64
|
+
lines.push(` ${C.heading(label)} ${C.text(bar(t.count, maxCount))} ` +
|
|
65
|
+
C.muted(`${t.count}× across ${t.nights} night(s)`));
|
|
66
|
+
}
|
|
67
|
+
lines.push('');
|
|
68
|
+
// ── 3. Per-night detail for the most recent nights ─────────────────────
|
|
69
|
+
const recent = graph.nights.slice(-recentNights).reverse();
|
|
70
|
+
lines.push(C.muted(` Recent detail (last ${recent.length})`));
|
|
71
|
+
for (const night of recent) {
|
|
72
|
+
lines.push(` ${C.heading(night.date)}`);
|
|
73
|
+
if (night.occurrences.length === 0) {
|
|
74
|
+
lines.push(` ${C.muted('(no tagged lessons/threads)')}`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const byTag = new Map();
|
|
78
|
+
for (const occ of night.occurrences) {
|
|
79
|
+
if (!byTag.has(occ.tag))
|
|
80
|
+
byTag.set(occ.tag, []);
|
|
81
|
+
byTag.get(occ.tag).push(occ.text);
|
|
82
|
+
}
|
|
83
|
+
for (const [tag, texts] of byTag) {
|
|
84
|
+
const sample = texts[0].length > 72 ? texts[0].slice(0, 69) + '...' : texts[0];
|
|
85
|
+
const more = texts.length > 1 ? C.muted(` (+${texts.length - 1} more)`) : '';
|
|
86
|
+
lines.push(` ${C.warn(`[${tag}]`)} ${C.text(sample)}${more}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push(C.muted(' :rem --html writes a visual graph to dreams/rem.html'));
|
|
91
|
+
lines.push('');
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=render-terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-terminal.js","sourceRoot":"","sources":["../../src/rem/render-terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LLMProvider } from '../providers/types.js';
|
|
2
|
+
import type { ProjectContext } from '../agent/context.js';
|
|
3
|
+
import { createTerminalDisplay } from '../cli/display.js';
|
|
4
|
+
import { PermissionSystem } from '../safety/permissions.js';
|
|
5
|
+
export interface QueueItem {
|
|
6
|
+
id: string;
|
|
7
|
+
prompt: string;
|
|
8
|
+
createdAt: number;
|
|
9
|
+
status: 'pending' | 'running' | 'done' | 'failed';
|
|
10
|
+
}
|
|
11
|
+
export declare function loadQueue(): QueueItem[];
|
|
12
|
+
export declare function addToQueue(prompt: string): QueueItem;
|
|
13
|
+
export declare function removeFromQueue(index: number): QueueItem | null;
|
|
14
|
+
export declare function clearQueue(): number;
|
|
15
|
+
export interface QueueRunResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
output: string;
|
|
18
|
+
turns: number;
|
|
19
|
+
toolCalls: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function runQueueItem(index: number, provider: LLMProvider, ctx: ProjectContext, permissions: PermissionSystem, display: ReturnType<typeof createTerminalDisplay>): Promise<QueueRunResult | null>;
|
|
22
|
+
export declare function formatQueue(items: QueueItem[]): string;
|