sift-light 1.0.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 (145) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/CONTRIBUTING.md +19 -0
  3. package/LICENSE +661 -0
  4. package/README.md +177 -0
  5. package/README.zh-CN.md +177 -0
  6. package/SECURITY.md +25 -0
  7. package/package.json +142 -0
  8. package/plugins/sift-light/.claude-plugin/plugin.json +10 -0
  9. package/plugins/sift-light/.codex-plugin/plugin.json +20 -0
  10. package/plugins/sift-light/.mcp.json +24 -0
  11. package/plugins/sift-light/LICENSE +661 -0
  12. package/plugins/sift-light/concept-worker.mjs +567 -0
  13. package/plugins/sift-light/hooks/THIRD_PARTY_NOTICES.txt +70 -0
  14. package/plugins/sift-light/hooks/hooks.json +16 -0
  15. package/plugins/sift-light/hooks/search-policy.mjs +4113 -0
  16. package/plugins/sift-light/hooks/tree-sitter-bash.wasm +0 -0
  17. package/plugins/sift-light/hooks/tree-sitter-powershell.wasm +0 -0
  18. package/plugins/sift-light/hooks/tree-sitter.wasm +0 -0
  19. package/plugins/sift-light/kimi.plugin.json +36 -0
  20. package/plugins/sift-light/mcp-server.mjs +1 -0
  21. package/plugins/sift-light/omp-extension.mjs +20914 -0
  22. package/plugins/sift-light/package.json +11 -0
  23. package/plugins/sift-light/syntax-worker.mjs +280 -0
  24. package/plugins/sift-light/syntax-worker.toml +2 -0
  25. package/src/analysis-evidence.ts +43 -0
  26. package/src/analysis-limits.ts +27 -0
  27. package/src/analysis-store.ts +559 -0
  28. package/src/analysis-term-pages.ts +73 -0
  29. package/src/analysis-types.ts +162 -0
  30. package/src/audit-search.ts +391 -0
  31. package/src/capped-lines.ts +112 -0
  32. package/src/concept-embedding-cache.ts +186 -0
  33. package/src/concept-inference.ts +218 -0
  34. package/src/concept-model.ts +96 -0
  35. package/src/concept-search.ts +577 -0
  36. package/src/concept-setup.ts +75 -0
  37. package/src/concept-source-generation.ts +268 -0
  38. package/src/concept-worker.mjs +567 -0
  39. package/src/concept-worker.ts +210 -0
  40. package/src/config-reader.ts +283 -0
  41. package/src/config.ts +37 -0
  42. package/src/context-budget.ts +26 -0
  43. package/src/discovery-errors.ts +2 -0
  44. package/src/errors.ts +95 -0
  45. package/src/evidence-candidates.ts +344 -0
  46. package/src/evidence-ranking.ts +48 -0
  47. package/src/evidence-service.ts +1047 -0
  48. package/src/evidence-validation.ts +466 -0
  49. package/src/evidence-validity.ts +33 -0
  50. package/src/excerpt.ts +53 -0
  51. package/src/file-discovery.ts +150 -0
  52. package/src/file-metadata-filter.ts +46 -0
  53. package/src/format.ts +407 -0
  54. package/src/git-diff.ts +195 -0
  55. package/src/git-process.ts +189 -0
  56. package/src/git-repository.ts +367 -0
  57. package/src/git-source.ts +385 -0
  58. package/src/historical-paths.ts +205 -0
  59. package/src/hybrid-search.ts +340 -0
  60. package/src/import-model.ts +611 -0
  61. package/src/import-navigation.ts +100 -0
  62. package/src/import-resolution.ts +240 -0
  63. package/src/index.ts +97 -0
  64. package/src/inspect-batch.ts +265 -0
  65. package/src/inspect.ts +271 -0
  66. package/src/language-capabilities.ts +157 -0
  67. package/src/language-capability-definitions.ts +204 -0
  68. package/src/literal-search.ts +25 -0
  69. package/src/mcp-cli.ts +21 -0
  70. package/src/mcp-model-output.ts +120 -0
  71. package/src/mcp-output.ts +9 -0
  72. package/src/mcp-semantic-judge.ts +39 -0
  73. package/src/mcp-server.mjs +14064 -0
  74. package/src/mcp-server.ts +157 -0
  75. package/src/mcp-stdio.ts +114 -0
  76. package/src/mcp.ts +631 -0
  77. package/src/model-error.ts +120 -0
  78. package/src/multi-term-search.ts +122 -0
  79. package/src/omp-index.ts +277 -0
  80. package/src/omp-marketplace-entry.ts +7 -0
  81. package/src/operation-lifecycle.ts +413 -0
  82. package/src/operation-output.ts +100 -0
  83. package/src/owned-parallel.ts +22 -0
  84. package/src/owned-process.ts +102 -0
  85. package/src/owned-task-queue.ts +38 -0
  86. package/src/package-version.ts +3 -0
  87. package/src/path-policy.ts +203 -0
  88. package/src/pi-search-policy.ts +33 -0
  89. package/src/prompt-guidelines.ts +54 -0
  90. package/src/python-outline.ts +231 -0
  91. package/src/record-value.ts +3 -0
  92. package/src/redaction.ts +95 -0
  93. package/src/request-contract-catalog.ts +215 -0
  94. package/src/request-contract-error.ts +96 -0
  95. package/src/request-contract.ts +481 -0
  96. package/src/request.ts +132 -0
  97. package/src/result-statistics.ts +178 -0
  98. package/src/rg.ts +574 -0
  99. package/src/ripgrep-diagnostics.ts +122 -0
  100. package/src/ripgrep-executable.ts +43 -0
  101. package/src/runtime.ts +53 -0
  102. package/src/scan-revisions.ts +148 -0
  103. package/src/script-runtime.ts +11 -0
  104. package/src/search-policy-commands.ts +170 -0
  105. package/src/search-policy-hook.ts +61 -0
  106. package/src/search-policy-recovery.ts +388 -0
  107. package/src/search-policy-shell.ts +280 -0
  108. package/src/search-policy.ts +102 -0
  109. package/src/search-retention.ts +77 -0
  110. package/src/semantic-judge-batches.ts +135 -0
  111. package/src/semantic-judge.ts +519 -0
  112. package/src/service.ts +945 -0
  113. package/src/session-summary.ts +100 -0
  114. package/src/snapshot-store.ts +203 -0
  115. package/src/source-access.ts +288 -0
  116. package/src/source-continuations.ts +168 -0
  117. package/src/source-document.ts +277 -0
  118. package/src/source-inspection.ts +731 -0
  119. package/src/source-pages.ts +112 -0
  120. package/src/source.ts +286 -0
  121. package/src/structural-search.ts +125 -0
  122. package/src/structure.ts +259 -0
  123. package/src/summary-previews.ts +96 -0
  124. package/src/summary.ts +79 -0
  125. package/src/syntax-facts.ts +464 -0
  126. package/src/syntax-fields.ts +161 -0
  127. package/src/syntax-search.ts +361 -0
  128. package/src/syntax-tree.ts +30 -0
  129. package/src/syntax-types.ts +72 -0
  130. package/src/syntax-worker.mjs +280 -0
  131. package/src/syntax-worker.toml +2 -0
  132. package/src/syntax-worker.ts +143 -0
  133. package/src/syntax.ts +259 -0
  134. package/src/test-navigation-facts.ts +261 -0
  135. package/src/test-navigation.ts +543 -0
  136. package/src/tool-schema.ts +321 -0
  137. package/src/tui/dashboard.ts +107 -0
  138. package/src/tui/layout.ts +291 -0
  139. package/src/tui/palette.ts +73 -0
  140. package/src/tui/presentation.ts +240 -0
  141. package/src/tui/renderers.ts +106 -0
  142. package/src/types.ts +368 -0
  143. package/src/validation-output.ts +148 -0
  144. package/src/validation-types.ts +48 -0
  145. package/src/workspace-files.ts +142 -0
