kirograph 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -8
- package/dist/bin/commands/caveman.js +7 -2
- package/dist/bin/commands/caveman.js.map +2 -2
- package/dist/bin/commands/compression.js +109 -0
- package/dist/bin/commands/compression.js.map +7 -0
- package/dist/bin/commands/context.js +31 -24
- package/dist/bin/commands/context.js.map +2 -2
- package/dist/bin/commands/exec.js +107 -0
- package/dist/bin/commands/exec.js.map +7 -0
- package/dist/bin/commands/gain.js +119 -0
- package/dist/bin/commands/gain.js.map +7 -0
- package/dist/bin/commands/help.js +10 -1
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/query.js +5 -1
- package/dist/bin/commands/query.js.map +2 -2
- package/dist/bin/commands/uninit.js +1 -1
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/utils.js +16 -0
- package/dist/bin/commands/utils.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +9 -2
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/hooks.js +19 -1
- package/dist/bin/installer/hooks.js.map +2 -2
- package/dist/bin/installer/index.js +6 -1
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/steering.js +116 -40
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/index.js.map +1 -1
- package/dist/bin/installer/targets/kiro.js +4 -2
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/kirograph.js +7 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/compression/filters/aws.js +418 -0
- package/dist/compression/filters/aws.js.map +7 -0
- package/dist/compression/filters/docker.js +153 -0
- package/dist/compression/filters/docker.js.map +7 -0
- package/dist/compression/filters/files.js +150 -0
- package/dist/compression/filters/files.js.map +7 -0
- package/dist/compression/filters/generic.js +86 -0
- package/dist/compression/filters/generic.js.map +7 -0
- package/dist/compression/filters/git.js +272 -0
- package/dist/compression/filters/git.js.map +7 -0
- package/dist/compression/filters/github.js +137 -0
- package/dist/compression/filters/github.js.map +7 -0
- package/dist/compression/filters/lint.js +280 -0
- package/dist/compression/filters/lint.js.map +7 -0
- package/dist/compression/filters/misc.js +212 -0
- package/dist/compression/filters/misc.js.map +7 -0
- package/dist/compression/filters/package.js +151 -0
- package/dist/compression/filters/package.js.map +7 -0
- package/dist/compression/filters/test.js +266 -0
- package/dist/compression/filters/test.js.map +7 -0
- package/dist/compression/index.js +144 -0
- package/dist/compression/index.js.map +7 -0
- package/dist/compression/naive-cost.js +94 -0
- package/dist/compression/naive-cost.js.map +7 -0
- package/dist/compression/tracker.js +228 -0
- package/dist/compression/tracker.js.map +7 -0
- package/dist/compression/types.js +17 -0
- package/dist/compression/types.js.map +7 -0
- package/dist/config.js +18 -1
- package/dist/config.js.map +2 -2
- package/dist/mcp/tool-names.js +3 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +170 -4
- package/dist/mcp/tools.js.map +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/compression/filters/aws.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * AWS CLI output filters\n *\n * Compresses verbose AWS CLI JSON output into compact, actionable summaries.\n * Strips policy documents, type annotations (DynamoDB), progress bars, and boilerplate.\n */\n\nimport type { CommandFilter, FilterResult, CompressorOptions } from '../types';\n\nexport const awsFilter: CommandFilter = {\n name: 'aws',\n\n matches(command: string): boolean {\n return /\\baws\\s/.test(command);\n },\n\n filter(command: string, rawOutput: string, level: CompressorOptions['level']): FilterResult {\n const subcommand = extractAwsSubcommand(command);\n\n switch (subcommand) {\n case 'sts:get-caller-identity': return filterStsIdentity(rawOutput, level);\n case 'ec2:describe-instances': return filterEc2Instances(rawOutput, level);\n case 'lambda:list-functions': return filterLambdaFunctions(rawOutput, level);\n case 'logs:get-log-events': return filterLogEvents(rawOutput, level);\n case 'cloudformation:describe-stack-events': return filterCfnEvents(rawOutput, level);\n case 'dynamodb:scan':\n case 'dynamodb:query':\n case 'dynamodb:get-item': return filterDynamoDB(rawOutput, level);\n case 'iam:list-roles': return filterIamRoles(rawOutput, level);\n case 'iam:list-policies': return filterIamPolicies(rawOutput, level);\n case 's3:ls': return filterS3Ls(rawOutput, level);\n case 's3:cp':\n case 's3:sync': return filterS3Transfer(rawOutput, level);\n case 'ecs:list-tasks':\n case 'ecs:describe-tasks': return filterEcsTasks(rawOutput, level);\n case 'ecs:describe-services': return filterEcsServices(rawOutput, level);\n case 'sqs:list-queues': return filterSqsQueues(rawOutput, level);\n case 'sns:list-topics': return filterSnsTopics(rawOutput, level);\n default: return filterGenericAws(rawOutput, level);\n }\n },\n};\n\nfunction extractAwsSubcommand(command: string): string {\n // \"aws sts get-caller-identity\" \u2192 \"sts:get-caller-identity\"\n const match = command.match(/aws\\s+(\\S+)\\s+(\\S+)/);\n if (match) return `${match[1]}:${match[2]}`;\n const serviceOnly = command.match(/aws\\s+(\\S+)/);\n if (serviceOnly) return serviceOnly[1];\n return '';\n}\n\n// \u2500\u2500 STS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterStsIdentity(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n if (level === 'ultra') {\n return { output: `${data.Account} ${data.Arn?.split('/').pop() || ''}`, strategy: 'aws:sts:ultra' };\n }\n return { output: `Account: ${data.Account}\\nArn: ${data.Arn}\\nUserId: ${data.UserId}`, strategy: 'aws:sts' };\n } catch {\n return { output: raw, strategy: 'aws:sts:passthrough' };\n }\n}\n\n// \u2500\u2500 EC2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterEc2Instances(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const instances: string[] = [];\n\n for (const reservation of data.Reservations || []) {\n for (const inst of reservation.Instances || []) {\n const name = inst.Tags?.find((t: any) => t.Key === 'Name')?.Value || '';\n const id = inst.InstanceId || '';\n const state = inst.State?.Name || '';\n const type = inst.InstanceType || '';\n const ip = inst.PrivateIpAddress || '';\n\n if (level === 'ultra') {\n instances.push(`${id} ${state} ${type}${name ? ' ' + name : ''}`);\n } else {\n instances.push(`${id} ${state.padEnd(10)} ${type.padEnd(12)} ${ip.padEnd(15)} ${name}`);\n }\n }\n }\n\n if (instances.length === 0) return { output: 'no instances', strategy: 'aws:ec2:empty' };\n\n if (level === 'ultra') {\n return { output: instances.join('\\n'), strategy: 'aws:ec2:ultra' };\n }\n\n const header = `${instances.length} instance(s):`;\n return { output: `${header}\\n${instances.join('\\n')}`, strategy: 'aws:ec2' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 Lambda \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterLambdaFunctions(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const functions = data.Functions || [];\n\n if (functions.length === 0) return { output: 'no functions', strategy: 'aws:lambda:empty' };\n\n const lines = functions.map((fn: any) => {\n const name = fn.FunctionName || '';\n const runtime = fn.Runtime || '';\n const memory = fn.MemorySize || '';\n const timeout = fn.Timeout || '';\n\n if (level === 'ultra') {\n return `${name} ${runtime} ${memory}MB`;\n }\n return `${name.padEnd(40)} ${runtime.padEnd(14)} ${String(memory).padStart(4)}MB ${String(timeout).padStart(3)}s`;\n });\n\n if (level === 'ultra') {\n return { output: `${functions.length} functions:\\n${lines.join('\\n')}`, strategy: 'aws:lambda:ultra' };\n }\n\n return { output: `${functions.length} function(s):\\n${lines.join('\\n')}`, strategy: 'aws:lambda' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 CloudWatch Logs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterLogEvents(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const events = data.events || [];\n\n if (events.length === 0) return { output: 'no events', strategy: 'aws:logs:empty' };\n\n const lines = events.map((e: any) => {\n const ts = new Date(e.timestamp).toISOString().slice(11, 23);\n const msg = (e.message || '').trim();\n return `${ts} ${msg}`;\n });\n\n // Deduplicate similar consecutive messages\n const deduped: string[] = [];\n let lastPattern = '';\n let repeatCount = 0;\n\n for (const line of lines) {\n const pattern = line.replace(/\\d+/g, 'N');\n if (pattern === lastPattern) {\n repeatCount++;\n } else {\n if (repeatCount > 1) deduped.push(` \u2026repeated ${repeatCount}x`);\n deduped.push(line);\n lastPattern = pattern;\n repeatCount = 1;\n }\n }\n if (repeatCount > 1) deduped.push(` \u2026repeated ${repeatCount}x`);\n\n const maxLines = level === 'ultra' ? 20 : level === 'aggressive' ? 40 : 60;\n const shown = deduped.slice(-maxLines); // Keep tail (most recent)\n const omitted = deduped.length > maxLines ? `\u2026(${deduped.length - maxLines} earlier events omitted)\\n` : '';\n\n return { output: `${omitted}${shown.join('\\n')}`, strategy: 'aws:logs' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 CloudFormation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterCfnEvents(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const events = data.StackEvents || [];\n\n if (events.length === 0) return { output: 'no events', strategy: 'aws:cfn:empty' };\n\n // Sort: failures first, then by timestamp desc\n const sorted = [...events].sort((a: any, b: any) => {\n const aFailed = (a.ResourceStatus || '').includes('FAILED') ? 0 : 1;\n const bFailed = (b.ResourceStatus || '').includes('FAILED') ? 0 : 1;\n if (aFailed !== bFailed) return aFailed - bFailed;\n return new Date(b.Timestamp).getTime() - new Date(a.Timestamp).getTime();\n });\n\n const lines = sorted.map((e: any) => {\n const status = e.ResourceStatus || '';\n const logical = e.LogicalResourceId || '';\n const reason = e.ResourceStatusReason || '';\n const isFailed = status.includes('FAILED');\n\n if (level === 'ultra') {\n return `${isFailed ? '\u2717' : '\u00B7'} ${logical} ${status}${reason ? ': ' + reason.slice(0, 60) : ''}`;\n }\n return `${status.padEnd(28)} ${logical}${reason ? '\\n \u2192 ' + reason : ''}`;\n });\n\n const maxLines = level === 'ultra' ? 15 : level === 'aggressive' ? 25 : 40;\n const shown = lines.slice(0, maxLines).join('\\n');\n const extra = lines.length > maxLines ? `\\n\u2026+${lines.length - maxLines} more events` : '';\n\n const failures = events.filter((e: any) => (e.ResourceStatus || '').includes('FAILED')).length;\n const header = failures > 0 ? `${failures} FAILED, ${events.length} total events:` : `${events.length} events:`;\n\n return { output: `${header}\\n${shown}${extra}`, strategy: 'aws:cfn' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 DynamoDB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterDynamoDB(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n\n // Unwrap DynamoDB type annotations: {\"S\": \"value\"} \u2192 \"value\", {\"N\": \"123\"} \u2192 123\n const unwrapped = unwrapDynamoTypes(data);\n const output = JSON.stringify(unwrapped, null, level === 'ultra' ? 0 : 2);\n\n return { output, strategy: 'aws:dynamodb' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\nfunction unwrapDynamoTypes(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(unwrapDynamoTypes);\n if (typeof obj !== 'object') return obj;\n\n // DynamoDB type wrappers: {\"S\": \"...\"}, {\"N\": \"...\"}, {\"BOOL\": true}, {\"L\": [...]}, {\"M\": {...}}, {\"NULL\": true}\n const keys = Object.keys(obj);\n if (keys.length === 1) {\n const key = keys[0];\n if (key === 'S') return obj.S;\n if (key === 'N') return Number(obj.N);\n if (key === 'BOOL') return obj.BOOL;\n if (key === 'NULL') return null;\n if (key === 'L') return (obj.L as any[]).map(unwrapDynamoTypes);\n if (key === 'M') return unwrapDynamoTypes(obj.M);\n if (key === 'SS') return obj.SS;\n if (key === 'NS') return (obj.NS as string[]).map(Number);\n if (key === 'BS') return obj.BS;\n }\n\n // Recurse into regular objects\n const result: any = {};\n for (const [k, v] of Object.entries(obj)) {\n result[k] = unwrapDynamoTypes(v);\n }\n return result;\n}\n\n// \u2500\u2500 IAM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterIamRoles(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const roles = data.Roles || [];\n\n if (roles.length === 0) return { output: 'no roles', strategy: 'aws:iam-roles:empty' };\n\n // Strip AssumeRolePolicyDocument (verbose, rarely needed in listing)\n const lines = roles.map((r: any) => {\n const name = r.RoleName || '';\n const path = r.Path || '/';\n const created = r.CreateDate ? r.CreateDate.slice(0, 10) : '';\n\n if (level === 'ultra') return name;\n return `${name.padEnd(40)} ${path.padEnd(10)} ${created}`;\n });\n\n const maxLines = level === 'ultra' ? 30 : level === 'aggressive' ? 40 : 60;\n const shown = lines.slice(0, maxLines).join('\\n');\n const extra = lines.length > maxLines ? `\\n\u2026+${lines.length - maxLines} more` : '';\n\n return { output: `${roles.length} roles:\\n${shown}${extra}`, strategy: 'aws:iam-roles' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\nfunction filterIamPolicies(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const policies = data.Policies || [];\n\n if (policies.length === 0) return { output: 'no policies', strategy: 'aws:iam-policies:empty' };\n\n const lines = policies.map((p: any) => {\n if (level === 'ultra') return p.PolicyName || '';\n return `${(p.PolicyName || '').padEnd(40)} ${p.Arn || ''}`;\n });\n\n const maxLines = level === 'ultra' ? 30 : 50;\n const shown = lines.slice(0, maxLines).join('\\n');\n const extra = lines.length > maxLines ? `\\n\u2026+${lines.length - maxLines} more` : '';\n\n return { output: `${policies.length} policies:\\n${shown}${extra}`, strategy: 'aws:iam-policies' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 S3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterS3Ls(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n\n if (lines.length === 0) return { output: 'empty', strategy: 'aws:s3-ls:empty' };\n if (lines.length <= 20) return { output: raw, strategy: 'aws:s3-ls:short' };\n\n if (level === 'ultra') {\n return { output: `${lines.length} objects`, strategy: 'aws:s3-ls:ultra' };\n }\n\n const maxLines = level === 'aggressive' ? 30 : 50;\n const shown = lines.slice(0, maxLines).join('\\n');\n const extra = lines.length > maxLines ? `\\n\u2026+${lines.length - maxLines} more objects` : '';\n\n return { output: `${shown}${extra}`, strategy: 'aws:s3-ls' };\n}\n\nfunction filterS3Transfer(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n\n // Strip progress lines (Completed X.X MiB/...)\n const meaningful = lines.filter(l => !l.includes('Completed') && !l.includes('upload:') || l.includes('upload: s3://'));\n\n if (meaningful.length === 0) return { output: 'ok', strategy: 'aws:s3-transfer' };\n\n if (level === 'ultra') {\n const count = lines.filter(l => l.includes('upload:') || l.includes('copy:')).length;\n return { output: `ok ${count} objects`, strategy: 'aws:s3-transfer:ultra' };\n }\n\n return { output: meaningful.slice(0, 20).join('\\n'), strategy: 'aws:s3-transfer' };\n}\n\n// \u2500\u2500 ECS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterEcsTasks(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const tasks = data.tasks || data.taskArns || [];\n\n if (tasks.length === 0) return { output: 'no tasks', strategy: 'aws:ecs-tasks:empty' };\n\n if (Array.isArray(tasks) && typeof tasks[0] === 'string') {\n // taskArns \u2014 just ARNs\n const short = tasks.map((arn: string) => arn.split('/').pop());\n return { output: `${tasks.length} tasks:\\n${short.join('\\n')}`, strategy: 'aws:ecs-tasks' };\n }\n\n const lines = tasks.map((t: any) => {\n const id = (t.taskArn || '').split('/').pop();\n const status = t.lastStatus || '';\n const group = t.group || '';\n if (level === 'ultra') return `${id} ${status}`;\n return `${id} ${status.padEnd(10)} ${group}`;\n });\n\n return { output: `${tasks.length} tasks:\\n${lines.join('\\n')}`, strategy: 'aws:ecs-tasks' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\nfunction filterEcsServices(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const services = data.services || [];\n\n if (services.length === 0) return { output: 'no services', strategy: 'aws:ecs-services:empty' };\n\n const lines = services.map((s: any) => {\n const name = s.serviceName || '';\n const status = s.status || '';\n const running = s.runningCount ?? 0;\n const desired = s.desiredCount ?? 0;\n if (level === 'ultra') return `${name} ${running}/${desired}`;\n return `${name.padEnd(30)} ${status.padEnd(8)} ${running}/${desired} tasks`;\n });\n\n return { output: `${services.length} services:\\n${lines.join('\\n')}`, strategy: 'aws:ecs-services' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 SQS / SNS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterSqsQueues(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const urls = data.QueueUrls || [];\n if (urls.length === 0) return { output: 'no queues', strategy: 'aws:sqs:empty' };\n\n const names = urls.map((url: string) => url.split('/').pop());\n if (level === 'ultra') return { output: `${names.length} queues`, strategy: 'aws:sqs:ultra' };\n return { output: `${names.length} queues:\\n${names.join('\\n')}`, strategy: 'aws:sqs' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\nfunction filterSnsTopics(raw: string, level: CompressorOptions['level']): FilterResult {\n try {\n const data = JSON.parse(raw);\n const topics = data.Topics || [];\n if (topics.length === 0) return { output: 'no topics', strategy: 'aws:sns:empty' };\n\n const arns = topics.map((t: any) => (t.TopicArn || '').split(':').pop());\n if (level === 'ultra') return { output: `${arns.length} topics`, strategy: 'aws:sns:ultra' };\n return { output: `${arns.length} topics:\\n${arns.join('\\n')}`, strategy: 'aws:sns' };\n } catch {\n return filterGenericAws(raw, level);\n }\n}\n\n// \u2500\u2500 Generic AWS fallback \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction filterGenericAws(raw: string, level: CompressorOptions['level']): FilterResult {\n // Try to parse as JSON and strip common verbose fields\n try {\n const data = JSON.parse(raw);\n const stripped = stripAwsVerboseFields(data);\n const indent = level === 'ultra' ? 0 : 2;\n const output = JSON.stringify(stripped, null, indent);\n\n // Truncate if still too long\n const maxChars = level === 'ultra' ? 2000 : level === 'aggressive' ? 5000 : 10000;\n if (output.length > maxChars) {\n return { output: output.slice(0, maxChars) + '\\n\u2026(truncated)', strategy: 'aws:generic:truncated' };\n }\n\n return { output, strategy: 'aws:generic:json' };\n } catch {\n // Not JSON \u2014 apply line-based truncation\n const lines = raw.split('\\n');\n const maxLines = level === 'ultra' ? 20 : level === 'aggressive' ? 40 : 60;\n if (lines.length <= maxLines) return { output: raw, strategy: 'aws:generic:text' };\n\n const shown = lines.slice(0, maxLines).join('\\n');\n return { output: `${shown}\\n\u2026+${lines.length - maxLines} more lines`, strategy: 'aws:generic:truncated' };\n }\n}\n\n/**\n * Strip commonly verbose AWS fields that add noise without actionable info.\n */\nfunction stripAwsVerboseFields(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(stripAwsVerboseFields);\n if (typeof obj !== 'object') return obj;\n\n const STRIP_KEYS = new Set([\n 'AssumeRolePolicyDocument',\n 'PolicyDocument',\n 'Document',\n 'ResponseMetadata',\n 'Marker',\n 'IsTruncated',\n ]);\n\n const result: any = {};\n for (const [k, v] of Object.entries(obj)) {\n if (STRIP_KEYS.has(k)) continue;\n result[k] = stripAwsVerboseFields(v);\n }\n return result;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var docker_exports = {};
|
|
20
|
+
__export(docker_exports, {
|
|
21
|
+
dockerFilter: () => dockerFilter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(docker_exports);
|
|
24
|
+
const dockerFilter = {
|
|
25
|
+
name: "docker",
|
|
26
|
+
matches(command) {
|
|
27
|
+
return /\b(docker|kubectl|podman)\b/.test(command);
|
|
28
|
+
},
|
|
29
|
+
filter(command, rawOutput, level) {
|
|
30
|
+
if (/docker\s+ps/.test(command)) return filterDockerPs(rawOutput, level);
|
|
31
|
+
if (/docker\s+images/.test(command)) return filterDockerImages(rawOutput, level);
|
|
32
|
+
if (/docker\s+logs/.test(command)) return filterDockerLogs(rawOutput, level);
|
|
33
|
+
if (/docker\s+compose\s+ps/.test(command)) return filterComposePs(rawOutput, level);
|
|
34
|
+
if (/kubectl.*pods/.test(command) || /kubectl\s+get\s+po/.test(command)) return filterKubectlPods(rawOutput, level);
|
|
35
|
+
if (/kubectl.*logs/.test(command)) return filterKubectlLogs(rawOutput, level);
|
|
36
|
+
if (/kubectl.*services/.test(command) || /kubectl\s+get\s+svc/.test(command)) return filterKubectlServices(rawOutput, level);
|
|
37
|
+
return { output: rawOutput, strategy: "docker:passthrough" };
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
function filterDockerPs(raw, level) {
|
|
41
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
42
|
+
if (lines.length <= 1) return { output: "no containers running", strategy: "docker-ps:empty" };
|
|
43
|
+
const header = lines[0];
|
|
44
|
+
const rows = lines.slice(1);
|
|
45
|
+
if (level === "ultra") {
|
|
46
|
+
return { output: `${rows.length} containers running`, strategy: "docker-ps:ultra" };
|
|
47
|
+
}
|
|
48
|
+
const containers = rows.map((row) => {
|
|
49
|
+
const parts = row.split(/\s{2,}/);
|
|
50
|
+
const name = parts[parts.length - 1] || "";
|
|
51
|
+
const status = parts.find((p) => /Up|Exited|Created/.test(p)) || "";
|
|
52
|
+
const image = parts[1] || "";
|
|
53
|
+
return { name: name.trim(), status: status.trim(), image: image.trim() };
|
|
54
|
+
}).filter((c) => c.name);
|
|
55
|
+
if (level === "aggressive") {
|
|
56
|
+
const compact = containers.map((c) => `${c.name}: ${c.status}`).join("\n");
|
|
57
|
+
return { output: `${containers.length} containers:
|
|
58
|
+
${compact}`, strategy: "docker-ps:compact" };
|
|
59
|
+
}
|
|
60
|
+
const detailed = containers.map((c) => `${c.name} (${c.image}) - ${c.status}`).join("\n");
|
|
61
|
+
return { output: `${containers.length} containers:
|
|
62
|
+
${detailed}`, strategy: "docker-ps:detailed" };
|
|
63
|
+
}
|
|
64
|
+
function filterDockerImages(raw, level) {
|
|
65
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
66
|
+
if (lines.length <= 1) return { output: "no images", strategy: "docker-images:empty" };
|
|
67
|
+
const rows = lines.slice(1);
|
|
68
|
+
if (level === "ultra") {
|
|
69
|
+
return { output: `${rows.length} images`, strategy: "docker-images:ultra" };
|
|
70
|
+
}
|
|
71
|
+
const images = rows.map((row) => {
|
|
72
|
+
const parts = row.split(/\s{2,}/);
|
|
73
|
+
return { repo: parts[0] || "", tag: parts[1] || "", size: parts[parts.length - 1] || "" };
|
|
74
|
+
}).filter((i) => i.repo && i.repo !== "<none>");
|
|
75
|
+
const compact = images.slice(0, level === "aggressive" ? 10 : 20).map((i) => `${i.repo}:${i.tag} (${i.size})`).join("\n");
|
|
76
|
+
const extra = images.length > 20 ? `
|
|
77
|
+
\u2026+${images.length - 20} more` : "";
|
|
78
|
+
return { output: `${images.length} images:
|
|
79
|
+
${compact}${extra}`, strategy: "docker-images:compact" };
|
|
80
|
+
}
|
|
81
|
+
function filterDockerLogs(raw, level) {
|
|
82
|
+
return deduplicateLogLines(raw, level, "docker-logs");
|
|
83
|
+
}
|
|
84
|
+
function filterComposePs(raw, level) {
|
|
85
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
86
|
+
if (lines.length <= 1) return { output: "no services", strategy: "compose-ps:empty" };
|
|
87
|
+
const rows = lines.slice(1);
|
|
88
|
+
if (level === "ultra") {
|
|
89
|
+
return { output: `${rows.length} services`, strategy: "compose-ps:ultra" };
|
|
90
|
+
}
|
|
91
|
+
return { output: lines.join("\n"), strategy: "compose-ps:table" };
|
|
92
|
+
}
|
|
93
|
+
function filterKubectlPods(raw, level) {
|
|
94
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
95
|
+
if (lines.length <= 1) return { output: "no pods", strategy: "kubectl-pods:empty" };
|
|
96
|
+
const rows = lines.slice(1);
|
|
97
|
+
if (level === "ultra") {
|
|
98
|
+
const running = rows.filter((r) => r.includes("Running")).length;
|
|
99
|
+
const other = rows.length - running;
|
|
100
|
+
return { output: `${rows.length} pods (${running} running${other > 0 ? `, ${other} other` : ""})`, strategy: "kubectl-pods:ultra" };
|
|
101
|
+
}
|
|
102
|
+
const maxRows = level === "aggressive" ? 15 : 30;
|
|
103
|
+
if (rows.length <= maxRows) return { output: raw, strategy: "kubectl-pods:short" };
|
|
104
|
+
const shown = [lines[0], ...rows.slice(0, maxRows)].join("\n");
|
|
105
|
+
return { output: `${shown}
|
|
106
|
+
\u2026+${rows.length - maxRows} more pods`, strategy: "kubectl-pods:truncated" };
|
|
107
|
+
}
|
|
108
|
+
function filterKubectlLogs(raw, level) {
|
|
109
|
+
return deduplicateLogLines(raw, level, "kubectl-logs");
|
|
110
|
+
}
|
|
111
|
+
function filterKubectlServices(raw, level) {
|
|
112
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
113
|
+
if (lines.length <= 1) return { output: "no services", strategy: "kubectl-svc:empty" };
|
|
114
|
+
if (level === "ultra") {
|
|
115
|
+
return { output: `${lines.length - 1} services`, strategy: "kubectl-svc:ultra" };
|
|
116
|
+
}
|
|
117
|
+
return { output: raw, strategy: "kubectl-svc:table" };
|
|
118
|
+
}
|
|
119
|
+
function deduplicateLogLines(raw, level, prefix) {
|
|
120
|
+
const lines = raw.split("\n");
|
|
121
|
+
if (lines.length <= 20) return { output: raw, strategy: `${prefix}:short` };
|
|
122
|
+
const result = [];
|
|
123
|
+
let lastPattern = "";
|
|
124
|
+
let repeatCount = 0;
|
|
125
|
+
for (const line of lines) {
|
|
126
|
+
const pattern = line.replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}[.\d]*Z?/g, "<ts>").replace(/\b\d+\b/g, "<n>");
|
|
127
|
+
if (pattern === lastPattern) {
|
|
128
|
+
repeatCount++;
|
|
129
|
+
} else {
|
|
130
|
+
if (repeatCount > 1) {
|
|
131
|
+
result.push(` \u2026repeated ${repeatCount} times`);
|
|
132
|
+
}
|
|
133
|
+
result.push(line);
|
|
134
|
+
lastPattern = pattern;
|
|
135
|
+
repeatCount = 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (repeatCount > 1) {
|
|
139
|
+
result.push(` \u2026repeated ${repeatCount} times`);
|
|
140
|
+
}
|
|
141
|
+
const maxLines = level === "ultra" ? 20 : level === "aggressive" ? 40 : 60;
|
|
142
|
+
if (result.length <= maxLines) {
|
|
143
|
+
return { output: result.join("\n"), strategy: `${prefix}:deduped` };
|
|
144
|
+
}
|
|
145
|
+
const shown = result.slice(-maxLines).join("\n");
|
|
146
|
+
return { output: `\u2026(${result.length - maxLines} earlier lines omitted)
|
|
147
|
+
${shown}`, strategy: `${prefix}:deduped+truncated` };
|
|
148
|
+
}
|
|
149
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
150
|
+
0 && (module.exports = {
|
|
151
|
+
dockerFilter
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/compression/filters/docker.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Docker and container output filters\n */\n\nimport type { CommandFilter, FilterResult, CompressorOptions } from '../types';\n\nexport const dockerFilter: CommandFilter = {\n name: 'docker',\n\n matches(command: string): boolean {\n return /\\b(docker|kubectl|podman)\\b/.test(command);\n },\n\n filter(command: string, rawOutput: string, level: CompressorOptions['level']): FilterResult {\n if (/docker\\s+ps/.test(command)) return filterDockerPs(rawOutput, level);\n if (/docker\\s+images/.test(command)) return filterDockerImages(rawOutput, level);\n if (/docker\\s+logs/.test(command)) return filterDockerLogs(rawOutput, level);\n if (/docker\\s+compose\\s+ps/.test(command)) return filterComposePs(rawOutput, level);\n if (/kubectl.*pods/.test(command) || /kubectl\\s+get\\s+po/.test(command)) return filterKubectlPods(rawOutput, level);\n if (/kubectl.*logs/.test(command)) return filterKubectlLogs(rawOutput, level);\n if (/kubectl.*services/.test(command) || /kubectl\\s+get\\s+svc/.test(command)) return filterKubectlServices(rawOutput, level);\n\n return { output: rawOutput, strategy: 'docker:passthrough' };\n },\n};\n\nfunction filterDockerPs(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n if (lines.length <= 1) return { output: 'no containers running', strategy: 'docker-ps:empty' };\n\n // Parse table format\n const header = lines[0];\n const rows = lines.slice(1);\n\n if (level === 'ultra') {\n return { output: `${rows.length} containers running`, strategy: 'docker-ps:ultra' };\n }\n\n // Extract key columns: NAMES, STATUS, PORTS\n const containers = rows.map(row => {\n const parts = row.split(/\\s{2,}/);\n // Typical: CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES\n const name = parts[parts.length - 1] || '';\n const status = parts.find(p => /Up|Exited|Created/.test(p)) || '';\n const image = parts[1] || '';\n return { name: name.trim(), status: status.trim(), image: image.trim() };\n }).filter(c => c.name);\n\n if (level === 'aggressive') {\n const compact = containers.map(c => `${c.name}: ${c.status}`).join('\\n');\n return { output: `${containers.length} containers:\\n${compact}`, strategy: 'docker-ps:compact' };\n }\n\n const detailed = containers.map(c => `${c.name} (${c.image}) - ${c.status}`).join('\\n');\n return { output: `${containers.length} containers:\\n${detailed}`, strategy: 'docker-ps:detailed' };\n}\n\nfunction filterDockerImages(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n if (lines.length <= 1) return { output: 'no images', strategy: 'docker-images:empty' };\n\n const rows = lines.slice(1);\n\n if (level === 'ultra') {\n return { output: `${rows.length} images`, strategy: 'docker-images:ultra' };\n }\n\n // Extract REPOSITORY, TAG, SIZE\n const images = rows.map(row => {\n const parts = row.split(/\\s{2,}/);\n return { repo: parts[0] || '', tag: parts[1] || '', size: parts[parts.length - 1] || '' };\n }).filter(i => i.repo && i.repo !== '<none>');\n\n const compact = images.slice(0, level === 'aggressive' ? 10 : 20)\n .map(i => `${i.repo}:${i.tag} (${i.size})`)\n .join('\\n');\n const extra = images.length > 20 ? `\\n\u2026+${images.length - 20} more` : '';\n\n return { output: `${images.length} images:\\n${compact}${extra}`, strategy: 'docker-images:compact' };\n}\n\nfunction filterDockerLogs(raw: string, level: CompressorOptions['level']): FilterResult {\n return deduplicateLogLines(raw, level, 'docker-logs');\n}\n\nfunction filterComposePs(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n if (lines.length <= 1) return { output: 'no services', strategy: 'compose-ps:empty' };\n\n const rows = lines.slice(1);\n if (level === 'ultra') {\n return { output: `${rows.length} services`, strategy: 'compose-ps:ultra' };\n }\n\n return { output: lines.join('\\n'), strategy: 'compose-ps:table' };\n}\n\nfunction filterKubectlPods(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n if (lines.length <= 1) return { output: 'no pods', strategy: 'kubectl-pods:empty' };\n\n const rows = lines.slice(1);\n\n if (level === 'ultra') {\n const running = rows.filter(r => r.includes('Running')).length;\n const other = rows.length - running;\n return { output: `${rows.length} pods (${running} running${other > 0 ? `, ${other} other` : ''})`, strategy: 'kubectl-pods:ultra' };\n }\n\n // Keep header + rows, but truncate\n const maxRows = level === 'aggressive' ? 15 : 30;\n if (rows.length <= maxRows) return { output: raw, strategy: 'kubectl-pods:short' };\n\n const shown = [lines[0], ...rows.slice(0, maxRows)].join('\\n');\n return { output: `${shown}\\n\u2026+${rows.length - maxRows} more pods`, strategy: 'kubectl-pods:truncated' };\n}\n\nfunction filterKubectlLogs(raw: string, level: CompressorOptions['level']): FilterResult {\n return deduplicateLogLines(raw, level, 'kubectl-logs');\n}\n\nfunction filterKubectlServices(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n if (lines.length <= 1) return { output: 'no services', strategy: 'kubectl-svc:empty' };\n\n if (level === 'ultra') {\n return { output: `${lines.length - 1} services`, strategy: 'kubectl-svc:ultra' };\n }\n\n return { output: raw, strategy: 'kubectl-svc:table' };\n}\n\n// \u2500\u2500 Shared log deduplication \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction deduplicateLogLines(raw: string, level: CompressorOptions['level'], prefix: string): FilterResult {\n const lines = raw.split('\\n');\n\n if (lines.length <= 20) return { output: raw, strategy: `${prefix}:short` };\n\n // Deduplicate consecutive similar lines\n const result: string[] = [];\n let lastPattern = '';\n let repeatCount = 0;\n\n for (const line of lines) {\n // Normalize: strip timestamps and numbers for comparison\n const pattern = line.replace(/\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}[.\\d]*Z?/g, '<ts>')\n .replace(/\\b\\d+\\b/g, '<n>');\n\n if (pattern === lastPattern) {\n repeatCount++;\n } else {\n if (repeatCount > 1) {\n result.push(` \u2026repeated ${repeatCount} times`);\n }\n result.push(line);\n lastPattern = pattern;\n repeatCount = 1;\n }\n }\n if (repeatCount > 1) {\n result.push(` \u2026repeated ${repeatCount} times`);\n }\n\n // Truncate\n const maxLines = level === 'ultra' ? 20 : level === 'aggressive' ? 40 : 60;\n if (result.length <= maxLines) {\n return { output: result.join('\\n'), strategy: `${prefix}:deduped` };\n }\n\n const shown = result.slice(-maxLines).join('\\n'); // Keep tail (most recent)\n return { output: `\u2026(${result.length - maxLines} earlier lines omitted)\\n${shown}`, strategy: `${prefix}:deduped+truncated` };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var files_exports = {};
|
|
20
|
+
__export(files_exports, {
|
|
21
|
+
filesFilter: () => filesFilter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(files_exports);
|
|
24
|
+
const filesFilter = {
|
|
25
|
+
name: "files",
|
|
26
|
+
matches(command) {
|
|
27
|
+
return /^\s*(ls|find|tree|dir)\b/.test(command);
|
|
28
|
+
},
|
|
29
|
+
filter(command, rawOutput, level) {
|
|
30
|
+
if (/^\s*tree\b/.test(command)) return filterTree(rawOutput, level);
|
|
31
|
+
if (/^\s*find\b/.test(command)) return filterFind(rawOutput, level);
|
|
32
|
+
if (/^\s*ls\b/.test(command)) return filterLs(rawOutput, level);
|
|
33
|
+
return { output: rawOutput, strategy: "files:passthrough" };
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
function filterLs(raw, level) {
|
|
37
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
38
|
+
if (lines.length <= 10) {
|
|
39
|
+
return { output: raw, strategy: "ls:short" };
|
|
40
|
+
}
|
|
41
|
+
const isLongFormat = lines.some((l) => /^[drwx-]{10}/.test(l));
|
|
42
|
+
if (isLongFormat) {
|
|
43
|
+
const dirs = [];
|
|
44
|
+
const files = [];
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
if (line.startsWith("total")) continue;
|
|
47
|
+
const parts2 = line.split(/\s+/);
|
|
48
|
+
const name = parts2[parts2.length - 1];
|
|
49
|
+
if (!name || name === "." || name === "..") continue;
|
|
50
|
+
if (line.startsWith("d")) {
|
|
51
|
+
dirs.push(name + "/");
|
|
52
|
+
} else {
|
|
53
|
+
files.push(name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (level === "ultra") {
|
|
57
|
+
return {
|
|
58
|
+
output: `${dirs.length} dirs, ${files.length} files`,
|
|
59
|
+
strategy: "ls:ultra"
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (level === "aggressive") {
|
|
63
|
+
const dirList = dirs.length > 0 ? `Dirs (${dirs.length}): ${dirs.slice(0, 10).join(", ")}${dirs.length > 10 ? "\u2026" : ""}` : "";
|
|
64
|
+
const fileList = files.length > 0 ? `Files (${files.length}): ${groupFilesByExt(files)}` : "";
|
|
65
|
+
return { output: [dirList, fileList].filter(Boolean).join("\n"), strategy: "ls:grouped" };
|
|
66
|
+
}
|
|
67
|
+
const parts = [];
|
|
68
|
+
if (dirs.length > 0) {
|
|
69
|
+
parts.push(`Directories (${dirs.length}): ${dirs.join(", ")}`);
|
|
70
|
+
}
|
|
71
|
+
if (files.length > 0) {
|
|
72
|
+
const maxFiles = 20;
|
|
73
|
+
parts.push(`Files (${files.length}):`);
|
|
74
|
+
parts.push(...files.slice(0, maxFiles).map((f) => ` ${f}`));
|
|
75
|
+
if (files.length > maxFiles) parts.push(` \u2026+${files.length - maxFiles} more`);
|
|
76
|
+
}
|
|
77
|
+
return { output: parts.join("\n"), strategy: "ls:structured" };
|
|
78
|
+
}
|
|
79
|
+
if (level === "ultra") {
|
|
80
|
+
return { output: `${lines.length} entries`, strategy: "ls:count:ultra" };
|
|
81
|
+
}
|
|
82
|
+
const maxLines = level === "aggressive" ? 20 : 40;
|
|
83
|
+
if (lines.length <= maxLines) return { output: raw, strategy: "ls:short" };
|
|
84
|
+
const shown = lines.slice(0, maxLines).join("\n");
|
|
85
|
+
return { output: `${shown}
|
|
86
|
+
\u2026+${lines.length - maxLines} more entries`, strategy: "ls:truncated" };
|
|
87
|
+
}
|
|
88
|
+
function filterFind(raw, level) {
|
|
89
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
90
|
+
if (lines.length === 0) return { output: "no matches", strategy: "find:empty" };
|
|
91
|
+
if (lines.length <= 10) return { output: raw, strategy: "find:short" };
|
|
92
|
+
const byDir = /* @__PURE__ */ new Map();
|
|
93
|
+
for (const line of lines) {
|
|
94
|
+
const dir = line.includes("/") ? line.slice(0, line.lastIndexOf("/")) : ".";
|
|
95
|
+
if (!byDir.has(dir)) byDir.set(dir, []);
|
|
96
|
+
byDir.get(dir).push(line.slice(line.lastIndexOf("/") + 1));
|
|
97
|
+
}
|
|
98
|
+
if (level === "ultra") {
|
|
99
|
+
const summary = [...byDir.entries()].sort((a, b) => b[1].length - a[1].length).slice(0, 5).map(([d, f]) => `${d}/ (${f.length})`).join(", ");
|
|
100
|
+
return { output: `${lines.length} matches: ${summary}`, strategy: "find:ultra" };
|
|
101
|
+
}
|
|
102
|
+
if (level === "aggressive") {
|
|
103
|
+
const grouped = [...byDir.entries()].sort((a, b) => b[1].length - a[1].length).slice(0, 10).map(([dir, files]) => `${dir}/ (${files.length} files)`).join("\n");
|
|
104
|
+
const extra = byDir.size > 10 ? `
|
|
105
|
+
\u2026+${byDir.size - 10} more directories` : "";
|
|
106
|
+
return { output: `${lines.length} matches in ${byDir.size} directories:
|
|
107
|
+
${grouped}${extra}`, strategy: "find:grouped" };
|
|
108
|
+
}
|
|
109
|
+
const parts = [`${lines.length} matches in ${byDir.size} directories:
|
|
110
|
+
`];
|
|
111
|
+
let shown = 0;
|
|
112
|
+
for (const [dir, files] of [...byDir.entries()].sort((a, b) => b[1].length - a[1].length)) {
|
|
113
|
+
if (shown >= 15) break;
|
|
114
|
+
parts.push(`${dir}/ (${files.length}):`);
|
|
115
|
+
for (const f of files.slice(0, 3)) parts.push(` ${f}`);
|
|
116
|
+
if (files.length > 3) parts.push(` \u2026+${files.length - 3} more`);
|
|
117
|
+
shown++;
|
|
118
|
+
}
|
|
119
|
+
if (byDir.size > 15) parts.push(`
|
|
120
|
+
\u2026+${byDir.size - 15} more directories`);
|
|
121
|
+
return { output: parts.join("\n"), strategy: "find:structured" };
|
|
122
|
+
}
|
|
123
|
+
function filterTree(raw, level) {
|
|
124
|
+
const lines = raw.split("\n").filter((l) => l.trim());
|
|
125
|
+
if (lines.length <= 20) return { output: raw, strategy: "tree:short" };
|
|
126
|
+
const summaryLine = lines.find((l) => /\d+\s+director/.test(l));
|
|
127
|
+
if (level === "ultra") {
|
|
128
|
+
return { output: summaryLine || `${lines.length} lines`, strategy: "tree:ultra" };
|
|
129
|
+
}
|
|
130
|
+
const maxLines = level === "aggressive" ? 30 : 50;
|
|
131
|
+
if (lines.length <= maxLines) return { output: raw, strategy: "tree:short" };
|
|
132
|
+
const shown = lines.slice(0, maxLines).join("\n");
|
|
133
|
+
const summary = summaryLine ? `
|
|
134
|
+
${summaryLine}` : `
|
|
135
|
+
\u2026+${lines.length - maxLines} more lines`;
|
|
136
|
+
return { output: `${shown}${summary}`, strategy: "tree:truncated" };
|
|
137
|
+
}
|
|
138
|
+
function groupFilesByExt(files) {
|
|
139
|
+
const byExt = /* @__PURE__ */ new Map();
|
|
140
|
+
for (const f of files) {
|
|
141
|
+
const ext = f.includes(".") ? f.slice(f.lastIndexOf(".")) : "(no ext)";
|
|
142
|
+
byExt.set(ext, (byExt.get(ext) || 0) + 1);
|
|
143
|
+
}
|
|
144
|
+
return [...byExt.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5).map(([ext, count]) => `${ext}: ${count}`).join(", ");
|
|
145
|
+
}
|
|
146
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
147
|
+
0 && (module.exports = {
|
|
148
|
+
filesFilter
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/compression/filters/files.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * File listing output filters (ls, find, tree)\n */\n\nimport type { CommandFilter, FilterResult, CompressorOptions } from '../types';\n\nexport const filesFilter: CommandFilter = {\n name: 'files',\n\n matches(command: string): boolean {\n return /^\\s*(ls|find|tree|dir)\\b/.test(command);\n },\n\n filter(command: string, rawOutput: string, level: CompressorOptions['level']): FilterResult {\n if (/^\\s*tree\\b/.test(command)) return filterTree(rawOutput, level);\n if (/^\\s*find\\b/.test(command)) return filterFind(rawOutput, level);\n if (/^\\s*ls\\b/.test(command)) return filterLs(rawOutput, level);\n return { output: rawOutput, strategy: 'files:passthrough' };\n },\n};\n\nfunction filterLs(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n\n // Short ls output \u2014 don't compress\n if (lines.length <= 10) {\n return { output: raw, strategy: 'ls:short' };\n }\n\n // ls -la format: detect by permission string\n const isLongFormat = lines.some(l => /^[drwx-]{10}/.test(l));\n\n if (isLongFormat) {\n const dirs: string[] = [];\n const files: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('total')) continue;\n const parts = line.split(/\\s+/);\n const name = parts[parts.length - 1];\n if (!name || name === '.' || name === '..') continue;\n\n if (line.startsWith('d')) {\n dirs.push(name + '/');\n } else {\n files.push(name);\n }\n }\n\n if (level === 'ultra') {\n return {\n output: `${dirs.length} dirs, ${files.length} files`,\n strategy: 'ls:ultra',\n };\n }\n\n if (level === 'aggressive') {\n const dirList = dirs.length > 0 ? `Dirs (${dirs.length}): ${dirs.slice(0, 10).join(', ')}${dirs.length > 10 ? '\u2026' : ''}` : '';\n const fileList = files.length > 0 ? `Files (${files.length}): ${groupFilesByExt(files)}` : '';\n return { output: [dirList, fileList].filter(Boolean).join('\\n'), strategy: 'ls:grouped' };\n }\n\n // Normal: show dirs + limited files\n const parts: string[] = [];\n if (dirs.length > 0) {\n parts.push(`Directories (${dirs.length}): ${dirs.join(', ')}`);\n }\n if (files.length > 0) {\n const maxFiles = 20;\n parts.push(`Files (${files.length}):`);\n parts.push(...files.slice(0, maxFiles).map(f => ` ${f}`));\n if (files.length > maxFiles) parts.push(` \u2026+${files.length - maxFiles} more`);\n }\n return { output: parts.join('\\n'), strategy: 'ls:structured' };\n }\n\n // Simple ls (no -l): just truncate\n if (level === 'ultra') {\n return { output: `${lines.length} entries`, strategy: 'ls:count:ultra' };\n }\n\n const maxLines = level === 'aggressive' ? 20 : 40;\n if (lines.length <= maxLines) return { output: raw, strategy: 'ls:short' };\n\n const shown = lines.slice(0, maxLines).join('\\n');\n return { output: `${shown}\\n\u2026+${lines.length - maxLines} more entries`, strategy: 'ls:truncated' };\n}\n\nfunction filterFind(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n\n if (lines.length === 0) return { output: 'no matches', strategy: 'find:empty' };\n if (lines.length <= 10) return { output: raw, strategy: 'find:short' };\n\n // Group by directory\n const byDir = new Map<string, string[]>();\n for (const line of lines) {\n const dir = line.includes('/') ? line.slice(0, line.lastIndexOf('/')) : '.';\n if (!byDir.has(dir)) byDir.set(dir, []);\n byDir.get(dir)!.push(line.slice(line.lastIndexOf('/') + 1));\n }\n\n if (level === 'ultra') {\n const summary = [...byDir.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, 5)\n .map(([d, f]) => `${d}/ (${f.length})`)\n .join(', ');\n return { output: `${lines.length} matches: ${summary}`, strategy: 'find:ultra' };\n }\n\n if (level === 'aggressive') {\n const grouped = [...byDir.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, 10)\n .map(([dir, files]) => `${dir}/ (${files.length} files)`)\n .join('\\n');\n const extra = byDir.size > 10 ? `\\n\u2026+${byDir.size - 10} more directories` : '';\n return { output: `${lines.length} matches in ${byDir.size} directories:\\n${grouped}${extra}`, strategy: 'find:grouped' };\n }\n\n // Normal: show grouped with some file names\n const parts: string[] = [`${lines.length} matches in ${byDir.size} directories:\\n`];\n let shown = 0;\n for (const [dir, files] of [...byDir.entries()].sort((a, b) => b[1].length - a[1].length)) {\n if (shown >= 15) break;\n parts.push(`${dir}/ (${files.length}):`);\n for (const f of files.slice(0, 3)) parts.push(` ${f}`);\n if (files.length > 3) parts.push(` \u2026+${files.length - 3} more`);\n shown++;\n }\n if (byDir.size > 15) parts.push(`\\n\u2026+${byDir.size - 15} more directories`);\n\n return { output: parts.join('\\n'), strategy: 'find:structured' };\n}\n\nfunction filterTree(raw: string, level: CompressorOptions['level']): FilterResult {\n const lines = raw.split('\\n').filter(l => l.trim());\n\n if (lines.length <= 20) return { output: raw, strategy: 'tree:short' };\n\n // Extract summary line (usually last: \"X directories, Y files\")\n const summaryLine = lines.find(l => /\\d+\\s+director/.test(l));\n\n if (level === 'ultra') {\n return { output: summaryLine || `${lines.length} lines`, strategy: 'tree:ultra' };\n }\n\n // Truncate to depth\n const maxLines = level === 'aggressive' ? 30 : 50;\n if (lines.length <= maxLines) return { output: raw, strategy: 'tree:short' };\n\n const shown = lines.slice(0, maxLines).join('\\n');\n const summary = summaryLine ? `\\n${summaryLine}` : `\\n\u2026+${lines.length - maxLines} more lines`;\n\n return { output: `${shown}${summary}`, strategy: 'tree:truncated' };\n}\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction groupFilesByExt(files: string[]): string {\n const byExt = new Map<string, number>();\n for (const f of files) {\n const ext = f.includes('.') ? f.slice(f.lastIndexOf('.')) : '(no ext)';\n byExt.set(ext, (byExt.get(ext) || 0) + 1);\n }\n return [...byExt.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([ext, count]) => `${ext}: ${count}`)\n .join(', ');\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,MAAM,cAA6B;AAAA,EACxC,MAAM;AAAA,EAEN,QAAQ,SAA0B;AAChC,WAAO,2BAA2B,KAAK,OAAO;AAAA,EAChD;AAAA,EAEA,OAAO,SAAiB,WAAmB,OAAiD;AAC1F,QAAI,aAAa,KAAK,OAAO,EAAG,QAAO,WAAW,WAAW,KAAK;AAClE,QAAI,aAAa,KAAK,OAAO,EAAG,QAAO,WAAW,WAAW,KAAK;AAClE,QAAI,WAAW,KAAK,OAAO,EAAG,QAAO,SAAS,WAAW,KAAK;AAC9D,WAAO,EAAE,QAAQ,WAAW,UAAU,oBAAoB;AAAA,EAC5D;AACF;AAEA,SAAS,SAAS,KAAa,OAAiD;AAC9E,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AAGlD,MAAI,MAAM,UAAU,IAAI;AACtB,WAAO,EAAE,QAAQ,KAAK,UAAU,WAAW;AAAA,EAC7C;AAGA,QAAM,eAAe,MAAM,KAAK,OAAK,eAAe,KAAK,CAAC,CAAC;AAE3D,MAAI,cAAc;AAChB,UAAM,OAAiB,CAAC;AACxB,UAAM,QAAkB,CAAC;AAEzB,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,OAAO,EAAG;AAC9B,YAAMA,SAAQ,KAAK,MAAM,KAAK;AAC9B,YAAM,OAAOA,OAAMA,OAAM,SAAS,CAAC;AACnC,UAAI,CAAC,QAAQ,SAAS,OAAO,SAAS,KAAM;AAE5C,UAAI,KAAK,WAAW,GAAG,GAAG;AACxB,aAAK,KAAK,OAAO,GAAG;AAAA,MACtB,OAAO;AACL,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,aAAO;AAAA,QACL,QAAQ,GAAG,KAAK,MAAM,UAAU,MAAM,MAAM;AAAA,QAC5C,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,UAAU,cAAc;AAC1B,YAAM,UAAU,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,KAAK,WAAM,EAAE,KAAK;AAC3H,YAAM,WAAW,MAAM,SAAS,IAAI,UAAU,MAAM,MAAM,MAAM,gBAAgB,KAAK,CAAC,KAAK;AAC3F,aAAO,EAAE,QAAQ,CAAC,SAAS,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,GAAG,UAAU,aAAa;AAAA,IAC1F;AAGA,UAAM,QAAkB,CAAC;AACzB,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,KAAK,gBAAgB,KAAK,MAAM,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/D;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,WAAW;AACjB,YAAM,KAAK,UAAU,MAAM,MAAM,IAAI;AACrC,YAAM,KAAK,GAAG,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AACzD,UAAI,MAAM,SAAS,SAAU,OAAM,KAAK,YAAO,MAAM,SAAS,QAAQ,OAAO;AAAA,IAC/E;AACA,WAAO,EAAE,QAAQ,MAAM,KAAK,IAAI,GAAG,UAAU,gBAAgB;AAAA,EAC/D;AAGA,MAAI,UAAU,SAAS;AACrB,WAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,YAAY,UAAU,iBAAiB;AAAA,EACzE;AAEA,QAAM,WAAW,UAAU,eAAe,KAAK;AAC/C,MAAI,MAAM,UAAU,SAAU,QAAO,EAAE,QAAQ,KAAK,UAAU,WAAW;AAEzE,QAAM,QAAQ,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI;AAChD,SAAO,EAAE,QAAQ,GAAG,KAAK;AAAA,SAAO,MAAM,SAAS,QAAQ,iBAAiB,UAAU,eAAe;AACnG;AAEA,SAAS,WAAW,KAAa,OAAiD;AAChF,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AAElD,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,QAAQ,cAAc,UAAU,aAAa;AAC9E,MAAI,MAAM,UAAU,GAAI,QAAO,EAAE,QAAQ,KAAK,UAAU,aAAa;AAGrE,QAAM,QAAQ,oBAAI,IAAsB;AACxC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,IAAI;AACxE,QAAI,CAAC,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,KAAK,CAAC,CAAC;AACtC,UAAM,IAAI,GAAG,EAAG,KAAK,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC,CAAC;AAAA,EAC5D;AAEA,MAAI,UAAU,SAAS;AACrB,UAAM,UAAU,CAAC,GAAG,MAAM,QAAQ,CAAC,EAChC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EACxC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,EACrC,KAAK,IAAI;AACZ,WAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,aAAa,OAAO,IAAI,UAAU,aAAa;AAAA,EACjF;AAEA,MAAI,UAAU,cAAc;AAC1B,UAAM,UAAU,CAAC,GAAG,MAAM,QAAQ,CAAC,EAChC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EACxC,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,MAAM,MAAM,MAAM,SAAS,EACvD,KAAK,IAAI;AACZ,UAAM,QAAQ,MAAM,OAAO,KAAK;AAAA,SAAO,MAAM,OAAO,EAAE,sBAAsB;AAC5E,WAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,eAAe,MAAM,IAAI;AAAA,EAAkB,OAAO,GAAG,KAAK,IAAI,UAAU,eAAe;AAAA,EACzH;AAGA,QAAM,QAAkB,CAAC,GAAG,MAAM,MAAM,eAAe,MAAM,IAAI;AAAA,CAAiB;AAClF,MAAI,QAAQ;AACZ,aAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG;AACzF,QAAI,SAAS,GAAI;AACjB,UAAM,KAAK,GAAG,GAAG,MAAM,MAAM,MAAM,IAAI;AACvC,eAAW,KAAK,MAAM,MAAM,GAAG,CAAC,EAAG,OAAM,KAAK,KAAK,CAAC,EAAE;AACtD,QAAI,MAAM,SAAS,EAAG,OAAM,KAAK,YAAO,MAAM,SAAS,CAAC,OAAO;AAC/D;AAAA,EACF;AACA,MAAI,MAAM,OAAO,GAAI,OAAM,KAAK;AAAA,SAAO,MAAM,OAAO,EAAE,mBAAmB;AAEzE,SAAO,EAAE,QAAQ,MAAM,KAAK,IAAI,GAAG,UAAU,kBAAkB;AACjE;AAEA,SAAS,WAAW,KAAa,OAAiD;AAChF,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AAElD,MAAI,MAAM,UAAU,GAAI,QAAO,EAAE,QAAQ,KAAK,UAAU,aAAa;AAGrE,QAAM,cAAc,MAAM,KAAK,OAAK,iBAAiB,KAAK,CAAC,CAAC;AAE5D,MAAI,UAAU,SAAS;AACrB,WAAO,EAAE,QAAQ,eAAe,GAAG,MAAM,MAAM,UAAU,UAAU,aAAa;AAAA,EAClF;AAGA,QAAM,WAAW,UAAU,eAAe,KAAK;AAC/C,MAAI,MAAM,UAAU,SAAU,QAAO,EAAE,QAAQ,KAAK,UAAU,aAAa;AAE3E,QAAM,QAAQ,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI;AAChD,QAAM,UAAU,cAAc;AAAA,EAAK,WAAW,KAAK;AAAA,SAAO,MAAM,SAAS,QAAQ;AAEjF,SAAO,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,IAAI,UAAU,iBAAiB;AACpE;AAIA,SAAS,gBAAgB,OAAyB;AAChD,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,YAAY,GAAG,CAAC,IAAI;AAC5D,UAAM,IAAI,MAAM,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC1C;AACA,SAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,EAAE,EACxC,KAAK,IAAI;AACd;",
|
|
6
|
+
"names": ["parts"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var generic_exports = {};
|
|
20
|
+
__export(generic_exports, {
|
|
21
|
+
genericFilter: () => genericFilter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(generic_exports);
|
|
24
|
+
const genericFilter = {
|
|
25
|
+
name: "generic",
|
|
26
|
+
matches(_command) {
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
29
|
+
filter(_command, rawOutput, level) {
|
|
30
|
+
const lines = rawOutput.split("\n");
|
|
31
|
+
if (lines.length <= 15) {
|
|
32
|
+
return { output: rawOutput, strategy: "generic:short" };
|
|
33
|
+
}
|
|
34
|
+
let filtered = lines.filter((l) => {
|
|
35
|
+
const trimmed = l.trim();
|
|
36
|
+
if (!trimmed) return false;
|
|
37
|
+
if (/^[▓░█▒■□●○◐◑◒◓⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]/.test(trimmed)) return false;
|
|
38
|
+
if (/^\d+%\s*[|█▓░]/.test(trimmed)) return false;
|
|
39
|
+
if (/^[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⣾⣽⣻⢿⡿⣟⣯⣷]/.test(trimmed)) return false;
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
42
|
+
const deduped = [];
|
|
43
|
+
let lastPattern = "";
|
|
44
|
+
let repeatCount = 0;
|
|
45
|
+
for (const line of filtered) {
|
|
46
|
+
const pattern = normalizeForComparison(line);
|
|
47
|
+
if (pattern === lastPattern) {
|
|
48
|
+
repeatCount++;
|
|
49
|
+
} else {
|
|
50
|
+
if (repeatCount > 2) {
|
|
51
|
+
deduped.push(` \u2026repeated ${repeatCount} times`);
|
|
52
|
+
} else if (repeatCount === 2) {
|
|
53
|
+
deduped.push(filtered[deduped.length] || "");
|
|
54
|
+
}
|
|
55
|
+
deduped.push(line);
|
|
56
|
+
lastPattern = pattern;
|
|
57
|
+
repeatCount = 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (repeatCount > 2) {
|
|
61
|
+
deduped.push(` \u2026repeated ${repeatCount} times`);
|
|
62
|
+
}
|
|
63
|
+
filtered = deduped;
|
|
64
|
+
const maxLines = level === "ultra" ? 30 : level === "aggressive" ? 60 : 100;
|
|
65
|
+
if (filtered.length <= maxLines) {
|
|
66
|
+
return { output: filtered.join("\n"), strategy: "generic:deduped" };
|
|
67
|
+
}
|
|
68
|
+
const headSize = Math.floor(maxLines * 0.6);
|
|
69
|
+
const tailSize = maxLines - headSize;
|
|
70
|
+
const head = filtered.slice(0, headSize);
|
|
71
|
+
const tail = filtered.slice(-tailSize);
|
|
72
|
+
const omitted = filtered.length - headSize - tailSize;
|
|
73
|
+
const output = [...head, `
|
|
74
|
+
\u2026(${omitted} lines omitted)
|
|
75
|
+
`, ...tail].join("\n");
|
|
76
|
+
return { output, strategy: "generic:truncated" };
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
function normalizeForComparison(line) {
|
|
80
|
+
return line.replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}[.\d]*Z?/g, "<ts>").replace(/\b\d{10,13}\b/g, "<ts>").replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "<uuid>").replace(/\b[0-9a-f]{7,40}\b/g, "<hash>").replace(/(?<![a-zA-Z_])\d+(?![a-zA-Z_])/g, "<n>");
|
|
81
|
+
}
|
|
82
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
83
|
+
0 && (module.exports = {
|
|
84
|
+
genericFilter
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=generic.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/compression/filters/generic.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Generic output filter \u2014 fallback for unrecognized commands.\n * Applies deduplication, truncation, and noise removal.\n */\n\nimport type { CommandFilter, FilterResult, CompressorOptions } from '../types';\n\nexport const genericFilter: CommandFilter = {\n name: 'generic',\n\n matches(_command: string): boolean {\n // Always matches as fallback\n return true;\n },\n\n filter(_command: string, rawOutput: string, level: CompressorOptions['level']): FilterResult {\n const lines = rawOutput.split('\\n');\n\n // Short output \u2014 don't compress\n if (lines.length <= 15) {\n return { output: rawOutput, strategy: 'generic:short' };\n }\n\n // Step 1: Remove blank lines and common noise\n let filtered = lines.filter(l => {\n const trimmed = l.trim();\n if (!trimmed) return false;\n // Remove common progress indicators\n if (/^[\u2593\u2591\u2588\u2592\u25A0\u25A1\u25CF\u25CB\u25D0\u25D1\u25D2\u25D3\u280B\u2819\u2839\u2838\u283C\u2834\u2826\u2827\u2807\u280F]/.test(trimmed)) return false;\n if (/^\\d+%\\s*[|\u2588\u2593\u2591]/.test(trimmed)) return false;\n // Remove spinner lines\n if (/^[\u280B\u2819\u2839\u2838\u283C\u2834\u2826\u2827\u2807\u280F\u28FE\u28FD\u28FB\u28BF\u287F\u28DF\u28EF\u28F7]/.test(trimmed)) return false;\n return true;\n });\n\n // Step 2: Deduplicate consecutive similar lines\n const deduped: string[] = [];\n let lastPattern = '';\n let repeatCount = 0;\n\n for (const line of filtered) {\n const pattern = normalizeForComparison(line);\n if (pattern === lastPattern) {\n repeatCount++;\n } else {\n if (repeatCount > 2) {\n deduped.push(` \u2026repeated ${repeatCount} times`);\n } else if (repeatCount === 2) {\n deduped.push(filtered[deduped.length] || '');\n }\n deduped.push(line);\n lastPattern = pattern;\n repeatCount = 1;\n }\n }\n if (repeatCount > 2) {\n deduped.push(` \u2026repeated ${repeatCount} times`);\n }\n\n filtered = deduped;\n\n // Step 3: Truncate based on level\n const maxLines = level === 'ultra' ? 30 : level === 'aggressive' ? 60 : 100;\n\n if (filtered.length <= maxLines) {\n return { output: filtered.join('\\n'), strategy: 'generic:deduped' };\n }\n\n // Keep head and tail\n const headSize = Math.floor(maxLines * 0.6);\n const tailSize = maxLines - headSize;\n const head = filtered.slice(0, headSize);\n const tail = filtered.slice(-tailSize);\n const omitted = filtered.length - headSize - tailSize;\n\n const output = [...head, `\\n\u2026(${omitted} lines omitted)\\n`, ...tail].join('\\n');\n return { output, strategy: 'generic:truncated' };\n },\n};\n\n/**\n * Normalize a line for deduplication comparison.\n * Strips timestamps, numbers, and UUIDs to detect repeated patterns.\n */\nfunction normalizeForComparison(line: string): string {\n return line\n // Strip ISO timestamps\n .replace(/\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}[.\\d]*Z?/g, '<ts>')\n // Strip Unix timestamps\n .replace(/\\b\\d{10,13}\\b/g, '<ts>')\n // Strip UUIDs\n .replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '<uuid>')\n // Strip hex hashes\n .replace(/\\b[0-9a-f]{7,40}\\b/g, '<hash>')\n // Strip standalone numbers (but keep those in identifiers)\n .replace(/(?<![a-zA-Z_])\\d+(?![a-zA-Z_])/g, '<n>');\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EAEN,QAAQ,UAA2B;AAEjC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,UAAkB,WAAmB,OAAiD;AAC3F,UAAM,QAAQ,UAAU,MAAM,IAAI;AAGlC,QAAI,MAAM,UAAU,IAAI;AACtB,aAAO,EAAE,QAAQ,WAAW,UAAU,gBAAgB;AAAA,IACxD;AAGA,QAAI,WAAW,MAAM,OAAO,OAAK;AAC/B,YAAM,UAAU,EAAE,KAAK;AACvB,UAAI,CAAC,QAAS,QAAO;AAErB,UAAI,4BAA4B,KAAK,OAAO,EAAG,QAAO;AACtD,UAAI,iBAAiB,KAAK,OAAO,EAAG,QAAO;AAE3C,UAAI,wBAAwB,KAAK,OAAO,EAAG,QAAO;AAClD,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,UAAoB,CAAC;AAC3B,QAAI,cAAc;AAClB,QAAI,cAAc;AAElB,eAAW,QAAQ,UAAU;AAC3B,YAAM,UAAU,uBAAuB,IAAI;AAC3C,UAAI,YAAY,aAAa;AAC3B;AAAA,MACF,OAAO;AACL,YAAI,cAAc,GAAG;AACnB,kBAAQ,KAAK,oBAAe,WAAW,QAAQ;AAAA,QACjD,WAAW,gBAAgB,GAAG;AAC5B,kBAAQ,KAAK,SAAS,QAAQ,MAAM,KAAK,EAAE;AAAA,QAC7C;AACA,gBAAQ,KAAK,IAAI;AACjB,sBAAc;AACd,sBAAc;AAAA,MAChB;AAAA,IACF;AACA,QAAI,cAAc,GAAG;AACnB,cAAQ,KAAK,oBAAe,WAAW,QAAQ;AAAA,IACjD;AAEA,eAAW;AAGX,UAAM,WAAW,UAAU,UAAU,KAAK,UAAU,eAAe,KAAK;AAExE,QAAI,SAAS,UAAU,UAAU;AAC/B,aAAO,EAAE,QAAQ,SAAS,KAAK,IAAI,GAAG,UAAU,kBAAkB;AAAA,IACpE;AAGA,UAAM,WAAW,KAAK,MAAM,WAAW,GAAG;AAC1C,UAAM,WAAW,WAAW;AAC5B,UAAM,OAAO,SAAS,MAAM,GAAG,QAAQ;AACvC,UAAM,OAAO,SAAS,MAAM,CAAC,QAAQ;AACrC,UAAM,UAAU,SAAS,SAAS,WAAW;AAE7C,UAAM,SAAS,CAAC,GAAG,MAAM;AAAA,SAAO,OAAO;AAAA,GAAqB,GAAG,IAAI,EAAE,KAAK,IAAI;AAC9E,WAAO,EAAE,QAAQ,UAAU,oBAAoB;AAAA,EACjD;AACF;AAMA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,KAEJ,QAAQ,mDAAmD,MAAM,EAEjE,QAAQ,kBAAkB,MAAM,EAEhC,QAAQ,kEAAkE,QAAQ,EAElF,QAAQ,uBAAuB,QAAQ,EAEvC,QAAQ,mCAAmC,KAAK;AACrD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|