akm-cli 0.9.1 → 0.9.2-alpha.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/CHANGELOG.md +103 -28
- package/README.md +3 -1
- package/SECURITY.md +1 -1
- package/STABILITY.md +1 -1
- package/dist/akm +2 -2
- package/dist/akm-migrate +2 -2
- package/dist/assets/hints/cli-hints-full.md +14 -9
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/models.json +35 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
- package/dist/assets/tasks/core/extract.yml +6 -5
- package/dist/assets/tasks/core/improve.yml +6 -5
- package/dist/assets/tasks/core/index-refresh.yml +6 -5
- package/dist/assets/tasks/core/sync.yml +6 -5
- package/dist/assets/tasks/core/version-check.yml +6 -5
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
- package/dist/cli/confirm.js +2 -2
- package/dist/cli/parse-args.js +3 -24
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +2 -2
- package/dist/cli.js +11 -9
- package/dist/commands/agent/agent-dispatch.js +55 -89
- package/dist/commands/agent/contribute-cli.js +12 -45
- package/dist/commands/command/builtin-action.js +32 -0
- package/dist/commands/command/command-cli.js +99 -0
- package/dist/commands/command/command-execution.js +308 -0
- package/dist/commands/command/execution-source-loader.js +176 -0
- package/dist/commands/command/portable-template.js +60 -0
- package/dist/commands/config-cli.js +10 -4
- package/dist/commands/env/env.js +4 -2
- package/dist/commands/feedback-cli.js +1 -1
- package/dist/commands/health/checks.js +241 -29
- package/dist/commands/health/html-report.js +0 -14
- package/dist/commands/health/report-view-model.js +0 -1
- package/dist/commands/health/surfaces.js +6 -7
- package/dist/commands/health/types.js +0 -2
- package/dist/commands/health.js +63 -18
- package/dist/commands/improve/collapse-detector.js +5 -6
- package/dist/commands/improve/consolidate.js +251 -214
- package/dist/commands/improve/distill/promote-memory.js +71 -34
- package/dist/commands/improve/distill/quality-gate.js +17 -5
- package/dist/commands/improve/distill.js +232 -155
- package/dist/commands/improve/eligibility.js +112 -79
- package/dist/commands/improve/execution.js +57 -0
- package/dist/commands/improve/extract-cli.js +5 -5
- package/dist/commands/improve/extract-prompt.js +64 -22
- package/dist/commands/improve/extract.js +608 -360
- package/dist/commands/improve/improve-strategies.js +43 -14
- package/dist/commands/improve/improve.js +249 -29
- package/dist/commands/improve/loop-stages.js +11 -17
- package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
- package/dist/commands/improve/outcome-loop.js +22 -38
- package/dist/commands/improve/planner.js +134 -0
- package/dist/commands/improve/preparation.js +730 -409
- package/dist/commands/improve/reflect.js +386 -223
- package/dist/commands/improve/run-context.js +3 -4
- package/dist/commands/improve/salience.js +6 -58
- package/dist/commands/improve/session-asset.js +12 -12
- package/dist/commands/lint/index.js +101 -29
- package/dist/commands/migrate-cli.js +11 -69
- package/dist/commands/migration-tool.js +6 -9
- package/dist/commands/models-cli.js +27 -0
- package/dist/commands/proposal/drain.js +258 -186
- package/dist/commands/proposal/proposal-cli.js +32 -10
- package/dist/commands/proposal/proposal.js +2 -5
- package/dist/commands/proposal/propose.js +192 -172
- package/dist/commands/proposal/repository.js +54 -91
- package/dist/commands/proposal/validators/proposal-validators.js +9 -7
- package/dist/commands/read/curate.js +53 -22
- package/dist/commands/read/registry-search.js +25 -9
- package/dist/commands/read/remember-cli.js +14 -2
- package/dist/commands/read/search.js +10 -4
- package/dist/commands/read/show.js +139 -153
- package/dist/commands/registry-cli.js +16 -7
- package/dist/commands/remember.js +33 -18
- package/dist/commands/sources/add-cli.js +19 -178
- package/dist/commands/sources/bundle-cli.js +15 -3
- package/dist/commands/sources/dangerous-env-audit.js +135 -0
- package/dist/commands/sources/info.js +2 -1
- package/dist/commands/sources/installed-stashes.js +901 -177
- package/dist/commands/sources/schema-repair.js +174 -95
- package/dist/commands/sources/self-update.js +30 -74
- package/dist/commands/sources/source-add.js +3 -5
- package/dist/commands/sources/sources-cli.js +2 -15
- package/dist/commands/sources/update-transaction.js +220 -0
- package/dist/commands/tasks/tasks-cli.js +3 -3
- package/dist/commands/tasks/tasks.js +736 -317
- package/dist/commands/workflow-cli.js +2 -2
- package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
- package/dist/core/adapter/adapters/akm-adapter.js +85 -35
- package/dist/core/adapter/adapters/akm-lint.js +54 -39
- package/dist/core/adapter/adapters/akm-metadata.js +45 -45
- package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
- package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
- package/dist/core/adapter/adapters/index.js +0 -9
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
- package/dist/core/adapter/adapters/okf-adapter.js +4 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
- package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
- package/dist/core/adapter/execution-source.js +308 -0
- package/dist/core/adapter/recognize-match.js +36 -13
- package/dist/core/adapter/registry.js +0 -9
- package/dist/core/asset/stash-meta.js +94 -4
- package/dist/core/common.js +6 -11
- package/dist/core/config/config-io.js +3 -3
- package/dist/core/config/config-schema.js +18 -40
- package/dist/core/config/config-sources.js +11 -21
- package/dist/core/config/config-walker.js +31 -13
- package/dist/core/config/config.js +23 -26
- package/dist/core/config/schema/engines.js +8 -7
- package/dist/core/config/schema/improve-processes.js +29 -5
- package/dist/core/config/schema/index-config.js +0 -27
- package/dist/core/config/schema/primitives.js +1 -23
- package/dist/core/config/schema/sources-bundles.js +13 -16
- package/dist/core/errors.js +2 -0
- package/dist/core/events.js +68 -32
- package/dist/core/extra-params.js +1 -0
- package/dist/core/improve-result.js +315 -0
- package/dist/core/lesson-lint.js +0 -6
- package/dist/core/maintenance-barrier.js +4 -4
- package/dist/core/network-policy.js +152 -0
- package/dist/core/paths.js +1 -1
- package/dist/core/recognition-util.js +4 -4
- package/dist/core/registry-url.js +456 -0
- package/dist/core/state/migrations.js +161 -47
- package/dist/core/state-db.js +453 -80
- package/dist/core/system-error.js +32 -0
- package/dist/core/time.js +2 -12
- package/dist/core/write-source.js +0 -18
- package/dist/execution/directory-identity.js +52 -0
- package/dist/execution/executable-identity.js +107 -0
- package/dist/execution/guarded-source.js +398 -0
- package/dist/execution/json.js +95 -0
- package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
- package/dist/execution/record.js +55 -0
- package/dist/execution/resolved-request.js +730 -0
- package/dist/execution/source.js +320 -0
- package/dist/indexer/bundle-identity-guard.js +5 -4
- package/dist/indexer/db/graph-db.js +33 -0
- package/dist/indexer/graph/graph-boost.js +3 -4
- package/dist/indexer/graph/graph-extraction.js +562 -373
- package/dist/indexer/index-written-assets.js +78 -39
- package/dist/indexer/indexer.js +471 -432
- package/dist/indexer/installations.js +6 -0
- package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
- package/dist/indexer/materialize-embeddings.js +155 -0
- package/dist/indexer/passes/memory-inference.js +227 -174
- package/dist/indexer/passes/metadata.js +263 -118
- package/dist/indexer/scan/doc-to-entry.js +7 -10
- package/dist/indexer/scan/drain-dir.js +51 -23
- package/dist/indexer/search/db-search.js +156 -50
- package/dist/indexer/search/fts-query.js +40 -40
- package/dist/indexer/search/ranking.js +36 -1
- package/dist/indexer/search/search-attribution.js +3 -1
- package/dist/indexer/search/search-fields.js +23 -14
- package/dist/indexer/search/search-hit-enrichers.js +1 -1
- package/dist/indexer/search/search-source.js +7 -16
- package/dist/indexer/search/semantic-status.js +10 -1
- package/dist/indexer/usage/show-usage.js +105 -0
- package/dist/indexer/usage/usage-events.js +7 -2
- package/dist/indexer/walk/matchers.js +40 -10
- package/dist/indexer/walk/path-resolver.js +5 -2
- package/dist/indexer/walk/walker.js +20 -2
- package/dist/integrations/agent/builder-shared.js +3 -6
- package/dist/integrations/agent/conversation-fallback.js +16 -0
- package/dist/integrations/agent/engine-resolution.js +87 -87
- package/dist/integrations/agent/execution-cascade.js +566 -0
- package/dist/integrations/agent/execution-definitions.js +211 -0
- package/dist/integrations/agent/execution-lowering.js +811 -0
- package/dist/integrations/agent/execution-preparation.js +67 -0
- package/dist/integrations/agent/index.js +0 -2
- package/dist/integrations/agent/inline-execution.js +74 -0
- package/dist/integrations/agent/model-map.js +515 -0
- package/dist/integrations/agent/persona-fallback.js +30 -0
- package/dist/integrations/agent/request-lowering.js +186 -0
- package/dist/integrations/agent/runner-dispatch.js +230 -37
- package/dist/integrations/agent/runner.js +12 -83
- package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
- package/dist/integrations/harnesses/aider/index.js +0 -1
- package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
- package/dist/integrations/harnesses/amazonq/index.js +0 -1
- package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
- package/dist/integrations/harnesses/claude/index.js +1 -5
- package/dist/integrations/harnesses/claude/session-log.js +3 -33
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
- package/dist/integrations/harnesses/codex/index.js +0 -1
- package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
- package/dist/integrations/harnesses/copilot/index.js +0 -1
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
- package/dist/integrations/harnesses/gemini/index.js +0 -1
- package/dist/integrations/harnesses/index.js +4 -44
- package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
- package/dist/integrations/harnesses/opencode/index.js +0 -2
- package/dist/integrations/harnesses/opencode/session-log.js +14 -204
- package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
- package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
- package/dist/integrations/harnesses/openhands/index.js +0 -1
- package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
- package/dist/integrations/harnesses/pi/index.js +0 -1
- package/dist/integrations/harnesses/shared.js +0 -1
- package/dist/integrations/harnesses/types.js +1 -3
- package/dist/integrations/lockfile.js +82 -79
- package/dist/integrations/session-logs/index.js +6 -17
- package/dist/integrations/session-logs/provider-base.js +1 -29
- package/dist/llm/client.js +10 -5
- package/dist/llm/embedder.js +6 -7
- package/dist/llm/embedders/local.js +37 -88
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/graph-extract.js +75 -50
- package/dist/llm/index-passes.js +43 -5
- package/dist/llm/memory-infer.js +8 -6
- package/dist/llm/metadata-enhance.js +5 -3
- package/dist/llm/structured-call.js +122 -25
- package/dist/output/format-exempt.js +1 -1
- package/dist/output/render-registry.js +0 -16
- package/dist/output/renderers.js +12 -7
- package/dist/output/shapes/curate.js +1 -0
- package/dist/output/shapes/helpers.js +10 -2
- package/dist/output/shapes/passthrough.js +2 -0
- package/dist/output/text/command-format.js +31 -33
- package/dist/output/text/health-format.js +1 -29
- package/dist/output/text/migrate.js +6 -56
- package/dist/output/text/proposal-format.js +16 -1
- package/dist/output/text/workflow-format.js +16 -0
- package/dist/registry/network.js +279 -0
- package/dist/registry/pinned-request-helper.js +247 -0
- package/dist/registry/pinned-transport.js +717 -0
- package/dist/registry/providers/skills-sh.js +18 -6
- package/dist/registry/providers/static-index.js +20 -7
- package/dist/registry/resolve.js +53 -28
- package/dist/scripts/akm-migrate-node.js +19334 -52269
- package/dist/scripts/akm-migrate.js +19270 -51612
- package/dist/setup/registry-stash-loader.js +64 -20
- package/dist/setup/semantic-assets.js +9 -34
- package/dist/setup/setup.js +12 -30
- package/dist/setup/source-identity.js +17 -0
- package/dist/setup/steps/sources.js +36 -15
- package/dist/setup/steps/tasks.js +39 -11
- package/dist/sources/providers/git-provider.js +3 -3
- package/dist/sources/providers/npm.js +2 -2
- package/dist/sources/providers/provider-utils.js +4 -3
- package/dist/sources/providers/website.js +11 -7
- package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
- package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
- package/dist/sources/website-url.js +73 -0
- package/dist/storage/engines/sqlite-migrations.js +81 -26
- package/dist/storage/managed-db.js +27 -24
- package/dist/storage/repositories/events-repository.js +3 -0
- package/dist/storage/repositories/index-connection.js +42 -10
- package/dist/storage/repositories/index-entries-repository.js +203 -229
- package/dist/storage/repositories/index-entry-mapper.js +8 -12
- package/dist/storage/repositories/index-entry-schema.js +255 -0
- package/dist/storage/repositories/index-fts-repository.js +64 -71
- package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
- package/dist/storage/repositories/index-meta-repository.js +0 -11
- package/dist/storage/repositories/index-schema.js +74 -350
- package/dist/storage/repositories/index-utility-repository.js +12 -17
- package/dist/storage/repositories/index-vec-repository.js +56 -7
- package/dist/storage/repositories/proposals-repository.js +4 -127
- package/dist/storage/repositories/registry-cache.js +2 -1
- package/dist/storage/repositories/task-history-repository.js +20 -40
- package/dist/storage/repositories/workflow-runs-repository.js +228 -129
- package/dist/storage/sqlite-read-snapshot.js +148 -0
- package/dist/tasks/backends/cron.js +170 -42
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +787 -202
- package/dist/tasks/backends/schtasks.js +282 -83
- package/dist/tasks/embedded.js +7 -7
- package/dist/tasks/frozen-script.js +50 -0
- package/dist/tasks/resolve-akm-bin.js +5 -1
- package/dist/tasks/runner.js +239 -251
- package/dist/tasks/runtime-v3.js +281 -0
- package/dist/tasks/scheduler-binding.js +272 -0
- package/dist/tasks/scheduler-invocation.js +57 -43
- package/dist/tasks/scheduler-sync.js +654 -0
- package/dist/tasks/source-v3.js +752 -0
- package/dist/tasks/standalone-script-entry.js +5 -0
- package/dist/tasks/task-id.js +29 -0
- package/dist/workflows/authoring/authoring.js +15 -32
- package/dist/workflows/exec/dispatch-redaction.js +14 -8
- package/dist/workflows/exec/exec-unit.js +7 -28
- package/dist/workflows/exec/frozen-judge.js +57 -89
- package/dist/workflows/exec/lowering-notices.js +23 -0
- package/dist/workflows/exec/native-executor.js +301 -458
- package/dist/workflows/exec/param-secrets.js +4 -3
- package/dist/workflows/exec/run-workflow.js +26 -32
- package/dist/workflows/exec/step-work.js +105 -109
- package/dist/workflows/exec/unit-dispatch.js +103 -27
- package/dist/workflows/exec/unit-writer.js +3 -3
- package/dist/workflows/exec/worktree.js +2 -2
- package/dist/workflows/ir/compile.js +86 -72
- package/dist/workflows/ir/environment-v4.js +328 -0
- package/dist/workflows/ir/freeze-v4.js +122 -0
- package/dist/workflows/ir/plan-hash.js +13 -7
- package/dist/workflows/ir/schema-v4.js +525 -0
- package/dist/workflows/ir/schema.js +25 -284
- package/dist/workflows/ir/source-freeze-v4.js +506 -0
- package/dist/workflows/parser.js +27 -24
- package/dist/workflows/program/schema.js +1 -2
- package/dist/workflows/renderer.js +42 -29
- package/dist/workflows/resource-limits.js +4 -5
- package/dist/workflows/runtime/agent-identity.js +11 -13
- package/dist/workflows/runtime/plan-classifier.js +8 -8
- package/dist/workflows/runtime/runs.js +27 -43
- package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
- package/dist/workflows/source-files.js +373 -0
- package/dist/workflows/source-ir/compile.js +196 -0
- package/dist/workflows/source-ir/github-yaml.js +577 -0
- package/dist/workflows/source-ir/ordering.js +38 -0
- package/dist/workflows/source-ir/program.js +50 -0
- package/dist/workflows/source-ir/result.js +26 -0
- package/dist/workflows/source-ir/schema.js +772 -0
- package/dist/workflows/source-ir/semantics.js +242 -0
- package/dist/workflows/source-ir/uses.js +14 -0
- package/docs/README.md +2 -0
- package/docs/migration/README.md +3 -1
- package/docs/migration/release-notes/0.9.2.md +55 -0
- package/docs/migration/release-notes/README.md +5 -0
- package/docs/migration/v0.8-to-v0.9.md +76 -1077
- package/docs/migration/v0.9.0-troubleshooting.md +104 -516
- package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
- package/docs/reference/README.md +1 -0
- package/docs/reference/cli.md +230 -98
- package/docs/reference/configuration.md +159 -36
- package/docs/reference/data-and-telemetry.md +19 -1
- package/docs/reference/supported-formats.md +23 -3
- package/docs/reference/tasks.md +182 -0
- package/docs/reference/workflow-schema.md +91 -40
- package/docs/reference/workflows.md +33 -6
- package/package.json +10 -6
- package/schemas/akm-config.json +372 -224
- package/schemas/akm-task.json +324 -80
- package/schemas/akm-workflow.json +6 -9
- package/dist/core/migration-operation.js +0 -75
- package/dist/integrations/agent/model-aliases.js +0 -74
- package/dist/tasks/parser.js +0 -380
- package/dist/tasks/schema.js +0 -123
- package/dist/tasks/validator.js +0 -80
- package/dist/workflows/ir/freeze.js +0 -320
- package/dist/workflows/runtime/document-cache.js +0 -13
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* Managed-database seam — the single home for the SQLite open/lifecycle recipe.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Two lifecycle steps are shared across the current managed databases
|
|
8
|
+
* (`state.db`, `logs.db`, and `index.db`) and their consumers:
|
|
9
9
|
*
|
|
10
10
|
* 1. The open recipe: `mkdir(dir) → openDatabase(path) → applyStandardPragmas
|
|
11
11
|
* → migrate`.
|
|
@@ -52,9 +52,31 @@ export function openManagedDatabase(spec) {
|
|
|
52
52
|
fs.mkdirSync(dir, { recursive: true });
|
|
53
53
|
}
|
|
54
54
|
const db = spec.create === false ? openDatabase(spec.path, { create: false }) : openDatabase(spec.path);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
try {
|
|
56
|
+
applyStandardPragmas(db, spec.pragmas ?? { dataDir: dir });
|
|
57
|
+
spec.init?.(db);
|
|
58
|
+
return db;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Initializers may open a transaction (source update does so before index
|
|
62
|
+
// schema work). Never strand that transaction/handle when later setup
|
|
63
|
+
// fails; closing rolls it back and releases its writer lock.
|
|
64
|
+
if (db.inTransaction) {
|
|
65
|
+
try {
|
|
66
|
+
db.exec("ROLLBACK");
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Closing remains the final rollback backstop.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
db.close();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Preserve the initializer failure, which identifies the real boundary.
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
58
80
|
}
|
|
59
81
|
/**
|
|
60
82
|
* Run `fn` against a managed database, owning its lifecycle.
|
|
@@ -80,22 +102,3 @@ export function withManagedDb(open, fn, opts) {
|
|
|
80
102
|
db.close();
|
|
81
103
|
}
|
|
82
104
|
}
|
|
83
|
-
/**
|
|
84
|
-
* Async sibling of {@link withManagedDb}. Use this — NOT `withManagedDb` — when
|
|
85
|
-
* `fn` holds the handle across an `await`: the sync version closes in its
|
|
86
|
-
* `finally` before the awaited work resolves (use-after-close). Here the handle
|
|
87
|
-
* is closed only after `fn`'s promise settles. Borrowed handles pass straight
|
|
88
|
-
* through and are not closed, as in the sync version.
|
|
89
|
-
*/
|
|
90
|
-
export async function withManagedDbAsync(open, fn, opts) {
|
|
91
|
-
if (opts?.borrowed) {
|
|
92
|
-
return fn(opts.borrowed);
|
|
93
|
-
}
|
|
94
|
-
const db = open();
|
|
95
|
-
try {
|
|
96
|
-
return await fn(db);
|
|
97
|
-
}
|
|
98
|
-
finally {
|
|
99
|
-
db.close();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
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
|
+
import { isReadOnlyFilesystemError } from "../../core/system-error.js";
|
|
4
5
|
import { error } from "../../core/warn.js";
|
|
5
6
|
/**
|
|
6
7
|
* Convert a raw `EventRow` from the database to the public `EventEnvelope`
|
|
@@ -41,6 +42,8 @@ export function insertEvent(db, input) {
|
|
|
41
42
|
return insertEventStrict(db, input);
|
|
42
43
|
}
|
|
43
44
|
catch (err) {
|
|
45
|
+
if (isReadOnlyFilesystemError(err))
|
|
46
|
+
return undefined;
|
|
44
47
|
const message = err instanceof Error ? err.message : String(err);
|
|
45
48
|
error(`akm: state.db event insert failed (${message})`);
|
|
46
49
|
return undefined;
|
|
@@ -17,6 +17,8 @@ import { getDbPath } from "../../core/paths.js";
|
|
|
17
17
|
import { openDatabase } from "../database.js";
|
|
18
18
|
import { openManagedDatabase } from "../managed-db.js";
|
|
19
19
|
import { SQLITE_BUSY_TIMEOUT_MS } from "../sqlite-pragmas.js";
|
|
20
|
+
import { openSqliteReadSnapshot } from "../sqlite-read-snapshot.js";
|
|
21
|
+
import { isCanonicalIndexGeneration } from "./index-entry-schema.js";
|
|
20
22
|
import { ensureSchema } from "./index-schema.js";
|
|
21
23
|
import { loadVecExtension, warnIfVecMissing } from "./index-vec-repository.js";
|
|
22
24
|
export function openIndexDatabase(dbPath, options) {
|
|
@@ -25,6 +27,10 @@ export function openIndexDatabase(dbPath, options) {
|
|
|
25
27
|
init: (db) => {
|
|
26
28
|
// Try to load sqlite-vec extension
|
|
27
29
|
loadVecExtension(db);
|
|
30
|
+
// Source update uses this narrow lifecycle seam to ATTACH state.db and
|
|
31
|
+
// open its coordinator-owned outer transaction before ensureSchema or
|
|
32
|
+
// any indexer write can mutate the live generation.
|
|
33
|
+
options?.beforeSchema?.(db);
|
|
28
34
|
// Dim resolution: explicit option wins; otherwise consult the on-disk
|
|
29
35
|
// config so unparameterised opens (registry providers, graph helpers,
|
|
30
36
|
// ad-hoc CLI subcommands) honour the operator-declared dimension. Only if
|
|
@@ -61,9 +67,10 @@ function resolveConfiguredEmbeddingDim() {
|
|
|
61
67
|
}
|
|
62
68
|
}
|
|
63
69
|
export function openExistingDatabase(dbPath) {
|
|
64
|
-
// Existing-DB callers
|
|
65
|
-
//
|
|
66
|
-
// so
|
|
70
|
+
// Existing-DB callers do not mutate schema or embedding metadata on open.
|
|
71
|
+
// They do validate the exact current derived generation before returning a
|
|
72
|
+
// handle, so no current reader can accidentally serve a populated legacy
|
|
73
|
+
// table and fail later on its first canonical-column query.
|
|
67
74
|
//
|
|
68
75
|
// "Existing" is load-bearing: a missing file throws instead of being
|
|
69
76
|
// created. Create-on-open used to leave a schema-less index.db behind (a
|
|
@@ -77,7 +84,19 @@ export function openExistingDatabase(dbPath) {
|
|
|
77
84
|
if (classifyPathAccess(resolvedPath).access === "absent") {
|
|
78
85
|
throw new Error(`Index database not found at ${resolvedPath}. Run 'akm index' to build it.`);
|
|
79
86
|
}
|
|
80
|
-
return openManagedDatabase({
|
|
87
|
+
return openManagedDatabase({
|
|
88
|
+
path: resolvedPath,
|
|
89
|
+
init: (db) => {
|
|
90
|
+
loadVecExtension(db);
|
|
91
|
+
assertCanonicalIndexGeneration(db, resolvedPath);
|
|
92
|
+
},
|
|
93
|
+
create: false,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function assertCanonicalIndexGeneration(db, resolvedPath) {
|
|
97
|
+
if (isCanonicalIndexGeneration(db))
|
|
98
|
+
return;
|
|
99
|
+
throw new ConfigError(`Index database uses an incompatible derived schema: ${resolvedPath}.`, "INDEX_SCHEMA_INCOMPATIBLE");
|
|
81
100
|
}
|
|
82
101
|
/**
|
|
83
102
|
* Refuse to treat an UNREADABLE index as a missing one (#791).
|
|
@@ -100,17 +119,23 @@ export function assertIndexPathReadable(resolvedPath) {
|
|
|
100
119
|
throw new ConfigError(`Index database exists but is not readable: ${describeInaccessiblePath(resolvedPath, code)}.`, "DATA_DIR_UNREADABLE");
|
|
101
120
|
}
|
|
102
121
|
/**
|
|
103
|
-
* Open an existing index for queries without
|
|
104
|
-
*
|
|
122
|
+
* Open an existing index for queries without changing the source database or
|
|
123
|
+
* running schema initialization. The default path attaches read-only to the
|
|
124
|
+
* source. `isolatedSnapshot` instead opens a disposable main/WAL copy so even
|
|
125
|
+
* SQLite's read-lock bookkeeping cannot touch the source SHM file.
|
|
105
126
|
*/
|
|
106
|
-
export function openReadonlyExistingDatabase(dbPath) {
|
|
127
|
+
export function openReadonlyExistingDatabase(dbPath, options) {
|
|
107
128
|
const resolvedPath = dbPath ?? getDbPath();
|
|
108
129
|
// `undefined` means "no index" — reserve it for a genuinely absent one, and
|
|
109
130
|
// let an unreadable index raise instead of masquerading as absent (#791).
|
|
110
131
|
assertIndexPathReadable(resolvedPath);
|
|
111
132
|
if (classifyPathAccess(resolvedPath).access === "absent")
|
|
112
133
|
return undefined;
|
|
113
|
-
const db =
|
|
134
|
+
const db = options?.isolatedSnapshot
|
|
135
|
+
? openSqliteReadSnapshot(resolvedPath)
|
|
136
|
+
: openDatabase(resolvedPath, { readonly: true, create: false });
|
|
137
|
+
if (!db)
|
|
138
|
+
return undefined;
|
|
114
139
|
// This opener bypasses openManagedDatabase/applyStandardPragmas by design (no
|
|
115
140
|
// journal or schema work on a read-only handle), but that also left
|
|
116
141
|
// busy_timeout at SQLite's default of 0. In WAL that is harmless — readers
|
|
@@ -118,8 +143,15 @@ export function openReadonlyExistingDatabase(dbPath) {
|
|
|
118
143
|
// AKM_SQLITE_JOURNAL_MODE can select, a concurrent writer makes every read
|
|
119
144
|
// fail instantly with SQLITE_BUSY. busy_timeout is legal on a read-only
|
|
120
145
|
// connection, so apply just that one.
|
|
121
|
-
|
|
122
|
-
|
|
146
|
+
try {
|
|
147
|
+
db.exec(`PRAGMA busy_timeout = ${SQLITE_BUSY_TIMEOUT_MS}`);
|
|
148
|
+
assertCanonicalIndexGeneration(db, resolvedPath);
|
|
149
|
+
return db;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
db.close();
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
123
155
|
}
|
|
124
156
|
export function closeDatabase(db) {
|
|
125
157
|
db.close();
|