@contorium/mcp 0.8.1

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 (187) hide show
  1. package/README.md +97 -0
  2. package/bin/contorium-mcp.js +34 -0
  3. package/dist/autoContext.d.ts +2 -0
  4. package/dist/autoContext.js +2 -0
  5. package/dist/bootstrapCli.d.ts +2 -0
  6. package/dist/bootstrapCli.js +21 -0
  7. package/dist/conflicts.d.ts +19 -0
  8. package/dist/conflicts.js +49 -0
  9. package/dist/dashboardEnsure.d.ts +10 -0
  10. package/dist/dashboardEnsure.js +41 -0
  11. package/dist/intelligence.d.ts +16 -0
  12. package/dist/intelligence.js +38 -0
  13. package/dist/intentGraph.d.ts +20 -0
  14. package/dist/intentGraph.js +51 -0
  15. package/dist/mcpBootstrap.d.ts +8 -0
  16. package/dist/mcpBootstrap.js +81 -0
  17. package/dist/memoryStore.d.ts +18 -0
  18. package/dist/memoryStore.js +57 -0
  19. package/dist/paths.d.ts +12 -0
  20. package/dist/paths.js +66 -0
  21. package/dist/runtimeState.d.ts +14 -0
  22. package/dist/runtimeState.js +36 -0
  23. package/dist/server.d.ts +3 -0
  24. package/dist/server.js +567 -0
  25. package/dist/stateBuilder.d.ts +16 -0
  26. package/dist/stateBuilder.js +40 -0
  27. package/dist/understanding.d.ts +1 -0
  28. package/dist/understanding.js +1 -0
  29. package/dist/workspace.d.ts +12 -0
  30. package/dist/workspace.js +40 -0
  31. package/dist/workspaceConfig.d.ts +14 -0
  32. package/dist/workspaceConfig.js +80 -0
  33. package/node_modules/@contora/state-core/dist/adapterSync.d.ts +29 -0
  34. package/node_modules/@contora/state-core/dist/adapterSync.d.ts.map +1 -0
  35. package/node_modules/@contora/state-core/dist/adapterSync.js +142 -0
  36. package/node_modules/@contora/state-core/dist/adapters.d.ts +20 -0
  37. package/node_modules/@contora/state-core/dist/adapters.d.ts.map +1 -0
  38. package/node_modules/@contora/state-core/dist/adapters.js +24 -0
  39. package/node_modules/@contora/state-core/dist/bootstrap/bootstrapState.d.ts +6 -0
  40. package/node_modules/@contora/state-core/dist/bootstrap/bootstrapState.d.ts.map +1 -0
  41. package/node_modules/@contora/state-core/dist/bootstrap/bootstrapState.js +116 -0
  42. package/node_modules/@contora/state-core/dist/bootstrapArtifacts.d.ts +18 -0
  43. package/node_modules/@contora/state-core/dist/bootstrapArtifacts.d.ts.map +1 -0
  44. package/node_modules/@contora/state-core/dist/bootstrapArtifacts.js +43 -0
  45. package/node_modules/@contora/state-core/dist/bootstrapState.d.ts +6 -0
  46. package/node_modules/@contora/state-core/dist/bootstrapState.d.ts.map +1 -0
  47. package/node_modules/@contora/state-core/dist/bootstrapState.js +60 -0
  48. package/node_modules/@contora/state-core/dist/dashboardActivity.d.ts +12 -0
  49. package/node_modules/@contora/state-core/dist/dashboardActivity.d.ts.map +1 -0
  50. package/node_modules/@contora/state-core/dist/dashboardActivity.js +58 -0
  51. package/node_modules/@contora/state-core/dist/dualMode.d.ts +11 -0
  52. package/node_modules/@contora/state-core/dist/dualMode.d.ts.map +1 -0
  53. package/node_modules/@contora/state-core/dist/dualMode.js +38 -0
  54. package/node_modules/@contora/state-core/dist/gitScan.d.ts +7 -0
  55. package/node_modules/@contora/state-core/dist/gitScan.d.ts.map +1 -0
  56. package/node_modules/@contora/state-core/dist/gitScan.js +39 -0
  57. package/node_modules/@contora/state-core/dist/index.d.ts +44 -0
  58. package/node_modules/@contora/state-core/dist/index.d.ts.map +1 -0
  59. package/node_modules/@contora/state-core/dist/index.js +141 -0
  60. package/node_modules/@contora/state-core/dist/minimalSnapshot.d.ts +4 -0
  61. package/node_modules/@contora/state-core/dist/minimalSnapshot.d.ts.map +1 -0
  62. package/node_modules/@contora/state-core/dist/minimalSnapshot.js +60 -0
  63. package/node_modules/@contora/state-core/dist/scanner/gitScan.d.ts +7 -0
  64. package/node_modules/@contora/state-core/dist/scanner/gitScan.d.ts.map +1 -0
  65. package/node_modules/@contora/state-core/dist/scanner/gitScan.js +42 -0
  66. package/node_modules/@contora/state-core/dist/scanner/workspaceScanner.d.ts +4 -0
  67. package/node_modules/@contora/state-core/dist/scanner/workspaceScanner.d.ts.map +1 -0
  68. package/node_modules/@contora/state-core/dist/scanner/workspaceScanner.js +148 -0
  69. package/node_modules/@contora/state-core/dist/semiAutoHandoff.d.ts +46 -0
  70. package/node_modules/@contora/state-core/dist/semiAutoHandoff.d.ts.map +1 -0
  71. package/node_modules/@contora/state-core/dist/semiAutoHandoff.js +227 -0
  72. package/node_modules/@contora/state-core/dist/sourceMetadata.d.ts +4 -0
  73. package/node_modules/@contora/state-core/dist/sourceMetadata.d.ts.map +1 -0
  74. package/node_modules/@contora/state-core/dist/sourceMetadata.js +27 -0
  75. package/node_modules/@contora/state-core/dist/state-builder/buildFromScan.d.ts +5 -0
  76. package/node_modules/@contora/state-core/dist/state-builder/buildFromScan.d.ts.map +1 -0
  77. package/node_modules/@contora/state-core/dist/state-builder/buildFromScan.js +33 -0
  78. package/node_modules/@contora/state-core/dist/state-builder/normalization.d.ts +5 -0
  79. package/node_modules/@contora/state-core/dist/state-builder/normalization.d.ts.map +1 -0
  80. package/node_modules/@contora/state-core/dist/state-builder/normalization.js +107 -0
  81. package/node_modules/@contora/state-core/dist/state-builder/rebuildFromScan.d.ts +4 -0
  82. package/node_modules/@contora/state-core/dist/state-builder/rebuildFromScan.d.ts.map +1 -0
  83. package/node_modules/@contora/state-core/dist/state-builder/rebuildFromScan.js +22 -0
  84. package/node_modules/@contora/state-core/dist/state-builder/snapshot.d.ts +5 -0
  85. package/node_modules/@contora/state-core/dist/state-builder/snapshot.d.ts.map +1 -0
  86. package/node_modules/@contora/state-core/dist/state-builder/snapshot.js +53 -0
  87. package/node_modules/@contora/state-core/dist/state-builder/store.d.ts +7 -0
  88. package/node_modules/@contora/state-core/dist/state-builder/store.d.ts.map +1 -0
  89. package/node_modules/@contora/state-core/dist/state-builder/store.js +99 -0
  90. package/node_modules/@contora/state-core/dist/state-builder/types.d.ts +18 -0
  91. package/node_modules/@contora/state-core/dist/state-builder/types.d.ts.map +1 -0
  92. package/node_modules/@contora/state-core/dist/state-builder/types.js +20 -0
  93. package/node_modules/@contora/state-core/dist/types.d.ts +42 -0
  94. package/node_modules/@contora/state-core/dist/types.d.ts.map +1 -0
  95. package/node_modules/@contora/state-core/dist/types.js +3 -0
  96. package/node_modules/@contora/state-core/dist/understanding/buildUnderstanding.d.ts +22 -0
  97. package/node_modules/@contora/state-core/dist/understanding/buildUnderstanding.d.ts.map +1 -0
  98. package/node_modules/@contora/state-core/dist/understanding/buildUnderstanding.js +87 -0
  99. package/node_modules/@contora/state-core/dist/understanding/changeDetector.d.ts +7 -0
  100. package/node_modules/@contora/state-core/dist/understanding/changeDetector.d.ts.map +1 -0
  101. package/node_modules/@contora/state-core/dist/understanding/changeDetector.js +68 -0
  102. package/node_modules/@contora/state-core/dist/understanding/chpHandoff.d.ts +49 -0
  103. package/node_modules/@contora/state-core/dist/understanding/chpHandoff.d.ts.map +1 -0
  104. package/node_modules/@contora/state-core/dist/understanding/chpHandoff.js +214 -0
  105. package/node_modules/@contora/state-core/dist/understanding/extractor.d.ts +21 -0
  106. package/node_modules/@contora/state-core/dist/understanding/extractor.d.ts.map +1 -0
  107. package/node_modules/@contora/state-core/dist/understanding/extractor.js +173 -0
  108. package/node_modules/@contora/state-core/dist/understanding/formatCanonicalExport.d.ts +30 -0
  109. package/node_modules/@contora/state-core/dist/understanding/formatCanonicalExport.d.ts.map +1 -0
  110. package/node_modules/@contora/state-core/dist/understanding/formatCanonicalExport.js +363 -0
  111. package/node_modules/@contora/state-core/dist/understanding/formatHandoff.d.ts +20 -0
  112. package/node_modules/@contora/state-core/dist/understanding/formatHandoff.d.ts.map +1 -0
  113. package/node_modules/@contora/state-core/dist/understanding/formatHandoff.js +57 -0
  114. package/node_modules/@contora/state-core/dist/understanding/graphBuilder.d.ts +9 -0
  115. package/node_modules/@contora/state-core/dist/understanding/graphBuilder.d.ts.map +1 -0
  116. package/node_modules/@contora/state-core/dist/understanding/graphBuilder.js +107 -0
  117. package/node_modules/@contora/state-core/dist/understanding/handoffBuilder.d.ts +12 -0
  118. package/node_modules/@contora/state-core/dist/understanding/handoffBuilder.d.ts.map +1 -0
  119. package/node_modules/@contora/state-core/dist/understanding/handoffBuilder.js +101 -0
  120. package/node_modules/@contora/state-core/dist/understanding/impactAnalyzer.d.ts +5 -0
  121. package/node_modules/@contora/state-core/dist/understanding/impactAnalyzer.d.ts.map +1 -0
  122. package/node_modules/@contora/state-core/dist/understanding/impactAnalyzer.js +58 -0
  123. package/node_modules/@contora/state-core/dist/understanding/intentFusion.d.ts +9 -0
  124. package/node_modules/@contora/state-core/dist/understanding/intentFusion.d.ts.map +1 -0
  125. package/node_modules/@contora/state-core/dist/understanding/intentFusion.js +54 -0
  126. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.d.ts +24 -0
  127. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.d.ts.map +1 -0
  128. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/closureConstants.js +33 -0
  129. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.d.ts +20 -0
  130. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.d.ts.map +1 -0
  131. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/confidence.js +53 -0
  132. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.d.ts +5 -0
  133. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.d.ts.map +1 -0
  134. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/gitFrequency.js +19 -0
  135. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.d.ts +13 -0
  136. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.d.ts.map +1 -0
  137. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/hotspotBuilder.js +101 -0
  138. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.d.ts +22 -0
  139. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.d.ts.map +1 -0
  140. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/intentFunctionMapper.js +106 -0
  141. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/knowledgeGraphBuilder.d.ts +23 -0
  142. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/knowledgeGraphBuilder.d.ts.map +1 -0
  143. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/knowledgeGraphBuilder.js +415 -0
  144. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/normalize.d.ts +11 -0
  145. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/normalize.d.ts.map +1 -0
  146. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/normalize.js +136 -0
  147. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/rebuildTrigger.d.ts +13 -0
  148. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/rebuildTrigger.d.ts.map +1 -0
  149. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/rebuildTrigger.js +34 -0
  150. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/snapshotBuilder.d.ts +17 -0
  151. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/snapshotBuilder.d.ts.map +1 -0
  152. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/snapshotBuilder.js +73 -0
  153. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/store.d.ts +7 -0
  154. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/store.d.ts.map +1 -0
  155. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/store.js +127 -0
  156. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/types.d.ts +116 -0
  157. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/types.d.ts.map +1 -0
  158. package/node_modules/@contora/state-core/dist/understanding/knowledgeGraph/types.js +6 -0
  159. package/node_modules/@contora/state-core/dist/understanding/miniGraph.d.ts +4 -0
  160. package/node_modules/@contora/state-core/dist/understanding/miniGraph.d.ts.map +1 -0
  161. package/node_modules/@contora/state-core/dist/understanding/miniGraph.js +18 -0
  162. package/node_modules/@contora/state-core/dist/understanding/store.d.ts +24 -0
  163. package/node_modules/@contora/state-core/dist/understanding/store.d.ts.map +1 -0
  164. package/node_modules/@contora/state-core/dist/understanding/store.js +243 -0
  165. package/node_modules/@contora/state-core/dist/understanding/symbolValidator.d.ts +9 -0
  166. package/node_modules/@contora/state-core/dist/understanding/symbolValidator.d.ts.map +1 -0
  167. package/node_modules/@contora/state-core/dist/understanding/symbolValidator.js +51 -0
  168. package/node_modules/@contora/state-core/dist/understanding/timelineTracker.d.ts +3 -0
  169. package/node_modules/@contora/state-core/dist/understanding/timelineTracker.d.ts.map +1 -0
  170. package/node_modules/@contora/state-core/dist/understanding/timelineTracker.js +129 -0
  171. package/node_modules/@contora/state-core/dist/understanding/treeSitterParser.d.ts +24 -0
  172. package/node_modules/@contora/state-core/dist/understanding/treeSitterParser.d.ts.map +1 -0
  173. package/node_modules/@contora/state-core/dist/understanding/treeSitterParser.js +56 -0
  174. package/node_modules/@contora/state-core/dist/understanding/types.d.ts +136 -0
  175. package/node_modules/@contora/state-core/dist/understanding/types.d.ts.map +1 -0
  176. package/node_modules/@contora/state-core/dist/understanding/types.js +5 -0
  177. package/node_modules/@contora/state-core/dist/understanding/understandingGraphBuilder.d.ts +23 -0
  178. package/node_modules/@contora/state-core/dist/understanding/understandingGraphBuilder.d.ts.map +1 -0
  179. package/node_modules/@contora/state-core/dist/understanding/understandingGraphBuilder.js +67 -0
  180. package/node_modules/@contora/state-core/dist/version.d.ts +3 -0
  181. package/node_modules/@contora/state-core/dist/version.d.ts.map +1 -0
  182. package/node_modules/@contora/state-core/dist/version.js +21 -0
  183. package/node_modules/@contora/state-core/dist/workspaceScanner.d.ts +4 -0
  184. package/node_modules/@contora/state-core/dist/workspaceScanner.d.ts.map +1 -0
  185. package/node_modules/@contora/state-core/dist/workspaceScanner.js +112 -0
  186. package/node_modules/@contora/state-core/package.json +49 -0
  187. package/package.json +61 -0
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CHP_VERSION = void 0;
37
+ exports.buildChpHandoffStateSync = buildChpHandoffStateSync;
38
+ exports.buildChpHandoffState = buildChpHandoffState;
39
+ exports.formatChpCompact = formatChpCompact;
40
+ exports.formatChpMarkdown = formatChpMarkdown;
41
+ exports.getProjectHandoff = getProjectHandoff;
42
+ const path = __importStar(require("node:path"));
43
+ const bootstrapState_js_1 = require("../bootstrap/bootstrapState.js");
44
+ const formatHandoff_js_1 = require("./formatHandoff.js");
45
+ const store_js_1 = require("./store.js");
46
+ /** Contorium Handoff Protocol v1 — shared AI state shape. */
47
+ exports.CHP_VERSION = 1;
48
+ function projectName(workspaceRoot) {
49
+ return path.basename(path.resolve(workspaceRoot)) || 'project';
50
+ }
51
+ function isoTime(ms) {
52
+ return new Date(ms).toISOString();
53
+ }
54
+ function mapKeyChange(kc) {
55
+ const type = kc.kind === 'function'
56
+ ? 'function_update'
57
+ : kc.kind === 'class'
58
+ ? 'class_update'
59
+ : 'file_update';
60
+ const name = kc.kind === 'function' ? `${kc.symbol}()` : kc.symbol;
61
+ return { type, name, change_type: kc.change_type };
62
+ }
63
+ function lastChangeLabel(changes) {
64
+ if (!changes.length) {
65
+ return '—';
66
+ }
67
+ return changes[0].name;
68
+ }
69
+ function lastActionFromChanges(changes) {
70
+ if (!changes.length) {
71
+ return 'idle';
72
+ }
73
+ const first = changes[0];
74
+ switch (first.change_type) {
75
+ case 'added':
76
+ return `add_${first.type.replace('_update', '')}`;
77
+ case 'removed':
78
+ return `remove_${first.type.replace('_update', '')}`;
79
+ case 'modified':
80
+ return `modify_${first.type.replace('_update', '')}`;
81
+ default:
82
+ return first.type;
83
+ }
84
+ }
85
+ /** Build CHP v1 from in-memory runtime slices (sync — dashboard / IDE status bar). */
86
+ function buildChpHandoffStateSync(input) {
87
+ const root = path.resolve(input.workspaceRoot);
88
+ const handoff = input.handoff ?? null;
89
+ const change = input.change ?? null;
90
+ const currentTask = input.currentTask?.trim() ||
91
+ handoff?.current_focus?.trim() ||
92
+ '';
93
+ const lastWriter = input.lastWriter ?? 'runtime';
94
+ const keyChanges = handoff?.key_changes?.length
95
+ ? handoff.key_changes
96
+ : change?.key_changes ?? [];
97
+ const recentChanges = keyChanges.slice(0, 8).map(mapKeyChange);
98
+ if (!handoff && !currentTask && !recentChanges.length) {
99
+ return null;
100
+ }
101
+ const generatedAt = handoff?.generatedAt ?? change?.generatedAt ?? Date.now();
102
+ return {
103
+ version: exports.CHP_VERSION,
104
+ project: projectName(root),
105
+ workspace_root: root,
106
+ current_task: currentTask || handoff?.current_focus?.trim() || '(not set)',
107
+ goal: handoff?.goal?.trim() || currentTask || '(not set)',
108
+ recent_changes: recentChanges,
109
+ agent_context: {
110
+ active_agent: String(lastWriter),
111
+ last_action: lastActionFromChanges(recentChanges),
112
+ },
113
+ summary: handoff?.summary?.trim() || 'No handoff summary yet.',
114
+ last_updated: isoTime(generatedAt),
115
+ };
116
+ }
117
+ /** Build CHP v1 state from runtime artifacts (single read model). */
118
+ async function buildChpHandoffState(input) {
119
+ const root = path.resolve(input.workspaceRoot);
120
+ const [handoff, change, state] = await Promise.all([
121
+ input.handoff !== undefined ? Promise.resolve(input.handoff) : (0, store_js_1.readHandoffArtifact)(root),
122
+ input.change !== undefined ? Promise.resolve(input.change) : (0, store_js_1.readChangeArtifact)(root),
123
+ (0, bootstrapState_js_1.readStateJson)(root),
124
+ ]);
125
+ return buildChpHandoffStateSync({
126
+ workspaceRoot: root,
127
+ handoff,
128
+ change,
129
+ currentTask: input.currentTask?.trim() || state?.currentTask?.trim(),
130
+ lastWriter: input.lastWriter ?? state?.source?.lastWriter,
131
+ });
132
+ }
133
+ /** CHP compact one-liner for Passive CLI / IDE status bar. */
134
+ function formatChpCompact(state, filter) {
135
+ const task = truncatePlain(state.current_task, 36);
136
+ const last = truncatePlain(lastChangeLabel(state.recent_changes), 28);
137
+ const agent = state.agent_context.active_agent;
138
+ const filterNote = filter?.trim() ? ` · filter:${filter.trim()}` : '';
139
+ return `[Contorium] task: ${task} | last: ${last} | agent: ${agent}${filterNote}`;
140
+ }
141
+ function truncatePlain(text, max) {
142
+ if (text.length <= max) {
143
+ return text;
144
+ }
145
+ return `${text.slice(0, Math.max(0, max - 1))}…`;
146
+ }
147
+ /** CHP markdown — AI chat injection (wraps V3.1 handoff block when available). */
148
+ function formatChpMarkdown(chp, handoff, timeline) {
149
+ if (handoff) {
150
+ const base = (0, formatHandoff_js_1.formatHandoffMarkdown)(handoff, timeline);
151
+ const header = [
152
+ `# Project: ${chp.project}`,
153
+ `Current Task: ${chp.current_task}`,
154
+ `Agent: ${chp.agent_context.active_agent} · last action: ${chp.agent_context.last_action}`,
155
+ '',
156
+ ].join('\n');
157
+ return `${header}${base}`;
158
+ }
159
+ const lines = [
160
+ `# Project: ${chp.project}`,
161
+ '',
162
+ `Current Task: ${chp.current_task}`,
163
+ `Goal: ${chp.goal}`,
164
+ '',
165
+ 'Recent Changes:',
166
+ ];
167
+ if (chp.recent_changes.length) {
168
+ for (const c of chp.recent_changes.slice(0, 8)) {
169
+ lines.push(`- ${c.name}${c.change_type ? ` (${c.change_type})` : ''}`);
170
+ }
171
+ }
172
+ else {
173
+ lines.push('- (none)');
174
+ }
175
+ lines.push('');
176
+ lines.push('Agent Context:');
177
+ lines.push(`- active: ${chp.agent_context.active_agent}`);
178
+ lines.push(`- last action: ${chp.agent_context.last_action}`);
179
+ lines.push('');
180
+ lines.push('Summary:');
181
+ lines.push(chp.summary);
182
+ lines.push('');
183
+ return lines.join('\n');
184
+ }
185
+ /** Unified get_handoff — read runtime artifacts and format. */
186
+ async function getProjectHandoff(workspaceRoot, format = 'compact', filter) {
187
+ const root = path.resolve(workspaceRoot);
188
+ const [chp, handoff, timeline] = await Promise.all([
189
+ buildChpHandoffState({ workspaceRoot: root }),
190
+ (0, store_js_1.readHandoffArtifact)(root),
191
+ (0, store_js_1.readProjectTimeline)(root),
192
+ ]);
193
+ if (!chp) {
194
+ return { found: false };
195
+ }
196
+ const filtered = filter?.trim()
197
+ ? {
198
+ ...chp,
199
+ recent_changes: chp.recent_changes.filter((c) => c.name.toLowerCase().includes(filter.trim().toLowerCase())),
200
+ }
201
+ : chp;
202
+ switch (format) {
203
+ case 'json':
204
+ return { found: true, state: filtered, text: JSON.stringify(filtered, null, 2) };
205
+ case 'markdown':
206
+ return {
207
+ found: true,
208
+ state: filtered,
209
+ text: formatChpMarkdown(filtered, handoff, timeline),
210
+ };
211
+ default:
212
+ return { found: true, state: filtered, text: formatChpCompact(filtered, filter) };
213
+ }
214
+ }
@@ -0,0 +1,21 @@
1
+ export interface ExtractedSymbol {
2
+ kind: 'function' | 'class' | 'import';
3
+ name: string;
4
+ line: number;
5
+ importTarget?: string;
6
+ }
7
+ export interface FileExtraction {
8
+ file: string;
9
+ symbols: ExtractedSymbol[];
10
+ /** Direct call targets detected in this file (same-file or imported names). */
11
+ calls: string[];
12
+ }
13
+ export declare function isCodeFile(rel: string): boolean;
14
+ declare function nodeId(file: string, kind: string, name: string): string;
15
+ export { nodeId };
16
+ export declare function extractFile(workspaceRoot: string, relFile: string): Promise<FileExtraction | undefined>;
17
+ /** Parse in-memory source (IDE live edit / incremental path). */
18
+ export declare function extractFromSource(relFile: string, text: string): FileExtraction | undefined;
19
+ export declare function resolveRelativeImport(fromFile: string, importTarget: string): string | undefined;
20
+ export declare function symbolNamesByKind(extraction: FileExtraction, kind: 'function' | 'class'): string[];
21
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/understanding/extractor.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,iBAAS,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,OAAO,EAAE,MAAM,EAAE,CAAC;AAgFlB,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAmBrC;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAS3F;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBhG;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,UAAU,GAAG,OAAO,GACzB,MAAM,EAAE,CAEV"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isCodeFile = isCodeFile;
37
+ exports.nodeId = nodeId;
38
+ exports.extractFile = extractFile;
39
+ exports.extractFromSource = extractFromSource;
40
+ exports.resolveRelativeImport = resolveRelativeImport;
41
+ exports.symbolNamesByKind = symbolNamesByKind;
42
+ const fs = __importStar(require("node:fs/promises"));
43
+ const path = __importStar(require("node:path"));
44
+ const CODE_EXT = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py']);
45
+ const CALL_KEYWORDS = new Set([
46
+ 'if', 'for', 'while', 'switch', 'catch', 'return', 'new', 'typeof', 'instanceof', 'function',
47
+ 'class', 'import', 'export', 'await', 'async', 'throw', 'delete', 'void', 'super', 'this',
48
+ ]);
49
+ function norm(rel) {
50
+ return rel.replace(/\\/g, '/');
51
+ }
52
+ function isCodeFile(rel) {
53
+ const ext = path.extname(rel).toLowerCase();
54
+ return CODE_EXT.has(ext);
55
+ }
56
+ function nodeId(file, kind, name) {
57
+ return `${norm(file)}::${kind}::${name}`;
58
+ }
59
+ function extractTsJs(lines) {
60
+ const symbols = [];
61
+ const calls = new Set();
62
+ for (let i = 0; i < lines.length; i++) {
63
+ const line = lines[i];
64
+ const ln = i + 1;
65
+ const fnMatch = line.match(/^\s*(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/) ??
66
+ line.match(/^\s*(?:export\s+)?const\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?\(/) ??
67
+ line.match(/^\s*(?:export\s+)?const\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s+)?function\b/);
68
+ if (fnMatch?.[1]) {
69
+ symbols.push({ kind: 'function', name: fnMatch[1], line: ln });
70
+ }
71
+ const classMatch = line.match(/^\s*(?:export\s+)?class\s+([A-Za-z_$][\w$]*)/);
72
+ if (classMatch?.[1]) {
73
+ symbols.push({ kind: 'class', name: classMatch[1], line: ln });
74
+ }
75
+ const importFrom = line.match(/^\s*import\s+(?:[\w*{}\s,]+?\s+from\s+)?['"]([^'"]+)['"]/);
76
+ if (importFrom?.[1]) {
77
+ symbols.push({ kind: 'import', name: importFrom[1], line: ln, importTarget: importFrom[1] });
78
+ }
79
+ const importSide = line.match(/^\s*import\s+['"]([^'"]+)['"]/);
80
+ if (importSide?.[1] && !importFrom) {
81
+ symbols.push({ kind: 'import', name: importSide[1], line: ln, importTarget: importSide[1] });
82
+ }
83
+ for (const m of line.matchAll(/\b([A-Za-z_$][\w$]*)\s*\(/g)) {
84
+ const name = m[1];
85
+ if (!CALL_KEYWORDS.has(name)) {
86
+ calls.add(name);
87
+ }
88
+ }
89
+ }
90
+ return { symbols, calls: [...calls] };
91
+ }
92
+ function extractPython(lines) {
93
+ const symbols = [];
94
+ const calls = new Set();
95
+ for (let i = 0; i < lines.length; i++) {
96
+ const line = lines[i];
97
+ const ln = i + 1;
98
+ const defMatch = line.match(/^\s*(?:async\s+)?def\s+([A-Za-z_][\w]*)\s*\(/);
99
+ if (defMatch?.[1]) {
100
+ symbols.push({ kind: 'function', name: defMatch[1], line: ln });
101
+ }
102
+ const classMatch = line.match(/^\s*class\s+([A-Za-z_][\w]*)\s*[(:]/);
103
+ if (classMatch?.[1]) {
104
+ symbols.push({ kind: 'class', name: classMatch[1], line: ln });
105
+ }
106
+ const importMatch = line.match(/^\s*(?:from\s+(\S+)\s+import|import\s+(\S+))/);
107
+ if (importMatch) {
108
+ const target = (importMatch[1] ?? importMatch[2] ?? '').split(',')[0].trim();
109
+ if (target) {
110
+ symbols.push({ kind: 'import', name: target, line: ln, importTarget: target });
111
+ }
112
+ }
113
+ for (const m of line.matchAll(/\b([A-Za-z_][\w]*)\s*\(/g)) {
114
+ const name = m[1];
115
+ if (!CALL_KEYWORDS.has(name) && name !== 'def' && name !== 'class') {
116
+ calls.add(name);
117
+ }
118
+ }
119
+ }
120
+ return { symbols, calls: [...calls] };
121
+ }
122
+ async function extractFile(workspaceRoot, relFile) {
123
+ const normalized = norm(relFile);
124
+ if (!isCodeFile(normalized)) {
125
+ return undefined;
126
+ }
127
+ const abs = path.join(workspaceRoot, normalized);
128
+ let text;
129
+ try {
130
+ text = await fs.readFile(abs, 'utf8');
131
+ }
132
+ catch {
133
+ return undefined;
134
+ }
135
+ if (text.length > 512_000) {
136
+ return undefined;
137
+ }
138
+ const lines = text.split('\n');
139
+ const ext = path.extname(normalized).toLowerCase();
140
+ const parsed = ext === '.py' ? extractPython(lines) : extractTsJs(lines);
141
+ return { file: normalized, symbols: parsed.symbols, calls: parsed.calls };
142
+ }
143
+ /** Parse in-memory source (IDE live edit / incremental path). */
144
+ function extractFromSource(relFile, text) {
145
+ const normalized = norm(relFile);
146
+ if (!isCodeFile(normalized) || text.length > 512_000) {
147
+ return undefined;
148
+ }
149
+ const lines = text.split('\n');
150
+ const ext = path.extname(normalized).toLowerCase();
151
+ const parsed = ext === '.py' ? extractPython(lines) : extractTsJs(lines);
152
+ return { file: normalized, symbols: parsed.symbols, calls: parsed.calls };
153
+ }
154
+ function resolveRelativeImport(fromFile, importTarget) {
155
+ if (!importTarget.startsWith('.')) {
156
+ return undefined;
157
+ }
158
+ const base = path.dirname(fromFile);
159
+ const joined = norm(path.join(base, importTarget));
160
+ const candidates = [
161
+ joined,
162
+ `${joined}.ts`,
163
+ `${joined}.tsx`,
164
+ `${joined}.js`,
165
+ `${joined}.jsx`,
166
+ `${joined}/index.ts`,
167
+ `${joined}/index.js`,
168
+ ];
169
+ return candidates[0];
170
+ }
171
+ function symbolNamesByKind(extraction, kind) {
172
+ return extraction.symbols.filter((s) => s.kind === kind).map((s) => s.name);
173
+ }
@@ -0,0 +1,30 @@
1
+ import type { HandoffArtifact, HandoffNextAction, ProjectTimeline } from './types.js';
2
+ import type { ProjectBuiltState } from '../state-builder/types.js';
3
+ import type { KnowledgeSnapshot } from './knowledgeGraph/types.js';
4
+ /** Machine-stable graph ref: fn:name, cls:name, mod:path */
5
+ export declare function normalizeGraphRef(ref: string): string;
6
+ /** Plain next line for canonical export (no [action] tags). */
7
+ export declare function formatNextActionPlain(a: HandoffNextAction): string;
8
+ /** V3.1 execution block — single AI decision entry (no duplicate snapshot lists). */
9
+ export declare function formatAiHandoffExecutionBlock(handoff: HandoffArtifact): string;
10
+ export interface CanonicalAiExportInput {
11
+ taskAnchor: string;
12
+ built?: ProjectBuiltState | null;
13
+ snapshotMarkdown?: string;
14
+ activeFiles: string[];
15
+ recentGitActivity: string[];
16
+ handoff?: HandoffArtifact | null;
17
+ timeline?: ProjectTimeline;
18
+ instruction: string;
19
+ notes?: string;
20
+ /** Optional weak insights — omitted from canonical body when empty */
21
+ insights?: string[];
22
+ /** V3.1 cognitive snapshot — preferred over full graph refs */
23
+ knowledgeSnapshot?: KnowledgeSnapshot | null;
24
+ }
25
+ /**
26
+ * V3.1 canonical markdown for IDE one-click copy (AI Mode).
27
+ * Layered: snapshot → working context → change/impact/graph → execution handoff → instruction.
28
+ */
29
+ export declare function formatCanonicalAiMarkdown(input: CanonicalAiExportInput): string;
30
+ //# sourceMappingURL=formatCanonicalExport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatCanonicalExport.d.ts","sourceRoot":"","sources":["../../src/understanding/formatCanonicalExport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAoBnE,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBrD;AAED,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAalE;AA6KD,qFAAqF;AACrF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA8B9E;AAmCD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAqG/E"}