@runcore-sh/runcore 0.5.6 → 0.5.8
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/dictionary.json +2 -2
- package/dist/.extensions/ext-byok.json +1 -0
- package/dist/.extensions/ext-hosted.json +1 -0
- package/dist/.extensions/ext-spawn.json +1 -0
- package/dist/agents/autonomous.d.ts.map +1 -1
- package/dist/agents/runtime/bus.d.ts +1 -0
- package/dist/agents/runtime/bus.d.ts.map +1 -1
- package/dist/agents/spawn.d.ts.map +1 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +3 -2
- package/dist/auth/middleware.js.map +1 -1
- package/dist/calendar/routes.d.ts.map +1 -1
- package/dist/calendar/routes.js +8 -7
- package/dist/calendar/routes.js.map +1 -1
- package/dist/files/registry.d.ts +4 -5
- package/dist/files/registry.d.ts.map +1 -1
- package/dist/files/registry.js +4 -5
- package/dist/files/registry.js.map +1 -1
- package/dist/files/store.d.ts +2 -0
- package/dist/files/store.d.ts.map +1 -1
- package/dist/files/store.js +5 -1
- package/dist/files/store.js.map +1 -1
- package/dist/instance.d.ts +2 -0
- package/dist/instance.d.ts.map +1 -1
- package/dist/instance.js +2 -0
- package/dist/instance.js.map +1 -1
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +15 -1
- package/dist/lib/paths.js.map +1 -1
- package/dist/library/brain-shadow.d.ts.map +1 -1
- package/dist/library/brain-shadow.js +5 -4
- package/dist/library/brain-shadow.js.map +1 -1
- package/dist/library/routes.d.ts.map +1 -1
- package/dist/library/routes.js +10 -9
- package/dist/library/routes.js.map +1 -1
- package/dist/llm/cache.d.ts.map +1 -1
- package/dist/llm/cache.js +7 -5
- package/dist/llm/cache.js.map +1 -1
- package/dist/llm/complete.js +2 -0
- package/dist/llm/complete.js.map +1 -1
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js +32 -7
- package/dist/llm/providers/ollama.js.map +1 -1
- package/dist/llm/providers/openrouter.d.ts.map +1 -1
- package/dist/llm/providers/openrouter.js +105 -12
- package/dist/llm/providers/openrouter.js.map +1 -1
- package/dist/llm/providers/types.d.ts +18 -0
- package/dist/llm/providers/types.d.ts.map +1 -1
- package/dist/llm/retry.d.ts.map +1 -1
- package/dist/llm/retry.js +6 -0
- package/dist/llm/retry.js.map +1 -1
- package/dist/llm/tools/handlers.d.ts +27 -0
- package/dist/llm/tools/handlers.d.ts.map +1 -0
- package/dist/llm/tools/handlers.js +842 -0
- package/dist/llm/tools/handlers.js.map +1 -0
- package/dist/llm/tools/index.d.ts +12 -0
- package/dist/llm/tools/index.d.ts.map +1 -0
- package/dist/llm/tools/index.js +10 -0
- package/dist/llm/tools/index.js.map +1 -0
- package/dist/llm/tools/loop.d.ts +47 -0
- package/dist/llm/tools/loop.d.ts.map +1 -0
- package/dist/llm/tools/loop.js +126 -0
- package/dist/llm/tools/loop.js.map +1 -0
- package/dist/llm/tools/registry.d.ts +27 -0
- package/dist/llm/tools/registry.d.ts.map +1 -0
- package/dist/llm/tools/registry.js +60 -0
- package/dist/llm/tools/registry.js.map +1 -0
- package/dist/llm/tools/schemas.d.ts +92 -0
- package/dist/llm/tools/schemas.d.ts.map +1 -0
- package/dist/llm/tools/schemas.js +154 -0
- package/dist/llm/tools/schemas.js.map +1 -0
- package/dist/llm/tools/types.d.ts +44 -0
- package/dist/llm/tools/types.d.ts.map +1 -0
- package/dist/llm/tools/types.js +9 -0
- package/dist/llm/tools/types.js.map +1 -0
- package/dist/mcp-server.d.ts +1 -1
- package/dist/mcp-server.js +249 -5
- package/dist/mcp-server.js.map +1 -1
- package/dist/memory/visual.d.ts.map +1 -1
- package/dist/memory/visual.js +3 -6
- package/dist/memory/visual.js.map +1 -1
- package/dist/openloop/foldback.js +1 -1
- package/dist/openloop/foldback.js.map +1 -1
- package/dist/openloop/resolution-scanner.d.ts.map +1 -1
- package/dist/openloop/resolution-scanner.js +76 -63
- package/dist/openloop/resolution-scanner.js.map +1 -1
- package/dist/plugins/github/index.d.ts +49 -0
- package/dist/plugins/github/index.d.ts.map +1 -0
- package/dist/plugins/github/index.js +153 -0
- package/dist/plugins/github/index.js.map +1 -0
- package/dist/plugins/index.d.ts +1 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +79 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/slack/index.d.ts +43 -0
- package/dist/plugins/slack/index.d.ts.map +1 -0
- package/dist/plugins/slack/index.js +158 -0
- package/dist/plugins/slack/index.js.map +1 -0
- package/dist/plugins/twilio/index.d.ts +41 -0
- package/dist/plugins/twilio/index.d.ts.map +1 -0
- package/dist/plugins/twilio/index.js +102 -0
- package/dist/plugins/twilio/index.js.map +1 -0
- package/dist/pulse/tier.d.ts +1 -1
- package/dist/pulse/tier.js +2 -2
- package/dist/pulse/tier.js.map +1 -1
- package/dist/search/gemini.d.ts +27 -0
- package/dist/search/gemini.d.ts.map +1 -0
- package/dist/search/gemini.js +103 -0
- package/dist/search/gemini.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +850 -536
- package/dist/server.js.map +1 -1
- package/dist/services/routine-patterns.d.ts.map +1 -1
- package/dist/services/routine-patterns.js +6 -0
- package/dist/services/routine-patterns.js.map +1 -1
- package/dist/services/traceInsights.d.ts +5 -0
- package/dist/services/traceInsights.d.ts.map +1 -1
- package/dist/services/traceInsights.js +18 -1
- package/dist/services/traceInsights.js.map +1 -1
- package/dist/settings.d.ts +1 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/types.d.ts +26 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vault/store.d.ts +1 -1
- package/dist/vault/store.d.ts.map +1 -1
- package/dist/webhooks/mount.d.ts.map +1 -1
- package/dist/whiteboard/store.d.ts +40 -0
- package/dist/whiteboard/store.d.ts.map +1 -0
- package/dist/whiteboard/store.js +280 -0
- package/dist/whiteboard/store.js.map +1 -0
- package/dist/whiteboard/types.d.ts +55 -0
- package/dist/whiteboard/types.d.ts.map +1 -0
- package/dist/whiteboard/types.js +9 -0
- package/dist/whiteboard/types.js.map +1 -0
- package/dist/whiteboard/weight.d.ts +23 -0
- package/dist/whiteboard/weight.d.ts.map +1 -0
- package/dist/whiteboard/weight.js +126 -0
- package/dist/whiteboard/weight.js.map +1 -0
- package/package.json +3 -2
- package/public/index.html +225 -51
- package/public/search-flyout.js +324 -0
- package/public/whiteboard.html +915 -0
- package/public/avatar/Hey-Dash_en_windows_v4_0_0.zip +0 -0
- package/public/avatar/README.md +0 -43
- package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
- package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
- package/public/avatar/cache/08b6f4880f59a385.mp4 +0 -0
- package/public/avatar/cache/0ef9e0e78d715af4.mp4 +0 -0
- package/public/avatar/cache/0fa85e9e8f444a8b.mp4 +0 -0
- package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
- package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
- package/public/avatar/cache/1b374d5390258fea.mp4 +0 -0
- package/public/avatar/cache/1e2367029b92f8aa.mp4 +0 -0
- package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
- package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
- package/public/avatar/cache/2a0f3ff34d92521a.mp4 +0 -0
- package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
- package/public/avatar/cache/307a6f70859aeab8.mp4 +0 -0
- package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
- package/public/avatar/cache/39fc4e81574d14ed.mp4 +0 -0
- package/public/avatar/cache/4a5c6051c1ef6a71.mp4 +0 -0
- package/public/avatar/cache/51f4aa76398c8c29.mp4 +0 -0
- package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
- package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
- package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
- package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
- package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
- package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
- package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
- package/public/avatar/cache/884ae6717fcacdd5.mp4 +0 -0
- package/public/avatar/cache/8ea0b7220d139615.mp4 +0 -0
- package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
- package/public/avatar/cache/9b9c4f7b8508eecc.mp4 +0 -0
- package/public/avatar/cache/9be1030ec2aa2b01.mp4 +0 -0
- package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
- package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
- package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
- package/public/avatar/cache/be89f49970672374.mp4 +0 -0
- package/public/avatar/cache/c11fdc99479492b6.mp4 +0 -0
- package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
- package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
- package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
- package/public/avatar/cache/e78fceae2373b7c1.mp4 +0 -0
- package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
- package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
- package/public/avatar/cache/eeb8d775f40dbe2c.mp4 +0 -0
- package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
- package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
- package/public/avatar/dash_headhshot_v1.png +0 -0
- package/public/avatar/idle.mp4 +0 -0
- package/public/avatar/photo.png +0 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whiteboard store — append-only JSONL persistence for WhiteboardNode.
|
|
3
|
+
*
|
|
4
|
+
* Follows src/queue/store.ts and src/files/store.ts patterns:
|
|
5
|
+
* in-memory Map cache, last-occurrence-wins, append-only writes.
|
|
6
|
+
*
|
|
7
|
+
* File: brain/log/whiteboard.jsonl
|
|
8
|
+
*/
|
|
9
|
+
import { readFile, appendFile, writeFile, mkdir } from "node:fs/promises";
|
|
10
|
+
import { join, dirname } from "node:path";
|
|
11
|
+
import { randomBytes } from "node:crypto";
|
|
12
|
+
import { createLogger } from "../utils/logger.js";
|
|
13
|
+
import { computeWeights, buildTree } from "./weight.js";
|
|
14
|
+
const log = createLogger("whiteboard.store");
|
|
15
|
+
const SCHEMA_LINE = JSON.stringify({
|
|
16
|
+
_schema: "whiteboard",
|
|
17
|
+
version: 1,
|
|
18
|
+
fields: [
|
|
19
|
+
"id", "parentId", "title", "body", "type", "status", "tags",
|
|
20
|
+
"plantedBy", "question", "answer", "answeredAt", "boardTaskId",
|
|
21
|
+
"createdAt", "updatedAt",
|
|
22
|
+
],
|
|
23
|
+
});
|
|
24
|
+
/** Generate a whiteboard node ID: wb_<timestamp>_<8-hex>. */
|
|
25
|
+
function generateId() {
|
|
26
|
+
const ts = Date.now();
|
|
27
|
+
const rand = randomBytes(4).toString("hex");
|
|
28
|
+
return `wb_${ts}_${rand}`;
|
|
29
|
+
}
|
|
30
|
+
export class WhiteboardStore {
|
|
31
|
+
cache = null;
|
|
32
|
+
filePath;
|
|
33
|
+
constructor(brainDir) {
|
|
34
|
+
this.filePath = join(brainDir, "log", "whiteboard.jsonl");
|
|
35
|
+
}
|
|
36
|
+
// ── File I/O ─────────────────────────────────────────────────────────────
|
|
37
|
+
async ensureFile() {
|
|
38
|
+
try {
|
|
39
|
+
await readFile(this.filePath, "utf-8");
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
await mkdir(dirname(this.filePath), { recursive: true });
|
|
43
|
+
await appendFile(this.filePath, SCHEMA_LINE + "\n", "utf-8");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async load() {
|
|
47
|
+
// Always re-read from disk — MCP server writes to the same file from a separate process
|
|
48
|
+
await this.ensureFile();
|
|
49
|
+
const raw = await readFile(this.filePath, "utf-8");
|
|
50
|
+
const lines = raw.split("\n").filter((l) => l.trim().length > 0);
|
|
51
|
+
const map = new Map();
|
|
52
|
+
for (const line of lines) {
|
|
53
|
+
try {
|
|
54
|
+
const obj = JSON.parse(line);
|
|
55
|
+
if (obj._schema)
|
|
56
|
+
continue;
|
|
57
|
+
map.set(obj.id, obj);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
this.cache = map;
|
|
64
|
+
return map;
|
|
65
|
+
}
|
|
66
|
+
async append(node) {
|
|
67
|
+
await appendFile(this.filePath, JSON.stringify(node) + "\n", "utf-8");
|
|
68
|
+
}
|
|
69
|
+
// ── CRUD ─────────────────────────────────────────────────────────────────
|
|
70
|
+
async create(input) {
|
|
71
|
+
const map = await this.load();
|
|
72
|
+
const now = new Date().toISOString();
|
|
73
|
+
const node = {
|
|
74
|
+
...input,
|
|
75
|
+
id: generateId(),
|
|
76
|
+
status: input.status ?? "open",
|
|
77
|
+
createdAt: now,
|
|
78
|
+
updatedAt: now,
|
|
79
|
+
};
|
|
80
|
+
map.set(node.id, node);
|
|
81
|
+
await this.append(node);
|
|
82
|
+
log.info("node created", { id: node.id, type: node.type, title: node.title });
|
|
83
|
+
// Return with weight computed
|
|
84
|
+
const weighted = computeWeights([node]);
|
|
85
|
+
return weighted[0];
|
|
86
|
+
}
|
|
87
|
+
async get(id) {
|
|
88
|
+
const map = await this.load();
|
|
89
|
+
return map.get(id) ?? null;
|
|
90
|
+
}
|
|
91
|
+
async update(id, patch) {
|
|
92
|
+
const map = await this.load();
|
|
93
|
+
const existing = map.get(id);
|
|
94
|
+
if (!existing)
|
|
95
|
+
return null;
|
|
96
|
+
const updated = {
|
|
97
|
+
...existing,
|
|
98
|
+
...patch,
|
|
99
|
+
id: existing.id, // prevent overwrite
|
|
100
|
+
createdAt: existing.createdAt,
|
|
101
|
+
plantedBy: existing.plantedBy,
|
|
102
|
+
updatedAt: new Date().toISOString(),
|
|
103
|
+
};
|
|
104
|
+
map.set(id, updated);
|
|
105
|
+
await this.append(updated);
|
|
106
|
+
log.debug("node updated", { id, changes: Object.keys(patch) });
|
|
107
|
+
return updated;
|
|
108
|
+
}
|
|
109
|
+
async archive(id, cascade = false) {
|
|
110
|
+
const map = await this.load();
|
|
111
|
+
const existing = map.get(id);
|
|
112
|
+
if (!existing)
|
|
113
|
+
return { ok: false, message: `Node not found: ${id}` };
|
|
114
|
+
if (existing.status === "archived")
|
|
115
|
+
return { ok: true, message: "Already archived" };
|
|
116
|
+
// Archive this node
|
|
117
|
+
await this.update(id, { status: "archived" });
|
|
118
|
+
// Cascade to children if requested
|
|
119
|
+
if (cascade) {
|
|
120
|
+
const children = await this.getChildren(id);
|
|
121
|
+
for (const child of children) {
|
|
122
|
+
await this.archive(child.id, true);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
log.info("node archived", { id, title: existing.title, cascade });
|
|
126
|
+
return { ok: true, message: `Archived: ${existing.title}` };
|
|
127
|
+
}
|
|
128
|
+
// ── List with filters ────────────────────────────────────────────────────
|
|
129
|
+
async list(filter) {
|
|
130
|
+
const map = await this.load();
|
|
131
|
+
let results = [...map.values()].filter((n) => n.status !== "archived");
|
|
132
|
+
if (filter) {
|
|
133
|
+
if (filter.type)
|
|
134
|
+
results = results.filter((n) => n.type === filter.type);
|
|
135
|
+
if (filter.status)
|
|
136
|
+
results = results.filter((n) => n.status === filter.status);
|
|
137
|
+
if (filter.plantedBy)
|
|
138
|
+
results = results.filter((n) => n.plantedBy === filter.plantedBy);
|
|
139
|
+
if (filter.parentId)
|
|
140
|
+
results = results.filter((n) => n.parentId === filter.parentId);
|
|
141
|
+
if (filter.tags?.length) {
|
|
142
|
+
results = results.filter((n) => filter.tags.some((t) => n.tags.includes(t)));
|
|
143
|
+
}
|
|
144
|
+
if (filter.search) {
|
|
145
|
+
const q = filter.search.toLowerCase();
|
|
146
|
+
results = results.filter((n) => n.title.toLowerCase().includes(q) ||
|
|
147
|
+
n.body?.toLowerCase().includes(q) ||
|
|
148
|
+
n.question?.toLowerCase().includes(q) ||
|
|
149
|
+
n.answer?.toLowerCase().includes(q) ||
|
|
150
|
+
n.tags.some((t) => t.toLowerCase().includes(q)));
|
|
151
|
+
}
|
|
152
|
+
if (filter.answeredSince) {
|
|
153
|
+
const since = filter.answeredSince;
|
|
154
|
+
results = results.filter((n) => n.type === "question" && n.answeredAt && n.answeredAt >= since);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
results.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
158
|
+
return results;
|
|
159
|
+
}
|
|
160
|
+
// ── Tree operations ──────────────────────────────────────────────────────
|
|
161
|
+
async getChildren(parentId) {
|
|
162
|
+
const map = await this.load();
|
|
163
|
+
return [...map.values()]
|
|
164
|
+
.filter((n) => n.parentId === parentId && n.status !== "archived")
|
|
165
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
166
|
+
}
|
|
167
|
+
async getSubtree(rootId) {
|
|
168
|
+
const map = await this.load();
|
|
169
|
+
const result = [];
|
|
170
|
+
const queue = [rootId];
|
|
171
|
+
while (queue.length > 0) {
|
|
172
|
+
const id = queue.shift();
|
|
173
|
+
const node = map.get(id);
|
|
174
|
+
if (!node || node.status === "archived")
|
|
175
|
+
continue;
|
|
176
|
+
result.push(node);
|
|
177
|
+
// Find children
|
|
178
|
+
for (const n of map.values()) {
|
|
179
|
+
if (n.parentId === id && n.status !== "archived") {
|
|
180
|
+
queue.push(n.id);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
async getRoots() {
|
|
187
|
+
const map = await this.load();
|
|
188
|
+
return [...map.values()]
|
|
189
|
+
.filter((n) => n.parentId === null && n.status !== "archived")
|
|
190
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
191
|
+
}
|
|
192
|
+
async getAncestors(id) {
|
|
193
|
+
const map = await this.load();
|
|
194
|
+
const path = [];
|
|
195
|
+
let current = map.get(id);
|
|
196
|
+
while (current?.parentId) {
|
|
197
|
+
const parent = map.get(current.parentId);
|
|
198
|
+
if (!parent)
|
|
199
|
+
break;
|
|
200
|
+
path.unshift(parent);
|
|
201
|
+
current = parent;
|
|
202
|
+
}
|
|
203
|
+
return path;
|
|
204
|
+
}
|
|
205
|
+
// ── Questions ────────────────────────────────────────────────────────────
|
|
206
|
+
async getOpenQuestions() {
|
|
207
|
+
const map = await this.load();
|
|
208
|
+
const questions = [...map.values()].filter((n) => n.type === "question" && n.status === "open" && !n.answer);
|
|
209
|
+
const weighted = computeWeights(questions);
|
|
210
|
+
return weighted.sort((a, b) => b.weight - a.weight);
|
|
211
|
+
}
|
|
212
|
+
async answerQuestion(id, answer) {
|
|
213
|
+
const map = await this.load();
|
|
214
|
+
const node = map.get(id);
|
|
215
|
+
if (!node)
|
|
216
|
+
return null;
|
|
217
|
+
if (node.type !== "question")
|
|
218
|
+
return null;
|
|
219
|
+
return this.update(id, {
|
|
220
|
+
answer,
|
|
221
|
+
answeredAt: new Date().toISOString(),
|
|
222
|
+
status: "done",
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async getAnsweredSince(since) {
|
|
226
|
+
const map = await this.load();
|
|
227
|
+
return [...map.values()].filter((n) => n.type === "question" && n.answeredAt && n.answeredAt >= since);
|
|
228
|
+
}
|
|
229
|
+
// ── Weighted / Tree views ────────────────────────────────────────────────
|
|
230
|
+
async getWeighted() {
|
|
231
|
+
const all = await this.list();
|
|
232
|
+
const weighted = computeWeights(all);
|
|
233
|
+
return weighted.sort((a, b) => b.weight - a.weight);
|
|
234
|
+
}
|
|
235
|
+
async getTree(rootId) {
|
|
236
|
+
const all = await this.list();
|
|
237
|
+
const weighted = computeWeights(all);
|
|
238
|
+
return buildTree(weighted, rootId);
|
|
239
|
+
}
|
|
240
|
+
// ── Summary ──────────────────────────────────────────────────────────────
|
|
241
|
+
async getSummary() {
|
|
242
|
+
const all = await this.list();
|
|
243
|
+
const weighted = computeWeights(all);
|
|
244
|
+
const open = all.filter((n) => n.status === "open").length;
|
|
245
|
+
const done = all.filter((n) => n.status === "done").length;
|
|
246
|
+
const openQuestions = all.filter((n) => n.type === "question" && n.status === "open" && !n.answer).length;
|
|
247
|
+
const byTag = {};
|
|
248
|
+
for (const node of all) {
|
|
249
|
+
for (const tag of node.tags) {
|
|
250
|
+
byTag[tag] = (byTag[tag] ?? 0) + 1;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const topWeighted = weighted
|
|
254
|
+
.filter((n) => n.weight > 0)
|
|
255
|
+
.sort((a, b) => b.weight - a.weight)
|
|
256
|
+
.slice(0, 5);
|
|
257
|
+
return {
|
|
258
|
+
total: all.length,
|
|
259
|
+
open,
|
|
260
|
+
done,
|
|
261
|
+
openQuestions,
|
|
262
|
+
topWeighted,
|
|
263
|
+
byTag,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// ── Compaction ───────────────────────────────────────────────────────────
|
|
267
|
+
async compact() {
|
|
268
|
+
const map = await this.load();
|
|
269
|
+
const nodes = [...map.values()];
|
|
270
|
+
const lines = [SCHEMA_LINE, ...nodes.map((n) => JSON.stringify(n))];
|
|
271
|
+
const before = (await readFile(this.filePath, "utf-8"))
|
|
272
|
+
.split("\n")
|
|
273
|
+
.filter((l) => l.trim().length > 0).length;
|
|
274
|
+
await writeFile(this.filePath, lines.join("\n") + "\n", "utf-8");
|
|
275
|
+
const after = lines.length;
|
|
276
|
+
log.info("whiteboard compacted", { before, after });
|
|
277
|
+
return { before, after };
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/whiteboard/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxD,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAE7C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,CAAC;IACV,MAAM,EAAE;QACN,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;QAC3D,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa;QAC9D,WAAW,EAAE,WAAW;KACzB;CACF,CAAC,CAAC;AAEH,6DAA6D;AAC7D,SAAS,UAAU;IACjB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,OAAO,eAAe;IAClB,KAAK,GAAuC,IAAI,CAAC;IACxC,QAAQ,CAAS;IAElC,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC5D,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,wFAAwF;QACxF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,GAAG,CAAC,OAAO;oBAAE,SAAS;gBAC1B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAqB,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAoB;QACvC,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,MAAM,CAAC,KAAsB;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,IAAI,GAAmB;YAC3B,GAAG,KAAK;YACR,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,MAAM;YAC9B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAExB,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9E,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAA8B;QACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,OAAO,GAAmB;YAC9B,GAAG,QAAQ;YACX,GAAG,KAAK;YACR,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAY,oBAAoB;YAC/C,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3B,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,OAAO,GAAG,KAAK;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;QACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAErF,oBAAoB;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAE9C,mCAAmC;QACnC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9D,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,IAAI,CAAC,MAAyB;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAEvE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,IAAI;gBAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;YACzE,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/E,IAAI,MAAM,CAAC,SAAS;gBAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC;YACxF,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrF,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBACxB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,MAAM,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC7C,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACtC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACjC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACjC,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACrC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAChD,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;gBACnC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAC/D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC;aACjE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;QAEvB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;gBAAE,SAAS;YAClD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,gBAAgB;YAChB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAqB,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1B,OAAO,OAAO,EAAE,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM;gBAAE,MAAM;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,gBAAgB;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CACjE,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,MAAc;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAE1C,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;YACrB,MAAM;YACN,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CACtE,CAAC;IACJ,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAe;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CACjE,CAAC,MAAM,CAAC;QAET,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;aACnC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,MAAM;YACjB,IAAI;YACJ,IAAI;YACJ,aAAa;YACb,WAAW;YACX,KAAK;SACN,CAAC;IACJ,CAAC;IAED,4EAA4E;IAE5E,KAAK,CAAC,OAAO;QACX,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;aACpD,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAE7C,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAE3B,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whiteboard types — shared collaboration surface between human and agent.
|
|
3
|
+
*
|
|
4
|
+
* WhiteboardNode is the core data type. Nodes form a tree (parentId).
|
|
5
|
+
* Questions are first-class: they carry attention weight and block
|
|
6
|
+
* downstream work until answered.
|
|
7
|
+
*/
|
|
8
|
+
export type NodeType = "goal" | "task" | "question" | "decision" | "note";
|
|
9
|
+
export type NodeStatus = "open" | "done" | "archived";
|
|
10
|
+
export type NodePlanter = "agent" | "human";
|
|
11
|
+
export interface WhiteboardNode {
|
|
12
|
+
id: string;
|
|
13
|
+
parentId: string | null;
|
|
14
|
+
title: string;
|
|
15
|
+
body?: string;
|
|
16
|
+
type: NodeType;
|
|
17
|
+
status: NodeStatus;
|
|
18
|
+
tags: string[];
|
|
19
|
+
plantedBy: NodePlanter;
|
|
20
|
+
question?: string;
|
|
21
|
+
answer?: string;
|
|
22
|
+
answeredAt?: string;
|
|
23
|
+
boardTaskId?: string;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
}
|
|
27
|
+
export interface WeightedNode extends WhiteboardNode {
|
|
28
|
+
weight: number;
|
|
29
|
+
openDescendants: number;
|
|
30
|
+
}
|
|
31
|
+
export interface TreeNode extends WeightedNode {
|
|
32
|
+
children: TreeNode[];
|
|
33
|
+
path: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface WhiteboardFilter {
|
|
36
|
+
type?: NodeType;
|
|
37
|
+
status?: NodeStatus;
|
|
38
|
+
tags?: string[];
|
|
39
|
+
plantedBy?: NodePlanter;
|
|
40
|
+
parentId?: string;
|
|
41
|
+
search?: string;
|
|
42
|
+
answeredSince?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface WhiteboardSummary {
|
|
45
|
+
total: number;
|
|
46
|
+
open: number;
|
|
47
|
+
done: number;
|
|
48
|
+
openQuestions: number;
|
|
49
|
+
topWeighted: WeightedNode[];
|
|
50
|
+
byTag: Record<string, number>;
|
|
51
|
+
}
|
|
52
|
+
export type CreateNodeInput = Omit<WhiteboardNode, "id" | "createdAt" | "updatedAt" | "status"> & {
|
|
53
|
+
status?: NodeStatus;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/whiteboard/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,WAAW,CAAC;IAGvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,MAAM,WAAW,QAAS,SAAQ,YAAY;IAC5C,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAID,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG;IAChG,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whiteboard types — shared collaboration surface between human and agent.
|
|
3
|
+
*
|
|
4
|
+
* WhiteboardNode is the core data type. Nodes form a tree (parentId).
|
|
5
|
+
* Questions are first-class: they carry attention weight and block
|
|
6
|
+
* downstream work until answered.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/whiteboard/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whiteboard attention weight calculation.
|
|
3
|
+
*
|
|
4
|
+
* Weight determines visual prominence. Computed on read, not stored.
|
|
5
|
+
* Higher weight = more attention needed from the human.
|
|
6
|
+
*
|
|
7
|
+
* Formula:
|
|
8
|
+
* weight = base + age_factor + downstream_factor
|
|
9
|
+
*
|
|
10
|
+
* Capped at 1.0. Items with weight > 0.5 get visual emphasis.
|
|
11
|
+
*/
|
|
12
|
+
import type { WhiteboardNode, WeightedNode } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Compute attention weights for a set of nodes.
|
|
15
|
+
* Builds the parent-child index once, then calculates weight per node.
|
|
16
|
+
*/
|
|
17
|
+
export declare function computeWeights(nodes: WhiteboardNode[]): WeightedNode[];
|
|
18
|
+
/**
|
|
19
|
+
* Build a tree structure from flat weighted nodes.
|
|
20
|
+
* Returns only root nodes with children nested recursively.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildTree(weightedNodes: WeightedNode[], rootId?: string): import("./types.js").TreeNode[];
|
|
23
|
+
//# sourceMappingURL=weight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weight.d.ts","sourceRoot":"","sources":["../../src/whiteboard/weight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA2D/D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CA+BtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,aAAa,EAAE,YAAY,EAAE,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,YAAY,EAAE,QAAQ,EAAE,CAqCjC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whiteboard attention weight calculation.
|
|
3
|
+
*
|
|
4
|
+
* Weight determines visual prominence. Computed on read, not stored.
|
|
5
|
+
* Higher weight = more attention needed from the human.
|
|
6
|
+
*
|
|
7
|
+
* Formula:
|
|
8
|
+
* weight = base + age_factor + downstream_factor
|
|
9
|
+
*
|
|
10
|
+
* Capped at 1.0. Items with weight > 0.5 get visual emphasis.
|
|
11
|
+
*/
|
|
12
|
+
// ── Base weights by type and status ──────────────────────────────────────────
|
|
13
|
+
function getBaseWeight(node) {
|
|
14
|
+
if (node.status === "done" || node.status === "archived")
|
|
15
|
+
return 0;
|
|
16
|
+
switch (node.type) {
|
|
17
|
+
case "question":
|
|
18
|
+
return node.answer ? 0 : 0.6; // Unanswered = high, answered = done
|
|
19
|
+
case "decision":
|
|
20
|
+
return 0.5;
|
|
21
|
+
case "task":
|
|
22
|
+
return 0.2;
|
|
23
|
+
case "goal":
|
|
24
|
+
return 0.1;
|
|
25
|
+
case "note":
|
|
26
|
+
return 0.0;
|
|
27
|
+
default:
|
|
28
|
+
return 0.1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ── Age factor (only for unanswered questions) ───────────────────────────────
|
|
32
|
+
function getAgeFactor(node) {
|
|
33
|
+
if (node.type !== "question" || node.answer)
|
|
34
|
+
return 0;
|
|
35
|
+
if (node.status !== "open")
|
|
36
|
+
return 0;
|
|
37
|
+
const created = new Date(node.createdAt).getTime();
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
const daysSinceCreated = (now - created) / (1000 * 60 * 60 * 24);
|
|
40
|
+
return Math.min(0.3, daysSinceCreated * 0.05);
|
|
41
|
+
}
|
|
42
|
+
// ── Downstream factor ────────────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Count open descendants for a node. Pre-computed via the childrenMap.
|
|
45
|
+
*/
|
|
46
|
+
function countOpenDescendants(nodeId, childrenMap, allNodes) {
|
|
47
|
+
const children = childrenMap.get(nodeId) ?? [];
|
|
48
|
+
let count = 0;
|
|
49
|
+
for (const child of children) {
|
|
50
|
+
if (child.status === "open")
|
|
51
|
+
count++;
|
|
52
|
+
count += countOpenDescendants(child.id, childrenMap, allNodes);
|
|
53
|
+
}
|
|
54
|
+
return count;
|
|
55
|
+
}
|
|
56
|
+
// ── Compute weights for all nodes ────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Compute attention weights for a set of nodes.
|
|
59
|
+
* Builds the parent-child index once, then calculates weight per node.
|
|
60
|
+
*/
|
|
61
|
+
export function computeWeights(nodes) {
|
|
62
|
+
// Build children index
|
|
63
|
+
const allNodes = new Map();
|
|
64
|
+
const childrenMap = new Map();
|
|
65
|
+
for (const node of nodes) {
|
|
66
|
+
allNodes.set(node.id, node);
|
|
67
|
+
}
|
|
68
|
+
for (const node of nodes) {
|
|
69
|
+
if (node.parentId) {
|
|
70
|
+
const siblings = childrenMap.get(node.parentId) ?? [];
|
|
71
|
+
siblings.push(node);
|
|
72
|
+
childrenMap.set(node.parentId, siblings);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Compute weight for each node
|
|
76
|
+
return nodes.map((node) => {
|
|
77
|
+
const base = getBaseWeight(node);
|
|
78
|
+
const age = getAgeFactor(node);
|
|
79
|
+
const openDesc = countOpenDescendants(node.id, childrenMap, allNodes);
|
|
80
|
+
const downstream = 0.03 * openDesc;
|
|
81
|
+
const weight = Math.min(1.0, base + age + downstream);
|
|
82
|
+
return {
|
|
83
|
+
...node,
|
|
84
|
+
weight: Math.round(weight * 100) / 100, // 2 decimal places
|
|
85
|
+
openDescendants: openDesc,
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build a tree structure from flat weighted nodes.
|
|
91
|
+
* Returns only root nodes with children nested recursively.
|
|
92
|
+
*/
|
|
93
|
+
export function buildTree(weightedNodes, rootId) {
|
|
94
|
+
const nodeMap = new Map();
|
|
95
|
+
const childrenMap = new Map();
|
|
96
|
+
for (const node of weightedNodes) {
|
|
97
|
+
nodeMap.set(node.id, node);
|
|
98
|
+
}
|
|
99
|
+
for (const node of weightedNodes) {
|
|
100
|
+
const parentKey = node.parentId ?? "__root__";
|
|
101
|
+
const siblings = childrenMap.get(parentKey) ?? [];
|
|
102
|
+
siblings.push(node);
|
|
103
|
+
childrenMap.set(parentKey, siblings);
|
|
104
|
+
}
|
|
105
|
+
function buildSubtree(nodeId, path) {
|
|
106
|
+
const node = nodeMap.get(nodeId);
|
|
107
|
+
const children = (childrenMap.get(nodeId) ?? [])
|
|
108
|
+
.map((child) => buildSubtree(child.id, [...path, nodeId]));
|
|
109
|
+
return {
|
|
110
|
+
...node,
|
|
111
|
+
children,
|
|
112
|
+
path,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// If rootId specified, build subtree from that node
|
|
116
|
+
if (rootId) {
|
|
117
|
+
const rootNode = nodeMap.get(rootId);
|
|
118
|
+
if (!rootNode)
|
|
119
|
+
return [];
|
|
120
|
+
return [buildSubtree(rootId, [])];
|
|
121
|
+
}
|
|
122
|
+
// Otherwise, build from all root nodes (parentId === null)
|
|
123
|
+
const roots = childrenMap.get("__root__") ?? [];
|
|
124
|
+
return roots.map((root) => buildSubtree(root.id, []));
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=weight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weight.js","sourceRoot":"","sources":["../../src/whiteboard/weight.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runcore-sh/runcore",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.8",
|
|
4
4
|
"description": "Local-first AI agent runtime. One command, your machine, your data.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"files": [
|
|
12
12
|
"dist",
|
|
13
13
|
"public",
|
|
14
|
+
"!public/avatar",
|
|
14
15
|
"skills",
|
|
15
16
|
"dictionary.json",
|
|
16
17
|
"brain-template",
|
|
@@ -49,7 +50,7 @@
|
|
|
49
50
|
"homepage": "https://runcore.sh",
|
|
50
51
|
"repository": {
|
|
51
52
|
"type": "git",
|
|
52
|
-
"url": "https://github.com/XDM-ZSBW/
|
|
53
|
+
"url": "https://github.com/XDM-ZSBW/runcore"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
56
|
"@types/multicast-dns": "^7.2.4",
|