@roarpeng/graphflow 1.9.13 → 1.9.14
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/AGENTS.md +2 -0
- package/CHANGELOG.md +20 -0
- package/CLAUDE.md +2 -0
- package/README.md +49 -8
- package/README.zh.md +129 -0
- package/cordis.patch.yml +30 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +1 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +6 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/graph/snapshot-view.d.ts +4 -0
- package/dist/graph/snapshot-view.d.ts.map +1 -1
- package/dist/graph/snapshot-view.js +36 -2
- package/dist/graph/snapshot-view.js.map +1 -1
- package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
- package/dist/integrations/agent-mcp-installer.js +8 -0
- package/dist/integrations/agent-mcp-installer.js.map +1 -1
- package/dist/integrations/agent-profiles/index.d.ts +2 -0
- package/dist/integrations/agent-profiles/index.d.ts.map +1 -1
- package/dist/integrations/agent-profiles/index.js +2 -0
- package/dist/integrations/agent-profiles/index.js.map +1 -1
- package/dist/integrations/agent-profiles/profiles/dsh.d.ts +2 -0
- package/dist/integrations/agent-profiles/profiles/dsh.d.ts.map +1 -0
- package/dist/integrations/agent-profiles/profiles/dsh.js +16 -0
- package/dist/integrations/agent-profiles/profiles/dsh.js.map +1 -0
- package/dist/integrations/agent-profiles/skills/dsh.d.ts +2 -0
- package/dist/integrations/agent-profiles/skills/dsh.d.ts.map +1 -0
- package/dist/integrations/agent-profiles/skills/dsh.js +13 -0
- package/dist/integrations/agent-profiles/skills/dsh.js.map +1 -0
- package/dist/integrations/dsh-harness-installer.d.ts +49 -0
- package/dist/integrations/dsh-harness-installer.d.ts.map +1 -0
- package/dist/integrations/dsh-harness-installer.js +193 -0
- package/dist/integrations/dsh-harness-installer.js.map +1 -0
- package/dist/integrations/skill-installer.d.ts.map +1 -1
- package/dist/integrations/skill-installer.js +6 -0
- package/dist/integrations/skill-installer.js.map +1 -1
- package/dist/learning/dialogue-thread.d.ts +88 -0
- package/dist/learning/dialogue-thread.d.ts.map +1 -0
- package/dist/learning/dialogue-thread.js +419 -0
- package/dist/learning/dialogue-thread.js.map +1 -0
- package/dist/learning/workbench-topic.d.ts +116 -0
- package/dist/learning/workbench-topic.d.ts.map +1 -0
- package/dist/learning/workbench-topic.js +642 -0
- package/dist/learning/workbench-topic.js.map +1 -0
- package/dist/surfaces/cli/index.js +123 -5
- package/dist/surfaces/cli/index.js.map +1 -1
- package/dist/surfaces/cli/init.d.ts +3 -0
- package/dist/surfaces/cli/init.d.ts.map +1 -1
- package/dist/surfaces/cli/init.js +36 -3
- package/dist/surfaces/cli/init.js.map +1 -1
- package/dist/surfaces/cli/output.d.ts.map +1 -1
- package/dist/surfaces/cli/output.js +3 -0
- package/dist/surfaces/cli/output.js.map +1 -1
- package/dist/surfaces/cli/runtime/dialogue.d.ts +23 -0
- package/dist/surfaces/cli/runtime/dialogue.d.ts.map +1 -0
- package/dist/surfaces/cli/runtime/dialogue.js +50 -0
- package/dist/surfaces/cli/runtime/dialogue.js.map +1 -0
- package/dist/surfaces/cli/runtime/graph.d.ts +11 -2
- package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/graph.js +225 -5
- package/dist/surfaces/cli/runtime/graph.js.map +1 -1
- package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/routing.js +44 -3
- package/dist/surfaces/cli/runtime/routing.js.map +1 -1
- package/dist/surfaces/cli/runtime/types.d.ts +48 -0
- package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.d.ts +2 -1
- package/dist/surfaces/cli/runtime.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.js +7 -2
- package/dist/surfaces/cli/runtime.js.map +1 -1
- package/dist/surfaces/cursor-rules/graphflow.mdc +10 -3
- package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
- package/dist/surfaces/mcp/tool-definitions.js +23 -3
- package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
- package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
- package/dist/surfaces/mcp/tool-handlers.js +27 -3
- package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
- package/dist/surfaces/trae-skill/graphflow/SKILL.md +50 -5
- package/package.json +11 -2
- package/plugin.json +27 -4
- package/skills/graphflow/SKILL.md +50 -5
- package/src/surfaces/cursor-rules/graphflow.mdc +10 -3
- package/src/surfaces/trae-skill/graphflow/SKILL.md +50 -5
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DIALOGUE_TURN_SENTINEL = exports.DIALOGUE_SESSION_KIND = exports.DIALOGUE_TURN_KIND = exports.DIALOGUE_SESSION_PREFIX = exports.DIALOGUE_TURN_PREFIX = void 0;
|
|
4
|
+
exports.dialogueSessionIdFor = dialogueSessionIdFor;
|
|
5
|
+
exports.dialogueTurnIdFor = dialogueTurnIdFor;
|
|
6
|
+
exports.isDialogueTurnNode = isDialogueTurnNode;
|
|
7
|
+
exports.isDialogueSessionNode = isDialogueSessionNode;
|
|
8
|
+
exports.parseDialogueTurn = parseDialogueTurn;
|
|
9
|
+
exports.parseDialogueSession = parseDialogueSession;
|
|
10
|
+
exports.recordDialogueTurn = recordDialogueTurn;
|
|
11
|
+
exports.listDialogueTurns = listDialogueTurns;
|
|
12
|
+
exports.loadDialogueThread = loadDialogueThread;
|
|
13
|
+
exports.formatDialogueThreadLines = formatDialogueThreadLines;
|
|
14
|
+
exports.scoreTopicOverlap = scoreTopicOverlap;
|
|
15
|
+
const hash_1 = require("../utils/hash");
|
|
16
|
+
/**
|
|
17
|
+
* Dialogue threads: each user question (+ optional LLM reply) becomes a
|
|
18
|
+
* Decision node so a conversation stays a connected graph — sequential turns
|
|
19
|
+
* AND topic jumps. Clicking a turn means "resume from this node".
|
|
20
|
+
*
|
|
21
|
+
* Layout (same Decision + metadata.kind pattern as episodes / goals):
|
|
22
|
+
* - session hub: id = dialogue-session:<hash>, kind "dialogue-session"
|
|
23
|
+
* - turn: id = dialogue:<sessionHash>:<seq>, kind "dialogue-turn"
|
|
24
|
+
* - edges: turn -part_of-> session
|
|
25
|
+
* parent -next_section-> turn (resumeFrom or previous tip)
|
|
26
|
+
* prevTip -co_occurs-> turn (when the click is a jump)
|
|
27
|
+
* turn -references-> code (optional L1 anchors)
|
|
28
|
+
*/
|
|
29
|
+
exports.DIALOGUE_TURN_PREFIX = "dialogue:";
|
|
30
|
+
exports.DIALOGUE_SESSION_PREFIX = "dialogue-session:";
|
|
31
|
+
exports.DIALOGUE_TURN_KIND = "dialogue-turn";
|
|
32
|
+
exports.DIALOGUE_SESSION_KIND = "dialogue-session";
|
|
33
|
+
exports.DIALOGUE_TURN_SENTINEL = "dialogue-turn";
|
|
34
|
+
const DEFAULT_SESSION_NAME = "main";
|
|
35
|
+
const DEDUPE_WINDOW_MS = 30 * 60 * 1000;
|
|
36
|
+
const MAX_QUERY_CHARS = 4_000;
|
|
37
|
+
const MAX_REPLY_CHARS = 4_000;
|
|
38
|
+
const MAX_RELATED_CODE = 6;
|
|
39
|
+
const MAX_THREAD_PROMPT_TURNS = 6;
|
|
40
|
+
const MIN_QUERY_CHARS = 4;
|
|
41
|
+
function dialogueSessionIdFor(sessionName, workspaceRoot) {
|
|
42
|
+
const key = `${normalizeSessionName(sessionName)}|${(workspaceRoot ?? "").trim().toLowerCase()}`;
|
|
43
|
+
return `${exports.DIALOGUE_SESSION_PREFIX}${(0, hash_1.hashText)(key)}`;
|
|
44
|
+
}
|
|
45
|
+
function dialogueTurnIdFor(sessionId, seq) {
|
|
46
|
+
const sessionHash = sessionId.startsWith(exports.DIALOGUE_SESSION_PREFIX)
|
|
47
|
+
? sessionId.slice(exports.DIALOGUE_SESSION_PREFIX.length)
|
|
48
|
+
: (0, hash_1.hashText)(sessionId);
|
|
49
|
+
return `${exports.DIALOGUE_TURN_PREFIX}${sessionHash}:${String(seq).padStart(4, "0")}`;
|
|
50
|
+
}
|
|
51
|
+
function isDialogueTurnNode(node) {
|
|
52
|
+
return node.metadata?.kind === exports.DIALOGUE_TURN_KIND || node.id.startsWith(exports.DIALOGUE_TURN_PREFIX);
|
|
53
|
+
}
|
|
54
|
+
function isDialogueSessionNode(node) {
|
|
55
|
+
return node.metadata?.kind === exports.DIALOGUE_SESSION_KIND || node.id.startsWith(exports.DIALOGUE_SESSION_PREFIX);
|
|
56
|
+
}
|
|
57
|
+
function parseDialogueTurn(node) {
|
|
58
|
+
if (!isDialogueTurnNode(node))
|
|
59
|
+
return undefined;
|
|
60
|
+
return deserializeTurn(node);
|
|
61
|
+
}
|
|
62
|
+
function parseDialogueSession(node) {
|
|
63
|
+
if (!isDialogueSessionNode(node))
|
|
64
|
+
return undefined;
|
|
65
|
+
return deserializeSession(node);
|
|
66
|
+
}
|
|
67
|
+
async function recordDialogueTurn(client, input) {
|
|
68
|
+
const userQuery = clip(input.userQuery, MAX_QUERY_CHARS);
|
|
69
|
+
const now = input.now ?? Date.now();
|
|
70
|
+
const sessionName = normalizeSessionName(input.sessionName);
|
|
71
|
+
const sessionId = dialogueSessionIdFor(sessionName, input.workspaceRoot);
|
|
72
|
+
const assistantReply = clip(input.assistantReply ?? "", MAX_REPLY_CHARS);
|
|
73
|
+
const session = (await loadSession(client, sessionId)) ?? {
|
|
74
|
+
id: sessionId,
|
|
75
|
+
name: sessionName,
|
|
76
|
+
turnCount: 0,
|
|
77
|
+
topicTokens: [],
|
|
78
|
+
createdAt: now,
|
|
79
|
+
updatedAt: now,
|
|
80
|
+
};
|
|
81
|
+
const existingTurns = await listDialogueTurns(client, { sessionId, limit: 500 });
|
|
82
|
+
const tip = existingTurns.find((turn) => turn.id === session.tipTurnId) ?? existingTurns[existingTurns.length - 1];
|
|
83
|
+
if (userQuery.trim().length < MIN_QUERY_CHARS) {
|
|
84
|
+
if (assistantReply && tip) {
|
|
85
|
+
const updated = { ...tip, assistantReply, updatedAt: now };
|
|
86
|
+
await persistTurn(client, updated, session, {
|
|
87
|
+
linkParent: false,
|
|
88
|
+
jumped: tip.jumped,
|
|
89
|
+
relatedNodeIds: mergeRelated(tip.relatedNodeIds, input.relatedNodeIds),
|
|
90
|
+
});
|
|
91
|
+
const nextSession = { ...session, tipTurnId: updated.id, updatedAt: now };
|
|
92
|
+
await persistSession(client, nextSession);
|
|
93
|
+
return { recorded: true, reused: true, jumped: updated.jumped, turn: updated, session: nextSession };
|
|
94
|
+
}
|
|
95
|
+
return { recorded: false, reused: false, jumped: false, skipped: "query-too-short" };
|
|
96
|
+
}
|
|
97
|
+
if (tip && shouldReuseTurn(tip, userQuery, now)) {
|
|
98
|
+
const updated = {
|
|
99
|
+
...tip,
|
|
100
|
+
...(assistantReply ? { assistantReply } : {}),
|
|
101
|
+
updatedAt: now,
|
|
102
|
+
};
|
|
103
|
+
await persistTurn(client, updated, session, {
|
|
104
|
+
linkParent: false,
|
|
105
|
+
jumped: tip.jumped,
|
|
106
|
+
relatedNodeIds: mergeRelated(tip.relatedNodeIds, input.relatedNodeIds),
|
|
107
|
+
});
|
|
108
|
+
const nextSession = {
|
|
109
|
+
...session,
|
|
110
|
+
tipTurnId: updated.id,
|
|
111
|
+
updatedAt: now,
|
|
112
|
+
topicTokens: mergeTopicTokens(session.topicTokens, userQuery),
|
|
113
|
+
};
|
|
114
|
+
await persistSession(client, nextSession);
|
|
115
|
+
return { recorded: true, reused: true, jumped: updated.jumped, turn: updated, session: nextSession };
|
|
116
|
+
}
|
|
117
|
+
const resumeFrom = input.resumeFromTurnId?.trim() || undefined;
|
|
118
|
+
const parentTurnId = resumeFrom && existingTurns.some((turn) => turn.id === resumeFrom) ? resumeFrom : tip?.id;
|
|
119
|
+
const jumped = Boolean(parentTurnId && tip && parentTurnId !== tip.id);
|
|
120
|
+
const seq = session.turnCount + 1;
|
|
121
|
+
const turn = {
|
|
122
|
+
id: dialogueTurnIdFor(sessionId, seq),
|
|
123
|
+
sessionId,
|
|
124
|
+
seq,
|
|
125
|
+
userQuery,
|
|
126
|
+
assistantReply,
|
|
127
|
+
...(parentTurnId ? { parentTurnId } : {}),
|
|
128
|
+
jumped,
|
|
129
|
+
relatedNodeIds: uniqueIds(input.relatedNodeIds).slice(0, MAX_RELATED_CODE),
|
|
130
|
+
createdAt: now,
|
|
131
|
+
updatedAt: now,
|
|
132
|
+
};
|
|
133
|
+
const nextSession = {
|
|
134
|
+
...session,
|
|
135
|
+
tipTurnId: turn.id,
|
|
136
|
+
turnCount: seq,
|
|
137
|
+
topicTokens: mergeTopicTokens(session.topicTokens, userQuery),
|
|
138
|
+
updatedAt: now,
|
|
139
|
+
};
|
|
140
|
+
await persistSession(client, nextSession);
|
|
141
|
+
const previousTipId = jumped ? tip?.id : undefined;
|
|
142
|
+
await persistTurn(client, turn, nextSession, {
|
|
143
|
+
linkParent: true,
|
|
144
|
+
jumped,
|
|
145
|
+
...(previousTipId ? { previousTipId } : {}),
|
|
146
|
+
relatedNodeIds: turn.relatedNodeIds,
|
|
147
|
+
});
|
|
148
|
+
return { recorded: true, reused: false, jumped, turn, session: nextSession };
|
|
149
|
+
}
|
|
150
|
+
async function listDialogueTurns(client, options) {
|
|
151
|
+
const nodes = await collectDialogueNodes(client);
|
|
152
|
+
const turns = [];
|
|
153
|
+
for (const node of nodes) {
|
|
154
|
+
const rec = parseDialogueTurn(node);
|
|
155
|
+
if (!rec)
|
|
156
|
+
continue;
|
|
157
|
+
if (options?.sessionId && rec.sessionId !== options.sessionId)
|
|
158
|
+
continue;
|
|
159
|
+
turns.push(rec);
|
|
160
|
+
}
|
|
161
|
+
if (options?.sessionId) {
|
|
162
|
+
turns.sort((a, b) => a.seq - b.seq || a.createdAt - b.createdAt || a.id.localeCompare(b.id));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
turns.sort((a, b) => b.updatedAt - a.updatedAt || b.seq - a.seq || a.id.localeCompare(b.id));
|
|
166
|
+
}
|
|
167
|
+
const limit = options?.limit;
|
|
168
|
+
if (limit === undefined) {
|
|
169
|
+
return turns;
|
|
170
|
+
}
|
|
171
|
+
const bounded = Math.max(1, limit);
|
|
172
|
+
if (options?.sessionId) {
|
|
173
|
+
return turns.slice(Math.max(0, turns.length - bounded));
|
|
174
|
+
}
|
|
175
|
+
return turns.slice(0, bounded);
|
|
176
|
+
}
|
|
177
|
+
async function loadDialogueThread(client, options) {
|
|
178
|
+
const sessionId = options?.sessionId ?? dialogueSessionIdFor(normalizeSessionName(options?.sessionName), options?.workspaceRoot);
|
|
179
|
+
const session = await loadSession(client, sessionId);
|
|
180
|
+
if (!session) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const turns = await listDialogueTurns(client, {
|
|
184
|
+
sessionId,
|
|
185
|
+
limit: options?.limit ?? MAX_THREAD_PROMPT_TURNS,
|
|
186
|
+
});
|
|
187
|
+
if (turns.length === 0) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
sessionId,
|
|
192
|
+
sessionName: session.name,
|
|
193
|
+
...(session.tipTurnId ? { tipTurnId: session.tipTurnId } : {}),
|
|
194
|
+
jumped: turns[turns.length - 1]?.jumped === true,
|
|
195
|
+
overlap: 1,
|
|
196
|
+
turns,
|
|
197
|
+
promptLines: formatDialogueThreadLines({
|
|
198
|
+
sessionId,
|
|
199
|
+
sessionName: session.name,
|
|
200
|
+
...(session.tipTurnId ? { tipTurnId: session.tipTurnId } : {}),
|
|
201
|
+
jumped: turns[turns.length - 1]?.jumped === true,
|
|
202
|
+
overlap: 1,
|
|
203
|
+
turns,
|
|
204
|
+
promptLines: [],
|
|
205
|
+
}),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function formatDialogueThreadLines(thread) {
|
|
209
|
+
const lines = [
|
|
210
|
+
`Thread: ${thread.sessionName} turns=${thread.turns.length}` +
|
|
211
|
+
(thread.tipTurnId ? ` tip=${thread.tipTurnId}` : "") +
|
|
212
|
+
(thread.jumped ? " jumped" : " mainline"),
|
|
213
|
+
];
|
|
214
|
+
for (const turn of thread.turns.slice(-MAX_THREAD_PROMPT_TURNS)) {
|
|
215
|
+
const jumpMark = turn.jumped ? ` jump←${turn.parentTurnId ?? "?"}` : "";
|
|
216
|
+
const answer = turn.assistantReply.trim() ? clip(turn.assistantReply, 120) : "(pending)";
|
|
217
|
+
lines.push(`Turn #${turn.seq}${jumpMark} Q: ${clip(turn.userQuery, 80)} | A: ${answer}`);
|
|
218
|
+
}
|
|
219
|
+
lines.push(`Resume: graphflow_context({ resumeFromTurnId: "<dialogue turn id>" }) to continue from a clicked turn.`);
|
|
220
|
+
return lines;
|
|
221
|
+
}
|
|
222
|
+
function scoreTopicOverlap(previousTokens, query) {
|
|
223
|
+
const next = extractTokens(query);
|
|
224
|
+
if (previousTokens.length === 0 || next.length === 0) {
|
|
225
|
+
return 1;
|
|
226
|
+
}
|
|
227
|
+
const prev = new Set(previousTokens);
|
|
228
|
+
let hit = 0;
|
|
229
|
+
for (const token of next) {
|
|
230
|
+
if (prev.has(token))
|
|
231
|
+
hit += 1;
|
|
232
|
+
}
|
|
233
|
+
return hit / next.length;
|
|
234
|
+
}
|
|
235
|
+
async function persistTurn(client, turn, session, options) {
|
|
236
|
+
const related = uniqueIds(options.relatedNodeIds ?? turn.relatedNodeIds).slice(0, MAX_RELATED_CODE);
|
|
237
|
+
const stored = { ...turn, relatedNodeIds: related };
|
|
238
|
+
const node = {
|
|
239
|
+
id: stored.id,
|
|
240
|
+
type: "Decision",
|
|
241
|
+
content: compactTurnContent(stored),
|
|
242
|
+
metadata: {
|
|
243
|
+
kind: exports.DIALOGUE_TURN_KIND,
|
|
244
|
+
record: JSON.stringify(stored),
|
|
245
|
+
seq: stored.seq,
|
|
246
|
+
sessionId: stored.sessionId,
|
|
247
|
+
jumped: stored.jumped,
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
await client.upsertNodes([node]);
|
|
251
|
+
const edges = [{ from: stored.id, to: session.id, relation: "part_of" }];
|
|
252
|
+
if (options.linkParent && stored.parentTurnId) {
|
|
253
|
+
edges.push({ from: stored.parentTurnId, to: stored.id, relation: "next_section" });
|
|
254
|
+
}
|
|
255
|
+
if (options.jumped && options.previousTipId && options.previousTipId !== stored.parentTurnId) {
|
|
256
|
+
edges.push({ from: options.previousTipId, to: stored.id, relation: "co_occurs" });
|
|
257
|
+
}
|
|
258
|
+
for (const relatedId of related) {
|
|
259
|
+
edges.push({ from: stored.id, to: relatedId, relation: "references" });
|
|
260
|
+
}
|
|
261
|
+
await upsertUniqueEdges(client, edges);
|
|
262
|
+
}
|
|
263
|
+
async function persistSession(client, session) {
|
|
264
|
+
const node = {
|
|
265
|
+
id: session.id,
|
|
266
|
+
type: "Decision",
|
|
267
|
+
content: `dialogue-session ${session.name} turns=${session.turnCount}` +
|
|
268
|
+
(session.tipTurnId ? ` tip=${session.tipTurnId}` : ""),
|
|
269
|
+
metadata: {
|
|
270
|
+
kind: exports.DIALOGUE_SESSION_KIND,
|
|
271
|
+
record: JSON.stringify(session),
|
|
272
|
+
name: session.name,
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
await client.upsertNodes([node]);
|
|
276
|
+
}
|
|
277
|
+
async function loadSession(client, sessionId) {
|
|
278
|
+
if (typeof client.getNodesByIds === "function") {
|
|
279
|
+
const nodes = await client.getNodesByIds([sessionId]);
|
|
280
|
+
const node = nodes.find((item) => item.id === sessionId);
|
|
281
|
+
if (node) {
|
|
282
|
+
return parseDialogueSession(node);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const nodes = await collectDialogueNodes(client);
|
|
286
|
+
const node = nodes.find((item) => item.id === sessionId);
|
|
287
|
+
return node ? parseDialogueSession(node) : undefined;
|
|
288
|
+
}
|
|
289
|
+
async function collectDialogueNodes(client) {
|
|
290
|
+
const snapshot = client.readSnapshot?.();
|
|
291
|
+
if (snapshot) {
|
|
292
|
+
return snapshot.nodes.filter((node) => isDialogueTurnNode(node) || isDialogueSessionNode(node));
|
|
293
|
+
}
|
|
294
|
+
const byId = new Map();
|
|
295
|
+
for (const query of [exports.DIALOGUE_TURN_SENTINEL, "dialogue-session", exports.DIALOGUE_TURN_PREFIX]) {
|
|
296
|
+
for (const node of await client.queryByKeyword(query)) {
|
|
297
|
+
if (isDialogueTurnNode(node) || isDialogueSessionNode(node)) {
|
|
298
|
+
byId.set(node.id, node);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return Array.from(byId.values());
|
|
303
|
+
}
|
|
304
|
+
async function upsertUniqueEdges(client, edges) {
|
|
305
|
+
if (edges.length === 0)
|
|
306
|
+
return;
|
|
307
|
+
const snapshot = client.readSnapshot?.();
|
|
308
|
+
const existing = new Set((snapshot?.edges ?? []).map((edge) => `${edge.from}|${edge.relation}|${edge.to}`));
|
|
309
|
+
const fresh = edges.filter((edge) => !existing.has(`${edge.from}|${edge.relation}|${edge.to}`));
|
|
310
|
+
if (fresh.length === 0)
|
|
311
|
+
return;
|
|
312
|
+
await client.upsertEdges(fresh);
|
|
313
|
+
}
|
|
314
|
+
function shouldReuseTurn(turn, userQuery, now) {
|
|
315
|
+
if (now - turn.updatedAt > DEDUPE_WINDOW_MS)
|
|
316
|
+
return false;
|
|
317
|
+
return normalizeQuery(turn.userQuery) === normalizeQuery(userQuery);
|
|
318
|
+
}
|
|
319
|
+
function compactTurnContent(turn) {
|
|
320
|
+
const answer = turn.assistantReply.trim() ? clip(turn.assistantReply, 160) : "(pending)";
|
|
321
|
+
return `${exports.DIALOGUE_TURN_SENTINEL} #${turn.seq} Q: ${clip(turn.userQuery, 160)} | A: ${answer}`;
|
|
322
|
+
}
|
|
323
|
+
function deserializeTurn(node) {
|
|
324
|
+
const raw = typeof node.metadata?.record === "string" ? node.metadata.record : undefined;
|
|
325
|
+
if (!raw)
|
|
326
|
+
return undefined;
|
|
327
|
+
try {
|
|
328
|
+
const parsed = JSON.parse(raw);
|
|
329
|
+
if (typeof parsed.id !== "string" || typeof parsed.userQuery !== "string")
|
|
330
|
+
return undefined;
|
|
331
|
+
return {
|
|
332
|
+
id: parsed.id,
|
|
333
|
+
sessionId: typeof parsed.sessionId === "string" ? parsed.sessionId : "",
|
|
334
|
+
seq: typeof parsed.seq === "number" ? parsed.seq : 0,
|
|
335
|
+
userQuery: parsed.userQuery,
|
|
336
|
+
assistantReply: typeof parsed.assistantReply === "string" ? parsed.assistantReply : "",
|
|
337
|
+
...(typeof parsed.parentTurnId === "string" ? { parentTurnId: parsed.parentTurnId } : {}),
|
|
338
|
+
jumped: parsed.jumped === true,
|
|
339
|
+
relatedNodeIds: Array.isArray(parsed.relatedNodeIds)
|
|
340
|
+
? parsed.relatedNodeIds.filter((id) => typeof id === "string")
|
|
341
|
+
: [],
|
|
342
|
+
createdAt: typeof parsed.createdAt === "number" ? parsed.createdAt : 0,
|
|
343
|
+
updatedAt: typeof parsed.updatedAt === "number" ? parsed.updatedAt : 0,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function deserializeSession(node) {
|
|
351
|
+
const raw = typeof node.metadata?.record === "string" ? node.metadata.record : undefined;
|
|
352
|
+
if (!raw)
|
|
353
|
+
return undefined;
|
|
354
|
+
try {
|
|
355
|
+
const parsed = JSON.parse(raw);
|
|
356
|
+
if (typeof parsed.id !== "string")
|
|
357
|
+
return undefined;
|
|
358
|
+
return {
|
|
359
|
+
id: parsed.id,
|
|
360
|
+
name: typeof parsed.name === "string" ? parsed.name : DEFAULT_SESSION_NAME,
|
|
361
|
+
...(typeof parsed.tipTurnId === "string" ? { tipTurnId: parsed.tipTurnId } : {}),
|
|
362
|
+
turnCount: typeof parsed.turnCount === "number" ? parsed.turnCount : 0,
|
|
363
|
+
topicTokens: Array.isArray(parsed.topicTokens)
|
|
364
|
+
? parsed.topicTokens.filter((token) => typeof token === "string")
|
|
365
|
+
: [],
|
|
366
|
+
createdAt: typeof parsed.createdAt === "number" ? parsed.createdAt : 0,
|
|
367
|
+
updatedAt: typeof parsed.updatedAt === "number" ? parsed.updatedAt : 0,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
return undefined;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
function normalizeSessionName(name) {
|
|
375
|
+
const trimmed = name?.trim();
|
|
376
|
+
return trimmed && trimmed.length > 0 ? trimmed.slice(0, 64) : DEFAULT_SESSION_NAME;
|
|
377
|
+
}
|
|
378
|
+
function normalizeQuery(query) {
|
|
379
|
+
return query.trim().replace(/\s+/g, " ").toLowerCase();
|
|
380
|
+
}
|
|
381
|
+
function clip(text, max) {
|
|
382
|
+
const normalized = text.replace(/\s+/g, " ").trim();
|
|
383
|
+
if (normalized.length <= max)
|
|
384
|
+
return normalized;
|
|
385
|
+
return `${normalized.slice(0, max - 1)}…`;
|
|
386
|
+
}
|
|
387
|
+
function extractTokens(text) {
|
|
388
|
+
const out = new Set();
|
|
389
|
+
for (const raw of text.toLowerCase().split(/[^a-z0-9_\u4e00-\u9fff]+/)) {
|
|
390
|
+
if (raw.length >= 2)
|
|
391
|
+
out.add(raw);
|
|
392
|
+
}
|
|
393
|
+
return Array.from(out);
|
|
394
|
+
}
|
|
395
|
+
function mergeTopicTokens(existing, query) {
|
|
396
|
+
const merged = new Set(existing);
|
|
397
|
+
for (const token of extractTokens(query)) {
|
|
398
|
+
merged.add(token);
|
|
399
|
+
}
|
|
400
|
+
return Array.from(merged).sort().slice(0, 48);
|
|
401
|
+
}
|
|
402
|
+
function uniqueIds(ids) {
|
|
403
|
+
if (!ids)
|
|
404
|
+
return [];
|
|
405
|
+
const seen = new Set();
|
|
406
|
+
const out = [];
|
|
407
|
+
for (const id of ids) {
|
|
408
|
+
const trimmed = id.trim();
|
|
409
|
+
if (!trimmed || seen.has(trimmed))
|
|
410
|
+
continue;
|
|
411
|
+
seen.add(trimmed);
|
|
412
|
+
out.push(trimmed);
|
|
413
|
+
}
|
|
414
|
+
return out;
|
|
415
|
+
}
|
|
416
|
+
function mergeRelated(current, incoming) {
|
|
417
|
+
return uniqueIds([...current, ...(incoming ?? [])]).slice(0, MAX_RELATED_CODE);
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=dialogue-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue-thread.js","sourceRoot":"","sources":["../../src/learning/dialogue-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { GraphEdge, GraphNode } from "../core/types";
|
|
2
|
+
import type { GraphClient } from "../graph/client-factory";
|
|
3
|
+
/**
|
|
4
|
+
* Workbench topic containers: the canvas node is a *function/topic*, not a turn.
|
|
5
|
+
*
|
|
6
|
+
* Complex task → seed a root + one topic per plan DAG step (mainline).
|
|
7
|
+
* Click a topic → that container becomes active; further Q&A appends as messages.
|
|
8
|
+
* Drift → an isolated (non-mainline) topic is forked so the mainline stays clean.
|
|
9
|
+
* Click a mainline topic → active pointer jumps back; next context is Goal + path + local messages.
|
|
10
|
+
*/
|
|
11
|
+
export declare const WORKBENCH_ROOT_PREFIX = "workbench:";
|
|
12
|
+
export declare const WORKBENCH_TOPIC_PREFIX = "topic:";
|
|
13
|
+
export declare const WORKBENCH_ROOT_KIND = "workbench-root";
|
|
14
|
+
export declare const WORKBENCH_TOPIC_KIND = "workbench-topic";
|
|
15
|
+
export interface WorkbenchMessage {
|
|
16
|
+
role: "user" | "assistant";
|
|
17
|
+
content: string;
|
|
18
|
+
at: number;
|
|
19
|
+
}
|
|
20
|
+
export interface WorkbenchTopicRecord {
|
|
21
|
+
id: string;
|
|
22
|
+
rootId: string;
|
|
23
|
+
title: string;
|
|
24
|
+
description: string;
|
|
25
|
+
mainline: boolean;
|
|
26
|
+
isolated: boolean;
|
|
27
|
+
planStepId?: string;
|
|
28
|
+
messages: WorkbenchMessage[];
|
|
29
|
+
createdAt: number;
|
|
30
|
+
updatedAt: number;
|
|
31
|
+
}
|
|
32
|
+
export interface WorkbenchRootRecord {
|
|
33
|
+
id: string;
|
|
34
|
+
task: string;
|
|
35
|
+
activeTopicId: string;
|
|
36
|
+
createdAt: number;
|
|
37
|
+
updatedAt: number;
|
|
38
|
+
}
|
|
39
|
+
export interface PlanStepSeed {
|
|
40
|
+
id: string;
|
|
41
|
+
description: string;
|
|
42
|
+
dependencies: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface WorkbenchContextView {
|
|
45
|
+
rootId: string;
|
|
46
|
+
task: string;
|
|
47
|
+
active: WorkbenchTopicRecord;
|
|
48
|
+
ancestors: Array<{
|
|
49
|
+
id: string;
|
|
50
|
+
title: string;
|
|
51
|
+
description: string;
|
|
52
|
+
}>;
|
|
53
|
+
isolated: boolean;
|
|
54
|
+
promptLines: string[];
|
|
55
|
+
outline?: WorkbenchOutline;
|
|
56
|
+
}
|
|
57
|
+
/** On-demand outline tree. Titles are display labels from the plan DAG / first drifted question. */
|
|
58
|
+
export interface WorkbenchOutlineNode {
|
|
59
|
+
id: string;
|
|
60
|
+
title: string;
|
|
61
|
+
kind: "mainline" | "side";
|
|
62
|
+
active: boolean;
|
|
63
|
+
messageCount: number;
|
|
64
|
+
pendingReply: boolean;
|
|
65
|
+
lastUserPreview?: string;
|
|
66
|
+
children: WorkbenchOutlineNode[];
|
|
67
|
+
}
|
|
68
|
+
export interface WorkbenchOutline {
|
|
69
|
+
rootId: string;
|
|
70
|
+
task: string;
|
|
71
|
+
activeTopicId: string;
|
|
72
|
+
nodes: WorkbenchOutlineNode[];
|
|
73
|
+
}
|
|
74
|
+
export declare function workbenchRootIdFor(task: string, workspaceRoot?: string): string;
|
|
75
|
+
export declare function workbenchTopicIdFor(rootId: string, planStepId: string): string;
|
|
76
|
+
export declare function isWorkbenchTopicNode(node: GraphNode): boolean;
|
|
77
|
+
export declare function isWorkbenchRootNode(node: GraphNode): boolean;
|
|
78
|
+
export declare function parseWorkbenchTopic(node: GraphNode): WorkbenchTopicRecord | undefined;
|
|
79
|
+
export declare function buildWorkbenchOutlines(nodes: GraphNode[], edges: GraphEdge[]): WorkbenchOutline[];
|
|
80
|
+
export declare function formatWorkbenchOutlineLines(outlines: WorkbenchOutline[]): string[];
|
|
81
|
+
export declare function loadWorkbenchOutlines(client: GraphClient): Promise<WorkbenchOutline[]>;
|
|
82
|
+
export declare function seedWorkbenchFromPlan(client: GraphClient, input: {
|
|
83
|
+
task: string;
|
|
84
|
+
steps: PlanStepSeed[];
|
|
85
|
+
workspaceRoot?: string;
|
|
86
|
+
now?: number;
|
|
87
|
+
}): Promise<{
|
|
88
|
+
root: WorkbenchRootRecord;
|
|
89
|
+
topics: WorkbenchTopicRecord[];
|
|
90
|
+
}>;
|
|
91
|
+
export declare function activateTopic(client: GraphClient, topicId: string, now?: number): Promise<WorkbenchTopicRecord | undefined>;
|
|
92
|
+
export declare function forkIsolatedTopic(client: GraphClient, input: {
|
|
93
|
+
fromTopicId: string;
|
|
94
|
+
title: string;
|
|
95
|
+
description?: string;
|
|
96
|
+
now?: number;
|
|
97
|
+
}): Promise<WorkbenchTopicRecord | undefined>;
|
|
98
|
+
export declare function appendTopicMessage(client: GraphClient, input: {
|
|
99
|
+
query?: string;
|
|
100
|
+
workspaceRoot?: string;
|
|
101
|
+
taskHint?: string;
|
|
102
|
+
topicId?: string;
|
|
103
|
+
assistantReply?: string;
|
|
104
|
+
allowAutoFork?: boolean;
|
|
105
|
+
now?: number;
|
|
106
|
+
}): Promise<{
|
|
107
|
+
topic: WorkbenchTopicRecord;
|
|
108
|
+
forked: boolean;
|
|
109
|
+
filled: boolean;
|
|
110
|
+
} | undefined>;
|
|
111
|
+
export declare function topicPendingReply(topic: WorkbenchTopicRecord): boolean;
|
|
112
|
+
export declare function loadActiveTopic(client: GraphClient, workspaceRoot?: string, taskHint?: string): Promise<WorkbenchTopicRecord | undefined>;
|
|
113
|
+
export declare function loadWorkbenchContext(client: GraphClient, topicId: string): Promise<WorkbenchContextView | undefined>;
|
|
114
|
+
export declare function formatWorkbenchPrompt(view: WorkbenchContextView): string[];
|
|
115
|
+
export declare function scoreOverlap(previousTokens: string[], query: string): number;
|
|
116
|
+
//# sourceMappingURL=workbench-topic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-topic.d.ts","sourceRoot":"","sources":["../../src/learning/workbench-topic.ts"],"names":[],"mappings":"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"}
|