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.
Files changed (65) hide show
  1. package/dist/cli/skill-templates.d.ts.map +1 -1
  2. package/dist/cli/skill-templates.js +8 -0
  3. package/dist/cli/skill-templates.js.map +1 -1
  4. package/dist/ingest/edge-creator.d.ts +13 -0
  5. package/dist/ingest/edge-creator.d.ts.map +1 -1
  6. package/dist/ingest/edge-creator.js +36 -0
  7. package/dist/ingest/edge-creator.js.map +1 -1
  8. package/dist/ingest/index.d.ts +5 -1
  9. package/dist/ingest/index.d.ts.map +1 -1
  10. package/dist/ingest/index.js +5 -1
  11. package/dist/ingest/index.js.map +1 -1
  12. package/dist/ingest/ingest-session.d.ts +6 -0
  13. package/dist/ingest/ingest-session.d.ts.map +1 -1
  14. package/dist/ingest/ingest-session.js +263 -33
  15. package/dist/ingest/ingest-session.js.map +1 -1
  16. package/dist/ingest/team-detector.d.ts +52 -0
  17. package/dist/ingest/team-detector.d.ts.map +1 -0
  18. package/dist/ingest/team-detector.js +241 -0
  19. package/dist/ingest/team-detector.js.map +1 -0
  20. package/dist/ingest/team-edge-detector.d.ts +47 -0
  21. package/dist/ingest/team-edge-detector.d.ts.map +1 -0
  22. package/dist/ingest/team-edge-detector.js +224 -0
  23. package/dist/ingest/team-edge-detector.js.map +1 -0
  24. package/dist/mcp/tools.d.ts.map +1 -1
  25. package/dist/mcp/tools.js +49 -0
  26. package/dist/mcp/tools.js.map +1 -1
  27. package/dist/parser/session-reader.d.ts +4 -0
  28. package/dist/parser/session-reader.d.ts.map +1 -1
  29. package/dist/parser/session-reader.js +45 -2
  30. package/dist/parser/session-reader.js.map +1 -1
  31. package/dist/retrieval/chain-assembler.d.ts +2 -0
  32. package/dist/retrieval/chain-assembler.d.ts.map +1 -1
  33. package/dist/retrieval/chain-assembler.js +5 -3
  34. package/dist/retrieval/chain-assembler.js.map +1 -1
  35. package/dist/retrieval/context-assembler.d.ts +2 -0
  36. package/dist/retrieval/context-assembler.d.ts.map +1 -1
  37. package/dist/retrieval/context-assembler.js +3 -0
  38. package/dist/retrieval/context-assembler.js.map +1 -1
  39. package/dist/retrieval/search-assembler.d.ts +2 -0
  40. package/dist/retrieval/search-assembler.d.ts.map +1 -1
  41. package/dist/retrieval/search-assembler.js +17 -5
  42. package/dist/retrieval/search-assembler.js.map +1 -1
  43. package/dist/retrieval/session-reconstructor.d.ts +3 -0
  44. package/dist/retrieval/session-reconstructor.d.ts.map +1 -1
  45. package/dist/retrieval/session-reconstructor.js +24 -2
  46. package/dist/retrieval/session-reconstructor.js.map +1 -1
  47. package/dist/storage/chunk-store.d.ts +1 -0
  48. package/dist/storage/chunk-store.d.ts.map +1 -1
  49. package/dist/storage/chunk-store.js +11 -6
  50. package/dist/storage/chunk-store.js.map +1 -1
  51. package/dist/storage/keyword-store.d.ts +1 -1
  52. package/dist/storage/keyword-store.d.ts.map +1 -1
  53. package/dist/storage/keyword-store.js +13 -8
  54. package/dist/storage/keyword-store.js.map +1 -1
  55. package/dist/storage/migrations.d.ts.map +1 -1
  56. package/dist/storage/migrations.js +21 -0
  57. package/dist/storage/migrations.js.map +1 -1
  58. package/dist/storage/schema.sql +5 -3
  59. package/dist/storage/types.d.ts +5 -1
  60. package/dist/storage/types.d.ts.map +1 -1
  61. package/dist/storage/vector-store.d.ts +3 -1
  62. package/dist/storage/vector-store.d.ts.map +1 -1
  63. package/dist/storage/vector-store.js +31 -5
  64. package/dist/storage/vector-store.js.map +1 -1
  65. 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,EAuyC3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAoGhD"}
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":"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"}
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;AAE3D;;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"}
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;AAcvD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAA+B,EAC/B,QAAkB;IAElB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAEzC,KAAK,CAAC,IAAI,CAAC;YACT,aAAa,EAAE,QAAQ;YACvB,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,CAAC,CAAC,IAAI;YACrB,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,UAAU,EAAE,KAAK,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAAqB,EACrB,aAAqB,EACrB,aAAqE;IAErE,WAAW,CAAC;QACV;YACE,aAAa;YACb,aAAa;YACb,QAAQ,EAAE,SAAS;YACnB,aAAa;YACb,aAAa,EAAE,GAAG;SACnB;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,mBAA2B,EAC3B,eAAuB;IAEvB,WAAW,CAAC;QACV;YACE,aAAa,EAAE,mBAAmB;YAClC,aAAa,EAAE,eAAe;YAC9B,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,eAAe;YAC9B,aAAa,EAAE,GAAG;SACnB;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,iBAAyB,EACzB,oBAA4B;IAE5B,WAAW,CAAC;QACV;YACE,aAAa,EAAE,iBAAiB;YAChC,aAAa,EAAE,oBAAoB;YACnC,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,GAAG;SACnB;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,mBAA2B,EAC3B,kBAA0B;IAE1B,WAAW,CAAC;QACV;YACE,aAAa,EAAE,mBAAmB;YAClC,aAAa,EAAE,kBAAkB;YACjC,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,SAAS;YACxB,aAAa,EAAE,GAAG;SACnB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"edge-creator.js","sourceRoot":"","sources":["../../src/ingest/edge-creator.ts"],"names":[],"mappings":"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"}
@@ -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,GAClB,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"}
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"}
@@ -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
@@ -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,GAClB,MAAM,mBAAmB,CAAC;AAG3B,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
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;AAkBjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,oBAAoB,CAAC;AAKtD;;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;CACrE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAqUvB;AA6ED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAarD"}
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 and process sub-agents first (if enabled)
157
+ // 1. Discover sub-agents (if enabled)
143
158
  let subAgentInfos = [];
144
159
  if (processSubAgents) {
145
160
  subAgentInfos = await discoverSubAgents(sessionPath);
146
- for (const subAgent of subAgentInfos) {
147
- // Parse sub-agent session
148
- const subMessages = await readSessionMessages(subAgent.filePath, {
149
- includeSidechains: true,
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
- const subTurns = assembleTurns(subMessages);
152
- if (subTurns.length === 0)
153
- continue;
154
- // Chunk sub-agent turns
155
- const subChunks = chunkTurns(subTurns, {
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 (subChunks.length === 0)
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
- // Store sub-agent chunks
164
- const subChunkInputs = subChunks.map((chunk) => ({ ...chunkToInput(chunk), projectPath }));
165
- const subChunkIds = insertChunks(subChunkInputs);
166
- // Embed with caching and true batch embedding
167
- const { embeddings: subEmbeddings, cacheHits, cacheMisses, } = await embedChunksWithCache(subChunks, embedAllFn, embeddingModel, useEmbeddingCache);
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
  *