logicstamp-context 0.1.1 → 0.2.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 (159) hide show
  1. package/LLM_CONTEXT.md +4 -3
  2. package/README.md +116 -19
  3. package/dist/cli/commands/compare.d.ts.map +1 -1
  4. package/dist/cli/commands/compare.js +17 -8
  5. package/dist/cli/commands/compare.js.map +1 -1
  6. package/dist/cli/commands/context/bundleFormatter.d.ts +20 -0
  7. package/dist/cli/commands/context/bundleFormatter.d.ts.map +1 -0
  8. package/dist/cli/commands/context/bundleFormatter.js +55 -0
  9. package/dist/cli/commands/context/bundleFormatter.js.map +1 -0
  10. package/dist/cli/commands/context/configManager.d.ts +23 -0
  11. package/dist/cli/commands/context/configManager.d.ts.map +1 -0
  12. package/dist/cli/commands/context/configManager.js +69 -0
  13. package/dist/cli/commands/context/configManager.js.map +1 -0
  14. package/dist/cli/commands/context/contractBuilder.d.ts +18 -0
  15. package/dist/cli/commands/context/contractBuilder.d.ts.map +1 -0
  16. package/dist/cli/commands/context/contractBuilder.js +72 -0
  17. package/dist/cli/commands/context/contractBuilder.js.map +1 -0
  18. package/dist/cli/commands/context/fileWriter.d.ts +38 -0
  19. package/dist/cli/commands/context/fileWriter.d.ts.map +1 -0
  20. package/dist/cli/commands/context/fileWriter.js +165 -0
  21. package/dist/cli/commands/context/fileWriter.js.map +1 -0
  22. package/dist/cli/commands/context/statsCalculator.d.ts +44 -0
  23. package/dist/cli/commands/context/statsCalculator.d.ts.map +1 -0
  24. package/dist/cli/commands/context/statsCalculator.js +150 -0
  25. package/dist/cli/commands/context/statsCalculator.js.map +1 -0
  26. package/dist/cli/commands/context/tokenEstimator.d.ts +76 -0
  27. package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -0
  28. package/dist/cli/commands/context/tokenEstimator.js +258 -0
  29. package/dist/cli/commands/context/tokenEstimator.js.map +1 -0
  30. package/dist/cli/commands/context.d.ts +1 -0
  31. package/dist/cli/commands/context.d.ts.map +1 -1
  32. package/dist/cli/commands/context.js +72 -399
  33. package/dist/cli/commands/context.js.map +1 -1
  34. package/dist/cli/commands/style.d.ts +11 -0
  35. package/dist/cli/commands/style.d.ts.map +1 -0
  36. package/dist/cli/commands/style.js +15 -0
  37. package/dist/cli/commands/style.js.map +1 -0
  38. package/dist/cli/handlers/cleanHandler.d.ts +5 -0
  39. package/dist/cli/handlers/cleanHandler.d.ts.map +1 -0
  40. package/dist/cli/handlers/cleanHandler.js +28 -0
  41. package/dist/cli/handlers/cleanHandler.js.map +1 -0
  42. package/dist/cli/handlers/compareHandler.d.ts +5 -0
  43. package/dist/cli/handlers/compareHandler.d.ts.map +1 -0
  44. package/dist/cli/handlers/compareHandler.js +332 -0
  45. package/dist/cli/handlers/compareHandler.js.map +1 -0
  46. package/dist/cli/handlers/contextHandler.d.ts +5 -0
  47. package/dist/cli/handlers/contextHandler.d.ts.map +1 -0
  48. package/dist/cli/handlers/contextHandler.js +24 -0
  49. package/dist/cli/handlers/contextHandler.js.map +1 -0
  50. package/dist/cli/handlers/initHandler.d.ts +6 -0
  51. package/dist/cli/handlers/initHandler.d.ts.map +1 -0
  52. package/dist/cli/handlers/initHandler.js +30 -0
  53. package/dist/cli/handlers/initHandler.js.map +1 -0
  54. package/dist/cli/handlers/styleHandler.d.ts +5 -0
  55. package/dist/cli/handlers/styleHandler.d.ts.map +1 -0
  56. package/dist/cli/handlers/styleHandler.js +30 -0
  57. package/dist/cli/handlers/styleHandler.js.map +1 -0
  58. package/dist/cli/handlers/validateHandler.d.ts +5 -0
  59. package/dist/cli/handlers/validateHandler.d.ts.map +1 -0
  60. package/dist/cli/handlers/validateHandler.js +23 -0
  61. package/dist/cli/handlers/validateHandler.js.map +1 -0
  62. package/dist/cli/parser/argumentParser.d.ts +44 -0
  63. package/dist/cli/parser/argumentParser.d.ts.map +1 -0
  64. package/dist/cli/parser/argumentParser.js +194 -0
  65. package/dist/cli/parser/argumentParser.js.map +1 -0
  66. package/dist/cli/parser/helpText.d.ts +11 -0
  67. package/dist/cli/parser/helpText.d.ts.map +1 -0
  68. package/dist/cli/parser/helpText.js +373 -0
  69. package/dist/cli/parser/helpText.js.map +1 -0
  70. package/dist/cli/stamp.js +14 -821
  71. package/dist/cli/stamp.js.map +1 -1
  72. package/dist/core/astParser/detectors.d.ts +24 -0
  73. package/dist/core/astParser/detectors.d.ts.map +1 -0
  74. package/dist/core/astParser/detectors.js +102 -0
  75. package/dist/core/astParser/detectors.js.map +1 -0
  76. package/dist/core/astParser/extractors/componentExtractor.d.ts +13 -0
  77. package/dist/core/astParser/extractors/componentExtractor.d.ts.map +1 -0
  78. package/dist/core/astParser/extractors/componentExtractor.js +41 -0
  79. package/dist/core/astParser/extractors/componentExtractor.js.map +1 -0
  80. package/dist/core/astParser/extractors/eventExtractor.d.ts +14 -0
  81. package/dist/core/astParser/extractors/eventExtractor.d.ts.map +1 -0
  82. package/dist/core/astParser/extractors/eventExtractor.js +49 -0
  83. package/dist/core/astParser/extractors/eventExtractor.js.map +1 -0
  84. package/dist/core/astParser/extractors/propExtractor.d.ts +14 -0
  85. package/dist/core/astParser/extractors/propExtractor.d.ts.map +1 -0
  86. package/dist/core/astParser/extractors/propExtractor.js +73 -0
  87. package/dist/core/astParser/extractors/propExtractor.js.map +1 -0
  88. package/dist/core/astParser/extractors/stateExtractor.d.ts +13 -0
  89. package/dist/core/astParser/extractors/stateExtractor.d.ts.map +1 -0
  90. package/dist/core/astParser/extractors/stateExtractor.js +66 -0
  91. package/dist/core/astParser/extractors/stateExtractor.js.map +1 -0
  92. package/dist/core/astParser.d.ts.map +1 -1
  93. package/dist/core/astParser.js +5 -307
  94. package/dist/core/astParser.js.map +1 -1
  95. package/dist/core/contractBuilder.d.ts +1 -0
  96. package/dist/core/contractBuilder.d.ts.map +1 -1
  97. package/dist/core/contractBuilder.js +1 -0
  98. package/dist/core/contractBuilder.js.map +1 -1
  99. package/dist/core/pack/builder.d.ts +35 -0
  100. package/dist/core/pack/builder.d.ts.map +1 -0
  101. package/dist/core/pack/builder.js +76 -0
  102. package/dist/core/pack/builder.js.map +1 -0
  103. package/dist/core/pack/collector.d.ts +20 -0
  104. package/dist/core/pack/collector.d.ts.map +1 -0
  105. package/dist/core/pack/collector.js +71 -0
  106. package/dist/core/pack/collector.js.map +1 -0
  107. package/dist/core/pack/loader.d.ts +23 -0
  108. package/dist/core/pack/loader.d.ts.map +1 -0
  109. package/dist/core/pack/loader.js +66 -0
  110. package/dist/core/pack/loader.js.map +1 -0
  111. package/dist/core/pack/resolver.d.ts +21 -0
  112. package/dist/core/pack/resolver.d.ts.map +1 -0
  113. package/dist/core/pack/resolver.js +79 -0
  114. package/dist/core/pack/resolver.js.map +1 -0
  115. package/dist/core/pack.d.ts +17 -27
  116. package/dist/core/pack.d.ts.map +1 -1
  117. package/dist/core/pack.js +18 -225
  118. package/dist/core/pack.js.map +1 -1
  119. package/dist/core/styleExtractor/index.d.ts +11 -0
  120. package/dist/core/styleExtractor/index.d.ts.map +1 -0
  121. package/dist/core/styleExtractor/index.js +11 -0
  122. package/dist/core/styleExtractor/index.js.map +1 -0
  123. package/dist/core/styleExtractor/layout.d.ts +14 -0
  124. package/dist/core/styleExtractor/layout.d.ts.map +1 -0
  125. package/dist/core/styleExtractor/layout.js +86 -0
  126. package/dist/core/styleExtractor/layout.js.map +1 -0
  127. package/dist/core/styleExtractor/motion.d.ts +20 -0
  128. package/dist/core/styleExtractor/motion.d.ts.map +1 -0
  129. package/dist/core/styleExtractor/motion.js +74 -0
  130. package/dist/core/styleExtractor/motion.js.map +1 -0
  131. package/dist/core/styleExtractor/scss.d.ts +30 -0
  132. package/dist/core/styleExtractor/scss.d.ts.map +1 -0
  133. package/dist/core/styleExtractor/scss.js +80 -0
  134. package/dist/core/styleExtractor/scss.js.map +1 -0
  135. package/dist/core/styleExtractor/styleExtractor.d.ts +11 -0
  136. package/dist/core/styleExtractor/styleExtractor.d.ts.map +1 -0
  137. package/dist/core/styleExtractor/styleExtractor.js +115 -0
  138. package/dist/core/styleExtractor/styleExtractor.js.map +1 -0
  139. package/dist/core/styleExtractor/styled.d.ts +13 -0
  140. package/dist/core/styleExtractor/styled.d.ts.map +1 -0
  141. package/dist/core/styleExtractor/styled.js +31 -0
  142. package/dist/core/styleExtractor/styled.js.map +1 -0
  143. package/dist/core/styleExtractor/tailwind.d.ts +16 -0
  144. package/dist/core/styleExtractor/tailwind.d.ts.map +1 -0
  145. package/dist/core/styleExtractor/tailwind.js +85 -0
  146. package/dist/core/styleExtractor/tailwind.js.map +1 -0
  147. package/dist/core/styleExtractor.d.ts +8 -0
  148. package/dist/core/styleExtractor.d.ts.map +1 -0
  149. package/dist/core/styleExtractor.js +8 -0
  150. package/dist/core/styleExtractor.js.map +1 -0
  151. package/dist/types/UIFContract.d.ts +71 -0
  152. package/dist/types/UIFContract.d.ts.map +1 -1
  153. package/dist/types/UIFContract.js.map +1 -1
  154. package/dist/utils/tokens.d.ts +18 -10
  155. package/dist/utils/tokens.d.ts.map +1 -1
  156. package/dist/utils/tokens.js +112 -10
  157. package/dist/utils/tokens.js.map +1 -1
  158. package/package.json +3 -1
  159. package/schema/logicstamp.context.schema.json +288 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Contract Builder Helper - Builds contracts from files
