@roarpeng/graphflow 1.9.13 → 1.9.15

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.
Files changed (151) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +43 -0
  3. package/CLAUDE.md +2 -0
  4. package/README.md +63 -9
  5. package/README.zh.md +137 -0
  6. package/cordis.patch.yml +42 -0
  7. package/dist/config/defaults.d.ts.map +1 -1
  8. package/dist/config/defaults.js +1 -0
  9. package/dist/config/defaults.js.map +1 -1
  10. package/dist/config/loader.d.ts.map +1 -1
  11. package/dist/config/loader.js +1 -0
  12. package/dist/config/loader.js.map +1 -1
  13. package/dist/config/schema.d.ts +6 -0
  14. package/dist/config/schema.d.ts.map +1 -1
  15. package/dist/graph/context-slicer-types.d.ts +7 -1
  16. package/dist/graph/context-slicer-types.d.ts.map +1 -1
  17. package/dist/graph/context-slicer-types.js.map +1 -1
  18. package/dist/graph/context-slicer.d.ts +6 -1
  19. package/dist/graph/context-slicer.d.ts.map +1 -1
  20. package/dist/graph/context-slicer.js +120 -39
  21. package/dist/graph/context-slicer.js.map +1 -1
  22. package/dist/graph/snapshot-view.d.ts +4 -0
  23. package/dist/graph/snapshot-view.d.ts.map +1 -1
  24. package/dist/graph/snapshot-view.js +36 -2
  25. package/dist/graph/snapshot-view.js.map +1 -1
  26. package/dist/graph/token-savings.d.ts +13 -0
  27. package/dist/graph/token-savings.d.ts.map +1 -1
  28. package/dist/graph/token-savings.js +36 -6
  29. package/dist/graph/token-savings.js.map +1 -1
  30. package/dist/hooks/auto-capture.d.ts +3 -2
  31. package/dist/hooks/auto-capture.d.ts.map +1 -1
  32. package/dist/hooks/auto-capture.js +3 -2
  33. package/dist/hooks/auto-capture.js.map +1 -1
  34. package/dist/index.d.ts +6 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +13 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  39. package/dist/integrations/agent-mcp-installer.js +8 -0
  40. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  41. package/dist/integrations/agent-profiles/index.d.ts +2 -0
  42. package/dist/integrations/agent-profiles/index.d.ts.map +1 -1
  43. package/dist/integrations/agent-profiles/index.js +2 -0
  44. package/dist/integrations/agent-profiles/index.js.map +1 -1
  45. package/dist/integrations/agent-profiles/profiles/dsh.d.ts +2 -0
  46. package/dist/integrations/agent-profiles/profiles/dsh.d.ts.map +1 -0
  47. package/dist/integrations/agent-profiles/profiles/dsh.js +16 -0
  48. package/dist/integrations/agent-profiles/profiles/dsh.js.map +1 -0
  49. package/dist/integrations/agent-profiles/skills/dsh.d.ts +2 -0
  50. package/dist/integrations/agent-profiles/skills/dsh.d.ts.map +1 -0
  51. package/dist/integrations/agent-profiles/skills/dsh.js +13 -0
  52. package/dist/integrations/agent-profiles/skills/dsh.js.map +1 -0
  53. package/dist/integrations/claude-code-hooks.d.ts +6 -3
  54. package/dist/integrations/claude-code-hooks.d.ts.map +1 -1
  55. package/dist/integrations/claude-code-hooks.js +20 -8
  56. package/dist/integrations/claude-code-hooks.js.map +1 -1
  57. package/dist/integrations/dsh-harness-installer.d.ts +53 -0
  58. package/dist/integrations/dsh-harness-installer.d.ts.map +1 -0
  59. package/dist/integrations/dsh-harness-installer.js +211 -0
  60. package/dist/integrations/dsh-harness-installer.js.map +1 -0
  61. package/dist/integrations/skill-installer.d.ts.map +1 -1
  62. package/dist/integrations/skill-installer.js +6 -0
  63. package/dist/integrations/skill-installer.js.map +1 -1
  64. package/dist/learning/canary-gate.d.ts +5 -2
  65. package/dist/learning/canary-gate.d.ts.map +1 -1
  66. package/dist/learning/canary-gate.js +11 -3
  67. package/dist/learning/canary-gate.js.map +1 -1
  68. package/dist/learning/dialogue-thread.d.ts +88 -0
  69. package/dist/learning/dialogue-thread.d.ts.map +1 -0
  70. package/dist/learning/dialogue-thread.js +419 -0
  71. package/dist/learning/dialogue-thread.js.map +1 -0
  72. package/dist/learning/episodic-memory.d.ts +16 -0
  73. package/dist/learning/episodic-memory.d.ts.map +1 -1
  74. package/dist/learning/episodic-memory.js +61 -1
  75. package/dist/learning/episodic-memory.js.map +1 -1
  76. package/dist/learning/skill-admission.d.ts +38 -0
  77. package/dist/learning/skill-admission.d.ts.map +1 -0
  78. package/dist/learning/skill-admission.js +195 -0
  79. package/dist/learning/skill-admission.js.map +1 -0
  80. package/dist/learning/skill-consolidate.d.ts +4 -1
  81. package/dist/learning/skill-consolidate.d.ts.map +1 -1
  82. package/dist/learning/skill-consolidate.js +56 -6
  83. package/dist/learning/skill-consolidate.js.map +1 -1
  84. package/dist/learning/skill-flywheel.d.ts +8 -2
  85. package/dist/learning/skill-flywheel.d.ts.map +1 -1
  86. package/dist/learning/skill-flywheel.js +65 -38
  87. package/dist/learning/skill-flywheel.js.map +1 -1
  88. package/dist/learning/skill-opt-lite.d.ts +17 -0
  89. package/dist/learning/skill-opt-lite.d.ts.map +1 -1
  90. package/dist/learning/skill-opt-lite.js +108 -0
  91. package/dist/learning/skill-opt-lite.js.map +1 -1
  92. package/dist/learning/skill-store.d.ts.map +1 -1
  93. package/dist/learning/skill-store.js +44 -4
  94. package/dist/learning/skill-store.js.map +1 -1
  95. package/dist/learning/skill-types.d.ts +15 -0
  96. package/dist/learning/skill-types.d.ts.map +1 -1
  97. package/dist/learning/skill-types.js +11 -0
  98. package/dist/learning/skill-types.js.map +1 -1
  99. package/dist/learning/workbench-topic.d.ts +116 -0
  100. package/dist/learning/workbench-topic.d.ts.map +1 -0
  101. package/dist/learning/workbench-topic.js +642 -0
  102. package/dist/learning/workbench-topic.js.map +1 -0
  103. package/dist/learning/workflow-skill.d.ts +25 -0
  104. package/dist/learning/workflow-skill.d.ts.map +1 -0
  105. package/dist/learning/workflow-skill.js +91 -0
  106. package/dist/learning/workflow-skill.js.map +1 -0
  107. package/dist/surfaces/cli/index.js +124 -6
  108. package/dist/surfaces/cli/index.js.map +1 -1
  109. package/dist/surfaces/cli/init.d.ts +3 -0
  110. package/dist/surfaces/cli/init.d.ts.map +1 -1
  111. package/dist/surfaces/cli/init.js +44 -3
  112. package/dist/surfaces/cli/init.js.map +1 -1
  113. package/dist/surfaces/cli/output.d.ts.map +1 -1
  114. package/dist/surfaces/cli/output.js +4 -1
  115. package/dist/surfaces/cli/output.js.map +1 -1
  116. package/dist/surfaces/cli/runtime/dialogue.d.ts +23 -0
  117. package/dist/surfaces/cli/runtime/dialogue.d.ts.map +1 -0
  118. package/dist/surfaces/cli/runtime/dialogue.js +50 -0
  119. package/dist/surfaces/cli/runtime/dialogue.js.map +1 -0
  120. package/dist/surfaces/cli/runtime/graph.d.ts +24 -22
  121. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  122. package/dist/surfaces/cli/runtime/graph.js +284 -26
  123. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  124. package/dist/surfaces/cli/runtime/memory.d.ts +7 -6
  125. package/dist/surfaces/cli/runtime/memory.d.ts.map +1 -1
  126. package/dist/surfaces/cli/runtime/memory.js +12 -21
  127. package/dist/surfaces/cli/runtime/memory.js.map +1 -1
  128. package/dist/surfaces/cli/runtime/routing.d.ts +4 -1
  129. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  130. package/dist/surfaces/cli/runtime/routing.js +54 -7
  131. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  132. package/dist/surfaces/cli/runtime/types.d.ts +63 -0
  133. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  134. package/dist/surfaces/cli/runtime.d.ts +2 -1
  135. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  136. package/dist/surfaces/cli/runtime.js +7 -2
  137. package/dist/surfaces/cli/runtime.js.map +1 -1
  138. package/dist/surfaces/cursor-rules/graphflow.mdc +10 -3
  139. package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
  140. package/dist/surfaces/mcp/tool-definitions.js +24 -4
  141. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  142. package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
  143. package/dist/surfaces/mcp/tool-handlers.js +27 -3
  144. package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
  145. package/dist/surfaces/trae-skill/graphflow/SKILL.md +51 -5
  146. package/dsh/plugin.mjs +255 -0
  147. package/package.json +20 -2
  148. package/plugin.json +27 -4
  149. package/skills/graphflow/SKILL.md +51 -5
  150. package/src/surfaces/cursor-rules/graphflow.mdc +10 -3
  151. package/src/surfaces/trae-skill/graphflow/SKILL.md +51 -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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"}
