clinkx 0.2.3 → 0.3.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 (88) hide show
  1. package/README.md +40 -1
  2. package/conf/prompts/json-codereviewer.txt +1 -0
  3. package/conf/prompts/json.txt +1 -0
  4. package/dist/allowed-roots.d.ts +12 -0
  5. package/dist/allowed-roots.js +94 -0
  6. package/dist/allowed-roots.js.map +1 -0
  7. package/dist/context-builder/anchors.d.ts +11 -0
  8. package/dist/context-builder/anchors.js +19 -0
  9. package/dist/context-builder/anchors.js.map +1 -0
  10. package/dist/context-builder/bundle.d.ts +76 -0
  11. package/dist/context-builder/bundle.js +3573 -0
  12. package/dist/context-builder/bundle.js.map +1 -0
  13. package/dist/context-builder/codemap.d.ts +17 -0
  14. package/dist/context-builder/codemap.js +301 -0
  15. package/dist/context-builder/codemap.js.map +1 -0
  16. package/dist/context-builder/config.d.ts +60 -0
  17. package/dist/context-builder/config.js +204 -0
  18. package/dist/context-builder/config.js.map +1 -0
  19. package/dist/context-builder/delegate-packet.d.ts +182 -0
  20. package/dist/context-builder/delegate-packet.js +898 -0
  21. package/dist/context-builder/delegate-packet.js.map +1 -0
  22. package/dist/context-builder/delegate-reconstruction.d.ts +13 -0
  23. package/dist/context-builder/delegate-reconstruction.js +220 -0
  24. package/dist/context-builder/delegate-reconstruction.js.map +1 -0
  25. package/dist/context-builder/delegate-validation.d.ts +18 -0
  26. package/dist/context-builder/delegate-validation.js +367 -0
  27. package/dist/context-builder/delegate-validation.js.map +1 -0
  28. package/dist/context-builder/delegate.d.ts +24 -0
  29. package/dist/context-builder/delegate.js +133 -0
  30. package/dist/context-builder/delegate.js.map +1 -0
  31. package/dist/context-builder/diagnostics.d.ts +27 -0
  32. package/dist/context-builder/diagnostics.js +74 -0
  33. package/dist/context-builder/diagnostics.js.map +1 -0
  34. package/dist/context-builder/discovery.d.ts +118 -0
  35. package/dist/context-builder/discovery.js +1829 -0
  36. package/dist/context-builder/discovery.js.map +1 -0
  37. package/dist/context-builder/globs.d.ts +14 -0
  38. package/dist/context-builder/globs.js +175 -0
  39. package/dist/context-builder/globs.js.map +1 -0
  40. package/dist/context-builder/handler.d.ts +17 -0
  41. package/dist/context-builder/handler.js +3848 -0
  42. package/dist/context-builder/handler.js.map +1 -0
  43. package/dist/context-builder/path-signals.d.ts +7 -0
  44. package/dist/context-builder/path-signals.js +66 -0
  45. package/dist/context-builder/path-signals.js.map +1 -0
  46. package/dist/context-builder/paths.d.ts +30 -0
  47. package/dist/context-builder/paths.js +153 -0
  48. package/dist/context-builder/paths.js.map +1 -0
  49. package/dist/context-builder/progress.d.ts +15 -0
  50. package/dist/context-builder/progress.js +70 -0
  51. package/dist/context-builder/progress.js.map +1 -0
  52. package/dist/context-builder/receipt.d.ts +89 -0
  53. package/dist/context-builder/receipt.js +169 -0
  54. package/dist/context-builder/receipt.js.map +1 -0
  55. package/dist/context-builder/run-id.d.ts +7 -0
  56. package/dist/context-builder/run-id.js +31 -0
  57. package/dist/context-builder/run-id.js.map +1 -0
  58. package/dist/context-builder/schema.d.ts +431 -0
  59. package/dist/context-builder/schema.js +293 -0
  60. package/dist/context-builder/schema.js.map +1 -0
  61. package/dist/context-builder/secrets.d.ts +13 -0
  62. package/dist/context-builder/secrets.js +222 -0
  63. package/dist/context-builder/secrets.js.map +1 -0
  64. package/dist/context-builder/selection.d.ts +52 -0
  65. package/dist/context-builder/selection.js +1649 -0
  66. package/dist/context-builder/selection.js.map +1 -0
  67. package/dist/context-builder/status.d.ts +45 -0
  68. package/dist/context-builder/status.js +105 -0
  69. package/dist/context-builder/status.js.map +1 -0
  70. package/dist/context-builder/storage.d.ts +85 -0
  71. package/dist/context-builder/storage.js +746 -0
  72. package/dist/context-builder/storage.js.map +1 -0
  73. package/dist/context-builder/token-estimate.d.ts +8 -0
  74. package/dist/context-builder/token-estimate.js +17 -0
  75. package/dist/context-builder/token-estimate.js.map +1 -0
  76. package/dist/paths.d.ts +8 -0
  77. package/dist/paths.js +31 -43
  78. package/dist/paths.js.map +1 -1
  79. package/dist/pipeline.d.ts +47 -3
  80. package/dist/pipeline.js +135 -39
  81. package/dist/pipeline.js.map +1 -1
  82. package/dist/server.d.ts +1 -0
  83. package/dist/server.js +40 -10
  84. package/dist/server.js.map +1 -1
  85. package/package.json +2 -1
  86. package/dist/artifacts.d.ts +0 -9
  87. package/dist/artifacts.js +0 -24
  88. package/dist/artifacts.js.map +0 -1