@@ -0,0 +1,120 @@
1
+ import type { AnalysisDetails } from "./analysis-types.js";
2
+ import type { SiftLightDetails, SiftLightResult } from "./types.js";
3
+
4
+ import { formatStatistics } from "./result-statistics.js";
5
+
6
+ function isRecord(value: unknown): value is Record<string, unknown> {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+
10
+ function compactMetadata(details: SiftLightDetails, analysis: AnalysisDetails): string[] {
11
+ return [
12
+ ...(analysis.statistics ? formatStatistics(analysis.statistics) : []),
13
+ analysis.counts ? `Counts: ${JSON.stringify(analysis.counts)}` : undefined,
14
+ analysis.termCounts ? `Term counts: ${JSON.stringify(analysis.termCounts)}` : undefined,
15
+ analysis.termCountsNextRequest
16
+ ? `More term counts: ${JSON.stringify(analysis.termCountsNextRequest)}`
17
+ : undefined,
18
+ analysis.matchesRequest
19
+ ? `Matches request: ${JSON.stringify(analysis.matchesRequest)}`
20
+ : undefined,
21
+ analysis.changes ? `Changes: ${JSON.stringify(analysis.changes)}` : undefined,
22
+ analysis.scope ? `Scope: ${JSON.stringify(analysis.scope)}` : undefined,
23
+ analysis.chunks ? `Chunks: ${JSON.stringify(analysis.chunks)}` : undefined,
24
+ analysis.coverage ? `Coverage: ${JSON.stringify(analysis.coverage)}` : undefined,
25
+ analysis.stats ? `Stats: ${JSON.stringify(analysis.stats)}` : undefined,
26
+ analysis.sourceGeneration
27
+ ? `Source generation: ${JSON.stringify(analysis.sourceGeneration)}`
28
+ : undefined,
29
+ analysis.semanticJudge
30
+ ? `Semantic judge: ${JSON.stringify(analysis.semanticJudge)}`
31
+ : undefined,
32
+ details.operation ? `Operation: ${JSON.stringify(details.operation)}` : undefined,
33
+ analysis.kind === "outline" && analysis.modelOutput
34
+ ? "[Outline signatures are deferred; use version-checked inspection for source excerpts.]"
35
+ : undefined,
36
+ ...analysis.reasons.map((reason) => `[${reason}]`),
37
+ details.redactionApplied ? "[Display redaction applied.]" : undefined,
38
+ ].filter((line): line is string => line !== undefined);
39
+ }
40
+
41
+ function compactRows(analysis: AnalysisDetails): string[] {
42
+ const rows: string[] = [];
43
+ let previousPath: string | undefined;
44
+ for (const item of analysis.items) {
45
+ if (item.path !== previousPath) {
46
+ rows.push(JSON.stringify(item.path));
47
+ previousPath = item.path;
48
+ }
49
+ const label = analysis.kind === "outline" && analysis.modelOutput ? item.label : "metadata";
50
+ const semanticJudge = item.details?.semanticJudge;
51
+ const judgment =
52
+ isRecord(semanticJudge) &&
53
+ typeof semanticJudge.classification === "string" &&
54
+ typeof semanticJudge.probability === "number" &&
55
+ typeof semanticJudge.model === "string"
56
+ ? ` Jev: ${semanticJudge.classification}; probability=${String(semanticJudge.probability)};${typeof semanticJudge.confidence === "number" ? ` confidence=${String(semanticJudge.confidence)};` : ""} model=${JSON.stringify(semanticJudge.model)}.`
57
+ : "";
58
+ rows.push(`#${String(item.index)} L${String(item.line)} ${label}${judgment}`);
59
+ }
60
+ return rows;
61
+ }
62
+
63
+ function compactInspectInstruction(analysis: AnalysisDetails): string | undefined {
64
+ if (analysis.inspectCursor)
65
+ return `Inspect item #N: mode="inspect", cursor=${JSON.stringify(analysis.inspectCursor)}, matchIndex=N.`;
66
+ const inspect = analysis.items.find((item) => item.inspect !== undefined)?.inspect;
67
+ if (!inspect || typeof inspect.cursor !== "string") return undefined;
68
+ return `Inspect item #N: mode="inspect", cursor=${JSON.stringify(inspect.cursor)}, matchIndex=N${inspect.redact ? ", redact=true" : ""}.`;
69
+ }
70
+
71
+ function compactHeader(details: SiftLightDetails, analysis: AnalysisDetails): string {
72
+ if (
73
+ analysis.termCounts &&
74
+ analysis.termCountsOffset !== undefined &&
75
+ analysis.totalTerms !== undefined
76
+ ) {
77
+ const start = analysis.termCountsOffset + 1;
78
+ const end = analysis.termCountsOffset + analysis.termCounts.length;
79
+ return `${analysis.kind} term inventory ${String(start)}–${String(end)} of ${String(analysis.totalTerms)} (${details.status}).`;
80
+ }
81
+ const first = analysis.items[0]?.index;
82
+ const last = analysis.items.at(-1)?.index;
83
+ const shown =
84
+ first === undefined || last === undefined
85
+ ? "showing none"
86
+ : `showing #${String(first)}–#${String(last)}`;
87
+ return `${analysis.kind}: ${String(analysis.totalItems)} retained ${analysis.unit} (${details.status}); ${shown}.`;
88
+ }
89
+
90
+ function distinctNextRequest(
91
+ details: SiftLightDetails,
92
+ analysis: AnalysisDetails,
93
+ ): string | undefined {
94
+ if (!details.nextRequest) return undefined;
95
+ const serialized = JSON.stringify(details.nextRequest);
96
+ return serialized === JSON.stringify(analysis.termCountsNextRequest) ||
97
+ serialized === JSON.stringify(analysis.matchesRequest)
98
+ ? undefined
99
+ : serialized;
100
+ }
101
+
102
+ export function compactMcpModelText(result: SiftLightResult): string {
103
+ const analysis = result.details.analysis;
104
+ // Validation is a source-state report, not a pageable syntax/result inventory.
105
+ // Its authoritative text retains freshness, comparison target and check interval.
106
+ if (!analysis || analysis.kind === "validate") return result.text;
107
+ const header = compactHeader(result.details, analysis);
108
+ const inspect = compactInspectInstruction(analysis);
109
+ const nextRequest = distinctNextRequest(result.details, analysis);
110
+ const compact = [
111
+ header,
112
+ ...compactMetadata(result.details, analysis),
113
+ ...compactRows(analysis),
114
+ ...(inspect ? [inspect] : []),
115
+ ...(nextRequest ? [`Next request: ${nextRequest}`] : []),
116
+ ].join("\n");
117
+ const standard = result.text.replace(" Structured output retains per-item evidence details.", "");
118
+ if (analysis.semanticJudge) return compact;
119
+ return Buffer.byteLength(compact) < Buffer.byteLength(standard) ? compact : standard;
120
+ }
@@ -0,0 +1,9 @@
1
+ export const DEFAULT_MCP_OUTPUT_MODE = "structured";
2
+
3
+ export type SiftLightMcpOutputMode = "structured" | "text" | "model";
4
+
5
+ export function parseSiftLightMcpOutputMode(value: string | undefined): SiftLightMcpOutputMode {
6
+ if (value === undefined || value === DEFAULT_MCP_OUTPUT_MODE) return DEFAULT_MCP_OUTPUT_MODE;
7
+ if (value === "text" || value === "model") return value;
8
+ throw new Error('SIFT_LIGHT_MCP_OUTPUT_MODE must be "structured", "text", or "model"');
9
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ DEFAULT_SEMANTIC_JUDGE_CONFIG,
3
+ readSiftLightConfigFile,
4
+ SIFT_LIGHT_CONFIG_ENV,
5
+ } from "./config-reader.js";
6
+ import {
7
+ createDisabledSemanticJudgeIntegration,
8
+ createSemanticJudgeIntegration,
9
+ type SemanticJudgeIntegration,
10
+ } from "./semantic-judge.js";
11
+
12
+ function configuredPath(environment: NodeJS.ProcessEnv): string | undefined {
13
+ const value = environment[SIFT_LIGHT_CONFIG_ENV]?.trim();
14
+ return value || undefined;
15
+ }
16
+
17
+ /**
18
+ * Resolve the MCP-only opt-in without borrowing a host-specific Pi/OMP path.
19
+ * The MCP process must receive the same config path explicitly in its own host
20
+ * environment; an absent path remains an observable, local-only disabled state.
21
+ */
22
+ export async function createMcpSemanticJudgeIntegration(
23
+ environment: NodeJS.ProcessEnv = process.env,
24
+ ): Promise<SemanticJudgeIntegration> {
25
+ const path = configuredPath(environment);
26
+ if (!path) return createDisabledSemanticJudgeIntegration(DEFAULT_SEMANTIC_JUDGE_CONFIG);
27
+
28
+ const config = await readSiftLightConfigFile(path, { missing: "error" });
29
+ return createSemanticJudgeIntegration(
30
+ config.semanticJudge ?? DEFAULT_SEMANTIC_JUDGE_CONFIG,
31
+ environment,
32
+ );
33
+ }
34
+
35
+ export function mcpSemanticJudgeConfigSource(
36
+ environment: NodeJS.ProcessEnv = process.env,
37
+ ): "explicit-config" | "not-configured" {
38
+ return configuredPath(environment) ? "explicit-config" : "not-configured";
39
+ }