@@ -1,6 +1,8 @@
1
1
  import type { GraphNode } from "../core/types";
2
2
  import type { GraphClient } from "../graph/client-factory";
3
3
  import { type EmbeddingProvider } from "./embeddings";
4
+ import { quarantineSkillsFromEpisode } from "./workflow-skill";
5
+ export { quarantineSkillsFromEpisode };
4
6
  export interface EpisodeRecord {
5
7
  id: string;
6
8
  task: string;
@@ -36,6 +38,20 @@ export declare function recordEpisode(client: GraphClient, episode: Omit<Episode
36
38
  * whether execution succeeded, optionally providing lessons learned.
37
39
  */
38
40
  export declare function updateEpisodeOutcome(client: GraphClient, episodeId: string, outcome: "pass" | "fail", lessons?: string[], deviation?: DeviationKind): Promise<EpisodeRecord | undefined>;
41
+ /**
42
+ * Load a single episode record (including its plan) by node id.
43
+ */
44
+ export declare function loadEpisode(client: GraphClient, episodeId: string): Promise<EpisodeRecord | undefined>;
45
+ /**
46
+ * Forget one episode: quarantine descendant skills (SkillJack hide, not
47
+ * delete), then mark the episode pruned so it stays auditable.
48
+ */
49
+ export declare function forgetEpisode(client: GraphClient, episodeId: string): Promise<{
50
+ found: boolean;
51
+ hidden: number;
52
+ ids: string[];
53
+ pruned: boolean;
54
+ }>;
39
55
  export declare function findSimilarEpisodes(client: GraphClient, task: string, limit?: number, embeddingProvider?: EmbeddingProvider): Promise<EpisodeRecord[]>;
40
56
  export declare function loadAllEpisodes(client: GraphClient): Promise<EpisodeRecord[]>;
41
57
  export declare function summarizeEpisodeForPrompt(episode: EpisodeRecord, client?: GraphClient): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"episodic-memory.d.ts","sourceRoot":"","sources":["../../src/learning/episodic-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACtD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,0EAA0E;AAC1E,eAAO,MAAM,eAAe,uEAKlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAOD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOxD;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,EAC9D,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,aAAa,CAAC,CAyCxB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0BpC;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAI,EACT,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,aAAa,EAAE,CAAC,CAqE1B;AAgCD,wBAAsB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGnF;AA8BD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAwBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,CAcjE;AA2CD,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAyD7B;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAatF"}
1
+ {"version":3,"file":"episodic-memory.d.ts","sourceRoot":"","sources":["../../src/learning/episodic-memory.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEVIATION_KINDS = void 0;
3
+ exports.DEVIATION_KINDS = exports.quarantineSkillsFromEpisode = void 0;
4
4
  exports.isDeviationKind = isDeviationKind;
5
5
  exports.extractTaskTokens = extractTaskTokens;
6
6
  exports.recordEpisode = recordEpisode;
7
7
  exports.updateEpisodeOutcome = updateEpisodeOutcome;
8
+ exports.loadEpisode = loadEpisode;
9
+ exports.forgetEpisode = forgetEpisode;
8
10
  exports.findSimilarEpisodes = findSimilarEpisodes;
9
11
  exports.loadAllEpisodes = loadAllEpisodes;
10
12
  exports.summarizeEpisodeForPrompt = summarizeEpisodeForPrompt;
@@ -13,6 +15,8 @@ exports.pruneExpiredEpisodes = pruneExpiredEpisodes;
13
15
  exports.forgetEpisodes = forgetEpisodes;
14
16
  const hash_1 = require("../utils/hash");
15
17
  const embeddings_1 = require("./embeddings");
18
+ const workflow_skill_1 = require("./workflow-skill");
19
+ Object.defineProperty(exports, "quarantineSkillsFromEpisode", { enumerable: true, get: function () { return workflow_skill_1.quarantineSkillsFromEpisode; } });
16
20
  /** Drift taxonomy shared by alignment-check submit and outcome report. */
17
21
  exports.DEVIATION_KINDS = [
18
22
  "none",
@@ -106,8 +110,64 @@ async function updateEpisodeOutcome(client, episodeId, outcome, lessons, deviati
106
110
  metadata: { ...node.metadata, record: serialize(updated) },
107
111
  };
108
112
  await client.upsertNodes([updatedNode]);
113
+ if (outcome === "pass" && updated.plan.length >= 2) {
114
+ try {
115
+ await (0, workflow_skill_1.distillWorkflowFromEpisode)(client, updated);
116
+ }
117
+ catch {
118
+ // Distillation must never block outcome reporting.
119
+ }
120
+ }
109
121
  return updated;
110
122
  }
123
+ /**
124
+ * Load a single episode record (including its plan) by node id.
125
+ */
126
+ async function loadEpisode(client, episodeId) {
127
+ const node = await loadEpisodeNode(client, episodeId);
128
+ if (!node)
129
+ return undefined;
130
+ return deserialize(node);
131
+ }
132
+ /**
133
+ * Forget one episode: quarantine descendant skills (SkillJack hide, not
134
+ * delete), then mark the episode pruned so it stays auditable.
135
+ */
136
+ async function forgetEpisode(client, episodeId) {
137
+ const { hidden, ids } = await (0, workflow_skill_1.quarantineSkillsFromEpisode)(client, episodeId);
138
+ const node = await loadEpisodeNode(client, episodeId);
139
+ if (!node) {
140
+ return { found: false, hidden, ids, pruned: false };
141
+ }
142
+ const rec = deserialize(node);
143
+ const lessons = rec
144
+ ? ["forgotten", ...rec.lessons.filter((lesson) => lesson !== "forgotten")].slice(0, 4)
145
+ : ["forgotten"];
146
+ const updatedRecord = rec
147
+ ? { ...rec, lessons, updatedAt: Date.now() }
148
+ : undefined;
149
+ await client.upsertNodes([
150
+ {
151
+ ...node,
152
+ metadata: {
153
+ ...node.metadata,
154
+ pruned: true,
155
+ ...(updatedRecord ? { record: serialize(updatedRecord) } : {}),
156
+ },
157
+ },
158
+ ]);
159
+ return { found: true, hidden, ids, pruned: true };
160
+ }
161
+ async function loadEpisodeNode(client, episodeId) {
162
+ if (client.getNodesByIds) {
163
+ const nodes = await client.getNodesByIds([episodeId]);
164
+ const node = nodes.find((candidate) => candidate.id === episodeId);
165
+ if (node && isEpisodeNode(node))
166
+ return node;
167
+ }
168
+ const hits = await client.queryByKeyword(episodeId);
169
+ return hits.find((candidate) => candidate.id === episodeId && isEpisodeNode(candidate));
170
+ }
111
171
  async function findSimilarEpisodes(client, task, limit = 3, embeddingProvider) {
112
172
  const queryTokens = new Set(extractTaskTokens(task));
113
173
  const candidateNodes = await collectEpisodeCandidates(client, task, Array.from(queryTokens));