3
+ */
4
+ import { buildContract } from '../../../core/contractBuilder.js';
5
+ import { extractFromFile } from '../../../core/astParser.js';
6
+ import { extractStyleMetadata } from '../../../core/styleExtractor.js';
7
+ import { readFileWithText } from '../../../utils/fsx.js';
8
+ import { Project } from 'ts-morph';
9
+ /**
10
+ * Build contracts from files
11
+ */
12
+ export async function buildContractsFromFiles(files, options) {
13
+ const contracts = [];
14
+ let analyzed = 0;
15
+ let totalSourceSize = 0;
16
+ // Create ts-morph project for style extraction if needed
17
+ let styleProject;
18
+ if (options.includeStyle) {
19
+ styleProject = new Project({
20
+ skipAddingFilesFromTsConfig: true,
21
+ compilerOptions: {
22
+ jsx: 1, // React JSX
23
+ target: 99, // ESNext
24
+ },
25
+ });
26
+ }
27
+ for (const file of files) {
28
+ try {
29
+ // Extract AST from file
30
+ const ast = await extractFromFile(file);
31
+ // Build contract from AST
32
+ const { text } = await readFileWithText(file);
33
+ totalSourceSize += text.length; // Accumulate source size
34
+ // Extract style metadata if requested (separate layer)
35
+ let styleMetadata;
36
+ if (options.includeStyle && styleProject) {
37
+ try {
38
+ const sourceFile = styleProject.addSourceFileAtPath(file);
39
+ styleMetadata = await extractStyleMetadata(sourceFile, file);
40
+ }
41
+ catch (styleError) {
42
+ // Style extraction is optional - don't fail if it errors
43
+ if (!options.quiet) {
44
+ console.warn(` ⚠️ Style extraction failed for ${file}`);
45
+ }
46
+ }
47
+ }
48
+ const result = buildContract(file, ast, {
49
+ preset: 'none',
50
+ sourceText: text,
51
+ enablePredictions: options.predictBehavior,
52
+ styleMetadata,
53
+ });
54
+ if (result.contract) {
55
+ contracts.push(result.contract);
56
+ analyzed++;
57
+ }
58
+ }
59
+ catch (error) {
60
+ // Skip files that can't be analyzed
61
+ if (!options.quiet) {
62
+ console.warn(` ⚠️ Skipped ${file}: ${error.message}`);
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ contracts,
68
+ analyzed,
69
+ totalSourceSize,
70
+ };
71
+ }
72
+ //# sourceMappingURL=contractBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractBuilder.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/contractBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAQnC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAe,EACf,OAIC;IAED,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,yDAAyD;IACzD,IAAI,YAAiC,CAAC;IACtC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,YAAY,GAAG,IAAI,OAAO,CAAC;YACzB,2BAA2B,EAAE,IAAI;YACjC,eAAe,EAAE;gBACf,GAAG,EAAE,CAAC,EAAE,YAAY;gBACpB,MAAM,EAAE,EAAE,EAAE,SAAS;aACtB;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAExC,0BAA0B;YAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC9C,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,yBAAyB;YAEzD,uDAAuD;YACvD,IAAI,aAAa,CAAC;YAClB,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC1D,aAAa,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,yDAAyD;oBACzD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE;gBACtC,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,IAAI;gBAChB,iBAAiB,EAAE,OAAO,CAAC,eAAe;gBAC1C,aAAa;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAChC,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oCAAoC;YACpC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * File Writer - Handles writing context files to disk
3
+ */
4
+ import type { LogicStampBundle, FolderInfo } from '../../../core/pack.js';
5
+ /**
6
+ * Normalize path for display (convert backslashes to forward slashes)
7
+ */
8
+ export declare function displayPath(path: string): string;
9
+ /**
10
+ * Detect if a folder is a root (application entry point) and assign a label
11
+ */
12
+ export declare function detectRootFolder(relativePath: string, components: string[]): {
13
+ isRoot: boolean;
14
+ rootLabel?: string;
15
+ };
16
+ /**
17
+ * Group bundles by folder
18
+ */
19
+ export declare function groupBundlesByFolder(bundles: LogicStampBundle[]): Map<string, LogicStampBundle[]>;
20
+ /**
21
+ * Write context files for all folders
22
+ */
23
+ export declare function writeContextFiles(bundles: LogicStampBundle[], outputDir: string, projectRoot: string, options: {
24
+ format: 'json' | 'pretty' | 'ndjson';
25
+ quiet?: boolean;
26
+ }): Promise<{
27
+ filesWritten: number;
28
+ folderInfos: FolderInfo[];
29
+ totalTokenEstimate: number;
30
+ }>;
31
+ /**
32
+ * Write main context index file
33
+ */
34
+ export declare function writeMainIndex(outputDir: string, folderInfos: FolderInfo[], contracts: unknown[], bundles: LogicStampBundle[], bundlesByFolderSize: number, totalTokenEstimate: number, projectRoot: string, options: {
35
+ quiet?: boolean;
36
+ suppressSuccessIndicator?: boolean;
37
+ }): Promise<void>;
38
+ //# sourceMappingURL=fileWriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileWriter.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/context/fileWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAK3F;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAsCpH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAcjG;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAkE1F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,OAAO,EAAE,EACpB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,MAAM,EAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GACA,OAAO,CAAC,IAAI,CAAC,CAsCf"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * File Writer - Handles writing context files to disk
3
+ */
4
+ import { writeFile, mkdir } from 'node:fs/promises';
5
+ import { dirname, join } from 'node:path';
6
+ import { getFolderPath, normalizeEntryId } from '../../../utils/fsx.js';
7
+ import { estimateGPT4Tokens } from '../../../utils/tokens.js';
8
+ import { formatBundlesForFolder } from './bundleFormatter.js';
9
+ /**
10
+ * Normalize path for display (convert backslashes to forward slashes)
11
+ */
12
+ export function displayPath(path) {
13
+ return path.replace(/\\/g, '/');
14
+ }
15
+ /**
16
+ * Detect if a folder is a root (application entry point) and assign a label
17
+ */
18
+ export function detectRootFolder(relativePath, components) {
19
+ // Project root is always a root
20
+ if (relativePath === '.') {
21
+ return { isRoot: true, rootLabel: 'Project Root' };
22
+ }
23
+ // Detect common application entry points
24
+ const pathLower = relativePath.toLowerCase();
25
+ // Next.js app router
26
+ if (pathLower.includes('/app') && components.some(c => c === 'page.tsx' || c === 'layout.tsx')) {
27
+ return { isRoot: true, rootLabel: 'Next.js App' };
28
+ }
29
+ // Examples folder
30
+ if (pathLower.startsWith('examples/') && pathLower.endsWith('/src')) {
31
+ const exampleName = relativePath.split('/')[1];
32
+ return { isRoot: true, rootLabel: `Example: ${exampleName}` };
33
+ }
34
+ // Test fixtures
35
+ if (pathLower.includes('tests/fixtures/') && pathLower.endsWith('/src')) {
36
+ return { isRoot: true, rootLabel: 'Test Fixture' };
37
+ }
38
+ // Root src folder
39
+ if (relativePath === 'src') {
40
+ return { isRoot: true, rootLabel: 'Main Source' };
41
+ }
42
+ // Apps folder (monorepo pattern)
43
+ if (pathLower.startsWith('apps/')) {
44
+ const appName = relativePath.split('/')[1];
45
+ return { isRoot: true, rootLabel: `App: ${appName}` };
46
+ }
47
+ // Default: not a root
48
+ return { isRoot: false };
49
+ }
50
+ /**
51
+ * Group bundles by folder
52
+ */
53
+ export function groupBundlesByFolder(bundles) {
54
+ const bundlesByFolder = new Map();
55
+ for (const bundle of bundles) {
56
+ const folderPath = getFolderPath(bundle.entryId);
57
+ if (!bundlesByFolder.has(folderPath)) {
58
+ bundlesByFolder.set(folderPath, []);
59
+ }
60
+ bundlesByFolder.get(folderPath).push(bundle);
61
+ }
62
+ return bundlesByFolder;
63
+ }
64
+ /**
65
+ * Write context files for all folders
66
+ */
67
+ export async function writeContextFiles(bundles, outputDir, projectRoot, options) {
68
+ const bundlesByFolder = groupBundlesByFolder(bundles);
69
+ const normalizedRoot = normalizeEntryId(projectRoot);
70
+ const folderInfos = [];
71
+ let filesWritten = 0;
72
+ let totalTokenEstimate = 0;
73
+ if (!options.quiet) {
74
+ console.log(`📝 Writing context files for ${bundlesByFolder.size} folders...`);
75
+ }
76
+ for (const [folderPath, folderBundles] of bundlesByFolder) {
77
+ // Sort bundles for deterministic output
78
+ folderBundles.sort((a, b) => a.entryId.localeCompare(b.entryId));
79
+ // Calculate relative path from project root
80
+ let relativePath;
81
+ if (folderPath === normalizedRoot) {
82
+ relativePath = '.';
83
+ }
84
+ else if (folderPath.startsWith(normalizedRoot + '/')) {
85
+ relativePath = folderPath.substring(normalizedRoot.length + 1);
86
+ }
87
+ else {
88
+ relativePath = folderPath;
89
+ }
90
+ // Extract component file names from bundle entryIds
91
+ const components = folderBundles.map(b => {
92
+ const normalized = normalizeEntryId(b.entryId);
93
+ const lastSlash = normalized.lastIndexOf('/');
94
+ return lastSlash !== -1 ? normalized.substring(lastSlash + 1) : normalized;
95
+ });
96
+ // Detect if this is a root folder
97
+ const { isRoot, rootLabel } = detectRootFolder(relativePath, components);
98
+ // Format bundles for this folder
99
+ const folderOutput = formatBundlesForFolder(folderBundles, options.format);
100
+ // Estimate tokens for this folder's context file
101
+ const folderTokenEstimate = await estimateGPT4Tokens(folderOutput);
102
+ totalTokenEstimate += folderTokenEstimate;
103
+ // Write folder's context.json to output directory maintaining relative structure
104
+ const contextFileName = relativePath === '.' ? 'context.json' : join(relativePath, 'context.json');
105
+ const contextFilePath = relativePath === '.' ? 'context.json' : `${relativePath}/context.json`;
106
+ const folderContextPath = join(outputDir, contextFileName);
107
+ await mkdir(dirname(folderContextPath), { recursive: true });
108
+ await writeFile(folderContextPath, folderOutput, 'utf8');
109
+ filesWritten++;
110
+ if (!options.quiet) {
111
+ console.log(` ✓ ${displayPath(folderContextPath)} (${folderBundles.length} bundles)`);
112
+ }
113
+ // Add to folder info array
114
+ folderInfos.push({
115
+ path: relativePath === '.' ? '.' : relativePath,
116
+ contextFile: contextFilePath,
117
+ bundles: folderBundles.length,
118
+ components: components.sort(),
119
+ isRoot,
120
+ rootLabel,
121
+ tokenEstimate: folderTokenEstimate,
122
+ });
123
+ }
124
+ return { filesWritten, folderInfos, totalTokenEstimate };
125
+ }
126
+ /**
127
+ * Write main context index file
128
+ */
129
+ export async function writeMainIndex(outputDir, folderInfos, contracts, bundles, bundlesByFolderSize, totalTokenEstimate, projectRoot, options) {
130
+ const mainContextPath = join(outputDir, 'context_main.json');
131
+ const normalizedRoot = normalizeEntryId(projectRoot);
132
+ if (!options.quiet) {
133
+ console.log(`📝 Writing main context index...`);
134
+ }
135
+ // Sort folders by path for deterministic output
136
+ folderInfos.sort((a, b) => a.path.localeCompare(b.path));
137
+ // Create index structure
138
+ const index = {
139
+ type: 'LogicStampIndex',
140
+ schemaVersion: '0.1',
141
+ projectRoot: '.',
142
+ projectRootResolved: normalizedRoot,
143
+ createdAt: new Date().toISOString(),
144
+ summary: {
145
+ totalComponents: contracts.length,
146
+ totalBundles: bundles.length,
147
+ totalFolders: bundlesByFolderSize,
148
+ totalTokenEstimate,
149
+ },
150
+ folders: folderInfos,
151
+ meta: {
152
+ source: 'logicstamp-context@0.1.1',
153
+ },
154
+ };
155
+ const indexOutput = JSON.stringify(index, null, 2);
156
+ await writeFile(mainContextPath, indexOutput, 'utf8');
157
+ if (options.quiet && !options.suppressSuccessIndicator) {
158
+ // Minimal output in quiet mode (unless suppressed for internal calls)
159
+ process.stdout.write('✓\n');
160
+ }
161
+ else if (!options.quiet) {
162
+ console.log(` ✓ ${displayPath(mainContextPath)} (index of ${bundlesByFolderSize} folders)`);
163
+ }
164
+ }
165
+ //# sourceMappingURL=fileWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileWriter.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/fileWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Stats Calculator - Calculates bundle statistics
3
+ */
4
+ import type { LogicStampBundle } from '../../../core/pack.js';
5
+ import type { UIFContract } from '../../../types/UIFContract.js';
6
+ import type { ProjectManifest } from '../../../core/manifest.js';
7
+ import type { TokenEstimates } from './tokenEstimator.js';
8
+ export interface BundleStats {
9
+ totalNodes: number;
10
+ totalEdges: number;
11
+ totalMissing: number;
12
+ }
13
+ /**
14
+ * Calculate bundle statistics
15
+ */
16
+ export declare function calculateStats(bundles: LogicStampBundle[]): BundleStats;
17
+ /**
18
+ * Generate stats output for --stats flag (CI-friendly JSON)
19
+ */
20
+ export declare function generateStatsOutput(contracts: UIFContract[], manifest: ProjectManifest, bundles: LogicStampBundle[], stats: BundleStats, tokenEstimates: TokenEstimates, elapsed: number): object;
21
+ /**
22
+ * Generate summary output for console
23
+ * Uses accurate token counting (regenerates contracts) like --compare-modes
24
+ */
25
+ export declare function generateSummary(contracts: UIFContract[], manifest: ProjectManifest, bundles: LogicStampBundle[], stats: BundleStats, tokenEstimates: TokenEstimates, options: {
26
+ includeCode: 'none' | 'header' | 'full';
27
+ includeStyle?: boolean;
28
+ files: string[];
29
+ projectRoot: string;
30
+ currentGPT4: number;
31
+ currentClaude: number;
32
+ totalSourceSize: number;
33
+ packOptions: {
34
+ depth: number;
35
+ maxNodes: number;
36
+ format: 'json' | 'pretty' | 'ndjson';
37
+ hashLock: boolean;
38
+ strict: boolean;
39
+ allowMissing: boolean;
40
+ predictBehavior: boolean;
41
+ };
42
+ quiet?: boolean;
43
+ }): Promise<void>;
44
+ //# sourceMappingURL=statsCalculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsCalculator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/context/statsCalculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAUvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM,GACd,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA4Gf"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Stats Calculator - Calculates bundle statistics
3
+ */
4
+ import { formatTokenCount, getTokenizerStatus } from '../../../utils/tokens.js';
5
+ /**
6
+ * Calculate bundle statistics
7
+ */
8
+ export function calculateStats(bundles) {
9
+ const totalNodes = bundles.reduce((sum, b) => sum + b.graph.nodes.length, 0);
10
+ const totalEdges = bundles.reduce((sum, b) => sum + b.graph.edges.length, 0);
11
+ const totalMissing = bundles.reduce((sum, b) => sum + b.meta.missing.length, 0);
12
+ return {
13
+ totalNodes,
14
+ totalEdges,
15
+ totalMissing,
16
+ };
17
+ }
18
+ /**
19
+ * Generate stats output for --stats flag (CI-friendly JSON)
20
+ */
21
+ export function generateStatsOutput(contracts, manifest, bundles, stats, tokenEstimates, elapsed) {
22
+ return {
23
+ totalComponents: contracts.length,
24
+ rootComponents: manifest.graph.roots.length,
25
+ leafComponents: manifest.graph.leaves.length,
26
+ bundlesGenerated: bundles.length,
27
+ totalNodes: stats.totalNodes,
28
+ totalEdges: stats.totalEdges,
29
+ missingDependencies: stats.totalMissing,
30
+ tokensGPT4: tokenEstimates.currentGPT4,
31
+ tokensClaude: tokenEstimates.currentClaude,
32
+ modeEstimates: {
33
+ none: { gpt4: tokenEstimates.modeEstimates.none.gpt4, claude: tokenEstimates.modeEstimates.none.claude },
34
+ header: { gpt4: tokenEstimates.modeEstimates.header.gpt4, claude: tokenEstimates.modeEstimates.header.claude },
35
+ full: { gpt4: tokenEstimates.modeEstimates.full.gpt4, claude: tokenEstimates.modeEstimates.full.claude },
36
+ },
37
+ savingsGPT4: tokenEstimates.savingsGPT4,
38
+ savingsClaude: tokenEstimates.savingsClaude,
39
+ elapsedMs: elapsed,
40
+ };
41
+ }
42
+ /**
43
+ * Generate summary output for console
44
+ * Uses accurate token counting (regenerates contracts) like --compare-modes
45
+ */
46
+ export async function generateSummary(contracts, manifest, bundles, stats, tokenEstimates, options) {
47
+ console.log('\n📊 Summary:');
48
+ console.log(` Total components: ${contracts.length}`);
49
+ console.log(` Root components: ${manifest.graph.roots.length}`);
50
+ console.log(` Leaf components: ${manifest.graph.leaves.length}`);
51
+ console.log(` Bundles generated: ${bundles.length}`);
52
+ console.log(` Total nodes in context: ${stats.totalNodes}`);
53
+ console.log(` Total edges: ${stats.totalEdges}`);
54
+ console.log(` Missing dependencies: ${stats.totalMissing}`);
55
+ // Determine mode label
56
+ const hasStyle = options.includeStyle === true;
57
+ const isHeaderMode = options.includeCode === 'header';
58
+ let modeLabel;
59
+ if (isHeaderMode && hasStyle) {
60
+ modeLabel = 'header+style';
61
+ }
62
+ else if (isHeaderMode && !hasStyle) {
63
+ modeLabel = 'header';
64
+ }
65
+ else {
66
+ modeLabel = options.includeCode === 'full' ? 'full+style' : options.includeCode;
67
+ }
68
+ // Calculate header token estimates (use estimates for performance, accurate regeneration only in --compare-modes)
69
+ let headerNoStyleGPT4;
70
+ let headerNoStyleClaude;
71
+ let headerWithStyleGPT4;
72
+ let headerWithStyleClaude;
73
+ if (isHeaderMode && hasStyle) {
74
+ // Current output IS header+style, estimate header without style
75
+ headerNoStyleGPT4 = Math.ceil(options.currentGPT4 * 0.88); // Style typically adds ~12%
76
+ headerNoStyleClaude = Math.ceil(options.currentClaude * 0.88);
77
+ headerWithStyleGPT4 = options.currentGPT4;
78
+ headerWithStyleClaude = options.currentClaude;
79
+ }
80
+ else if (isHeaderMode && !hasStyle) {
81
+ // Current output IS header without style, estimate header+style
82
+ headerNoStyleGPT4 = options.currentGPT4;
83
+ headerNoStyleClaude = options.currentClaude;
84
+ headerWithStyleGPT4 = Math.ceil(options.currentGPT4 * 1.14); // Style adds ~14%
85
+ headerWithStyleClaude = Math.ceil(options.currentClaude * 1.14);
86
+ }
87
+ else {
88
+ // For non-header modes, use estimates
89
+ headerNoStyleGPT4 = Math.ceil(options.currentGPT4 * 0.75);
90
+ headerNoStyleClaude = Math.ceil(options.currentClaude * 0.75);
91
+ headerWithStyleGPT4 = Math.ceil(options.currentGPT4 * 0.85);
92
+ headerWithStyleClaude = Math.ceil(options.currentClaude * 0.85);
93
+ }
94
+ // Calculate savings percentages vs raw source
95
+ const headerSavingsGPT4 = tokenEstimates.sourceTokensGPT4 > 0
96
+ ? ((tokenEstimates.sourceTokensGPT4 - headerNoStyleGPT4) / tokenEstimates.sourceTokensGPT4 * 100).toFixed(0)
97
+ : '0';
98
+ const headerStyleSavingsGPT4 = tokenEstimates.sourceTokensGPT4 > 0
99
+ ? ((tokenEstimates.sourceTokensGPT4 - headerWithStyleGPT4) / tokenEstimates.sourceTokensGPT4 * 100).toFixed(0)
100
+ : '0';
101
+ // Check tokenizer status and display it
102
+ const tokenizerStatus = await getTokenizerStatus();
103
+ const gpt4Method = tokenizerStatus.gpt4 ? 'tiktoken' : 'approximation';
104
+ const claudeMethod = tokenizerStatus.claude ? 'tokenizer' : 'approximation';
105
+ console.log(`\n📏 Token Estimates (${modeLabel} mode):`);
106
+ console.log(` Token estimation: GPT-4o (${gpt4Method}) | Claude (${claudeMethod})`);
107
+ if (!tokenizerStatus.gpt4 || !tokenizerStatus.claude) {
108
+ const missing = [];
109
+ if (!tokenizerStatus.gpt4) {
110
+ missing.push('@dqbd/tiktoken (GPT-4)');
111
+ }
112
+ if (!tokenizerStatus.claude) {
113
+ missing.push('@anthropic-ai/tokenizer (Claude)');
114
+ }
115
+ console.log(` 💡 Tip: Install ${missing.join(' and/or ')} for accurate token counts`);
116
+ }
117
+ console.log(` ⚠️ Current mode = tokenizer-based.`);
118
+ console.log(` Other modes / raw source = heuristic.`);
119
+ console.log(` For precise per-mode breakdown, use "stamp context --compare-modes".`);
120
+ console.log(` GPT-4o-mini: ${formatTokenCount(tokenEstimates.currentGPT4)} tokens`);
121
+ console.log(` Claude: ${formatTokenCount(tokenEstimates.currentClaude)} tokens`);
122
+ console.log(`\n Comparison:`);
123
+ console.log(` Mode | Tokens GPT-4o | Tokens Claude | Savings vs Raw Source`);
124
+ console.log(` -------------|---------------|---------------|------------------------`);
125
+ console.log(` Raw source | ${formatTokenCount(tokenEstimates.sourceTokensGPT4).padStart(13)} | ${formatTokenCount(tokenEstimates.sourceTokensClaude).padStart(13)} | 0%`);
126
+ console.log(` Header | ${formatTokenCount(headerNoStyleGPT4).padStart(13)} | ${formatTokenCount(headerNoStyleClaude).padStart(13)} | ${headerSavingsGPT4}%`);
127
+ console.log(` Header+style | ${formatTokenCount(headerWithStyleGPT4).padStart(13)} | ${formatTokenCount(headerWithStyleClaude).padStart(13)} | ${headerStyleSavingsGPT4}%`);
128
+ console.log(`\n Full context (code+style): ~${formatTokenCount(tokenEstimates.modeEstimates.full.gpt4)} GPT-4o-mini / ~${formatTokenCount(tokenEstimates.modeEstimates.full.claude)} Claude`);
129
+ console.log(`\n📊 Current Mode Comparison:`);
130
+ console.log(` ⚠️ Current mode = tokenizer-based.`);
131
+ console.log(` Other modes / raw source = heuristic.`);
132
+ console.log(` For precise per-mode breakdown, use "stamp context --compare-modes".`);
133
+ console.log(` none: ~${formatTokenCount(tokenEstimates.modeEstimates.none.gpt4)} tokens`);
134
+ // Show current mode with honest labeling - reflects actual mode (header or header+style)
135
+ const currentModeLabel = modeLabel;
136
+ console.log(` ${currentModeLabel.padEnd(13)} ~${formatTokenCount(tokenEstimates.currentGPT4)} tokens`);
137
+ console.log(` full: ~${formatTokenCount(tokenEstimates.modeEstimates.full.gpt4)} tokens`);
138
+ if (stats.totalMissing > 0) {
139
+ console.log('\n⚠️ Missing dependencies (external/third-party):');
140
+ const allMissing = new Set();
141
+ bundles.forEach(b => {
142
+ b.meta.missing.forEach(dep => allMissing.add(dep.name));
143
+ });
144
+ Array.from(allMissing).slice(0, 10).forEach(name => console.log(` - ${name}`));
145
+ if (allMissing.size > 10) {
146
+ console.log(` ... and ${allMissing.size - 10} more`);
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=statsCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statsCalculator.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/statsCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Token Estimator - Calculates token counts and mode comparisons
3
+ */
4
+ import type { ProjectManifest } from '../../../core/manifest.js';
5
+ export interface TokenEstimates {
6
+ currentGPT4: number;
7
+ currentClaude: number;
8
+ sourceTokensGPT4: number;
9
+ sourceTokensClaude: number;
10
+ modeEstimates: {
11
+ none: {
12
+ gpt4: number;
13
+ claude: number;
14
+ };
15
+ header: {
16
+ gpt4: number;
17
+ claude: number;
18
+ };
19
+ full: {
20
+ gpt4: number;
21
+ claude: number;
22
+ };
23
+ };
24
+ savingsGPT4: string;
25
+ savingsClaude: string;
26
+ }
27
+ export interface ModeComparisonResult {
28
+ headerNoStyleGPT4: number;
29
+ headerNoStyleClaude: number;
30
+ headerWithStyleGPT4: number;
31
+ headerWithStyleClaude: number;
32
+ sourceTokensGPT4: number;
33
+ sourceTokensClaude: number;
34
+ modeEstimates: {
35
+ none: {
36
+ gpt4: number;
37
+ claude: number;
38
+ };
39
+ header: {
40
+ gpt4: number;
41
+ claude: number;
42
+ };
43
+ headerStyle: {
44
+ gpt4: number;
45
+ claude: number;
46
+ };
47
+ full: {
48
+ gpt4: number;
49
+ claude: number;
50
+ };
51
+ };
52
+ }
53
+ /**
54
+ * Calculate token estimates for current output
55
+ */
56
+ export declare function calculateTokenEstimates(output: string, totalSourceSize: number, currentGPT4: number, currentClaude: number): Promise<TokenEstimates>;
57
+ /**
58
+ * Generate mode comparison by rebuilding contracts with/without style
59
+ */
60
+ export declare function generateModeComparison(files: string[], manifest: ProjectManifest, projectRoot: string, currentGPT4: number, currentClaude: number, totalSourceSize: number, options: {
61
+ includeCode: 'none' | 'header' | 'full';
62
+ includeStyle?: boolean;
63
+ depth: number;
64
+ maxNodes: number;
65
+ format: 'json' | 'pretty' | 'ndjson';
66
+ hashLock: boolean;
67
+ strict: boolean;
68
+ allowMissing: boolean;
69
+ predictBehavior: boolean;
70
+ quiet?: boolean;
71
+ }): Promise<ModeComparisonResult>;
72
+ /**
73
+ * Display mode comparison table
74
+ */
75
+ export declare function displayModeComparison(comparison: ModeComparisonResult, elapsed: number): Promise<void>;
76
+ //# sourceMappingURL=tokenEstimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenEstimator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/context/tokenEstimator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAUjE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE;QACb,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACvC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACxC,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE;QACb,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACvC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACxC,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAyCzB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,oBAAoB,CAAC,CA6K/B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAwDf"}