@@ -0,0 +1,293 @@
1
+ import { z } from "zod";
2
+ import { zodToJsonSchema } from "zod-to-json-schema";
3
+ import { InvalidParamsError } from "../errors.js";
4
+ import { validateCallerRunId } from "./run-id.js";
5
+ import { assertNoHighConfidenceSecretsInTask } from "./secrets.js";
6
+ export const CONTEXT_BUILDER_INTENT_PROFILES = [
7
+ "handoff_small",
8
+ "implementation_medium",
9
+ "review_deep",
10
+ ];
11
+ export const CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS = Object.freeze({
12
+ max_estimated_tokens: 24_000,
13
+ max_files: 200,
14
+ max_scan_files: 10_000,
15
+ max_bytes_per_file: 1_000_000,
16
+ max_total_bytes: 5_000_000,
17
+ max_search_results: 1_000,
18
+ });
19
+ export const CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS = Object.freeze({
20
+ max_estimated_tokens: 200_000,
21
+ max_files: 300,
22
+ max_scan_files: 50_000,
23
+ max_bytes_per_file: 1_000_000,
24
+ max_total_bytes: 5_000_000,
25
+ max_search_results: 5_000,
26
+ });
27
+ export const CONTEXT_BUILDER_DELEGATE_DEFAULTS = Object.freeze({
28
+ timeout_seconds: 120,
29
+ max_response_chars: 20_000,
30
+ failure_policy: "fallback",
31
+ finalizer_min_score: 8.5,
32
+ });
33
+ export const CONTEXT_BUILDER_DELEGATE_HARD_LIMITS = Object.freeze({
34
+ timeout_seconds: 600,
35
+ max_response_chars: 200_000,
36
+ });
37
+ export const CONTEXT_BUILDER_INTENT_PROFILE_DEFAULTS = Object.freeze({
38
+ handoff_small: {
39
+ budget: {
40
+ max_estimated_tokens: 12_000,
41
+ max_files: 80,
42
+ max_scan_files: 5_000,
43
+ max_bytes_per_file: 1_000_000,
44
+ max_total_bytes: 2_500_000,
45
+ max_search_results: 500,
46
+ },
47
+ delegate: {
48
+ timeout_seconds: 90,
49
+ max_response_chars: 12_000,
50
+ },
51
+ finalizer_enabled: false,
52
+ },
53
+ implementation_medium: {
54
+ budget: {
55
+ max_estimated_tokens: 48_000,
56
+ max_files: 200,
57
+ max_scan_files: 15_000,
58
+ max_bytes_per_file: 1_000_000,
59
+ max_total_bytes: 5_000_000,
60
+ max_search_results: 1_500,
61
+ },
62
+ delegate: {
63
+ timeout_seconds: 120,
64
+ max_response_chars: 20_000,
65
+ },
66
+ finalizer_enabled: false,
67
+ },
68
+ review_deep: {
69
+ budget: {
70
+ max_estimated_tokens: 96_000,
71
+ max_files: 300,
72
+ max_scan_files: 30_000,
73
+ max_bytes_per_file: 1_000_000,
74
+ max_total_bytes: 5_000_000,
75
+ max_search_results: 3_000,
76
+ },
77
+ delegate: {
78
+ timeout_seconds: 180,
79
+ max_response_chars: 40_000,
80
+ },
81
+ finalizer_enabled: true,
82
+ },
83
+ });
84
+ const ContextBuilderProfileSchema = z.enum(CONTEXT_BUILDER_INTENT_PROFILES);
85
+ const ContextBuilderBudgetSchema = z
86
+ .object({
87
+ max_estimated_tokens: z
88
+ .number()
89
+ .int()
90
+ .positive()
91
+ .max(CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS.max_estimated_tokens)
92
+ .optional(),
93
+ max_files: z
94
+ .number()
95
+ .int()
96
+ .positive()
97
+ .max(CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS.max_files)
98
+ .optional(),
99
+ max_scan_files: z
100
+ .number()
101
+ .int()
102
+ .positive()
103
+ .max(CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS.max_scan_files)
104
+ .optional(),
105
+ max_bytes_per_file: z
106
+ .number()
107
+ .int()
108
+ .positive()
109
+ .max(CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS.max_bytes_per_file)
110
+ .optional(),
111
+ max_total_bytes: z
112
+ .number()
113
+ .int()
114
+ .positive()
115
+ .max(CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS.max_total_bytes)
116
+ .optional(),
117
+ max_search_results: z
118
+ .number()
119
+ .int()
120
+ .positive()
121
+ .max(CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS.max_search_results)
122
+ .optional(),
123
+ })
124
+ .strict()
125
+ .default({});
126
+ const NonBlankStringSchema = z.string().trim().min(1);
127
+ const TaskSchema = NonBlankStringSchema.max(4_000).describe("Task for context curation");
128
+ const DelegateProviderConfigSchema = z
129
+ .object({
130
+ cli_name: NonBlankStringSchema,
131
+ role: NonBlankStringSchema,
132
+ })
133
+ .strict();
134
+ const DelegateFinalizerConfigSchema = DelegateProviderConfigSchema.extend({
135
+ enabled: z.boolean().optional(),
136
+ min_score: z
137
+ .number()
138
+ .min(0)
139
+ .max(10)
140
+ .default(CONTEXT_BUILDER_DELEGATE_DEFAULTS.finalizer_min_score),
141
+ }).strict();
142
+ const DisabledDelegateSchema = z
143
+ .object({
144
+ enabled: z.literal(false).default(false),
145
+ })
146
+ .strict();
147
+ const EnabledDelegateSchema = z
148
+ .object({
149
+ enabled: z.literal(true),
150
+ curator: DelegateProviderConfigSchema,
151
+ finalizer: DelegateFinalizerConfigSchema,
152
+ timeout_seconds: z
153
+ .number()
154
+ .int()
155
+ .min(1)
156
+ .max(CONTEXT_BUILDER_DELEGATE_HARD_LIMITS.timeout_seconds)
157
+ .optional(),
158
+ max_response_chars: z
159
+ .number()
160
+ .int()
161
+ .positive()
162
+ .max(CONTEXT_BUILDER_DELEGATE_HARD_LIMITS.max_response_chars)
163
+ .optional(),
164
+ failure_policy: z
165
+ .enum(["fallback", "fail"])
166
+ .optional(),
167
+ })
168
+ .strict();
169
+ const DelegateSchema = z
170
+ .union([EnabledDelegateSchema, DisabledDelegateSchema])
171
+ .default({ enabled: false });
172
+ /**
173
+ * Strict context_builder input schema. Delegate provider names are explicit
174
+ * request fields; no curator or finalizer provider defaults are hardcoded.
175
+ */
176
+ export const ContextBuilderInputSchema = z
177
+ .object({
178
+ task: TaskSchema,
179
+ // Frozen v1 input schema: `profile` is an additive optional v1 extension.
180
+ profile: ContextBuilderProfileSchema.optional(),
181
+ roots: z.array(NonBlankStringSchema).max(8).optional(),
182
+ focus_paths: z.array(NonBlankStringSchema).max(200).default([]),
183
+ include_globs: z.array(NonBlankStringSchema).max(50).default([]),
184
+ exclude_globs: z.array(NonBlankStringSchema).max(100).default([]),
185
+ search_terms: z.array(NonBlankStringSchema).max(20).default([]),
186
+ budget: ContextBuilderBudgetSchema,
187
+ delegate: DelegateSchema,
188
+ run_id: z.string().optional().transform(validateOptionalRunId),
189
+ debug: z.boolean().default(false),
190
+ })
191
+ .strict()
192
+ .transform((input) => ({
193
+ ...input,
194
+ roots: input.roots ?? [process.cwd()],
195
+ budget: resolveContextBuilderProfileBudget(input.profile, compactContextBuilderBudgetInput(input.budget)),
196
+ delegate: resolveContextBuilderProfileDelegate(input.profile, input.delegate),
197
+ }));
198
+ export function parseContextBuilderInput(input) {
199
+ const result = ContextBuilderInputSchema.safeParse(input);
200
+ if (!result.success) {
201
+ throw new InvalidParamsError(`Invalid context_builder input: ${result.error.issues
202
+ .map((issue) => issue.message)
203
+ .join("; ")}`);
204
+ }
205
+ assertNoHighConfidenceSecretsInTask(result.data.task);
206
+ return result.data;
207
+ }
208
+ export function normalizeContextBuilderPublicBudget(budget = {}) {
209
+ const maxEstimatedTokens = budget.max_estimated_tokens ??
210
+ CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS.max_estimated_tokens;
211
+ const normalized = {
212
+ max_estimated_tokens: maxEstimatedTokens,
213
+ target_estimated_tokens: Math.floor(0.9 * maxEstimatedTokens),
214
+ max_files: budget.max_files ?? CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS.max_files,
215
+ max_scan_files: budget.max_scan_files ??
216
+ CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS.max_scan_files,
217
+ max_bytes_per_file: budget.max_bytes_per_file ??
218
+ CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS.max_bytes_per_file,
219
+ max_total_bytes: budget.max_total_bytes ??
220
+ CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS.max_total_bytes,
221
+ max_search_results: budget.max_search_results ??
222
+ CONTEXT_BUILDER_PUBLIC_BUDGET_DEFAULTS.max_search_results,
223
+ };
224
+ for (const [key, value] of Object.entries(normalized)) {
225
+ if (key === "target_estimated_tokens") {
226
+ continue;
227
+ }
228
+ const hardLimit = CONTEXT_BUILDER_PUBLIC_BUDGET_HARD_LIMITS[key];
229
+ if (!Number.isInteger(value) || value <= 0 || value > hardLimit) {
230
+ throw new InvalidParamsError(`context_builder budget.${key} must be a positive integer <= ${hardLimit}`);
231
+ }
232
+ }
233
+ return normalized;
234
+ }
235
+ export function resolveContextBuilderProfileBudget(profile, budget = {}) {
236
+ const profileBudget = profile == null ? {} : CONTEXT_BUILDER_INTENT_PROFILE_DEFAULTS[profile].budget;
237
+ return normalizeContextBuilderPublicBudget({
238
+ ...profileBudget,
239
+ ...budget,
240
+ });
241
+ }
242
+ function resolveContextBuilderProfileDelegate(profile, delegate) {
243
+ if (!delegate.enabled) {
244
+ return delegate;
245
+ }
246
+ const profileDelegate = profile == null
247
+ ? {}
248
+ : CONTEXT_BUILDER_INTENT_PROFILE_DEFAULTS[profile].delegate;
249
+ return {
250
+ ...delegate,
251
+ timeout_seconds: delegate.timeout_seconds ??
252
+ profileDelegate.timeout_seconds ??
253
+ CONTEXT_BUILDER_DELEGATE_DEFAULTS.timeout_seconds,
254
+ max_response_chars: delegate.max_response_chars ??
255
+ profileDelegate.max_response_chars ??
256
+ CONTEXT_BUILDER_DELEGATE_DEFAULTS.max_response_chars,
257
+ failure_policy: delegate.failure_policy ??
258
+ CONTEXT_BUILDER_DELEGATE_DEFAULTS.failure_policy,
259
+ };
260
+ }
261
+ function compactContextBuilderBudgetInput(budget) {
262
+ return {
263
+ ...(budget.max_estimated_tokens == null
264
+ ? {}
265
+ : { max_estimated_tokens: budget.max_estimated_tokens }),
266
+ ...(budget.max_files == null ? {} : { max_files: budget.max_files }),
267
+ ...(budget.max_scan_files == null
268
+ ? {}
269
+ : { max_scan_files: budget.max_scan_files }),
270
+ ...(budget.max_bytes_per_file == null
271
+ ? {}
272
+ : { max_bytes_per_file: budget.max_bytes_per_file }),
273
+ ...(budget.max_total_bytes == null
274
+ ? {}
275
+ : { max_total_bytes: budget.max_total_bytes }),
276
+ ...(budget.max_search_results == null
277
+ ? {}
278
+ : { max_search_results: budget.max_search_results }),
279
+ };
280
+ }
281
+ export function contextBuilderJsonSchema() {
282
+ return zodToJsonSchema(ContextBuilderInputSchema, {
283
+ target: "jsonSchema7",
284
+ $refStrategy: "none",
285
+ });
286
+ }
287
+ function validateOptionalRunId(runId) {
288
+ if (runId == null) {
289
+ return undefined;
290
+ }
291
+ return validateCallerRunId(runId);
292
+ }
293
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/context-builder/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type SecretFindingKind = "path" | "content";
2
+ export type SecretFinding = {
3
+ kind: SecretFindingKind;
4
+ confidence: "high";
5
+ provenance: string;
6
+ line?: number;
7
+ };
8
+ export declare function scanSecretPath(rootRelativePath: string): SecretFinding[];
9
+ export declare function scanHighConfidenceSecretContent(text: string): SecretFinding[];
10
+ export declare function isBlockingSecretFinding(finding: SecretFinding): boolean;
11
+ export declare function redactHighConfidenceAssignmentSecrets(text: string): string;
12
+ export declare function assertNoHighConfidenceSecretsInTask(task: string): void;
13
+ export declare function hasHighConfidenceSecret(text: string): boolean;
@@ -0,0 +1,222 @@
1
+ import { InvalidParamsError } from "../errors.js";
2
+ const PRIVATE_KEY_BLOCK_PATTERN = /-----BEGIN [A-Z0-9][A-Z0-9 ]{0,48}PRIVATE KEY-----/;
3
+ const WELL_KNOWN_TOKEN_PATTERNS = [
4
+ { provenance: "aws_access_key_id", pattern: /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/ },
5
+ { provenance: "github_token", pattern: /\bgh[opusr]_[A-Za-z0-9_]{30,}\b/ },
6
+ {
7
+ provenance: "github_fine_grained_token",
8
+ pattern: /\bgithub_pat_[A-Za-z0-9_]{20,}_[A-Za-z0-9_]{20,}\b/,
9
+ },
10
+ { provenance: "npm_token", pattern: /\bnpm_[A-Za-z0-9]{30,}\b/ },
11
+ { provenance: "slack_token", pattern: /\bxox[baprs]-[A-Za-z0-9-]{20,}\b/ },
12
+ ];
13
+ const ASSIGNMENT_PATTERN = /\b(password|passwd|api[_-]?key|secret|token|access[_-]?token|private[_-]?key|client[_-]?secret)\b\s*[:=]\s*(['"]?)([^'"\s;,#]{8,})\2/i;
14
+ const PLACEHOLDER_VALUES = new Set([
15
+ "changeme",
16
+ "example",
17
+ "placeholder",
18
+ "redacted",
19
+ "secret",
20
+ "token",
21
+ "password",
22
+ "apikey",
23
+ "api_key",
24
+ "your_token_here",
25
+ "your_api_key",
26
+ "notasecret",
27
+ "dummy",
28
+ "test",
29
+ ]);
30
+ export function scanSecretPath(rootRelativePath) {
31
+ const normalized = normalizeSecretPath(rootRelativePath);
32
+ const comparable = normalized.toLowerCase();
33
+ const segments = comparable.split("/").filter(Boolean);
34
+ const basename = segments.at(-1) ?? normalized;
35
+ const findings = [];
36
+ if (basename === ".env" || basename.startsWith(".env.")) {
37
+ findings.push(pathFinding("path_basename_dotenv"));
38
+ }
39
+ if ([".npmrc", ".netrc", ".pypirc"].includes(basename)) {
40
+ findings.push(pathFinding(`path_basename_${basename.slice(1)}`));
41
+ }
42
+ if (basename.endsWith(".pem")) {
43
+ findings.push(pathFinding("path_extension_pem"));
44
+ }
45
+ if (basename.endsWith(".key")) {
46
+ findings.push(pathFinding("path_extension_key"));
47
+ }
48
+ if (basename === "id_rsa" || basename === "id_ed25519") {
49
+ findings.push(pathFinding(`path_basename_${basename}`));
50
+ }
51
+ if (basename === "credentials.json") {
52
+ findings.push(pathFinding("path_basename_credentials_json"));
53
+ }
54
+ if (segments.some((segment) => isSecretDirectorySegment(segment))) {
55
+ findings.push(pathFinding("path_secret_directory_segment"));
56
+ }
57
+ if (hasPathSuffix(segments, [".aws", "credentials"])) {
58
+ findings.push(pathFinding("path_aws_credentials"));
59
+ }
60
+ if (hasPathPrefix(segments, [".config", "gcloud"])) {
61
+ findings.push(pathFinding("path_gcloud_config"));
62
+ }
63
+ if (hasPathPrefix(segments, [".azure"])) {
64
+ findings.push(pathFinding("path_azure_config"));
65
+ }
66
+ return dedupeFindings(findings);
67
+ }
68
+ export function scanHighConfidenceSecretContent(text) {
69
+ const findings = [];
70
+ const privateKeyLine = findPatternLine(text, PRIVATE_KEY_BLOCK_PATTERN);
71
+ if (privateKeyLine != null) {
72
+ findings.push(contentFinding("private_key_block", privateKeyLine));
73
+ }
74
+ for (const { provenance, pattern } of WELL_KNOWN_TOKEN_PATTERNS) {
75
+ const line = findPatternLine(text, pattern);
76
+ if (line != null) {
77
+ findings.push(contentFinding(provenance, line));
78
+ }
79
+ }
80
+ const lines = text.split(/\r?\n/);
81
+ for (let index = 0; index < lines.length; index++) {
82
+ const match = ASSIGNMENT_PATTERN.exec(lines[index] ?? "");
83
+ if (match == null) {
84
+ continue;
85
+ }
86
+ const value = match[3] ?? "";
87
+ const quote = match[2] ?? "";
88
+ if (quote.length === 0 && looksLikeCodeExpression(value)) {
89
+ continue;
90
+ }
91
+ if (isHighConfidenceAssignedSecret(value)) {
92
+ findings.push(contentFinding("assignment_secret", index + 1));
93
+ break;
94
+ }
95
+ }
96
+ return dedupeFindings(findings);
97
+ }
98
+ export function isBlockingSecretFinding(finding) {
99
+ return finding.provenance !== "assignment_secret";
100
+ }
101
+ export function redactHighConfidenceAssignmentSecrets(text) {
102
+ return text
103
+ .split(/(\r?\n)/)
104
+ .map((part) => {
105
+ if (part === "\n" || part === "\r\n") {
106
+ return part;
107
+ }
108
+ return redactAssignmentSecretLine(part);
109
+ })
110
+ .join("");
111
+ }
112
+ export function assertNoHighConfidenceSecretsInTask(task) {
113
+ const findings = scanHighConfidenceSecretContent(task);
114
+ if (findings.length === 0) {
115
+ return;
116
+ }
117
+ const provenances = findings.map((finding) => finding.provenance).join(", ");
118
+ throw new InvalidParamsError(`context_builder task contains high-confidence secret material (${provenances})`);
119
+ }
120
+ export function hasHighConfidenceSecret(text) {
121
+ return scanHighConfidenceSecretContent(text).length > 0;
122
+ }
123
+ function normalizeSecretPath(rootRelativePath) {
124
+ return rootRelativePath.replaceAll("\\", "/").replace(/^\.\/+/, "");
125
+ }
126
+ function pathFinding(provenance) {
127
+ return { kind: "path", confidence: "high", provenance };
128
+ }
129
+ function contentFinding(provenance, line) {
130
+ return { kind: "content", confidence: "high", provenance, line };
131
+ }
132
+ function hasPathSuffix(segments, suffix) {
133
+ if (suffix.length > segments.length) {
134
+ return false;
135
+ }
136
+ return suffix.every((segment, index) => segments[segments.length - suffix.length + index] === segment);
137
+ }
138
+ function hasPathPrefix(segments, prefix) {
139
+ if (prefix.length > segments.length) {
140
+ return false;
141
+ }
142
+ return prefix.every((segment, index) => segments[index] === segment);
143
+ }
144
+ function isSecretDirectorySegment(segment) {
145
+ return (segment === "secrets" ||
146
+ segment === ".secrets" ||
147
+ segment === "private_keys" ||
148
+ segment === "credentials");
149
+ }
150
+ function findPatternLine(text, pattern) {
151
+ const lines = text.split(/\r?\n/);
152
+ for (let index = 0; index < lines.length; index++) {
153
+ if (pattern.test(lines[index] ?? "")) {
154
+ return index + 1;
155
+ }
156
+ }
157
+ return undefined;
158
+ }
159
+ function looksLikeCodeExpression(value) {
160
+ return (/^[A-Za-z_][A-Za-z0-9_:.]*\([^"'`]*\)$/.test(value) ||
161
+ /^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_.]*$/.test(value) ||
162
+ /^[A-Za-z_][A-Za-z0-9_]*_[A-Za-z0-9_]*$/.test(value));
163
+ }
164
+ function isHighConfidenceAssignedSecret(value) {
165
+ const normalized = value.trim().toLowerCase();
166
+ if (normalized.length < 16) {
167
+ return false;
168
+ }
169
+ if (PLACEHOLDER_VALUES.has(normalized)) {
170
+ return false;
171
+ }
172
+ if (/^(?:x+|\*+|0+|1+|a+)$/.test(normalized)) {
173
+ return false;
174
+ }
175
+ if (/^<[^>]+>$/.test(normalized) || /^\$\{[^}]+}$/.test(normalized)) {
176
+ return false;
177
+ }
178
+ return shannonEntropy(value) >= 3;
179
+ }
180
+ function redactAssignmentSecretLine(line) {
181
+ const match = ASSIGNMENT_PATTERN.exec(line);
182
+ if (match == null) {
183
+ return line;
184
+ }
185
+ const value = match[3] ?? "";
186
+ const quote = match[2] ?? "";
187
+ if (quote.length === 0 && looksLikeCodeExpression(value)) {
188
+ return line;
189
+ }
190
+ if (!isHighConfidenceAssignedSecret(value)) {
191
+ return line;
192
+ }
193
+ const valueStart = match.index + match[0].lastIndexOf(value);
194
+ if (valueStart < match.index) {
195
+ return line;
196
+ }
197
+ return `${line.slice(0, valueStart)}[redacted-sensitive]${line.slice(valueStart + value.length)}`;
198
+ }
199
+ function shannonEntropy(value) {
200
+ const counts = new Map();
201
+ for (const char of value) {
202
+ counts.set(char, (counts.get(char) ?? 0) + 1);
203
+ }
204
+ let entropy = 0;
205
+ for (const count of counts.values()) {
206
+ const probability = count / value.length;
207
+ entropy -= probability * Math.log2(probability);
208
+ }
209
+ return entropy;
210
+ }
211
+ function dedupeFindings(findings) {
212
+ const seen = new Set();
213
+ return findings.filter((finding) => {
214
+ const key = `${finding.kind}:${finding.provenance}:${finding.line ?? ""}`;
215
+ if (seen.has(key)) {
216
+ return false;
217
+ }
218
+ seen.add(key);
219
+ return true;
220
+ });
221
+ }
222
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/context-builder/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type ContextBuilderSearchRecord, type ContextBuilderSliceRecord, type ContextBuilderTreeFile } from "./discovery.js";
2
+ import type { ContextBuilderOmission } from "./diagnostics.js";
3
+ import type { ContextBuilderPublicBudget } from "./schema.js";
4
+ export type ContextBuilderSelectedRange = {
5
+ start_line: number;
6
+ end_line: number;
7
+ };
8
+ export type ContextBuilderSelectedFile = {
9
+ root_index: number;
10
+ path: string;
11
+ ranges: ContextBuilderSelectedRange[];
12
+ content: string;
13
+ bytes: number;
14
+ estimated_tokens: number;
15
+ source: "focus" | "search";
16
+ };
17
+ export type ContextBuilderSelectionMetrics = {
18
+ files_selected: number;
19
+ files_omitted: number;
20
+ bytes_selected: number;
21
+ estimated_tokens: number;
22
+ truncated: boolean;
23
+ };
24
+ export type ContextBuilderSelectionTier = "full_file" | "signature_slices" | "omitted";
25
+ export type ContextBuilderSelectionSummaryFile = {
26
+ root_index: number;
27
+ path: string;
28
+ tier: ContextBuilderSelectionTier;
29
+ bytes: number;
30
+ estimated_tokens: number;
31
+ reason?: string;
32
+ };
33
+ export type ContextBuilderSelectionResult = {
34
+ selected: ContextBuilderSelectedFile[];
35
+ tree: ContextBuilderTreeFile[];
36
+ search: ContextBuilderSearchRecord[];
37
+ slices: ContextBuilderSliceRecord[];
38
+ omissions: ContextBuilderOmission[];
39
+ metrics: ContextBuilderSelectionMetrics;
40
+ summary?: {
41
+ files: ContextBuilderSelectionSummaryFile[];
42
+ };
43
+ };
44
+ export declare function selectContextBuilderFinalContext(input: {
45
+ task?: string;
46
+ tree: readonly ContextBuilderTreeFile[];
47
+ search: readonly ContextBuilderSearchRecord[];
48
+ slices: readonly ContextBuilderSliceRecord[];
49
+ budget: ContextBuilderPublicBudget;
50
+ }): ContextBuilderSelectionResult;
51
+ export declare function isContextBuilderTaskClosureAnchor(path: string, task: string): boolean;
52
+ export declare function contextBuilderTaskClosureAnchorRank(path: string, task: string): number;