@slope-dev/slope 1.13.1 → 1.15.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 (192) hide show
  1. package/README.md +118 -189
  2. package/dist/adapters.d.ts +3 -0
  3. package/dist/adapters.d.ts.map +1 -1
  4. package/dist/adapters.js +2 -0
  5. package/dist/adapters.js.map +1 -1
  6. package/dist/cli/commands/context.d.ts +2 -0
  7. package/dist/cli/commands/context.d.ts.map +1 -0
  8. package/dist/cli/commands/context.js +190 -0
  9. package/dist/cli/commands/context.js.map +1 -0
  10. package/dist/cli/commands/distill.d.ts.map +1 -1
  11. package/dist/cli/commands/distill.js +13 -4
  12. package/dist/cli/commands/distill.js.map +1 -1
  13. package/dist/cli/commands/enrich.d.ts +2 -0
  14. package/dist/cli/commands/enrich.d.ts.map +1 -0
  15. package/dist/cli/commands/enrich.js +140 -0
  16. package/dist/cli/commands/enrich.js.map +1 -0
  17. package/dist/cli/commands/guard.d.ts +19 -0
  18. package/dist/cli/commands/guard.d.ts.map +1 -1
  19. package/dist/cli/commands/guard.js +87 -1
  20. package/dist/cli/commands/guard.js.map +1 -1
  21. package/dist/cli/commands/hook.d.ts +1 -0
  22. package/dist/cli/commands/hook.d.ts.map +1 -1
  23. package/dist/cli/commands/hook.js +2 -0
  24. package/dist/cli/commands/hook.js.map +1 -1
  25. package/dist/cli/commands/index-cmd.d.ts +2 -0
  26. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  27. package/dist/cli/commands/index-cmd.js +296 -0
  28. package/dist/cli/commands/index-cmd.js.map +1 -0
  29. package/dist/cli/commands/init.d.ts +4 -2
  30. package/dist/cli/commands/init.d.ts.map +1 -1
  31. package/dist/cli/commands/init.js +204 -145
  32. package/dist/cli/commands/init.js.map +1 -1
  33. package/dist/cli/commands/initiative.d.ts +2 -0
  34. package/dist/cli/commands/initiative.d.ts.map +1 -0
  35. package/dist/cli/commands/initiative.js +207 -0
  36. package/dist/cli/commands/initiative.js.map +1 -0
  37. package/dist/cli/commands/metaphor.d.ts +3 -0
  38. package/dist/cli/commands/metaphor.d.ts.map +1 -0
  39. package/dist/cli/commands/metaphor.js +100 -0
  40. package/dist/cli/commands/metaphor.js.map +1 -0
  41. package/dist/cli/commands/prep.d.ts +2 -0
  42. package/dist/cli/commands/prep.d.ts.map +1 -0
  43. package/dist/cli/commands/prep.js +94 -0
  44. package/dist/cli/commands/prep.js.map +1 -0
  45. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  46. package/dist/cli/commands/roadmap.js +83 -44
  47. package/dist/cli/commands/roadmap.js.map +1 -1
  48. package/dist/cli/commands/store.d.ts +2 -0
  49. package/dist/cli/commands/store.d.ts.map +1 -0
  50. package/dist/cli/commands/store.js +270 -0
  51. package/dist/cli/commands/store.js.map +1 -0
  52. package/dist/cli/guards/stop-check.d.ts +1 -1
  53. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  54. package/dist/cli/guards/stop-check.js +14 -2
  55. package/dist/cli/guards/stop-check.js.map +1 -1
  56. package/dist/cli/index.js +60 -1
  57. package/dist/cli/index.js.map +1 -1
  58. package/dist/cli/interactive-init.d.ts +19 -0
  59. package/dist/cli/interactive-init.d.ts.map +1 -0
  60. package/dist/cli/interactive-init.js +132 -0
  61. package/dist/cli/interactive-init.js.map +1 -0
  62. package/dist/cli/registry.d.ts.map +1 -1
  63. package/dist/cli/registry.js +8 -0
  64. package/dist/cli/registry.js.map +1 -1
  65. package/dist/cli/store.d.ts +9 -0
  66. package/dist/cli/store.d.ts.map +1 -1
  67. package/dist/cli/store.js +29 -0
  68. package/dist/cli/store.js.map +1 -1
  69. package/dist/cli/template-generator.d.ts +1 -1
  70. package/dist/cli/template-generator.d.ts.map +1 -1
  71. package/dist/cli/template-generator.js +5 -3
  72. package/dist/cli/template-generator.js.map +1 -1
  73. package/dist/core/adapters/claude-code.d.ts +3 -0
  74. package/dist/core/adapters/claude-code.d.ts.map +1 -1
  75. package/dist/core/adapters/claude-code.js +17 -2
  76. package/dist/core/adapters/claude-code.js.map +1 -1
  77. package/dist/core/adapters/cline.d.ts +36 -0
  78. package/dist/core/adapters/cline.d.ts.map +1 -0
  79. package/dist/core/adapters/cline.js +279 -0
  80. package/dist/core/adapters/cline.js.map +1 -0
  81. package/dist/core/adapters/cursor.d.ts +3 -0
  82. package/dist/core/adapters/cursor.d.ts.map +1 -1
  83. package/dist/core/adapters/cursor.js +5 -0
  84. package/dist/core/adapters/cursor.js.map +1 -1
  85. package/dist/core/adapters/generic.d.ts +3 -0
  86. package/dist/core/adapters/generic.d.ts.map +1 -1
  87. package/dist/core/adapters/generic.js +5 -0
  88. package/dist/core/adapters/generic.js.map +1 -1
  89. package/dist/core/adapters/windsurf.d.ts +3 -0
  90. package/dist/core/adapters/windsurf.d.ts.map +1 -1
  91. package/dist/core/adapters/windsurf.js +5 -0
  92. package/dist/core/adapters/windsurf.js.map +1 -1
  93. package/dist/core/config.d.ts +8 -0
  94. package/dist/core/config.d.ts.map +1 -1
  95. package/dist/core/config.js +9 -0
  96. package/dist/core/config.js.map +1 -1
  97. package/dist/core/context.d.ts +20 -0
  98. package/dist/core/context.d.ts.map +1 -0
  99. package/dist/core/context.js +59 -0
  100. package/dist/core/context.js.map +1 -0
  101. package/dist/core/embedding-client.d.ts +11 -0
  102. package/dist/core/embedding-client.d.ts.map +1 -0
  103. package/dist/core/embedding-client.js +92 -0
  104. package/dist/core/embedding-client.js.map +1 -0
  105. package/dist/core/embedding-store.d.ts +44 -0
  106. package/dist/core/embedding-store.d.ts.map +1 -0
  107. package/dist/core/embedding-store.js +7 -0
  108. package/dist/core/embedding-store.js.map +1 -0
  109. package/dist/core/embedding.d.ts +32 -0
  110. package/dist/core/embedding.d.ts.map +1 -0
  111. package/dist/core/embedding.js +114 -0
  112. package/dist/core/embedding.js.map +1 -0
  113. package/dist/core/enrich.d.ts +76 -0
  114. package/dist/core/enrich.d.ts.map +1 -0
  115. package/dist/core/enrich.js +115 -0
  116. package/dist/core/enrich.js.map +1 -0
  117. package/dist/core/harness.d.ts +6 -0
  118. package/dist/core/harness.d.ts.map +1 -1
  119. package/dist/core/harness.js +1 -1
  120. package/dist/core/harness.js.map +1 -1
  121. package/dist/core/index.d.ts +30 -8
  122. package/dist/core/index.d.ts.map +1 -1
  123. package/dist/core/index.js +26 -5
  124. package/dist/core/index.js.map +1 -1
  125. package/dist/core/initiative.d.ts +72 -0
  126. package/dist/core/initiative.d.ts.map +1 -0
  127. package/dist/core/initiative.js +421 -0
  128. package/dist/core/initiative.js.map +1 -0
  129. package/dist/core/interview-engine.d.ts +34 -0
  130. package/dist/core/interview-engine.d.ts.map +1 -0
  131. package/dist/core/interview-engine.js +195 -0
  132. package/dist/core/interview-engine.js.map +1 -0
  133. package/dist/core/interview-steps.d.ts +27 -0
  134. package/dist/core/interview-steps.d.ts.map +1 -0
  135. package/dist/core/interview-steps.js +157 -0
  136. package/dist/core/interview-steps.js.map +1 -0
  137. package/dist/core/interview.d.ts +20 -0
  138. package/dist/core/interview.d.ts.map +1 -1
  139. package/dist/core/interview.js +62 -35
  140. package/dist/core/interview.js.map +1 -1
  141. package/dist/core/metaphor-preview.d.ts +34 -0
  142. package/dist/core/metaphor-preview.d.ts.map +1 -0
  143. package/dist/core/metaphor-preview.js +94 -0
  144. package/dist/core/metaphor-preview.js.map +1 -0
  145. package/dist/core/metaphor.d.ts +14 -0
  146. package/dist/core/metaphor.d.ts.map +1 -1
  147. package/dist/core/metaphor.js +14 -0
  148. package/dist/core/metaphor.js.map +1 -1
  149. package/dist/core/plugins.d.ts +12 -0
  150. package/dist/core/plugins.d.ts.map +1 -1
  151. package/dist/core/plugins.js +58 -1
  152. package/dist/core/plugins.js.map +1 -1
  153. package/dist/core/prep.d.ts +88 -0
  154. package/dist/core/prep.d.ts.map +1 -0
  155. package/dist/core/prep.js +302 -0
  156. package/dist/core/prep.js.map +1 -0
  157. package/dist/core/roadmap.d.ts.map +1 -1
  158. package/dist/core/roadmap.js +5 -4
  159. package/dist/core/roadmap.js.map +1 -1
  160. package/dist/core/roles.d.ts +3 -0
  161. package/dist/core/roles.d.ts.map +1 -1
  162. package/dist/core/roles.js +36 -0
  163. package/dist/core/roles.js.map +1 -1
  164. package/dist/core/store-health.d.ts +11 -0
  165. package/dist/core/store-health.d.ts.map +1 -0
  166. package/dist/core/store-health.js +26 -0
  167. package/dist/core/store-health.js.map +1 -0
  168. package/dist/core/store.d.ts +11 -1
  169. package/dist/core/store.d.ts.map +1 -1
  170. package/dist/core/store.js.map +1 -1
  171. package/dist/mcp/index.d.ts +2 -2
  172. package/dist/mcp/index.d.ts.map +1 -1
  173. package/dist/mcp/index.js +103 -6
  174. package/dist/mcp/index.js.map +1 -1
  175. package/dist/mcp/index.test.js +7 -4
  176. package/dist/mcp/index.test.js.map +1 -1
  177. package/dist/mcp/registry.d.ts +1 -1
  178. package/dist/mcp/registry.d.ts.map +1 -1
  179. package/dist/mcp/registry.js +47 -3
  180. package/dist/mcp/registry.js.map +1 -1
  181. package/dist/mcp/sandbox.d.ts.map +1 -1
  182. package/dist/mcp/sandbox.js +18 -1
  183. package/dist/mcp/sandbox.js.map +1 -1
  184. package/dist/store/index.d.ts +34 -3
  185. package/dist/store/index.d.ts.map +1 -1
  186. package/dist/store/index.js +220 -4
  187. package/dist/store/index.js.map +1 -1
  188. package/dist/store-pg/index.d.ts +3 -0
  189. package/dist/store-pg/index.d.ts.map +1 -1
  190. package/dist/store-pg/index.js +74 -1
  191. package/dist/store-pg/index.js.map +1 -1
  192. package/package.json +14 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-client.d.ts","sourceRoot":"","sources":["../../src/core/embedding-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAclF;;GAEG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAqCzB;AAOD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,eAAe,EACvB,SAAS,SAAK,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAsC5B"}
