causantic 0.6.1 → 0.7.0
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/dist/cli/skill-templates.d.ts.map +1 -1
- package/dist/cli/skill-templates.js +8 -0
- package/dist/cli/skill-templates.js.map +1 -1
- package/dist/ingest/edge-creator.d.ts +13 -0
- package/dist/ingest/edge-creator.d.ts.map +1 -1
- package/dist/ingest/edge-creator.js +36 -0
- package/dist/ingest/edge-creator.js.map +1 -1
- package/dist/ingest/index.d.ts +5 -1
- package/dist/ingest/index.d.ts.map +1 -1
- package/dist/ingest/index.js +5 -1
- package/dist/ingest/index.js.map +1 -1
- package/dist/ingest/ingest-session.d.ts +6 -0
- package/dist/ingest/ingest-session.d.ts.map +1 -1
- package/dist/ingest/ingest-session.js +263 -33
- package/dist/ingest/ingest-session.js.map +1 -1
- package/dist/ingest/team-detector.d.ts +52 -0
- package/dist/ingest/team-detector.d.ts.map +1 -0
- package/dist/ingest/team-detector.js +241 -0
- package/dist/ingest/team-detector.js.map +1 -0
- package/dist/ingest/team-edge-detector.d.ts +47 -0
- package/dist/ingest/team-edge-detector.d.ts.map +1 -0
- package/dist/ingest/team-edge-detector.js +224 -0
- package/dist/ingest/team-edge-detector.js.map +1 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +49 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/parser/session-reader.d.ts +4 -0
- package/dist/parser/session-reader.d.ts.map +1 -1
- package/dist/parser/session-reader.js +45 -2
- package/dist/parser/session-reader.js.map +1 -1
- package/dist/retrieval/chain-assembler.d.ts +2 -0
- package/dist/retrieval/chain-assembler.d.ts.map +1 -1
- package/dist/retrieval/chain-assembler.js +5 -3
- package/dist/retrieval/chain-assembler.js.map +1 -1
- package/dist/retrieval/context-assembler.d.ts +2 -0
- package/dist/retrieval/context-assembler.d.ts.map +1 -1
- package/dist/retrieval/context-assembler.js +3 -0
- package/dist/retrieval/context-assembler.js.map +1 -1
- package/dist/retrieval/search-assembler.d.ts +2 -0
- package/dist/retrieval/search-assembler.d.ts.map +1 -1
- package/dist/retrieval/search-assembler.js +17 -5
- package/dist/retrieval/search-assembler.js.map +1 -1
- package/dist/retrieval/session-reconstructor.d.ts +3 -0
- package/dist/retrieval/session-reconstructor.d.ts.map +1 -1
- package/dist/retrieval/session-reconstructor.js +24 -2
- package/dist/retrieval/session-reconstructor.js.map +1 -1
- package/dist/storage/chunk-store.d.ts +1 -0
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +11 -6
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/keyword-store.d.ts +1 -1
- package/dist/storage/keyword-store.d.ts.map +1 -1
- package/dist/storage/keyword-store.js +13 -8
- package/dist/storage/keyword-store.js.map +1 -1
- package/dist/storage/migrations.d.ts.map +1 -1
- package/dist/storage/migrations.js +21 -0
- package/dist/storage/migrations.js.map +1 -1
- package/dist/storage/schema.sql +5 -3
- package/dist/storage/types.d.ts +5 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/vector-store.d.ts +3 -1
- package/dist/storage/vector-store.d.ts.map +1 -1
- package/dist/storage/vector-store.js +31 -5
- package/dist/storage/vector-store.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-templates.d.ts","sourceRoot":"","sources":["../../src/cli/skill-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"skill-templates.d.ts","sourceRoot":"","sources":["../../src/cli/skill-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,EAAE,aAAa,EA6yC3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAsGhD"}
|
|
@@ -31,6 +31,7 @@ Pass these to the \`recall\` MCP tool:
|
|
|
31
31
|
|
|
32
32
|
- **query** (required): A specific topic, decision, or problem to trace
|
|
33
33
|
- **project**: Filter to a specific project slug (use \`/causantic-list-projects\` to discover names)
|
|
34
|
+
- **agent**: Filter to a specific agent (e.g., "researcher"). Use for team sessions to scope recall to a single agent's work. The filter applies to seed selection only — chain walking crosses agent boundaries freely.
|
|
34
35
|
|
|
35
36
|
## When to Use
|
|
36
37
|
|
|
@@ -79,6 +80,7 @@ Pass these to the \`search\` MCP tool:
|
|
|
79
80
|
|
|
80
81
|
- **query** (required): What to search for in memory
|
|
81
82
|
- **project**: Filter to a specific project slug (use \`/causantic-list-projects\` to discover names)
|
|
83
|
+
- **agent**: Filter to a specific agent (e.g., "researcher"). Use for team sessions to scope search to a single agent's contributions.
|
|
82
84
|
|
|
83
85
|
## When to Use
|
|
84
86
|
|
|
@@ -119,6 +121,7 @@ Pass these to the \`predict\` MCP tool:
|
|
|
119
121
|
|
|
120
122
|
- **context** (required): A concise summary of the current task, topic, or question
|
|
121
123
|
- **project**: Filter to a specific project slug
|
|
124
|
+
- **agent**: Filter to a specific agent (e.g., "researcher"). Use for team sessions to scope predictions to a single agent's context.
|
|
122
125
|
|
|
123
126
|
## When to Use
|
|
124
127
|
|
|
@@ -311,6 +314,7 @@ Present a concise briefing:
|
|
|
311
314
|
- Highlight unfinished work prominently — that's what the user needs most
|
|
312
315
|
- If the last session ended mid-task, flag that clearly
|
|
313
316
|
- For broader context beyond the last session, use timeline mode: call \`reconstruct\` with just \`project\` (no \`previous_session\`)
|
|
317
|
+
- For team sessions: note the team composition (which agents were involved), what each agent worked on, and any inter-agent coordination that occurred
|
|
314
318
|
`,
|
|
315
319
|
},
|
|
316
320
|
{
|
|
@@ -357,6 +361,7 @@ Use the \`list-sessions\` and \`reconstruct\` MCP tools from \`causantic\` to re
|
|
|
357
361
|
- **previous_session**: Get the session before the current one (set to \`true\`)
|
|
358
362
|
- **current_session_id**: Required when \`previous_session\` is true
|
|
359
363
|
- **keep_newest**: Keep newest chunks when truncating (default: true)
|
|
364
|
+
- **agent**: Filter to a specific agent (e.g., "researcher"). For team sessions, reconstructs only that agent's chunks. Agent boundaries are shown automatically when multiple agents are present.
|
|
360
365
|
|
|
361
366
|
## Interpreting User Intent
|
|
362
367
|
|
|
@@ -512,6 +517,7 @@ Summarize recent work across sessions by combining session browsing with context
|
|
|
512
517
|
- Highlight work that was started but not completed — this is the most actionable info
|
|
513
518
|
- If the time range has many sessions, prioritize breadth over depth
|
|
514
519
|
- If no sessions found for the time range, suggest widening the range
|
|
520
|
+
- For team sessions: attribute work to specific agents (e.g., "researcher explored X, tester validated Y") when agent boundaries are visible in the reconstructed context
|
|
515
521
|
`,
|
|
516
522
|
},
|
|
517
523
|
{
|
|
@@ -1377,6 +1383,8 @@ Long-term memory is available via the \`causantic\` MCP server.
|
|
|
1377
1383
|
|
|
1378
1384
|
**Key distinction:** \`recall\` is semantic (finds best topic match regardless of time). \`reconstruct\`/\`resume\` are time-ordered (finds most recent work). For any question about "last", "recent", or "latest" → use \`reconstruct\` or \`resume\`, never \`recall\`.
|
|
1379
1385
|
|
|
1386
|
+
**Agent filtering:** For team sessions (multiple agents), all retrieval tools accept an optional \`agent\` parameter to scope results to a specific agent (e.g., "researcher"). Agent boundaries are shown automatically in output when multiple agents contributed.
|
|
1387
|
+
|
|
1380
1388
|
### Proactive Memory Usage
|
|
1381
1389
|
|
|
1382
1390
|
**Check memory automatically (no skill needed) when:**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-templates.js","sourceRoot":"","sources":["../../src/cli/skill-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C;QACE,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"skill-templates.js","sourceRoot":"","sources":["../../src/cli/skill-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Creates only forward edges (earlier → later). Direction is inferred at query time.
|
|
4
4
|
*/
|
|
5
5
|
import type { TransitionResult } from './edge-detector.js';
|
|
6
|
+
import type { TeamEdgePoint } from './team-edge-detector.js';
|
|
6
7
|
/**
|
|
7
8
|
* Result of edge creation.
|
|
8
9
|
*/
|
|
@@ -33,4 +34,16 @@ export declare function createBriefEdge(parentLastChunkId: string, subAgentFirst
|
|
|
33
34
|
* Create a debrief edge: last sub-agent chunk → first parent chunk after return.
|
|
34
35
|
*/
|
|
35
36
|
export declare function createDebriefEdge(subAgentLastChunkId: string, parentFirstChunkId: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Create team edges from detected team edge points.
|
|
39
|
+
*
|
|
40
|
+
* Weights by edge type:
|
|
41
|
+
* - team-spawn: 0.9 (lead dispatching work)
|
|
42
|
+
* - team-report: 0.9 (teammate reporting results)
|
|
43
|
+
* - peer-message: 0.85 (lateral communication)
|
|
44
|
+
*
|
|
45
|
+
* @param points - Detected team edge points
|
|
46
|
+
* @returns Number of edges created
|
|
47
|
+
*/
|
|
48
|
+
export declare function createTeamEdges(points: TeamEdgePoint[]): Promise<number>;
|
|
36
49
|
//# sourceMappingURL=edge-creator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-creator.d.ts","sourceRoot":"","sources":["../../src/ingest/edge-creator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"edge-creator.d.ts","sourceRoot":"","sources":["../../src/ingest/edge-creator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAwB7B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,cAAc,GAAG,eAAe,GAAG,OAAO,GAAG,SAAS,GACpE,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,MAAM,EACzB,oBAAoB,EAAE,MAAM,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B9E"}
|
|
@@ -85,4 +85,40 @@ export async function createDebriefEdge(subAgentLastChunkId, parentFirstChunkId)
|
|
|
85
85
|
},
|
|
86
86
|
]);
|
|
87
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Create team edges from detected team edge points.
|
|
90
|
+
*
|
|
91
|
+
* Weights by edge type:
|
|
92
|
+
* - team-spawn: 0.9 (lead dispatching work)
|
|
93
|
+
* - team-report: 0.9 (teammate reporting results)
|
|
94
|
+
* - peer-message: 0.85 (lateral communication)
|
|
95
|
+
*
|
|
96
|
+
* @param points - Detected team edge points
|
|
97
|
+
* @returns Number of edges created
|
|
98
|
+
*/
|
|
99
|
+
export async function createTeamEdges(points) {
|
|
100
|
+
const edges = [];
|
|
101
|
+
const weights = {
|
|
102
|
+
'team-spawn': 0.9,
|
|
103
|
+
'team-report': 0.9,
|
|
104
|
+
'peer-message': 0.85,
|
|
105
|
+
};
|
|
106
|
+
for (const point of points) {
|
|
107
|
+
for (const sourceId of point.sourceChunkIds) {
|
|
108
|
+
for (const targetId of point.targetChunkIds) {
|
|
109
|
+
edges.push({
|
|
110
|
+
sourceChunkId: sourceId,
|
|
111
|
+
targetChunkId: targetId,
|
|
112
|
+
edgeType: 'forward',
|
|
113
|
+
referenceType: point.edgeType,
|
|
114
|
+
initialWeight: weights[point.edgeType],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (edges.length > 0) {
|
|
120
|
+
createEdges(edges);
|
|
121
|
+
}
|
|
122
|
+
return edges.length;
|
|
123
|
+
}
|
|
88
124
|
//# sourceMappingURL=edge-creator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-creator.js","sourceRoot":"","sources":["../../src/ingest/edge-creator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"edge-creator.js","sourceRoot":"","sources":["../../src/ingest/edge-creator.ts"],"names":[],"mappings":"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"}
|
package/dist/ingest/index.d.ts
CHANGED
|
@@ -7,8 +7,12 @@ export { batchIngest, batchIngestDirectory, discoverSessions } from './batch-ing
|
|
|
7
7
|
export type { BatchIngestOptions, BatchIngestResult } from './batch-ingest.js';
|
|
8
8
|
export { detectCausalTransitions, detectTransitions, getTimeGapMs } from './edge-detector.js';
|
|
9
9
|
export type { TransitionResult, DetectionOptions } from './edge-detector.js';
|
|
10
|
-
export { createEdgesFromTransitions, createForwardEdge, createCrossSessionEdges, createBriefEdge, createDebriefEdge, } from './edge-creator.js';
|
|
10
|
+
export { createEdgesFromTransitions, createForwardEdge, createCrossSessionEdges, createBriefEdge, createDebriefEdge, createTeamEdges, } from './edge-creator.js';
|
|
11
11
|
export type { EdgeCreationResult } from './edge-creator.js';
|
|
12
12
|
export { linkCrossSession, linkAllSessions, isContinuedSession } from './cross-session-linker.js';
|
|
13
13
|
export type { CrossSessionLinkResult } from './cross-session-linker.js';
|
|
14
|
+
export { detectTeamTopology, groupTeammateFiles } from './team-detector.js';
|
|
15
|
+
export type { TeamTopology, TeammateFileGroup } from './team-detector.js';
|
|
16
|
+
export { detectTeamEdges } from './team-edge-detector.js';
|
|
17
|
+
export type { TeamEdgePoint } from './team-edge-detector.js';
|
|
14
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClG,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGxE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/ingest/index.js
CHANGED
|
@@ -8,7 +8,11 @@ export { batchIngest, batchIngestDirectory, discoverSessions } from './batch-ing
|
|
|
8
8
|
// Edge detection
|
|
9
9
|
export { detectCausalTransitions, detectTransitions, getTimeGapMs } from './edge-detector.js';
|
|
10
10
|
// Edge creation
|
|
11
|
-
export { createEdgesFromTransitions, createForwardEdge, createCrossSessionEdges, createBriefEdge, createDebriefEdge, } from './edge-creator.js';
|
|
11
|
+
export { createEdgesFromTransitions, createForwardEdge, createCrossSessionEdges, createBriefEdge, createDebriefEdge, createTeamEdges, } from './edge-creator.js';
|
|
12
12
|
// Cross-session linking
|
|
13
13
|
export { linkCrossSession, linkAllSessions, isContinuedSession } from './cross-session-linker.js';
|
|
14
|
+
// Team detection
|
|
15
|
+
export { detectTeamTopology, groupTeammateFiles } from './team-detector.js';
|
|
16
|
+
// Team edge detection
|
|
17
|
+
export { detectTeamEdges } from './team-edge-detector.js';
|
|
14
18
|
//# sourceMappingURL=index.js.map
|
package/dist/ingest/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGlE,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGxF,iBAAiB;AACjB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9F,gBAAgB;AAChB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGlE,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGxF,iBAAiB;AACjB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9F,gBAAgB;AAChB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAG3B,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGlG,iBAAiB;AACjB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -64,6 +64,12 @@ export interface IngestResult {
|
|
|
64
64
|
cacheMisses?: number;
|
|
65
65
|
/** Reason for skip if skipped */
|
|
66
66
|
skipReason?: 'already_ingested' | 'unchanged_file' | 'no_new_turns';
|
|
67
|
+
/** Number of team edges created */
|
|
68
|
+
teamEdges: number;
|
|
69
|
+
/** Number of dead-end sub-agent files skipped */
|
|
70
|
+
deadEndFilesSkipped: number;
|
|
71
|
+
/** Whether this session uses agent teams */
|
|
72
|
+
isTeamSession: boolean;
|
|
67
73
|
}
|
|
68
74
|
/**
|
|
69
75
|
* Ingest a single session file.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-session.d.ts","sourceRoot":"","sources":["../../src/ingest/ingest-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ingest-session.d.ts","sourceRoot":"","sources":["../../src/ingest/ingest-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAyBjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,oBAAoB,CAAC;AAQtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,UAAU,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACpE,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAmkBvB;AAyID;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAarD"}
|
|
@@ -17,11 +17,15 @@ import { getModel } from '../models/model-registry.js';
|
|
|
17
17
|
import { insertChunks, isSessionIngested } from '../storage/chunk-store.js';
|
|
18
18
|
import { vectorStore } from '../storage/vector-store.js';
|
|
19
19
|
import { detectCausalTransitions } from './edge-detector.js';
|
|
20
|
-
import { createEdgesFromTransitions, createBriefEdge, createDebriefEdge } from './edge-creator.js';
|
|
20
|
+
import { createEdgesFromTransitions, createBriefEdge, createDebriefEdge, createTeamEdges, } from './edge-creator.js';
|
|
21
21
|
import { linkCrossSession } from './cross-session-linker.js';
|
|
22
22
|
import { detectBriefPoints, detectDebriefPoints, buildChunkIdsByTurn, } from './brief-debrief-detector.js';
|
|
23
|
+
import { detectTeamTopology, groupTeammateFiles } from './team-detector.js';
|
|
24
|
+
import { detectTeamEdges } from './team-edge-detector.js';
|
|
23
25
|
import { getCheckpoint, saveCheckpoint } from '../storage/checkpoint-store.js';
|
|
24
26
|
import { computeContentHash, getCachedEmbeddingsBatch, cacheEmbeddingsBatch, } from '../storage/embedding-cache.js';
|
|
27
|
+
import { createLogger } from '../utils/logger.js';
|
|
28
|
+
const log = createLogger('ingest-session');
|
|
25
29
|
/** Threshold for streaming file parsing (10MB) */
|
|
26
30
|
const STREAMING_THRESHOLD_BYTES = 10 * 1024 * 1024;
|
|
27
31
|
/**
|
|
@@ -54,6 +58,9 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
54
58
|
skipReason: 'unchanged_file',
|
|
55
59
|
durationMs: Date.now() - startTime,
|
|
56
60
|
subAgentCount: 0,
|
|
61
|
+
teamEdges: 0,
|
|
62
|
+
deadEndFilesSkipped: 0,
|
|
63
|
+
isTeamSession: false,
|
|
57
64
|
};
|
|
58
65
|
}
|
|
59
66
|
}
|
|
@@ -70,6 +77,9 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
70
77
|
skipReason: 'already_ingested',
|
|
71
78
|
durationMs: Date.now() - startTime,
|
|
72
79
|
subAgentCount: 0,
|
|
80
|
+
teamEdges: 0,
|
|
81
|
+
deadEndFilesSkipped: 0,
|
|
82
|
+
isTeamSession: false,
|
|
73
83
|
};
|
|
74
84
|
}
|
|
75
85
|
// Use streaming for large files
|
|
@@ -113,6 +123,9 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
113
123
|
skipReason: startTurnIndex > 0 ? 'no_new_turns' : undefined,
|
|
114
124
|
durationMs: Date.now() - startTime,
|
|
115
125
|
subAgentCount: 0,
|
|
126
|
+
teamEdges: 0,
|
|
127
|
+
deadEndFilesSkipped: 0,
|
|
128
|
+
isTeamSession: false,
|
|
116
129
|
};
|
|
117
130
|
}
|
|
118
131
|
// Set up embedding — single embedder, sequential inference
|
|
@@ -138,49 +151,226 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
138
151
|
let totalChunkCount = 0;
|
|
139
152
|
let totalEdgeCount = 0;
|
|
140
153
|
let subAgentEdges = 0;
|
|
154
|
+
let teamEdgeCount = 0;
|
|
155
|
+
let deadEndFilesSkipped = 0;
|
|
141
156
|
const subAgentData = new Map();
|
|
142
|
-
// 1. Discover
|
|
157
|
+
// 1. Discover sub-agents (if enabled)
|
|
143
158
|
let subAgentInfos = [];
|
|
144
159
|
if (processSubAgents) {
|
|
145
160
|
subAgentInfos = await discoverSubAgents(sessionPath);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
161
|
+
// Filter out dead-end files
|
|
162
|
+
const activeSubAgents = [];
|
|
163
|
+
for (const sa of subAgentInfos) {
|
|
164
|
+
if (sa.isDeadEnd) {
|
|
165
|
+
deadEndFilesSkipped++;
|
|
166
|
+
log.debug('Skipping dead-end sub-agent file', {
|
|
167
|
+
agentId: sa.agentId,
|
|
168
|
+
lineCount: sa.lineCount,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
activeSubAgents.push(sa);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Detect team topology using ALL turns (not turnsToProcess — needs full history)
|
|
176
|
+
const topology = detectTeamTopology(turns, activeSubAgents);
|
|
177
|
+
if (topology.isTeamSession) {
|
|
178
|
+
log.info('Detected team session', {
|
|
179
|
+
teamName: topology.teamName,
|
|
180
|
+
teammates: topology.teammates.size,
|
|
181
|
+
teamAgentIds: topology.teamAgentIds.size,
|
|
150
182
|
});
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
183
|
+
// Partition sub-agents: team members vs regular sub-agents
|
|
184
|
+
const regularSubAgents = [];
|
|
185
|
+
const teamSubAgents = [];
|
|
186
|
+
for (const sa of activeSubAgents) {
|
|
187
|
+
if (topology.teamAgentIds.has(sa.agentId)) {
|
|
188
|
+
teamSubAgents.push(sa);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
regularSubAgents.push(sa);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Process regular sub-agents through existing brief/debrief pipeline
|
|
195
|
+
for (const subAgent of regularSubAgents) {
|
|
196
|
+
const result = await processSubAgent(subAgent, info.sessionId, projectSlug, projectPath, maxTokensPerChunk, includeThinking, embedAllFn, embeddingModel, useEmbeddingCache);
|
|
197
|
+
if (!result)
|
|
198
|
+
continue;
|
|
199
|
+
totalChunkCount += result.chunkCount;
|
|
200
|
+
totalEdgeCount += result.edgeCount;
|
|
201
|
+
totalCacheHits += result.cacheHits;
|
|
202
|
+
totalCacheMisses += result.cacheMisses;
|
|
203
|
+
subAgentData.set(subAgent.agentId, { turns: result.turns, chunks: result.chunks });
|
|
204
|
+
}
|
|
205
|
+
// Process team members: group by teammate name, then process each file
|
|
206
|
+
const teammateGroups = groupTeammateFiles(teamSubAgents, topology);
|
|
207
|
+
const teamAgentData = new Map();
|
|
208
|
+
for (const group of teammateGroups) {
|
|
209
|
+
for (const subAgent of group.files) {
|
|
210
|
+
const subMessages = await readSessionMessages(subAgent.filePath, {
|
|
211
|
+
includeSidechains: true,
|
|
212
|
+
});
|
|
213
|
+
const subTurns = assembleTurns(subMessages);
|
|
214
|
+
if (subTurns.length === 0)
|
|
215
|
+
continue;
|
|
216
|
+
const subChunks = chunkTurns(subTurns, {
|
|
217
|
+
maxTokens: maxTokensPerChunk,
|
|
218
|
+
includeThinking,
|
|
219
|
+
sessionId: info.sessionId,
|
|
220
|
+
sessionSlug: projectSlug,
|
|
221
|
+
});
|
|
222
|
+
if (subChunks.length === 0)
|
|
223
|
+
continue;
|
|
224
|
+
// Store with human-readable agentId and teamName
|
|
225
|
+
const subChunkInputs = subChunks.map((chunk) => ({
|
|
226
|
+
...chunkToInput(chunk),
|
|
227
|
+
projectPath,
|
|
228
|
+
agentId: group.humanName,
|
|
229
|
+
teamName: topology.teamName ?? undefined,
|
|
230
|
+
}));
|
|
231
|
+
const subChunkIds = insertChunks(subChunkInputs);
|
|
232
|
+
// Embed
|
|
233
|
+
const { embeddings: subEmbeddings, cacheHits: ch, cacheMisses: cm, } = await embedChunksWithCache(subChunks, embedAllFn, embeddingModel, useEmbeddingCache);
|
|
234
|
+
totalCacheHits += ch;
|
|
235
|
+
totalCacheMisses += cm;
|
|
236
|
+
await vectorStore.insertBatch(subChunkIds.map((id, i) => ({ id, embedding: subEmbeddings[i] })));
|
|
237
|
+
// Create within-chain edges
|
|
238
|
+
const subTransitions = detectCausalTransitions(subChunks);
|
|
239
|
+
const subEdgeResult = await createEdgesFromTransitions(subTransitions, subChunkIds);
|
|
240
|
+
totalChunkCount += subChunkIds.length;
|
|
241
|
+
totalEdgeCount += subEdgeResult.totalCount;
|
|
242
|
+
// Store for team edge detection (use ChunkInput with IDs)
|
|
243
|
+
const chunkInputsWithIds = subChunkInputs.map((c, i) => ({ ...c, id: subChunkIds[i] }));
|
|
244
|
+
const existing = teamAgentData.get(group.humanName);
|
|
245
|
+
if (existing) {
|
|
246
|
+
existing.turns.push(...subTurns);
|
|
247
|
+
existing.chunks.push(...chunkInputsWithIds);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
teamAgentData.set(group.humanName, {
|
|
251
|
+
turns: subTurns,
|
|
252
|
+
chunks: chunkInputsWithIds,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// 2. Chunk main session (only new turns)
|
|
258
|
+
const mainChunks = chunkTurns(turnsToProcess, {
|
|
156
259
|
maxTokens: maxTokensPerChunk,
|
|
157
260
|
includeThinking,
|
|
158
261
|
sessionId: info.sessionId,
|
|
159
262
|
sessionSlug: projectSlug,
|
|
160
263
|
});
|
|
161
|
-
if (
|
|
264
|
+
if (mainChunks.length === 0) {
|
|
265
|
+
return {
|
|
266
|
+
sessionId: info.sessionId,
|
|
267
|
+
sessionSlug: projectSlug,
|
|
268
|
+
chunkCount: totalChunkCount,
|
|
269
|
+
edgeCount: totalEdgeCount,
|
|
270
|
+
crossSessionEdges: 0,
|
|
271
|
+
subAgentEdges: 0,
|
|
272
|
+
skipped: false,
|
|
273
|
+
durationMs: Date.now() - startTime,
|
|
274
|
+
subAgentCount: subAgentInfos.length,
|
|
275
|
+
cacheHits: totalCacheHits,
|
|
276
|
+
cacheMisses: totalCacheMisses,
|
|
277
|
+
teamEdges: 0,
|
|
278
|
+
deadEndFilesSkipped,
|
|
279
|
+
isTeamSession: true,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
// Store main chunks
|
|
283
|
+
const mainChunkInputs = mainChunks.map((chunk) => ({
|
|
284
|
+
...chunkToInput(chunk),
|
|
285
|
+
projectPath,
|
|
286
|
+
}));
|
|
287
|
+
const mainChunkIds = insertChunks(mainChunkInputs);
|
|
288
|
+
// Embed main chunks
|
|
289
|
+
const { embeddings: mainEmbeddings, cacheHits: mainCH, cacheMisses: mainCM, } = await embedChunksWithCache(mainChunks, embedAllFn, embeddingModel, useEmbeddingCache);
|
|
290
|
+
totalCacheHits += mainCH;
|
|
291
|
+
totalCacheMisses += mainCM;
|
|
292
|
+
await vectorStore.insertBatch(mainChunkIds.map((id, i) => ({ id, embedding: mainEmbeddings[i] })));
|
|
293
|
+
// Create main intra-session edges
|
|
294
|
+
const mainTransitions = detectCausalTransitions(mainChunks);
|
|
295
|
+
const mainEdgeResult = await createEdgesFromTransitions(mainTransitions, mainChunkIds);
|
|
296
|
+
totalChunkCount += mainChunkIds.length;
|
|
297
|
+
totalEdgeCount += mainEdgeResult.totalCount;
|
|
298
|
+
// Brief/debrief edges for regular sub-agents
|
|
299
|
+
if (subAgentData.size > 0) {
|
|
300
|
+
const chunkIdsByTurn = buildChunkIdsByTurn(mainChunks.map((c, i) => ({ ...c, id: mainChunkIds[i] })));
|
|
301
|
+
const briefPoints = detectBriefPoints(turnsToProcess, chunkIdsByTurn, undefined, 0);
|
|
302
|
+
for (const brief of briefPoints) {
|
|
303
|
+
const subData = subAgentData.get(brief.agentId);
|
|
304
|
+
if (subData && subData.chunks.length > 0) {
|
|
305
|
+
const lastParentChunkId = brief.parentChunkIds[brief.parentChunkIds.length - 1];
|
|
306
|
+
const firstSubAgentChunkId = subData.chunks[0].id;
|
|
307
|
+
await createBriefEdge(lastParentChunkId, firstSubAgentChunkId);
|
|
308
|
+
subAgentEdges += 1;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const debriefPoints = detectDebriefPoints(turnsToProcess, new Map(Array.from(subAgentData.entries()).map(([k, v]) => [k, v.chunks])), mainChunks.map((c, i) => ({ ...c, id: mainChunkIds[i] })), chunkIdsByTurn, undefined, 1);
|
|
312
|
+
for (const debrief of debriefPoints) {
|
|
313
|
+
const lastAgentChunkId = debrief.agentFinalChunkIds[debrief.agentFinalChunkIds.length - 1];
|
|
314
|
+
const firstParentChunkId = debrief.parentChunkIds[0];
|
|
315
|
+
await createDebriefEdge(lastAgentChunkId, firstParentChunkId);
|
|
316
|
+
subAgentEdges += 1;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Detect and create team edges
|
|
320
|
+
if (teamAgentData.size > 0) {
|
|
321
|
+
const mainChunkInputsForEdges = mainChunks.map((c, i) => ({
|
|
322
|
+
...chunkToInput(c),
|
|
323
|
+
projectPath,
|
|
324
|
+
id: mainChunkIds[i],
|
|
325
|
+
}));
|
|
326
|
+
const teamEdgePoints = detectTeamEdges(turns, // Use ALL turns for detection
|
|
327
|
+
mainChunkInputsForEdges, teamAgentData, topology);
|
|
328
|
+
teamEdgeCount = await createTeamEdges(teamEdgePoints);
|
|
329
|
+
totalEdgeCount += teamEdgeCount;
|
|
330
|
+
}
|
|
331
|
+
// Save checkpoint
|
|
332
|
+
if (useIncrementalIngestion) {
|
|
333
|
+
saveCheckpoint({
|
|
334
|
+
sessionId: info.sessionId,
|
|
335
|
+
projectSlug,
|
|
336
|
+
lastTurnIndex: startTurnIndex + turnsToProcess.length - 1,
|
|
337
|
+
lastChunkId: mainChunkIds[mainChunkIds.length - 1],
|
|
338
|
+
fileMtime,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// Link cross-sessions
|
|
342
|
+
let crossSessionEdges = 0;
|
|
343
|
+
if (linkCrossSessions) {
|
|
344
|
+
const linkResult = await linkCrossSession(info.sessionId, projectSlug);
|
|
345
|
+
crossSessionEdges = linkResult.edgeCount;
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
sessionId: info.sessionId,
|
|
349
|
+
sessionSlug: projectSlug,
|
|
350
|
+
chunkCount: totalChunkCount,
|
|
351
|
+
edgeCount: totalEdgeCount,
|
|
352
|
+
crossSessionEdges,
|
|
353
|
+
subAgentEdges,
|
|
354
|
+
skipped: false,
|
|
355
|
+
durationMs: Date.now() - startTime,
|
|
356
|
+
subAgentCount: subAgentInfos.length,
|
|
357
|
+
cacheHits: totalCacheHits,
|
|
358
|
+
cacheMisses: totalCacheMisses,
|
|
359
|
+
teamEdges: teamEdgeCount,
|
|
360
|
+
deadEndFilesSkipped,
|
|
361
|
+
isTeamSession: true,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
// Non-team session: process all active sub-agents through existing pipeline
|
|
365
|
+
for (const subAgent of activeSubAgents) {
|
|
366
|
+
const result = await processSubAgent(subAgent, info.sessionId, projectSlug, projectPath, maxTokensPerChunk, includeThinking, embedAllFn, embeddingModel, useEmbeddingCache);
|
|
367
|
+
if (!result)
|
|
162
368
|
continue;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
totalCacheHits += cacheHits;
|
|
169
|
-
totalCacheMisses += cacheMisses;
|
|
170
|
-
await vectorStore.insertBatch(subChunkIds.map((id, i) => ({
|
|
171
|
-
id,
|
|
172
|
-
embedding: subEmbeddings[i],
|
|
173
|
-
})));
|
|
174
|
-
// Create intra-agent edges
|
|
175
|
-
const subTransitions = detectCausalTransitions(subChunks);
|
|
176
|
-
const subEdgeResult = await createEdgesFromTransitions(subTransitions, subChunkIds);
|
|
177
|
-
totalChunkCount += subChunkIds.length;
|
|
178
|
-
totalEdgeCount += subEdgeResult.totalCount;
|
|
179
|
-
// Store for brief/debrief detection
|
|
180
|
-
subAgentData.set(subAgent.agentId, {
|
|
181
|
-
turns: subTurns,
|
|
182
|
-
chunks: subChunks.map((c, i) => ({ ...c, id: subChunkIds[i] })),
|
|
183
|
-
});
|
|
369
|
+
totalChunkCount += result.chunkCount;
|
|
370
|
+
totalEdgeCount += result.edgeCount;
|
|
371
|
+
totalCacheHits += result.cacheHits;
|
|
372
|
+
totalCacheMisses += result.cacheMisses;
|
|
373
|
+
subAgentData.set(subAgent.agentId, { turns: result.turns, chunks: result.chunks });
|
|
184
374
|
}
|
|
185
375
|
}
|
|
186
376
|
// 2. Chunk main session (only new turns)
|
|
@@ -203,6 +393,9 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
203
393
|
subAgentCount: subAgentInfos.length,
|
|
204
394
|
cacheHits: totalCacheHits,
|
|
205
395
|
cacheMisses: totalCacheMisses,
|
|
396
|
+
teamEdges: 0,
|
|
397
|
+
deadEndFilesSkipped,
|
|
398
|
+
isTeamSession: false,
|
|
206
399
|
};
|
|
207
400
|
}
|
|
208
401
|
// Store main chunks
|
|
@@ -275,6 +468,9 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
275
468
|
subAgentCount: subAgentInfos.length,
|
|
276
469
|
cacheHits: totalCacheHits,
|
|
277
470
|
cacheMisses: totalCacheMisses,
|
|
471
|
+
teamEdges: 0,
|
|
472
|
+
deadEndFilesSkipped,
|
|
473
|
+
isTeamSession: false,
|
|
278
474
|
};
|
|
279
475
|
}
|
|
280
476
|
finally {
|
|
@@ -283,6 +479,40 @@ export async function ingestSession(sessionPath, options = {}) {
|
|
|
283
479
|
}
|
|
284
480
|
}
|
|
285
481
|
}
|
|
482
|
+
/**
|
|
483
|
+
* Process a single sub-agent file: parse, chunk, embed, store, create edges.
|
|
484
|
+
* Extracted to reduce duplication between team and non-team paths.
|
|
485
|
+
*/
|
|
486
|
+
async function processSubAgent(subAgent, sessionId, sessionSlug, projectPath, maxTokensPerChunk, includeThinking, embedAllFn, embeddingModel, useEmbeddingCache) {
|
|
487
|
+
const subMessages = await readSessionMessages(subAgent.filePath, {
|
|
488
|
+
includeSidechains: true,
|
|
489
|
+
});
|
|
490
|
+
const subTurns = assembleTurns(subMessages);
|
|
491
|
+
if (subTurns.length === 0)
|
|
492
|
+
return null;
|
|
493
|
+
const subChunks = chunkTurns(subTurns, {
|
|
494
|
+
maxTokens: maxTokensPerChunk,
|
|
495
|
+
includeThinking,
|
|
496
|
+
sessionId,
|
|
497
|
+
sessionSlug,
|
|
498
|
+
});
|
|
499
|
+
if (subChunks.length === 0)
|
|
500
|
+
return null;
|
|
501
|
+
const subChunkInputs = subChunks.map((chunk) => ({ ...chunkToInput(chunk), projectPath }));
|
|
502
|
+
const subChunkIds = insertChunks(subChunkInputs);
|
|
503
|
+
const { embeddings: subEmbeddings, cacheHits, cacheMisses, } = await embedChunksWithCache(subChunks, embedAllFn, embeddingModel, useEmbeddingCache);
|
|
504
|
+
await vectorStore.insertBatch(subChunkIds.map((id, i) => ({ id, embedding: subEmbeddings[i] })));
|
|
505
|
+
const subTransitions = detectCausalTransitions(subChunks);
|
|
506
|
+
const subEdgeResult = await createEdgesFromTransitions(subTransitions, subChunkIds);
|
|
507
|
+
return {
|
|
508
|
+
turns: subTurns,
|
|
509
|
+
chunks: subChunks.map((c, i) => ({ ...c, id: subChunkIds[i] })),
|
|
510
|
+
chunkCount: subChunkIds.length,
|
|
511
|
+
edgeCount: subEdgeResult.totalCount,
|
|
512
|
+
cacheHits,
|
|
513
|
+
cacheMisses,
|
|
514
|
+
};
|
|
515
|
+
}
|
|
286
516
|
/**
|
|
287
517
|
* Embed chunks with optional content-hash caching.
|
|
288
518
|
*
|