knodin 0.7.6 → 0.8.2
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 +19 -7
- package/benchmarks/competitors/SYNTHESIS.md +66 -0
- package/dist/bin/cli.js +2164 -108
- package/dist/bin/launcher.js +25 -3
- package/dist/src/agent-integration.js +304 -0
- package/dist/src/artifact-refresh.js +82 -0
- package/dist/src/cli-args.js +292 -0
- package/dist/src/cli-model.js +384 -0
- package/dist/src/codeflow-replay.js +81 -0
- package/dist/src/compact-structural.js +96 -0
- package/dist/src/compare.js +39 -0
- package/dist/src/competitive-cold-mcp.js +40 -0
- package/dist/src/competitive-constraints.js +21 -0
- package/dist/src/competitive-manifest.js +411 -0
- package/dist/src/competitive-measurement.js +183 -0
- package/dist/src/competitive-runner.js +487 -0
- package/dist/src/competitive-sandbox.js +108 -0
- package/dist/src/context-export.js +423 -0
- package/dist/src/context.js +102 -0
- package/dist/src/deterministic-random.js +34 -0
- package/dist/src/diagnostics-write-helper.js +473 -0
- package/dist/src/diagnostics.js +1476 -0
- package/dist/src/docs-sections.js +141 -0
- package/dist/src/doctor.js +382 -0
- package/dist/src/engine/ann-hnsw.js +261 -0
- package/dist/src/engine/embeddings.js +193 -0
- package/dist/src/engine/file-walker.js +49 -0
- package/dist/src/engine/git-history.js +289 -0
- package/dist/src/engine/index.js +14238 -0
- package/dist/src/engine/perf.js +115 -0
- package/dist/src/engine/prune.js +112 -0
- package/dist/src/engine/sarif-import.js +341 -0
- package/dist/src/engine/scip-import.js +423 -0
- package/dist/src/engine/source-policy.js +85 -0
- package/dist/src/engine/sqlite.js +71 -0
- package/dist/src/engine/state-paths.js +175 -0
- package/dist/src/engine/symbol-delete.js +58 -0
- package/dist/src/execution-profile.js +208 -0
- package/dist/src/failure-diagnosis.js +655 -0
- package/dist/src/fleet.js +7 -0
- package/dist/src/git-executable.js +31 -0
- package/dist/src/graph-layout.js +173 -0
- package/dist/src/graph-query-health.js +115 -0
- package/dist/src/hook-manager-integration.js +156 -0
- package/dist/src/index-activity.js +126 -0
- package/dist/src/init-progress-worker.js +106 -2
- package/dist/src/init-progress.js +155 -0
- package/dist/src/init.js +1295 -0
- package/dist/src/lifecycle-health.js +282 -0
- package/dist/src/lsp-readonly.js +217 -0
- package/dist/src/mcp-graph-worker.js +69 -0
- package/dist/src/mcp-reliability.js +154 -0
- package/dist/src/mcp-worker-supervisor.js +350 -0
- package/dist/src/mirror.js +290 -0
- package/dist/src/node-runtime.js +157 -0
- package/dist/src/output-compression.js +630 -0
- package/dist/src/output-telemetry.js +368 -0
- package/dist/src/pr-triage.js +638 -0
- package/dist/src/progressive-evidence.js +477 -0
- package/dist/src/pure-compression-cli.js +102 -0
- package/dist/src/relationship-adapters.js +377 -0
- package/dist/src/release-attestation.js +533 -0
- package/dist/src/release-preflight.js +513 -0
- package/dist/src/repair-lease.js +85 -0
- package/dist/src/repair-progress-worker.js +120 -2
- package/dist/src/repair-progress.js +262 -0
- package/dist/src/repository-init-process.js +177 -0
- package/dist/src/repository-management.js +1261 -0
- package/dist/src/response-budget.js +196 -0
- package/dist/src/server.js +217 -0
- package/dist/src/structural-fast-path.js +344 -0
- package/dist/src/structural-snapshot.js +37 -0
- package/dist/src/system-config.js +638 -0
- package/dist/src/terminal-help.js +83 -0
- package/dist/src/tools/knodin-tools.js +1640 -0
- package/dist/src/update-ceremony.js +162 -0
- package/dist/src/update-policy.js +944 -0
- package/dist/src/update-trust.js +504 -0
- package/dist/src/version.js +13 -0
- package/dist/src/visualization.js +515 -0
- package/dist/src/wait-for-fresh.js +98 -0
- package/dist/src/worktree-lifecycle.js +234 -0
- package/docs/BEHAVIORAL-CONTRACT.md +72 -0
- package/docs/CLI.md +20 -1
- package/docs/COMPARISON.md +403 -0
- package/docs/COMPETITIVE-LANDSCAPE-2026-08.md +267 -0
- package/docs/CONTAINED-EXECUTION.md +77 -0
- package/docs/DIAGNOSTICS.md +80 -0
- package/docs/GIT-HISTORY-REVIEW.md +39 -0
- package/docs/HANDOFF.md +180 -0
- package/docs/INSTALLATION.md +21 -18
- package/docs/MCP.md +59 -8
- package/docs/PROGRESSIVE-EVIDENCE.md +37 -0
- package/docs/PT-ACCESS-RECOMMENDATION.md +89 -0
- package/docs/RELEASE-0.3-EVIDENCE.md +73 -0
- package/docs/REPOSITORIES-AND-WORKTREES.md +18 -6
- package/docs/SCIP-IMPORT.md +62 -0
- package/docs/SIGNED-UPDATES.md +151 -0
- package/docs/TELEMETRY.md +46 -0
- package/docs/TOKEN-OPTIMIZER-SCORECARD.md +79 -0
- package/docs/assets/knodin-favicon.svg +4 -0
- package/docs/releases/0.3.0.md +46 -0
- package/docs/releases/0.4.0.md +68 -0
- package/docs/releases/0.4.1.md +28 -0
- package/docs/releases/0.4.2.md +27 -0
- package/docs/releases/0.4.3.md +23 -0
- package/docs/releases/0.5.0.md +29 -0
- package/docs/releases/0.5.1.md +17 -0
- package/docs/releases/0.6.0.md +18 -0
- package/docs/releases/0.7.0.md +24 -0
- package/docs/releases/0.7.1.md +21 -0
- package/docs/releases/0.7.2.md +21 -0
- package/docs/releases/0.7.3.md +23 -0
- package/docs/releases/0.7.4.md +17 -0
- package/docs/releases/0.7.5.md +20 -0
- package/docs/releases/0.8.0.md +74 -0
- package/docs/releases/0.8.2.md +34 -0
- package/package.json +127 -4
- package/roadmap/competitive-roadmap.md +3801 -0
- package/schemas/release-attestation-v1.schema.json +210 -0
- package/schemas/support-bundle-v2.schema.json +212 -0
- package/dist/chunks/chunk-DMQAGX77.js +0 -654
- package/dist/chunks/chunk-F4Z3Z766.js +0 -4
- package/dist/chunks/chunk-SIJAQVSX.js +0 -3
- package/dist/chunks/chunk-X6M4HUUE.js +0 -2
- package/dist/chunks/chunk-YPRMY2LP.js +0 -8
- package/dist/chunks/pure-compression-cli-4TA2TQD5.js +0 -5
- package/dist/chunks/server-7EDF4CBY.js +0 -14
- package/dist/chunks/structural-fast-path-KD5KQSPX.js +0 -4
- package/docs/releases/0.7.6.md +0 -25
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
const HEARTBEAT_MS = 15_000;
|
|
2
|
+
const TTY_THROTTLE_MS = 100;
|
|
3
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
4
|
+
const CLEAR_TTY_LINE = "\r\x1b[2K";
|
|
5
|
+
export function normalizeTerminalDimension(value, fallback) {
|
|
6
|
+
return Number.isFinite(value) && (value ?? 0) > 0 ? Math.floor(value) : fallback;
|
|
7
|
+
}
|
|
8
|
+
function formatCount(value) {
|
|
9
|
+
return value.toLocaleString();
|
|
10
|
+
}
|
|
11
|
+
function formatBytes(value) {
|
|
12
|
+
if (value < 1024 * 1024)
|
|
13
|
+
return `${Math.round(value / 1024)} KB`;
|
|
14
|
+
return `${(value / (1024 * 1024)).toFixed(1)} MB`;
|
|
15
|
+
}
|
|
16
|
+
function formatDuration(seconds) {
|
|
17
|
+
if (seconds < 1)
|
|
18
|
+
return "<1s";
|
|
19
|
+
if (seconds < 60)
|
|
20
|
+
return `${Math.ceil(seconds)}s`;
|
|
21
|
+
return `${Math.floor(seconds / 60)}m ${Math.ceil(seconds % 60)}s`;
|
|
22
|
+
}
|
|
23
|
+
export function formatProgress(event, ratePerSecond, operation = "init") {
|
|
24
|
+
const model = event.modelFile ? ` (${event.modelFile})` : "";
|
|
25
|
+
const total = event.phaseTotal;
|
|
26
|
+
if (total === undefined)
|
|
27
|
+
return `[${operation}:${event.phase}] ${event.message}${model}`;
|
|
28
|
+
const counter = event.phase === "embedding-model"
|
|
29
|
+
? `${formatBytes(event.phaseCompleted)} / ${formatBytes(total)}`
|
|
30
|
+
: `${formatCount(event.phaseCompleted)} / ${formatCount(total)}`;
|
|
31
|
+
const percent = total > 0 ? ` (${Math.floor((event.phaseCompleted / total) * 100)}%)` : "";
|
|
32
|
+
const eta = ratePerSecond && total > event.phaseCompleted
|
|
33
|
+
? ` • ~${formatDuration((total - event.phaseCompleted) / ratePerSecond)} remaining`
|
|
34
|
+
: "";
|
|
35
|
+
const rate = ratePerSecond && event.phase !== "embedding-model"
|
|
36
|
+
? ` • ${ratePerSecond.toFixed(ratePerSecond >= 10 ? 0 : 1)}/s`
|
|
37
|
+
: "";
|
|
38
|
+
return `[${operation}:${event.phase}] ${counter}${percent} ${event.message}${model}${rate}${eta}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Human-only init feedback. It writes to stderr, leaving stdout stable for the
|
|
42
|
+
* final result, redraws a TTY at most 10 times/sec, and heartbeats a quiet phase.
|
|
43
|
+
*/
|
|
44
|
+
export function createInitProgressRenderer(options) {
|
|
45
|
+
const operation = options.operation ?? "init";
|
|
46
|
+
const now = options.now ?? Date.now;
|
|
47
|
+
const schedule = options.setTimeout ??
|
|
48
|
+
((callback, intervalMs) => setTimeout(callback, intervalMs));
|
|
49
|
+
const unschedule = options.clearTimeout ?? ((handle) => clearTimeout(handle));
|
|
50
|
+
const tty = options.stderr.isTTY === true;
|
|
51
|
+
let started = false;
|
|
52
|
+
let stopped = false;
|
|
53
|
+
let hasTtyLine = false;
|
|
54
|
+
let startedAt = 0;
|
|
55
|
+
let heartbeat;
|
|
56
|
+
let spinner;
|
|
57
|
+
let spinnerFrame = 0;
|
|
58
|
+
let displayLine = `[${operation}:starting] Opening local graph database`;
|
|
59
|
+
let lastWriteAt = Number.NEGATIVE_INFINITY;
|
|
60
|
+
let lastPhase = "starting";
|
|
61
|
+
let lastPercentBucket = -1;
|
|
62
|
+
let phaseStartedElapsedMs = 0;
|
|
63
|
+
let phaseStartedCompleted = 0;
|
|
64
|
+
const scheduleHeartbeat = () => {
|
|
65
|
+
if (heartbeat !== undefined || stopped)
|
|
66
|
+
return;
|
|
67
|
+
heartbeat = schedule(() => {
|
|
68
|
+
heartbeat = undefined;
|
|
69
|
+
if (stopped)
|
|
70
|
+
return;
|
|
71
|
+
write(`${displayLine} (still working; ${Math.floor((now() - startedAt) / 1000)}s elapsed)`, false);
|
|
72
|
+
scheduleHeartbeat();
|
|
73
|
+
}, HEARTBEAT_MS);
|
|
74
|
+
if (typeof heartbeat === "object" && heartbeat !== null && "unref" in heartbeat) {
|
|
75
|
+
heartbeat.unref();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const scheduleSpinner = () => {
|
|
79
|
+
if (!tty || spinner !== undefined || stopped)
|
|
80
|
+
return;
|
|
81
|
+
spinner = schedule(() => {
|
|
82
|
+
spinner = undefined;
|
|
83
|
+
if (stopped)
|
|
84
|
+
return;
|
|
85
|
+
spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;
|
|
86
|
+
options.stderr.write(`${CLEAR_TTY_LINE}${SPINNER_FRAMES[spinnerFrame]} ${displayLine} (${Math.floor((now() - startedAt) / 1000)}s elapsed)`);
|
|
87
|
+
hasTtyLine = true;
|
|
88
|
+
scheduleSpinner();
|
|
89
|
+
}, TTY_THROTTLE_MS);
|
|
90
|
+
if (typeof spinner === "object" && spinner !== null && "unref" in spinner) {
|
|
91
|
+
spinner.unref();
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const write = (line, updateDisplay = true) => {
|
|
95
|
+
if (updateDisplay)
|
|
96
|
+
displayLine = line;
|
|
97
|
+
if (tty) {
|
|
98
|
+
options.stderr.write(`${CLEAR_TTY_LINE}${SPINNER_FRAMES[spinnerFrame]} ${line} (${Math.floor((now() - startedAt) / 1000)}s elapsed)`);
|
|
99
|
+
hasTtyLine = true;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
options.stderr.write(`${line}\n`);
|
|
103
|
+
}
|
|
104
|
+
lastWriteAt = now();
|
|
105
|
+
scheduleHeartbeat();
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
start() {
|
|
109
|
+
if (started || stopped)
|
|
110
|
+
return;
|
|
111
|
+
started = true;
|
|
112
|
+
startedAt = now();
|
|
113
|
+
scheduleSpinner();
|
|
114
|
+
write(displayLine);
|
|
115
|
+
},
|
|
116
|
+
onProgress(event) {
|
|
117
|
+
if (stopped)
|
|
118
|
+
return;
|
|
119
|
+
if (!started)
|
|
120
|
+
this.start();
|
|
121
|
+
const percentage = event.phaseTotal && event.phaseTotal > 0
|
|
122
|
+
? Math.floor((event.phaseCompleted / event.phaseTotal) * 100)
|
|
123
|
+
: undefined;
|
|
124
|
+
const bucket = percentage === undefined ? -1 : Math.floor(percentage / 5);
|
|
125
|
+
const phaseChanged = event.phase !== lastPhase;
|
|
126
|
+
if (phaseChanged) {
|
|
127
|
+
phaseStartedElapsedMs = event.elapsedMs;
|
|
128
|
+
phaseStartedCompleted = event.phaseCompleted;
|
|
129
|
+
}
|
|
130
|
+
const phaseElapsedSeconds = Math.max(0, event.elapsedMs - phaseStartedElapsedMs) / 1_000;
|
|
131
|
+
const ratePerSecond = phaseElapsedSeconds > 0 && event.phaseCompleted > phaseStartedCompleted
|
|
132
|
+
? (event.phaseCompleted - phaseStartedCompleted) / phaseElapsedSeconds
|
|
133
|
+
: undefined;
|
|
134
|
+
const completed = event.phaseTotal !== undefined && event.phaseCompleted >= event.phaseTotal;
|
|
135
|
+
if (tty && !phaseChanged && !completed && now() - lastWriteAt < TTY_THROTTLE_MS)
|
|
136
|
+
return;
|
|
137
|
+
if (!tty && !phaseChanged && bucket <= lastPercentBucket && !completed)
|
|
138
|
+
return;
|
|
139
|
+
write(formatProgress(event, ratePerSecond, operation));
|
|
140
|
+
lastPhase = event.phase;
|
|
141
|
+
lastPercentBucket = Math.max(lastPercentBucket, bucket);
|
|
142
|
+
},
|
|
143
|
+
stop() {
|
|
144
|
+
if (stopped)
|
|
145
|
+
return;
|
|
146
|
+
stopped = true;
|
|
147
|
+
if (heartbeat !== undefined)
|
|
148
|
+
unschedule(heartbeat);
|
|
149
|
+
if (spinner !== undefined)
|
|
150
|
+
unschedule(spinner);
|
|
151
|
+
if (tty && hasTtyLine)
|
|
152
|
+
options.stderr.write(`${CLEAR_TTY_LINE}\n`);
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|