@@ -0,0 +1,92 @@
1
+ // SLOPE — HTTP Client for OpenAI-Compatible Embedding Endpoints
2
+ /**
3
+ * Resolve apiKey — supports `env:VAR_NAME` syntax for environment variable resolution.
4
+ */
5
+ function resolveApiKey(key) {
6
+ if (!key)
7
+ return undefined;
8
+ if (key.startsWith('env:')) {
9
+ const envVar = key.slice(4);
10
+ return process.env[envVar] || undefined;
11
+ }
12
+ return key;
13
+ }
14
+ /**
15
+ * Embed an array of texts using an OpenAI-compatible embedding endpoint.
16
+ */
17
+ export async function embed(texts, config) {
18
+ if (texts.length === 0)
19
+ return [];
20
+ const apiKey = resolveApiKey(config.apiKey);
21
+ const headers = {
22
+ 'Content-Type': 'application/json',
23
+ };
24
+ if (apiKey) {
25
+ headers['Authorization'] = `Bearer ${apiKey}`;
26
+ }
27
+ const response = await fetch(config.endpoint, {
28
+ method: 'POST',
29
+ headers,
30
+ body: JSON.stringify({
31
+ model: config.model,
32
+ input: texts,
33
+ }),
34
+ signal: AbortSignal.timeout(60_000), // 60s timeout per batch
35
+ });
36
+ if (!response.ok) {
37
+ const body = await response.text().catch(() => '');
38
+ throw new Error(`Embedding request failed (${response.status}): ${body}`);
39
+ }
40
+ const json = await response.json();
41
+ if (!json.data || !Array.isArray(json.data)) {
42
+ throw new Error('Unexpected embedding response shape: missing data array');
43
+ }
44
+ // Sort by index to maintain input order
45
+ const sorted = json.data.sort((a, b) => a.index - b.index);
46
+ return sorted.map(d => new Float32Array(d.embedding));
47
+ }
48
+ // Safety net: truncate chunks that exceed embedding model context.
49
+ // nomic-embed-text has 8192 token context; dense content can tokenize
50
+ // at ~2 chars/token, so 8000 chars is a safe per-chunk ceiling.
51
+ const MAX_EMBED_CHARS = 8000;
52
+ /**
53
+ * Embed code chunks in batches, returning full EmbeddingResults.
54
+ * Truncates oversized chunks and retries failed batches individually.
55
+ */
56
+ export async function embedBatch(chunks, config, batchSize = 32) {
57
+ const results = [];
58
+ for (let i = 0; i < chunks.length; i += batchSize) {
59
+ const batch = chunks.slice(i, i + batchSize);
60
+ const texts = batch.map(c => c.content.length > MAX_EMBED_CHARS ? c.content.slice(0, MAX_EMBED_CHARS) : c.content);
61
+ try {
62
+ const vectors = await embed(texts, config);
63
+ for (let j = 0; j < batch.length; j++) {
64
+ results.push({
65
+ filePath: batch[j].filePath,
66
+ chunkIndex: batch[j].chunkIndex,
67
+ chunkText: batch[j].content,
68
+ vector: vectors[j],
69
+ });
70
+ }
71
+ }
72
+ catch {
73
+ // Batch failed — retry each chunk individually, skip failures
74
+ for (let j = 0; j < batch.length; j++) {
75
+ try {
76
+ const [vector] = await embed([texts[j]], config);
77
+ results.push({
78
+ filePath: batch[j].filePath,
79
+ chunkIndex: batch[j].chunkIndex,
80
+ chunkText: batch[j].content,
81
+ vector,
82
+ });
83
+ }
84
+ catch {
85
+ // Skip this chunk — content exceeds model context
86
+ }
87
+ }
88
+ }
89
+ }
90
+ return results;
91
+ }
92
+ //# sourceMappingURL=embedding-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-client.js","sourceRoot":"","sources":["../../src/core/embedding-client.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAIhE;;GAEG;AACH,SAAS,aAAa,CAAC,GAA8B;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,KAAe,EACf,MAAuB;IAEvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,wBAAwB;KAC9D,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAE/B,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,wCAAwC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,mEAAmE;AACnE,sEAAsE;AACtE,gEAAgE;AAChE,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,MAAuB,EACvB,SAAS,GAAG,EAAE;IAEd,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1B,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CACrF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;oBAC3B,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU;oBAC/B,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;oBAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;YAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBACjD,OAAO,CAAC,IAAI,CAAC;wBACX,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;wBAC3B,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU;wBAC/B,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;wBAC3B,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,kDAAkD;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,44 @@
1
+ export interface EmbeddingEntry {
2
+ filePath: string;
3
+ chunkIndex: number;
4
+ chunkText: string;
5
+ gitSha: string;
6
+ model: string;
7
+ vector: Float32Array;
8
+ }
9
+ export interface EmbeddingSearchResult {
10
+ id: number;
11
+ filePath: string;
12
+ chunkIndex: number;
13
+ chunkText: string;
14
+ score: number;
15
+ }
16
+ export interface EmbeddingStats {
17
+ fileCount: number;
18
+ chunkCount: number;
19
+ model: string | null;
20
+ dimensions: number | null;
21
+ lastIndexedAt: string | null;
22
+ lastIndexedSha: string | null;
23
+ }
24
+ export interface IndexMeta {
25
+ sha: string;
26
+ model: string;
27
+ dimensions: number;
28
+ }
29
+ export interface EmbeddingStore {
30
+ saveEmbeddings(entries: EmbeddingEntry[]): Promise<void>;
31
+ searchEmbeddings(queryVector: Float32Array, limit?: number): Promise<EmbeddingSearchResult[]>;
32
+ getIndexedFiles(): Promise<Array<{
33
+ filePath: string;
34
+ gitSha: string;
35
+ model: string;
36
+ }>>;
37
+ deleteEmbeddingsByFile(filePath: string): Promise<void>;
38
+ getEmbeddingStats(): Promise<EmbeddingStats>;
39
+ setIndexMeta(sha: string, model: string, dimensions: number): Promise<void>;
40
+ getIndexMeta(): Promise<IndexMeta | null>;
41
+ }
42
+ /** Runtime type guard — check if a store supports embedding operations. */
43
+ export declare function hasEmbeddingSupport(store: unknown): store is EmbeddingStore;
44
+ //# sourceMappingURL=embedding-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-store.d.ts","sourceRoot":"","sources":["../../src/core/embedding-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE9F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACvF,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAE3E"}
@@ -0,0 +1,7 @@
1
+ // SLOPE — EmbeddingStore Interface
2
+ // Separate from SlopeStore — uses type guard for runtime detection.
3
+ /** Runtime type guard — check if a store supports embedding operations. */
4
+ export function hasEmbeddingSupport(store) {
5
+ return store !== null && typeof store === 'object' && 'searchEmbeddings' in store;
6
+ }
7
+ //# sourceMappingURL=embedding-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-store.js","sourceRoot":"","sources":["../../src/core/embedding-store.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AA+CpE,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB,IAAK,KAAgB,CAAC;AAChG,CAAC"}
@@ -0,0 +1,32 @@
1
+ export interface EmbeddingConfig {
2
+ endpoint: string;
3
+ model: string;
4
+ dimensions: number;
5
+ apiKey?: string;
6
+ }
7
+ export interface CodeChunk {
8
+ filePath: string;
9
+ chunkIndex: number;
10
+ content: string;
11
+ }
12
+ export interface EmbeddingResult {
13
+ filePath: string;
14
+ chunkIndex: number;
15
+ chunkText: string;
16
+ vector: Float32Array;
17
+ }
18
+ export declare const MAX_CHUNK_FILE_SIZE: number;
19
+ export declare const SKIP_EXTENSIONS: Set<string>;
20
+ /** Filenames to skip regardless of extension (lock files, generated output). */
21
+ export declare const SKIP_FILENAMES: Set<string>;
22
+ export declare const SKIP_DIRS: Set<string>;
23
+ /**
24
+ * Chunk a file into embeddable code segments.
25
+ * Strategy: split by top-level declarations for TS/JS, fixed-size for others.
26
+ */
27
+ export declare function chunkFile(filePath: string, content: string, maxLines?: number): CodeChunk[];
28
+ /**
29
+ * Check if a file path should be skipped for embedding.
30
+ */
31
+ export declare function shouldSkipFile(filePath: string): boolean;
32
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAE9C,eAAO,MAAM,eAAe,aAI1B,CAAC;AAEH,gFAAgF;AAChF,eAAO,MAAM,cAAc,aAEzB,CAAC;AAEH,eAAO,MAAM,SAAS,aAEpB,CAAC;AAKH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAoB,GAAG,SAAS,EAAE,CAmBtG;AAqED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcxD"}
@@ -0,0 +1,114 @@
1
+ // SLOPE — Embedding Types & Chunking Logic (pure — no HTTP calls)
2
+ export const MAX_CHUNK_FILE_SIZE = 100 * 1024; // 100KB — skip larger files
3
+ export const SKIP_EXTENSIONS = new Set([
4
+ '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf',
5
+ '.eot', '.mp3', '.mp4', '.zip', '.tar', '.gz', '.bin', '.exe', '.dll',
6
+ '.so', '.dylib', '.lock', '.map',
7
+ ]);
8
+ /** Filenames to skip regardless of extension (lock files, generated output). */
9
+ export const SKIP_FILENAMES = new Set([
10
+ 'pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lockb',
11
+ ]);
12
+ export const SKIP_DIRS = new Set([
13
+ 'node_modules', 'dist', '.git', '.slope', 'coverage', 'slope-loop',
14
+ ]);
15
+ const DEFAULT_MAX_LINES = 200;
16
+ const DEFAULT_OVERLAP_LINES = 20;
17
+ /**
18
+ * Chunk a file into embeddable code segments.
19
+ * Strategy: split by top-level declarations for TS/JS, fixed-size for others.
20
+ */
21
+ export function chunkFile(filePath, content, maxLines = DEFAULT_MAX_LINES) {
22
+ if (content.length > MAX_CHUNK_FILE_SIZE)
23
+ return [];
24
+ if (content.trim().length === 0)
25
+ return [];
26
+ const lines = content.split('\n');
27
+ // Small files: single chunk
28
+ if (lines.length <= maxLines) {
29
+ return [{ filePath, chunkIndex: 0, content }];
30
+ }
31
+ const isTS = filePath.endsWith('.ts') || filePath.endsWith('.tsx') ||
32
+ filePath.endsWith('.js') || filePath.endsWith('.jsx');
33
+ if (isTS) {
34
+ return chunkByDeclarations(filePath, content, lines, maxLines);
35
+ }
36
+ return chunkByLines(filePath, lines, maxLines, DEFAULT_OVERLAP_LINES);
37
+ }
38
+ /**
39
+ * Split TS/JS files by top-level declarations (export, function, class, const, interface, type).
40
+ */
41
+ function chunkByDeclarations(filePath, _content, lines, maxLines) {
42
+ const declarationPattern = /^(export\s+)?(default\s+)?(async\s+)?(function|class|const|let|var|interface|type|enum|abstract)\s/;
43
+ const breakpoints = [0];
44
+ for (let i = 1; i < lines.length; i++) {
45
+ const line = lines[i];
46
+ if (declarationPattern.test(line) && i - breakpoints[breakpoints.length - 1] >= 10) {
47
+ breakpoints.push(i);
48
+ }
49
+ }
50
+ // Merge breakpoints into chunks respecting maxLines
51
+ const chunks = [];
52
+ let chunkStart = 0;
53
+ let chunkIndex = 0;
54
+ for (let b = 1; b < breakpoints.length; b++) {
55
+ if (breakpoints[b] - chunkStart > maxLines) {
56
+ const chunkContent = lines.slice(chunkStart, breakpoints[b]).join('\n');
57
+ chunks.push({ filePath, chunkIndex, content: chunkContent });
58
+ chunkIndex++;
59
+ chunkStart = breakpoints[b];
60
+ }
61
+ }
62
+ // Final chunk
63
+ const remaining = lines.slice(chunkStart).join('\n');
64
+ if (remaining.trim().length > 0) {
65
+ chunks.push({ filePath, chunkIndex, content: remaining });
66
+ }
67
+ return chunks;
68
+ }
69
+ /**
70
+ * Fixed-size line-based chunking with overlap for non-TS files.
71
+ */
72
+ function chunkByLines(filePath, lines, maxLines, overlap) {
73
+ const chunks = [];
74
+ let start = 0;
75
+ let chunkIndex = 0;
76
+ while (start < lines.length) {
77
+ const end = Math.min(start + maxLines, lines.length);
78
+ const chunkContent = lines.slice(start, end).join('\n');
79
+ if (chunkContent.trim().length > 0) {
80
+ chunks.push({ filePath, chunkIndex, content: chunkContent });
81
+ chunkIndex++;
82
+ }
83
+ start = end - overlap;
84
+ if (start >= lines.length - overlap)
85
+ break;
86
+ }
87
+ // Ensure final lines are included
88
+ if (start < lines.length) {
89
+ const chunkContent = lines.slice(start).join('\n');
90
+ if (chunkContent.trim().length > 0 && (chunks.length === 0 || chunks[chunks.length - 1].content !== chunkContent)) {
91
+ chunks.push({ filePath, chunkIndex, content: chunkContent });
92
+ }
93
+ }
94
+ return chunks;
95
+ }
96
+ /**
97
+ * Check if a file path should be skipped for embedding.
98
+ */
99
+ export function shouldSkipFile(filePath) {
100
+ const ext = filePath.slice(filePath.lastIndexOf('.'));
101
+ if (SKIP_EXTENSIONS.has(ext))
102
+ return true;
103
+ const parts = filePath.split('/');
104
+ for (const part of parts) {
105
+ if (SKIP_DIRS.has(part))
106
+ return true;
107
+ }
108
+ // Check filename (lock files with non-.lock extensions)
109
+ const filename = parts[parts.length - 1];
110
+ if (SKIP_FILENAMES.has(filename))
111
+ return true;
112
+ return false;
113
+ }
114
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { EmbeddingConfig } from './embedding.js';
2
+ import type { EmbeddingStore } from './embedding-store.js';
3
+ import type { GolfScorecard } from './types.js';
4
+ export interface EnrichedTicket {
5
+ key: string;
6
+ title: string;
7
+ club: string;
8
+ description: string;
9
+ acceptance_criteria: string[];
10
+ modules: string[];
11
+ max_files: number;
12
+ files: {
13
+ primary: string[];
14
+ test: string[];
15
+ related: string[];
16
+ };
17
+ estimated_tokens: number;
18
+ similar_tickets: Array<{
19
+ key: string;
20
+ title: string;
21
+ result: string;
22
+ sprint: number;
23
+ }>;
24
+ hazards: string[];
25
+ }
26
+ export interface EnrichedBacklog {
27
+ sprints: Array<{
28
+ id: string;
29
+ title?: string;
30
+ strategy?: string;
31
+ tickets: EnrichedTicket[];
32
+ [key: string]: unknown;
33
+ }>;
34
+ _enrichMeta: {
35
+ version: 1;
36
+ enrichedAt: string;
37
+ topK: number;
38
+ };
39
+ [key: string]: unknown;
40
+ }
41
+ /**
42
+ * Estimate token count for a list of files.
43
+ * Uses bytes/4 with 1.2x safety factor (TypeScript averages ~3.3 bytes/token).
44
+ */
45
+ export declare function estimateTokens(filePaths: string[], cwd: string): number;
46
+ /**
47
+ * Enrich a single ticket with file context and metadata.
48
+ */
49
+ export declare function enrichTicket(opts: {
50
+ ticket: {
51
+ key: string;
52
+ title: string;
53
+ description: string;
54
+ modules: string[];
55
+ acceptance_criteria: string[];
56
+ club: string;
57
+ max_files: number;
58
+ };
59
+ store: EmbeddingStore;
60
+ embeddingConfig: EmbeddingConfig;
61
+ scorecards: GolfScorecard[];
62
+ cwd: string;
63
+ topK?: number;
64
+ }): Promise<EnrichedTicket>;
65
+ /**
66
+ * Enrich all tickets in a backlog.
67
+ */
68
+ export declare function enrichBacklog(opts: {
69
+ backlogPath: string;
70
+ store: EmbeddingStore;
71
+ embeddingConfig: EmbeddingConfig;
72
+ scorecards: GolfScorecard[];
73
+ cwd: string;
74
+ topK?: number;
75
+ }): Promise<EnrichedBacklog>;
76
+ //# sourceMappingURL=enrich.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/core/enrich.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAahD,MAAM,WAAW,cAAc;IAE7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAElB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvF,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC,CAAC;IACH,WAAW,EAAE;QACX,OAAO,EAAE,CAAC,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CAsD1B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,eAAe,CAAC,CA6C3B"}
@@ -0,0 +1,115 @@
1
+ // SLOPE — Backlog Enrichment
2
+ // Batch-enriches tickets with file context, token estimates, and hazards.
3
+ import { readFileSync, statSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { embed } from './embedding-client.js';
6
+ import { deduplicateByFile } from './context.js';
7
+ import { buildQueryText, collectTestFiles, findSimilarTickets, extractHazards, } from './prep.js';
8
+ // --- Functions ---
9
+ /**
10
+ * Estimate token count for a list of files.
11
+ * Uses bytes/4 with 1.2x safety factor (TypeScript averages ~3.3 bytes/token).
12
+ */
13
+ export function estimateTokens(filePaths, cwd) {
14
+ let totalBytes = 0;
15
+ for (const fp of filePaths) {
16
+ try {
17
+ totalBytes += statSync(join(cwd, fp)).size;
18
+ }
19
+ catch { /* skip missing */ }
20
+ }
21
+ return Math.ceil((totalBytes / 4) * 1.2);
22
+ }
23
+ /**
24
+ * Enrich a single ticket with file context and metadata.
25
+ */
26
+ export async function enrichTicket(opts) {
27
+ const { ticket, store, embeddingConfig, scorecards, cwd, topK = 5 } = opts;
28
+ // Build query and search
29
+ const queryText = buildQueryText(ticket);
30
+ const [queryVector] = await embed([queryText], embeddingConfig);
31
+ const rawResults = await store.searchEmbeddings(queryVector, topK * 3);
32
+ const contextResults = rawResults.map(r => ({
33
+ filePath: r.filePath,
34
+ chunkIndex: r.chunkIndex,
35
+ snippet: r.chunkText,
36
+ score: r.score,
37
+ }));
38
+ const deduped = deduplicateByFile(contextResults);
39
+ // Split into primary (>= 0.4) and related (>= 0.3)
40
+ const primary = deduped.filter(r => r.score >= 0.4).slice(0, topK);
41
+ const related = deduped.filter(r => r.score >= 0.3 && r.score < 0.4).slice(0, topK);
42
+ const primaryPaths = primary.map(r => r.filePath);
43
+ const relatedPaths = related.map(r => r.filePath);
44
+ // Test files
45
+ const testFiles = collectTestFiles(primaryPaths, cwd);
46
+ // Token estimate (all files — routing metric)
47
+ const allPaths = [...primaryPaths, ...testFiles, ...relatedPaths];
48
+ const estimated_tokens = estimateTokens(allPaths, cwd);
49
+ // Similar tickets
50
+ const similar_tickets = findSimilarTickets(ticket.title, scorecards);
51
+ // Hazards
52
+ const hazards = extractHazards(ticket.modules, scorecards);
53
+ return {
54
+ key: ticket.key,
55
+ title: ticket.title,
56
+ club: ticket.club,
57
+ description: ticket.description,
58
+ acceptance_criteria: ticket.acceptance_criteria,
59
+ modules: ticket.modules,
60
+ max_files: ticket.max_files,
61
+ files: {
62
+ primary: primaryPaths,
63
+ test: testFiles,
64
+ related: relatedPaths,
65
+ },
66
+ estimated_tokens,
67
+ similar_tickets,
68
+ hazards,
69
+ };
70
+ }
71
+ /**
72
+ * Enrich all tickets in a backlog.
73
+ */
74
+ export async function enrichBacklog(opts) {
75
+ const { backlogPath, store, embeddingConfig, scorecards, cwd, topK = 5 } = opts;
76
+ const raw = JSON.parse(readFileSync(backlogPath, 'utf8'));
77
+ const sprints = raw.sprints ?? [];
78
+ const enrichedSprints = [];
79
+ for (const sprint of sprints) {
80
+ const enrichedTickets = [];
81
+ for (const ticket of sprint.tickets ?? []) {
82
+ const enriched = await enrichTicket({
83
+ ticket: {
84
+ key: ticket.key ?? ticket.id ?? '',
85
+ title: ticket.title ?? '',
86
+ description: ticket.description ?? '',
87
+ modules: ticket.modules ?? [],
88
+ acceptance_criteria: ticket.acceptance_criteria ?? [],
89
+ club: ticket.club ?? 'short_iron',
90
+ max_files: ticket.max_files ?? 1,
91
+ },
92
+ store,
93
+ embeddingConfig,
94
+ scorecards,
95
+ cwd,
96
+ topK,
97
+ });
98
+ enrichedTickets.push(enriched);
99
+ }
100
+ enrichedSprints.push({
101
+ ...sprint,
102
+ tickets: enrichedTickets,
103
+ });
104
+ }
105
+ return {
106
+ ...raw,
107
+ sprints: enrichedSprints,
108
+ _enrichMeta: {
109
+ version: 1,
110
+ enrichedAt: new Date().toISOString(),
111
+ topK,
112
+ },
113
+ };
114
+ }
115
+ //# sourceMappingURL=enrich.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/core/enrich.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,0EAA0E;AAE1E,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,WAAW,CAAC;AAwCnB,oBAAoB;AAEpB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAmB,EAAE,GAAW;IAC7D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC;YAAC,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAelC;IACC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAE3E,yBAAyB;IACzB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IAEvE,MAAM,cAAc,GAAoB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,OAAO,EAAE,CAAC,CAAC,SAAS;QACpB,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAElD,mDAAmD;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAEpF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAElD,aAAa;IACb,MAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAEtD,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEvD,kBAAkB;IAClB,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAErE,UAAU;IACV,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE3D,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE;YACL,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,YAAY;SACtB;QACD,gBAAgB;QAChB,eAAe;QACf,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAOnC;IACC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAEhF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAElC,MAAM,eAAe,GAA+B,EAAE,CAAC;IAEvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,eAAe,GAAqB,EAAE,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC;gBAClC,MAAM,EAAE;oBACN,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE;oBAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;oBACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;oBACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;oBAC7B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,EAAE;oBACrD,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,YAAY;oBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;iBACjC;gBACD,KAAK;gBACL,eAAe;gBACf,UAAU;gBACV,GAAG;gBACH,IAAI;aACL,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,eAAe,CAAC,IAAI,CAAC;YACnB,GAAG,MAAM;YACT,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,GAAG,GAAG;QACN,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,IAAI;SACL;KACF,CAAC;AACJ,CAAC"}
@@ -27,6 +27,12 @@ export interface HarnessAdapter {
27
27
  installGuards(cwd: string, guards: AnyGuardDefinition[]): void;
28
28
  /** Detect whether this harness is active in the given directory */
29
29
  detect(cwd: string): boolean;
30
+ /** Hook events this harness supports (e.g. PreToolUse, PostToolUse, Stop, PreCompact) */
31
+ readonly supportedEvents: ReadonlySet<string>;
32
+ /** Whether the harness can inject additionalContext into the agent's context */
33
+ readonly supportsContextInjection: boolean;
34
+ /** Return the path to this harness's hooks config file, or null if N/A */
35
+ hooksConfigPath(cwd: string): string | null;
30
36
  }
31
37
  /** Claude Code tool name mappings */
32
38
  export declare const CLAUDE_CODE_TOOLS: ToolNameMap;
@@ -1 +1 @@
1
- {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/core/harness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlE,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE3H,uEAAuE;AACvE,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,WAAW,CAAC;AAEhB,wCAAwC;AACxC,eAAO,MAAM,eAAe,EAAE,YAAY,EAQzC,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAEvD,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,SAAS,CAAC;IACd,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,SAAS,EAAE,WAAW,CAAC;IACvB,sDAAsD;IACtD,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAClD,uDAAuD;IACvD,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IACnD,gDAAgD;IAChD,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/C,oDAAoD;IACpD,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;IACpF,4DAA4D;IAC5D,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC;IAC/D,mEAAmE;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAID,qCAAqC;AACrC,eAAO,MAAM,iBAAiB,EAAE,WAQ/B,CAAC;AAIF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAAqD,CAAC;AAM9F,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAEpE;AAED,uCAAuC;AACvC,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAerE;AAED,mDAAmD;AACnD,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUtH"}
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/core/harness.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlE,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE3H,uEAAuE;AACvE,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,WAAW,CAAC;AAEhB,wCAAwC;AACxC,eAAO,MAAM,eAAe,EAAE,YAAY,EAQzC,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAEvD,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,SAAS,CAAC;IACd,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,SAAS,EAAE,WAAW,CAAC;IACvB,sDAAsD;IACtD,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAClD,uDAAuD;IACvD,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IACnD,gDAAgD;IAChD,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/C,oDAAoD;IACpD,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;IACpF,4DAA4D;IAC5D,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC;IAC/D,mEAAmE;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,gFAAgF;IAChF,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;IAC3C,0EAA0E;IAC1E,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7C;AAID,qCAAqC;AACrC,eAAO,MAAM,iBAAiB,EAAE,WAQ/B,CAAC;AAIF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAA8D,CAAC;AAMvG,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAEpE;AAED,uCAAuC;AACvC,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAerE;AAED,mDAAmD;AACnD,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUtH"}
@@ -23,7 +23,7 @@ export const CLAUDE_CODE_TOOLS = {
23
23
  };
24
24
  // --- Adapter Priority ---
25
25
  /** Detection order for adapters. First match wins. Generic is always last (fallback). */
26
- export const ADAPTER_PRIORITY = ['claude-code', 'cursor', 'windsurf', 'generic'];
26
+ export const ADAPTER_PRIORITY = ['claude-code', 'cursor', 'windsurf', 'cline', 'generic'];
27
27
  // --- Adapter Registry ---
28
28
  const adapters = new Map();
29
29
  /** Register a harness adapter. Idempotent — overwrites if id already registered. */
@@ -1 +1 @@
1
- {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/core/harness.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,6FAA6F;AAmB7F,wCAAwC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,WAAW;IACX,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;CACZ,CAAC;AA2BF,oCAAoC;AAEpC,qCAAqC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAgB;IAC5C,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,MAAM;IACpB,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,SAAS,EAAE,cAAc;CAC1B,CAAC;AAEF,2BAA2B;AAE3B,yFAAyF;AACzF,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE9F,2BAA2B;AAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,EAAa;IACtC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,2EAA2E;IAC3E,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IAC3C,CAAC;IACD,uEAAuE;IACvE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;YAAE,SAAS;QACvC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,SAAS;QACpD,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IAC1C,CAAC;IACD,qCAAqC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB,EAAE,UAAsC;IAChG,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,+DAA+D;QAC/D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/core/harness.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,6FAA6F;AAmB7F,wCAAwC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,WAAW;IACX,YAAY;IACZ,cAAc;IACd,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;CACZ,CAAC;AAiCF,oCAAoC;AAEpC,qCAAqC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAgB;IAC5C,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,MAAM;IACpB,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,SAAS,EAAE,cAAc;CAC1B,CAAC;AAEF,2BAA2B;AAE3B,yFAAyF;AACzF,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAEvG,2BAA2B;AAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,EAAa;IACtC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,2EAA2E;IAC3E,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IAC3C,CAAC;IACD,uEAAuE;IACvE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;YAAE,SAAS;QACvC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,SAAS;QACpD,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IAC1C,CAAC;IACD,qCAAqC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB,EAAE,UAAsC;IAChG,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,+DAA+D;QAC/D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}