akm-cli 0.9.0-beta.5 → 0.9.0-beta.50
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/CHANGELOG.md +709 -0
- package/dist/assets/profiles/default.json +9 -4
- package/dist/assets/profiles/frequent.json +1 -1
- package/dist/assets/profiles/memory-focus.json +1 -1
- package/dist/assets/profiles/quick.json +1 -1
- package/dist/assets/profiles/synthesize.json +15 -0
- package/dist/assets/profiles/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +23 -0
- package/dist/assets/prompts/contradiction-judge.md +33 -0
- package/dist/assets/prompts/distill-knowledge-system.md +22 -0
- package/dist/assets/prompts/distill-lesson-system.md +36 -0
- package/dist/assets/prompts/extract-session.md +6 -2
- package/dist/assets/prompts/graph-extract-system.md +1 -0
- package/dist/assets/prompts/graph-extract-user-prompt.md +1 -1
- package/dist/assets/prompts/memory-infer-system.md +1 -0
- package/dist/assets/prompts/memory-infer-user.md +5 -0
- package/dist/assets/prompts/metadata-enhance-system.md +1 -0
- package/dist/assets/prompts/procedural-system.md +44 -0
- package/dist/assets/prompts/recombine-system.md +40 -0
- package/dist/assets/prompts/staleness-detect-system.md +6 -0
- package/dist/assets/prompts/validate-summary-judge.md +1 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +38 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +38 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +39 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +40 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +43 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +38 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +43 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +40 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +43 -0
- package/dist/assets/templates/html/health.html +281 -111
- package/dist/assets/wiki/ingest-workflow-template.md +17 -10
- package/dist/cli/shared.js +28 -0
- package/dist/cli.js +15 -5
- package/dist/commands/agent/agent-dispatch.js +2 -2
- package/dist/commands/agent/agent-support.js +0 -7
- package/dist/commands/agent/contribute-cli.js +17 -4
- package/dist/commands/env/env-cli.js +16 -24
- package/dist/commands/env/secret-cli.js +12 -20
- package/dist/commands/feedback-cli.js +15 -6
- package/dist/commands/graph/graph-cli.js +5 -13
- package/dist/commands/graph/graph.js +76 -72
- package/dist/commands/health/checks.js +48 -0
- package/dist/commands/health/html-report.js +422 -80
- package/dist/commands/health.js +386 -9
- package/dist/commands/improve/calibration.js +161 -0
- package/dist/commands/improve/consolidate/chunking.js +141 -0
- package/dist/commands/improve/consolidate/eligibility.js +81 -0
- package/dist/commands/improve/consolidate/merge.js +145 -0
- package/dist/commands/improve/consolidate/sanitize.js +231 -0
- package/dist/commands/{lint.js → improve/consolidate/types.js} +1 -1
- package/dist/commands/improve/consolidate.js +635 -660
- package/dist/commands/improve/dedup.js +482 -0
- package/dist/commands/improve/distill.js +159 -69
- package/dist/commands/improve/eligibility.js +434 -0
- package/dist/commands/improve/encoding-salience.js +205 -0
- package/dist/commands/improve/extract-cli.js +124 -2
- package/dist/commands/improve/extract-prompt.js +39 -2
- package/dist/commands/improve/extract-watch.js +140 -0
- package/dist/commands/improve/extract.js +389 -40
- package/dist/commands/improve/feedback-valence.js +54 -0
- package/dist/commands/improve/homeostatic.js +467 -0
- package/dist/commands/improve/improve-auto-accept.js +109 -6
- package/dist/commands/improve/improve-cli.js +35 -60
- package/dist/commands/improve/improve-profiles.js +14 -0
- package/dist/commands/improve/improve-result-file.js +5 -23
- package/dist/commands/improve/improve-session.js +58 -0
- package/dist/commands/improve/improve.js +485 -2498
- package/dist/commands/improve/locks.js +154 -0
- package/dist/commands/improve/loop-stages.js +1083 -0
- package/dist/commands/improve/memory/memory-contradiction-detect.js +23 -28
- package/dist/commands/improve/outcome-loop.js +256 -0
- package/dist/commands/improve/preparation.js +1966 -0
- package/dist/commands/improve/proactive-maintenance.js +115 -0
- package/dist/commands/improve/procedural.js +418 -0
- package/dist/commands/improve/recombine.js +813 -0
- package/dist/commands/improve/reflect-noise.js +0 -0
- package/dist/commands/improve/reflect.js +183 -40
- package/dist/commands/improve/salience.js +438 -0
- package/dist/commands/improve/triage.js +93 -0
- package/dist/commands/lint/agent-linter.js +19 -24
- package/dist/commands/lint/base-linter.js +173 -60
- package/dist/commands/lint/command-linter.js +19 -24
- package/dist/commands/lint/env-key-rules.js +34 -1
- package/dist/commands/lint/fact-linter.js +39 -0
- package/dist/commands/lint/index.js +31 -13
- package/dist/commands/lint/memory-linter.js +1 -1
- package/dist/commands/lint/registry.js +7 -2
- package/dist/commands/lint/task-linter.js +3 -3
- package/dist/commands/lint/workflow-linter.js +26 -1
- package/dist/commands/proposal/drain-policies.js +5 -0
- package/dist/commands/proposal/drain.js +43 -50
- package/dist/commands/proposal/proposal-cli.js +21 -31
- package/dist/commands/proposal/proposal.js +5 -0
- package/dist/commands/proposal/propose.js +7 -2
- package/dist/commands/proposal/validators/proposal-quality-validators.js +9 -8
- package/dist/commands/proposal/validators/proposals.js +189 -63
- package/dist/commands/read/curate.js +414 -94
- package/dist/commands/read/knowledge.js +2 -2
- package/dist/commands/read/search-cli.js +7 -0
- package/dist/commands/read/search.js +1 -0
- package/dist/commands/read/show.js +67 -2
- package/dist/commands/sources/init.js +36 -9
- package/dist/commands/sources/installed-stashes.js +5 -1
- package/dist/commands/sources/schema-repair.js +13 -1
- package/dist/commands/sources/self-update.js +2 -2
- package/dist/commands/sources/stash-cli.js +28 -40
- package/dist/commands/sources/stash-skeleton.js +23 -8
- package/dist/commands/tasks/tasks-cli.js +19 -27
- package/dist/commands/tasks/tasks.js +1 -1
- package/dist/commands/wiki-cli.js +21 -35
- package/dist/core/asset/asset-registry.js +2 -0
- package/dist/core/asset/asset-spec.js +14 -0
- package/dist/core/asset/frontmatter.js +166 -167
- package/dist/core/asset/markdown.js +8 -0
- package/dist/core/authoring-rules.js +92 -0
- package/dist/core/common.js +0 -5
- package/dist/core/config/config-schema.js +340 -56
- package/dist/core/config/config-types.js +3 -3
- package/dist/core/config/config.js +28 -7
- package/dist/core/events.js +3 -7
- package/dist/core/improve-types.js +11 -8
- package/dist/core/logs-db.js +10 -66
- package/dist/core/parse.js +36 -16
- package/dist/core/paths.js +3 -0
- package/dist/core/standards/resolve-standards-context.js +87 -0
- package/dist/core/standards/resolve-stash-standards.js +99 -0
- package/dist/core/standards/resolve-type-conventions.js +66 -0
- package/dist/core/state/migrations.js +714 -0
- package/dist/core/state-db.js +525 -474
- package/dist/indexer/db/db.js +439 -247
- package/dist/indexer/db/graph-db.js +129 -86
- package/dist/indexer/ensure-index.js +152 -17
- package/dist/indexer/graph/graph-boost.js +51 -41
- package/dist/indexer/graph/graph-extraction.js +218 -4
- package/dist/indexer/index-writer-lock.js +99 -0
- package/dist/indexer/indexer.js +123 -221
- package/dist/indexer/passes/dir-staleness.js +114 -0
- package/dist/indexer/passes/memory-inference.js +10 -3
- package/dist/indexer/passes/staleness-detect.js +2 -5
- package/dist/indexer/search/db-search.js +15 -4
- package/dist/indexer/search/ranking-contributors.js +22 -0
- package/dist/indexer/search/ranking.js +4 -0
- package/dist/indexer/search/search-source.js +10 -24
- package/dist/indexer/search/semantic-status.js +4 -0
- package/dist/indexer/walk/matchers.js +9 -0
- package/dist/integrations/agent/config.js +6 -53
- package/dist/integrations/agent/index.js +2 -18
- package/dist/integrations/agent/prompts.js +74 -8
- package/dist/integrations/agent/runner-dispatch.js +59 -0
- package/dist/integrations/harnesses/claude/session-log.js +11 -1
- package/dist/integrations/harnesses/index.js +2 -3
- package/dist/integrations/harnesses/opencode/session-log.js +173 -3
- package/dist/integrations/harnesses/opencode-sdk/index.js +2 -2
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -2
- package/dist/integrations/session-logs/index.js +16 -0
- package/dist/llm/client.js +45 -15
- package/dist/llm/embedder.js +42 -3
- package/dist/llm/embedders/deterministic.js +66 -0
- package/dist/llm/embedders/local.js +66 -2
- package/dist/llm/feature-gate.js +8 -4
- package/dist/llm/graph-extract.js +67 -44
- package/dist/llm/memory-infer.js +38 -30
- package/dist/llm/metadata-enhance.js +44 -31
- package/dist/llm/structured-call.js +49 -0
- package/dist/output/context.js +5 -5
- package/dist/output/renderers.js +73 -1
- package/dist/output/shapes/curate.js +14 -2
- package/dist/output/shapes/passthrough.js +0 -1
- package/dist/output/text/helpers.js +16 -1
- package/dist/registry/providers/skills-sh.js +21 -147
- package/dist/registry/providers/static-index.js +15 -157
- package/dist/registry/resolve.js +22 -9
- package/dist/runtime.js +25 -1
- package/dist/scripts/migrate-storage.js +2136 -1596
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +682 -433
- package/dist/setup/setup.js +29 -8
- package/dist/sources/providers/filesystem.js +0 -1
- package/dist/sources/providers/git-install.js +206 -0
- package/dist/sources/providers/git-provider.js +234 -0
- package/dist/sources/providers/git-stash.js +248 -0
- package/dist/sources/providers/git.js +10 -661
- package/dist/sources/providers/npm.js +2 -6
- package/dist/sources/providers/sync-from-ref.js +9 -1
- package/dist/sources/providers/tar-utils.js +16 -8
- package/dist/sources/providers/website.js +2 -3
- package/dist/sources/website-ingest.js +51 -9
- package/dist/sources/wiki-fetchers/registry.js +53 -0
- package/dist/sources/wiki-fetchers/youtube.js +239 -0
- package/dist/storage/database.js +45 -10
- package/dist/storage/managed-db.js +82 -0
- package/dist/storage/repositories/registry-cache.js +92 -0
- package/dist/storage/sqlite-pragmas.js +146 -0
- package/dist/tasks/backends/cron.js +1 -1
- package/dist/tasks/backends/launchd.js +1 -1
- package/dist/tasks/backends/schtasks.js +1 -1
- package/dist/tasks/{resolveAkmBin.js → resolve-akm-bin.js} +2 -2
- package/dist/tasks/runner.js +5 -13
- package/dist/wiki/wiki.js +37 -0
- package/dist/workflows/db.js +3 -4
- package/dist/workflows/runtime/runs.js +1 -117
- package/dist/workflows/runtime/workflow-asset-loader.js +125 -0
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/data-and-telemetry.md +1 -0
- package/package.json +9 -7
- package/dist/commands/db-cli.js +0 -23
- package/dist/indexer/db/db-backup.js +0 -376
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import { fetchWithRetry, jsonWithByteCap, toErrorMessage } from "../../core/common.js";
|
|
5
|
-
import { rethrowIfTestIsolationError } from "../../core/errors.js";
|
|
6
|
-
import { closeDatabase, getRegistryIndexCache, openDatabase, upsertRegistryIndexCache } from "../../indexer/db/db.js";
|
|
7
5
|
import { asString } from "../../integrations/github.js";
|
|
6
|
+
import { fetchCachedJson } from "../../storage/repositories/registry-cache.js";
|
|
8
7
|
import { registerProvider } from "../factory.js";
|
|
8
|
+
import { buildInstallRef } from "../resolve.js";
|
|
9
9
|
// ── Constants ───────────────────────────────────────────────────────────────
|
|
10
10
|
/** Cache TTL in milliseconds (1 hour). */
|
|
11
11
|
const CACHE_TTL_MS = 60 * 60 * 1000;
|
|
@@ -30,51 +30,6 @@ class StaticIndexProvider {
|
|
|
30
30
|
}
|
|
31
31
|
return { hits, assetHits, warnings: warnings.length > 0 ? warnings : undefined };
|
|
32
32
|
}
|
|
33
|
-
// ── v1-spec §3.1 surface ────────────────────────────────────────────────
|
|
34
|
-
async searchKits(q) {
|
|
35
|
-
const result = await this.search({
|
|
36
|
-
query: q.text,
|
|
37
|
-
limit: q.limit ?? 20,
|
|
38
|
-
includeAssets: false,
|
|
39
|
-
});
|
|
40
|
-
return result.hits.map(hitToKitResult);
|
|
41
|
-
}
|
|
42
|
-
async searchAssets(q) {
|
|
43
|
-
const result = await this.search({
|
|
44
|
-
query: q.text,
|
|
45
|
-
limit: q.limit ?? 20,
|
|
46
|
-
includeAssets: true,
|
|
47
|
-
});
|
|
48
|
-
return (result.assetHits ?? []).map(assetHitToPreview);
|
|
49
|
-
}
|
|
50
|
-
async getKit(id) {
|
|
51
|
-
const allKits = await this.loadAllKits([]);
|
|
52
|
-
const found = allKits.find(({ stash }) => stash.id === id);
|
|
53
|
-
if (!found)
|
|
54
|
-
return null;
|
|
55
|
-
const installRef = buildInstallRef(found.stash.source, found.stash.ref);
|
|
56
|
-
return {
|
|
57
|
-
id: found.stash.id,
|
|
58
|
-
installRef,
|
|
59
|
-
assets: found.stash.assets?.map((asset) => ({
|
|
60
|
-
kitId: found.stash.id,
|
|
61
|
-
type: asset.type,
|
|
62
|
-
name: asset.name,
|
|
63
|
-
summary: asset.description,
|
|
64
|
-
cloneRef: installRef,
|
|
65
|
-
})),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Static-index doesn't own a URL prefix — any `ParsedRegistryRef` could
|
|
70
|
-
* theoretically be backed by an entry in some static-index registry. We
|
|
71
|
-
* therefore claim every ref. The orchestrator picks the first matching
|
|
72
|
-
* provider, and `static-index` is registered first by `index.ts`, so this
|
|
73
|
-
* is effectively the default catch-all.
|
|
74
|
-
*/
|
|
75
|
-
canHandle(_ref) {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
33
|
// ── Internals ───────────────────────────────────────────────────────────
|
|
79
34
|
async loadAllKits(warnings) {
|
|
80
35
|
const allKits = [];
|
|
@@ -94,84 +49,17 @@ class StaticIndexProvider {
|
|
|
94
49
|
return allKits;
|
|
95
50
|
}
|
|
96
51
|
}
|
|
97
|
-
function hitToKitResult(hit) {
|
|
98
|
-
return {
|
|
99
|
-
id: hit.id,
|
|
100
|
-
title: hit.title,
|
|
101
|
-
summary: hit.description,
|
|
102
|
-
installRef: hit.installRef,
|
|
103
|
-
score: hit.score,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
function assetHitToPreview(hit) {
|
|
107
|
-
return {
|
|
108
|
-
kitId: hit.stash.id,
|
|
109
|
-
type: hit.assetType,
|
|
110
|
-
name: hit.assetName,
|
|
111
|
-
summary: hit.description,
|
|
112
|
-
cloneRef: hit.action.replace(/^akm add\s+/, ""),
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
52
|
// ── Self-register ───────────────────────────────────────────────────────────
|
|
116
53
|
registerProvider("static-index", (config) => new StaticIndexProvider(config));
|
|
117
54
|
// ── Index loading with cache ────────────────────────────────────────────────
|
|
118
|
-
/**
|
|
119
|
-
* RAII-style lifecycle helper for the registry cache DB. Opens the DB (treating
|
|
120
|
-
* a failed open exactly like the legacy fall-through: the bun-test isolation
|
|
121
|
-
* guard is re-thrown, any other failure yields `db = undefined`), runs `fn`,
|
|
122
|
-
* and guarantees the DB is closed in a `finally` after `fn` has fully settled
|
|
123
|
-
* (the await is required: the callbacks are async, and closing before they
|
|
124
|
-
* settle would tear the DB down mid-write).
|
|
125
|
-
*/
|
|
126
|
-
async function withRegistryCacheDb(fn) {
|
|
127
|
-
let db;
|
|
128
|
-
try {
|
|
129
|
-
db = openDatabase();
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
// Never mask the bun-test isolation guard as "DB unavailable".
|
|
133
|
-
rethrowIfTestIsolationError(err);
|
|
134
|
-
db = undefined;
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
return await fn(db);
|
|
138
|
-
}
|
|
139
|
-
finally {
|
|
140
|
-
if (db) {
|
|
141
|
-
try {
|
|
142
|
-
closeDatabase(db);
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
/* ignore */
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
55
|
async function loadIndex(entry) {
|
|
151
|
-
return
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
catch (err) {
|
|
160
|
-
// Never mask the bun-test isolation guard as "DB unavailable" — see
|
|
161
|
-
// rethrowIfTestIsolationError in src/core/errors.ts. Without this, a
|
|
162
|
-
// leaky test silently gets a cold cache instead of the loud
|
|
163
|
-
// TEST_ISOLATION_MISSING failure the guard intends.
|
|
164
|
-
rethrowIfTestIsolationError(err);
|
|
165
|
-
// index.db read failed (pre-migration install or test env) — fall through
|
|
166
|
-
}
|
|
167
|
-
if (dbCacheResult) {
|
|
168
|
-
const index = parseRegistryIndex(JSON.parse(dbCacheResult.indexJson));
|
|
169
|
-
if (index) {
|
|
170
|
-
return index;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// ── Step 2: Fetch fresh index from remote ────────────────────────────────
|
|
174
|
-
try {
|
|
56
|
+
return fetchCachedJson({
|
|
57
|
+
cacheKey: entry.url,
|
|
58
|
+
ttlMs: CACHE_TTL_MS,
|
|
59
|
+
// Both the fresh hit and the stale fallback parse identically; a corrupt
|
|
60
|
+
// cache row lets JSON.parse throw out of the load (legacy behaviour).
|
|
61
|
+
parseCache: (json) => parseRegistryIndex(JSON.parse(json)) ?? undefined,
|
|
62
|
+
fetchFresh: async () => {
|
|
175
63
|
const response = await fetchWithRetry(entry.url, undefined, { timeout: 10_000 });
|
|
176
64
|
if (!response.ok) {
|
|
177
65
|
throw new Error(`HTTP ${response.status}`);
|
|
@@ -180,31 +68,13 @@ async function loadIndex(entry) {
|
|
|
180
68
|
// responses from a compromised server would OOM us.
|
|
181
69
|
const data = await jsonWithByteCap(response, 50 * 1024 * 1024);
|
|
182
70
|
const index = parseRegistryIndex(data);
|
|
183
|
-
if (index) {
|
|
184
|
-
|
|
185
|
-
if (db) {
|
|
186
|
-
try {
|
|
187
|
-
const etag = response.headers.get("etag") ?? undefined;
|
|
188
|
-
const lastModified = response.headers.get("last-modified") ?? undefined;
|
|
189
|
-
upsertRegistryIndexCache(db, entry.url, JSON.stringify(index), { etag, lastModified });
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
/* best-effort */
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return index;
|
|
196
|
-
}
|
|
197
|
-
throw new Error("Invalid registry index format");
|
|
198
|
-
}
|
|
199
|
-
catch (err) {
|
|
200
|
-
// Fetch failed — use stale DB cache if available
|
|
201
|
-
if (dbCacheResult) {
|
|
202
|
-
const index = parseRegistryIndex(JSON.parse(dbCacheResult.indexJson));
|
|
203
|
-
if (index)
|
|
204
|
-
return index;
|
|
71
|
+
if (!index) {
|
|
72
|
+
throw new Error("Invalid registry index format");
|
|
205
73
|
}
|
|
206
|
-
|
|
207
|
-
|
|
74
|
+
const etag = response.headers.get("etag") ?? undefined;
|
|
75
|
+
const lastModified = response.headers.get("last-modified") ?? undefined;
|
|
76
|
+
return { value: index, cacheJson: JSON.stringify(index), cacheOpts: { etag, lastModified } };
|
|
77
|
+
},
|
|
208
78
|
});
|
|
209
79
|
}
|
|
210
80
|
export function isCacheExpired(mtimeMs) {
|
|
@@ -431,15 +301,3 @@ function asStringArray(value) {
|
|
|
431
301
|
const filtered = value.filter((v) => typeof v === "string");
|
|
432
302
|
return filtered.length > 0 ? filtered : undefined;
|
|
433
303
|
}
|
|
434
|
-
function buildInstallRef(source, ref) {
|
|
435
|
-
switch (source) {
|
|
436
|
-
case "npm":
|
|
437
|
-
return `npm:${ref}`;
|
|
438
|
-
case "git":
|
|
439
|
-
return `git+${ref}`;
|
|
440
|
-
case "local":
|
|
441
|
-
return `file:${ref}`;
|
|
442
|
-
default:
|
|
443
|
-
return `github:${ref}`;
|
|
444
|
-
}
|
|
445
|
-
}
|
package/dist/registry/resolve.js
CHANGED
|
@@ -70,6 +70,19 @@ export function parseRegistryRef(rawRef) {
|
|
|
70
70
|
}
|
|
71
71
|
return parseGithubShorthand(ref, ref);
|
|
72
72
|
}
|
|
73
|
+
/** Inverse of {@link parseRegistryRef}: build the install ref for a source kind. */
|
|
74
|
+
export function buildInstallRef(source, ref) {
|
|
75
|
+
switch (source) {
|
|
76
|
+
case "npm":
|
|
77
|
+
return `npm:${ref}`;
|
|
78
|
+
case "git":
|
|
79
|
+
return `git+${ref}`;
|
|
80
|
+
case "local":
|
|
81
|
+
return `file:${ref}`;
|
|
82
|
+
case "github":
|
|
83
|
+
return `github:${ref}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
73
86
|
/**
|
|
74
87
|
* Known prefixes that `parseRegistryRef` handles as installable sources.
|
|
75
88
|
* Anything with a colon that doesn't start with one of these is likely a
|
|
@@ -105,16 +118,16 @@ function detectRegistrySearchId(ref) {
|
|
|
105
118
|
return lines.join("\n");
|
|
106
119
|
}
|
|
107
120
|
export async function resolveRegistryArtifact(parsed) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
121
|
+
switch (parsed.source) {
|
|
122
|
+
case "npm":
|
|
123
|
+
return resolveNpmArtifact(parsed);
|
|
124
|
+
case "local":
|
|
125
|
+
return resolveLocalArtifact(parsed);
|
|
126
|
+
case "git":
|
|
127
|
+
return resolveGitArtifact(parsed);
|
|
128
|
+
case "github":
|
|
129
|
+
return resolveGithubArtifact(parsed);
|
|
116
130
|
}
|
|
117
|
-
return resolveGithubArtifact(parsed);
|
|
118
131
|
}
|
|
119
132
|
function parseNpmRef(input, originalRef) {
|
|
120
133
|
const trimmed = input.trim();
|
package/dist/runtime.js
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { spawn as nodeSpawn, spawnSync as nodeSpawnSync } from "node:child_process";
|
|
24
24
|
import { createHash } from "node:crypto";
|
|
25
|
-
import { createWriteStream } from "node:fs";
|
|
25
|
+
import { createWriteStream, statfsSync } from "node:fs";
|
|
26
26
|
import { createRequire } from "node:module";
|
|
27
27
|
import path from "node:path";
|
|
28
28
|
import { Readable } from "node:stream";
|
|
@@ -200,6 +200,30 @@ export function resolveModule(spec, from) {
|
|
|
200
200
|
export function getDirname(importMetaUrl) {
|
|
201
201
|
return path.dirname(fileURLToPath(importMetaUrl));
|
|
202
202
|
}
|
|
203
|
+
// ── Filesystem type probe ─────────────────────────────────────────────────────
|
|
204
|
+
/**
|
|
205
|
+
* Best-effort filesystem-type probe: return the numeric `f_type` magic of the
|
|
206
|
+
* filesystem backing `path`, or `undefined` on any error (ENOENT/EPERM/
|
|
207
|
+
* unsupported). Used (via injection) by the SQLite journal-mode network-FS
|
|
208
|
+
* fallback (#628).
|
|
209
|
+
*
|
|
210
|
+
* This is a runtime primitive (a `statfs` filesystem-type probe) and therefore
|
|
211
|
+
* lives here, per the runtime boundary, even though it uses only `node:fs`. The
|
|
212
|
+
* "magic-number → is-network" classification stays a pure helper elsewhere.
|
|
213
|
+
*
|
|
214
|
+
* `fs.statfsSync` is a stable `node:fs` API (Node ≥ 18.15) and is implemented
|
|
215
|
+
* under Bun as well. It THROWS ENOENT on a non-existent path, so callers should
|
|
216
|
+
* probe an already-created directory — the swallowed error simply yields
|
|
217
|
+
* `undefined` (treated as "not network").
|
|
218
|
+
*/
|
|
219
|
+
export function statfsType(path) {
|
|
220
|
+
try {
|
|
221
|
+
return statfsSync(path).type;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
203
227
|
// ── Sleep ───────────────────────────────────────────────────────────────────
|
|
204
228
|
/**
|
|
205
229
|
* Block the current thread for `ms` without busy-spinning. On Bun uses the real
|