@unbrained/pm-cli 2026.3.12 → 2026.5.1
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/.agents/pm/extensions/.managed-extensions.json +42 -0
- package/.agents/pm/extensions/beads/index.js +109 -0
- package/.agents/pm/extensions/beads/manifest.json +7 -0
- package/{dist/cli/commands/beads.js → .agents/pm/extensions/beads/runtime.js} +31 -21
- package/.agents/pm/extensions/beads/runtime.ts +702 -0
- package/.agents/pm/extensions/todos/index.js +126 -0
- package/.agents/pm/extensions/todos/manifest.json +7 -0
- package/{dist/extensions/builtins/todos/import-export.js → .agents/pm/extensions/todos/runtime.js} +39 -29
- package/.agents/pm/extensions/todos/runtime.ts +568 -0
- package/AGENTS.md +196 -92
- package/CHANGELOG.md +399 -0
- package/CODE_OF_CONDUCT.md +42 -0
- package/CONTRIBUTING.md +144 -0
- package/PRD.md +512 -164
- package/README.md +1053 -2
- package/SECURITY.md +51 -0
- package/dist/cli/commands/activity.d.ts +5 -0
- package/dist/cli/commands/activity.js +66 -3
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/aggregate.d.ts +54 -0
- package/dist/cli/commands/aggregate.js +181 -0
- package/dist/cli/commands/aggregate.js.map +1 -0
- package/dist/cli/commands/append.js +4 -1
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.d.ts +109 -0
- package/dist/cli/commands/calendar.js +797 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/claim.d.ts +5 -1
- package/dist/cli/commands/claim.js +42 -21
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts +1 -0
- package/dist/cli/commands/close.js +54 -5
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.d.ts +91 -0
- package/dist/cli/commands/comments-audit.js +195 -0
- package/dist/cli/commands/comments-audit.js.map +1 -0
- package/dist/cli/commands/comments.d.ts +1 -0
- package/dist/cli/commands/comments.js +70 -21
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.d.ts +10 -4
- package/dist/cli/commands/completion.js +1184 -137
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +35 -3
- package/dist/cli/commands/config.js +968 -13
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.d.ts +86 -0
- package/dist/cli/commands/context.js +299 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/contracts.d.ts +78 -0
- package/dist/cli/commands/contracts.js +920 -0
- package/dist/cli/commands/contracts.js.map +1 -0
- package/dist/cli/commands/create.d.ts +48 -14
- package/dist/cli/commands/create.js +1331 -160
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.d.ts +81 -0
- package/dist/cli/commands/dedupe-audit.js +330 -0
- package/dist/cli/commands/dedupe-audit.js.map +1 -0
- package/dist/cli/commands/deps.d.ts +52 -0
- package/dist/cli/commands/deps.js +204 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +19 -0
- package/dist/cli/commands/docs.js +212 -13
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +122 -0
- package/dist/cli/commands/extension.js +1850 -0
- package/dist/cli/commands/extension.js.map +1 -0
- package/dist/cli/commands/files.d.ts +52 -1
- package/dist/cli/commands/files.js +443 -13
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.d.ts +11 -1
- package/dist/cli/commands/gc.js +89 -11
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +13 -0
- package/dist/cli/commands/get.js +35 -3
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +10 -2
- package/dist/cli/commands/health.js +774 -23
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history.d.ts +20 -0
- package/dist/cli/commands/history.js +152 -6
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +16 -3
- package/dist/cli/commands/index.js +16 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +7 -2
- package/dist/cli/commands/init.js +137 -5
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.d.ts +17 -0
- package/dist/cli/commands/learnings.js +129 -0
- package/dist/cli/commands/learnings.js.map +1 -0
- package/dist/cli/commands/list.d.ts +29 -1
- package/dist/cli/commands/list.js +289 -53
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.d.ts +51 -0
- package/dist/cli/commands/normalize.js +298 -0
- package/dist/cli/commands/normalize.js.map +1 -0
- package/dist/cli/commands/notes.d.ts +17 -0
- package/dist/cli/commands/notes.js +129 -0
- package/dist/cli/commands/notes.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +1 -0
- package/dist/cli/commands/reindex.js +208 -32
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.js +164 -30
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/search.d.ts +14 -1
- package/dist/cli/commands/search.js +475 -81
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.js +26 -10
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +26 -0
- package/dist/cli/commands/templates.js +179 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/commands/test-all.d.ts +19 -1
- package/dist/cli/commands/test-all.js +161 -13
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test-runs.d.ts +63 -0
- package/dist/cli/commands/test-runs.js +179 -0
- package/dist/cli/commands/test-runs.js.map +1 -0
- package/dist/cli/commands/test.d.ts +75 -1
- package/dist/cli/commands/test.js +1360 -41
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.d.ts +57 -0
- package/dist/cli/commands/update-many.js +631 -0
- package/dist/cli/commands/update-many.js.map +1 -0
- package/dist/cli/commands/update.d.ts +30 -0
- package/dist/cli/commands/update.js +1393 -84
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +30 -0
- package/dist/cli/commands/validate.js +1140 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/error-guidance.d.ts +33 -0
- package/dist/cli/error-guidance.js +337 -0
- package/dist/cli/error-guidance.js.map +1 -0
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +92 -0
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.d.ts +20 -0
- package/dist/cli/help-content.js +543 -0
- package/dist/cli/help-content.js.map +1 -0
- package/dist/cli/main.js +3625 -445
- package/dist/cli/main.js.map +1 -1
- package/dist/core/extensions/index.d.ts +13 -1
- package/dist/core/extensions/index.js +108 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/item-fields.d.ts +2 -0
- package/dist/core/extensions/item-fields.js +79 -0
- package/dist/core/extensions/item-fields.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +322 -9
- package/dist/core/extensions/loader.js +911 -20
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runtime-registrations.d.ts +5 -0
- package/dist/core/extensions/runtime-registrations.js +51 -0
- package/dist/core/extensions/runtime-registrations.js.map +1 -0
- package/dist/core/history/history-stream-policy.d.ts +20 -0
- package/dist/core/history/history-stream-policy.js +53 -0
- package/dist/core/history/history-stream-policy.js.map +1 -0
- package/dist/core/history/history.js +90 -1
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/item/id.js +4 -1
- package/dist/core/item/id.js.map +1 -1
- package/dist/core/item/index.d.ts +1 -0
- package/dist/core/item/index.js +1 -0
- package/dist/core/item/index.js.map +1 -1
- package/dist/core/item/item-format.d.ts +11 -5
- package/dist/core/item/item-format.js +507 -24
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/parent-reference-policy.d.ts +6 -0
- package/dist/core/item/parent-reference-policy.js +32 -0
- package/dist/core/item/parent-reference-policy.js.map +1 -0
- package/dist/core/item/parse.d.ts +5 -0
- package/dist/core/item/parse.js +216 -19
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/sprint-release-format.d.ts +6 -0
- package/dist/core/item/sprint-release-format.js +33 -0
- package/dist/core/item/sprint-release-format.js.map +1 -0
- package/dist/core/item/status.d.ts +3 -0
- package/dist/core/item/status.js +24 -0
- package/dist/core/item/status.js.map +1 -0
- package/dist/core/item/type-registry.d.ts +37 -0
- package/dist/core/item/type-registry.js +706 -0
- package/dist/core/item/type-registry.js.map +1 -0
- package/dist/core/lock/lock.d.ts +1 -1
- package/dist/core/lock/lock.js +101 -12
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/output/command-aware.d.ts +1 -0
- package/dist/core/output/command-aware.js +394 -0
- package/dist/core/output/command-aware.js.map +1 -0
- package/dist/core/output/output.d.ts +3 -0
- package/dist/core/output/output.js +124 -6
- package/dist/core/output/output.js.map +1 -1
- package/dist/core/schema/runtime-field-filters.d.ts +3 -0
- package/dist/core/schema/runtime-field-filters.js +39 -0
- package/dist/core/schema/runtime-field-filters.js.map +1 -0
- package/dist/core/schema/runtime-field-values.d.ts +8 -0
- package/dist/core/schema/runtime-field-values.js +154 -0
- package/dist/core/schema/runtime-field-values.js.map +1 -0
- package/dist/core/schema/runtime-schema.d.ts +68 -0
- package/dist/core/schema/runtime-schema.js +554 -0
- package/dist/core/schema/runtime-schema.js.map +1 -0
- package/dist/core/search/cache.d.ts +13 -1
- package/dist/core/search/cache.js +123 -14
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/semantic-defaults.d.ts +6 -0
- package/dist/core/search/semantic-defaults.js +120 -0
- package/dist/core/search/semantic-defaults.js.map +1 -0
- package/dist/core/search/vector-stores.js +3 -1
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/shared/command-types.d.ts +2 -0
- package/dist/core/shared/conflict-markers.d.ts +7 -0
- package/dist/core/shared/conflict-markers.js +27 -0
- package/dist/core/shared/conflict-markers.js.map +1 -0
- package/dist/core/shared/constants.d.ts +15 -4
- package/dist/core/shared/constants.js +141 -1
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +10 -1
- package/dist/core/shared/errors.js +3 -1
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/text-normalization.d.ts +4 -0
- package/dist/core/shared/text-normalization.js +33 -0
- package/dist/core/shared/text-normalization.js.map +1 -0
- package/dist/core/shared/time.d.ts +1 -2
- package/dist/core/shared/time.js +98 -11
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/index.d.ts +1 -0
- package/dist/core/store/index.js +1 -0
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/store/item-format-migration.d.ts +9 -0
- package/dist/core/store/item-format-migration.js +87 -0
- package/dist/core/store/item-format-migration.js.map +1 -0
- package/dist/core/store/item-store.d.ts +13 -4
- package/dist/core/store/item-store.js +238 -51
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.d.ts +21 -3
- package/dist/core/store/paths.js +59 -4
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings.d.ts +14 -1
- package/dist/core/store/settings.js +463 -7
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/consent.d.ts +2 -0
- package/dist/core/telemetry/consent.js +79 -0
- package/dist/core/telemetry/consent.js.map +1 -0
- package/dist/core/telemetry/runtime.d.ts +38 -0
- package/dist/core/telemetry/runtime.js +733 -0
- package/dist/core/telemetry/runtime.js.map +1 -0
- package/dist/core/test/background-runs.d.ts +117 -0
- package/dist/core/test/background-runs.js +760 -0
- package/dist/core/test/background-runs.js.map +1 -0
- package/dist/core/test/item-test-run-tracking.d.ts +9 -0
- package/dist/core/test/item-test-run-tracking.js +50 -0
- package/dist/core/test/item-test-run-tracking.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +92 -0
- package/dist/sdk/cli-contracts.js +2357 -0
- package/dist/sdk/cli-contracts.js.map +1 -0
- package/dist/sdk/index.d.ts +34 -0
- package/dist/sdk/index.js +23 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/types.d.ts +197 -3
- package/dist/types.js +48 -1
- package/dist/types.js.map +1 -1
- package/docs/ARCHITECTURE.md +368 -39
- package/docs/EXTENSIONS.md +454 -49
- package/docs/RELEASING.md +68 -19
- package/docs/SDK.md +123 -0
- package/docs/examples/starter-extension/README.md +48 -0
- package/docs/examples/starter-extension/index.js +191 -0
- package/docs/examples/starter-extension/manifest.json +17 -0
- package/docs/examples/starter-extension/package.json +10 -0
- package/package.json +33 -6
- package/.pi/extensions/pm-cli/index.ts +0 -778
- package/dist/cli/commands/beads.d.ts +0 -16
- package/dist/cli/commands/beads.js.map +0 -1
- package/dist/cli/commands/install.d.ts +0 -18
- package/dist/cli/commands/install.js +0 -87
- package/dist/cli/commands/install.js.map +0 -1
- package/dist/core/extensions/builtins.d.ts +0 -3
- package/dist/core/extensions/builtins.js +0 -47
- package/dist/core/extensions/builtins.js.map +0 -1
- package/dist/extensions/builtins/beads/index.d.ts +0 -8
- package/dist/extensions/builtins/beads/index.js +0 -33
- package/dist/extensions/builtins/beads/index.js.map +0 -1
- package/dist/extensions/builtins/todos/import-export.d.ts +0 -26
- package/dist/extensions/builtins/todos/import-export.js.map +0 -1
- package/dist/extensions/builtins/todos/index.d.ts +0 -8
- package/dist/extensions/builtins/todos/index.js +0 -38
- package/dist/extensions/builtins/todos/index.js.map +0 -1
|
@@ -1,19 +1,35 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
1
|
import path from "node:path";
|
|
3
|
-
import {
|
|
2
|
+
import { getActiveExtensionRegistrations, runActiveOnIndexHooks, runActiveOnWriteHooks } from "../../core/extensions/index.js";
|
|
3
|
+
import { resolveRegisteredSearchProvider, resolveRegisteredVectorStoreAdapter, } from "../../core/extensions/runtime-registrations.js";
|
|
4
4
|
import { pathExists, writeFileAtomic } from "../../core/fs/fs-utils.js";
|
|
5
|
-
import {
|
|
5
|
+
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
6
6
|
import { executeEmbeddingBatchesWithRetry } from "../../core/search/embedding-batches.js";
|
|
7
|
+
import { writeVectorizationStatusLedger } from "../../core/search/cache.js";
|
|
7
8
|
import { resolveEmbeddingProviders } from "../../core/search/providers.js";
|
|
9
|
+
import { resolveSettingsWithSemanticRuntimeDefaults } from "../../core/search/semantic-defaults.js";
|
|
8
10
|
import { executeVectorUpsert, resolveVectorStores } from "../../core/search/vector-stores.js";
|
|
9
|
-
import { EXIT_CODE
|
|
11
|
+
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
10
12
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
11
13
|
import { nowIso } from "../../core/shared/time.js";
|
|
12
|
-
import {
|
|
14
|
+
import { listAllFrontMatterWithBody } from "../../core/store/item-store.js";
|
|
13
15
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
14
16
|
import { readSettings } from "../../core/store/settings.js";
|
|
15
17
|
const MANIFEST_PATH = "index/manifest.json";
|
|
16
18
|
const EMBEDDINGS_PATH = "search/embeddings.jsonl";
|
|
19
|
+
function shouldEmitReindexProgress(options) {
|
|
20
|
+
return options.progress === true || process.stderr.isTTY === true;
|
|
21
|
+
}
|
|
22
|
+
function emitReindexProgress(enabled, message) {
|
|
23
|
+
if (!enabled) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
process.stderr.write(`[pm reindex] ${message}\n`);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Ignore transient stderr write failures.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
17
33
|
function parseMode(raw) {
|
|
18
34
|
const normalized = (raw ?? "keyword").trim().toLowerCase();
|
|
19
35
|
if (normalized === "keyword") {
|
|
@@ -24,20 +40,15 @@ function parseMode(raw) {
|
|
|
24
40
|
}
|
|
25
41
|
throw new PmCliError("Reindex mode must be one of keyword|semantic|hybrid", EXIT_CODE.USAGE);
|
|
26
42
|
}
|
|
27
|
-
async function loadDocuments(pmRoot) {
|
|
28
|
-
const items = await
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
scope: "project",
|
|
37
|
-
});
|
|
38
|
-
documents.push(parseItemDocument(raw));
|
|
39
|
-
}
|
|
40
|
-
return documents;
|
|
43
|
+
async function loadDocuments(pmRoot, itemFormat, typeToFolder, schema) {
|
|
44
|
+
const items = await listAllFrontMatterWithBody(pmRoot, itemFormat, typeToFolder, undefined, schema);
|
|
45
|
+
return items.map((item) => {
|
|
46
|
+
const { body, ...frontMatter } = item;
|
|
47
|
+
return {
|
|
48
|
+
front_matter: frontMatter,
|
|
49
|
+
body,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
41
52
|
}
|
|
42
53
|
function buildKeywordRecord(document, mode) {
|
|
43
54
|
const item = document.front_matter;
|
|
@@ -64,29 +75,128 @@ function buildKeywordRecord(document, mode) {
|
|
|
64
75
|
function buildSemanticCorpusInput(document) {
|
|
65
76
|
return JSON.stringify(buildKeywordRecord(document, "semantic").corpus);
|
|
66
77
|
}
|
|
78
|
+
function toOptionalNonEmptyString(value) {
|
|
79
|
+
if (typeof value !== "string") {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const normalized = value.trim();
|
|
83
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
84
|
+
}
|
|
85
|
+
function resolveExtensionSearchEmbedding(settings) {
|
|
86
|
+
const registrations = getActiveExtensionRegistrations();
|
|
87
|
+
const providerName = toOptionalNonEmptyString(settings.search?.provider);
|
|
88
|
+
const registration = resolveRegisteredSearchProvider(registrations, providerName);
|
|
89
|
+
if (!registration) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const runtimeDefinition = registration.runtime_definition ?? registration.definition;
|
|
93
|
+
const name = toOptionalNonEmptyString(runtimeDefinition.name) ??
|
|
94
|
+
toOptionalNonEmptyString(registration.definition.name) ??
|
|
95
|
+
providerName;
|
|
96
|
+
if (!name) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const embedBatch = runtimeDefinition.embedBatch;
|
|
100
|
+
const embedBatchSnake = runtimeDefinition.embed_batch;
|
|
101
|
+
const embed = runtimeDefinition.embed;
|
|
102
|
+
const resolvedEmbedBatch = typeof embedBatch === "function"
|
|
103
|
+
? embedBatch
|
|
104
|
+
: typeof embedBatchSnake === "function"
|
|
105
|
+
? embedBatchSnake
|
|
106
|
+
: undefined;
|
|
107
|
+
const resolvedEmbed = typeof embed === "function" ? embed : undefined;
|
|
108
|
+
if (!resolvedEmbedBatch && !resolvedEmbed) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
name,
|
|
113
|
+
embedBatch: resolvedEmbedBatch,
|
|
114
|
+
embed: resolvedEmbed,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function resolveExtensionVectorUpsert(settings) {
|
|
118
|
+
const registrations = getActiveExtensionRegistrations();
|
|
119
|
+
const adapterName = toOptionalNonEmptyString(settings.vector_store?.adapter);
|
|
120
|
+
const registration = resolveRegisteredVectorStoreAdapter(registrations, adapterName);
|
|
121
|
+
if (!registration) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const runtimeDefinition = registration.runtime_definition ?? registration.definition;
|
|
125
|
+
const name = toOptionalNonEmptyString(runtimeDefinition.name) ??
|
|
126
|
+
toOptionalNonEmptyString(registration.definition.name) ??
|
|
127
|
+
adapterName;
|
|
128
|
+
const upsert = runtimeDefinition.upsert;
|
|
129
|
+
if (!name || typeof upsert !== "function") {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
name,
|
|
134
|
+
upsert: upsert,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function assertVector(value, context) {
|
|
138
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "number" || !Number.isFinite(entry))) {
|
|
139
|
+
throw new PmCliError(`Invalid vector returned by ${context}`, EXIT_CODE.GENERIC_FAILURE);
|
|
140
|
+
}
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
async function executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs) {
|
|
144
|
+
const model = settings.search?.embedding_model?.trim() || "text-embedding-3-small";
|
|
145
|
+
if (extensionEmbedding.embedBatch) {
|
|
146
|
+
const vectors = await Promise.resolve(extensionEmbedding.embedBatch({
|
|
147
|
+
inputs: corpusInputs,
|
|
148
|
+
settings,
|
|
149
|
+
model,
|
|
150
|
+
}));
|
|
151
|
+
if (!Array.isArray(vectors)) {
|
|
152
|
+
throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" embedBatch must return an array of vectors`, EXIT_CODE.GENERIC_FAILURE);
|
|
153
|
+
}
|
|
154
|
+
return vectors.map((vector, index) => assertVector(vector, `extension search provider "${extensionEmbedding.name}" embedBatch output at index ${index}`));
|
|
155
|
+
}
|
|
156
|
+
if (!extensionEmbedding.embed) {
|
|
157
|
+
throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" does not implement embed/embedBatch`, EXIT_CODE.GENERIC_FAILURE);
|
|
158
|
+
}
|
|
159
|
+
const vectors = [];
|
|
160
|
+
for (const [index, input] of corpusInputs.entries()) {
|
|
161
|
+
const vector = await Promise.resolve(extensionEmbedding.embed({
|
|
162
|
+
input,
|
|
163
|
+
settings,
|
|
164
|
+
model,
|
|
165
|
+
}));
|
|
166
|
+
vectors.push(assertVector(vector, `extension search provider "${extensionEmbedding.name}" embed output at index ${index}`));
|
|
167
|
+
}
|
|
168
|
+
return vectors;
|
|
169
|
+
}
|
|
67
170
|
export async function runReindex(options, global) {
|
|
68
171
|
const requestedMode = parseMode(options.mode);
|
|
172
|
+
const progressEnabled = shouldEmitReindexProgress(options);
|
|
173
|
+
emitReindexProgress(progressEnabled, `start mode=${requestedMode}`);
|
|
69
174
|
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
70
175
|
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
71
176
|
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
72
177
|
}
|
|
73
|
-
const settings = await readSettings(pmRoot);
|
|
178
|
+
const settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;
|
|
179
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
180
|
+
const extensionEmbedding = resolveExtensionSearchEmbedding(settings);
|
|
181
|
+
const extensionVectorUpsert = resolveExtensionVectorUpsert(settings);
|
|
74
182
|
let activeEmbeddingProvider = null;
|
|
75
183
|
let activeVectorStore = null;
|
|
76
184
|
if (requestedMode !== "keyword") {
|
|
77
185
|
const providerResolution = resolveEmbeddingProviders(settings);
|
|
78
|
-
if (!providerResolution.active) {
|
|
79
|
-
throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai or settings.
|
|
186
|
+
if (!providerResolution.active && !extensionEmbedding) {
|
|
187
|
+
throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai/settings.providers.ollama or an extension provider selected by settings.search.provider`, EXIT_CODE.USAGE);
|
|
80
188
|
}
|
|
81
189
|
const vectorResolution = resolveVectorStores(settings);
|
|
82
|
-
if (!vectorResolution.active) {
|
|
83
|
-
throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured vector store in settings.vector_store.qdrant or settings.vector_store.
|
|
190
|
+
if (!vectorResolution.active && !extensionVectorUpsert) {
|
|
191
|
+
throw new PmCliError(`Reindex mode '${requestedMode}' requires a configured vector store in settings.vector_store.qdrant/settings.vector_store.lancedb or an extension adapter selected by settings.vector_store.adapter`, EXIT_CODE.USAGE);
|
|
84
192
|
}
|
|
85
193
|
activeEmbeddingProvider = providerResolution.active;
|
|
86
194
|
activeVectorStore = vectorResolution.active;
|
|
87
195
|
}
|
|
88
196
|
const mode = requestedMode;
|
|
89
|
-
|
|
197
|
+
emitReindexProgress(progressEnabled, "loading item corpus");
|
|
198
|
+
const documents = await loadDocuments(pmRoot, settings.item_format, typeRegistry.type_to_folder, settings.schema);
|
|
199
|
+
emitReindexProgress(progressEnabled, `loaded_items=${documents.length}`);
|
|
90
200
|
const generatedAt = nowIso();
|
|
91
201
|
const manifest = {
|
|
92
202
|
version: 1,
|
|
@@ -105,13 +215,37 @@ export async function runReindex(options, global) {
|
|
|
105
215
|
const embeddingsPath = path.join(pmRoot, EMBEDDINGS_PATH);
|
|
106
216
|
const embeddingsLines = documents.map((document) => JSON.stringify(buildKeywordRecord(document, mode))).join("\n");
|
|
107
217
|
const semanticWarnings = [];
|
|
108
|
-
|
|
218
|
+
const vectorizationLedgerEntries = {};
|
|
219
|
+
if (mode !== "keyword" && documents.length > 0) {
|
|
220
|
+
emitReindexProgress(progressEnabled, `embedding_start items=${documents.length}`);
|
|
109
221
|
const corpusInputs = documents.map((document) => buildSemanticCorpusInput(document));
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
222
|
+
let vectors = [];
|
|
223
|
+
if (extensionEmbedding) {
|
|
224
|
+
try {
|
|
225
|
+
vectors = await executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (!activeEmbeddingProvider) {
|
|
229
|
+
throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" failed to generate embeddings: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
|
|
230
|
+
}
|
|
231
|
+
semanticWarnings.push(`Extension search provider "${extensionEmbedding.name}" failed; falling back to built-in provider (${error instanceof Error ? error.message : String(error)})`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (vectors.length === 0) {
|
|
235
|
+
if (!activeEmbeddingProvider) {
|
|
236
|
+
throw new PmCliError(`No embedding executor available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
|
|
237
|
+
}
|
|
238
|
+
const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs);
|
|
239
|
+
semanticWarnings.push(...embeddingResult.warnings);
|
|
240
|
+
vectors = embeddingResult.vectors;
|
|
241
|
+
}
|
|
242
|
+
emitReindexProgress(progressEnabled, `embedding_complete vectors=${vectors.length}`);
|
|
243
|
+
if (vectors.length !== documents.length) {
|
|
244
|
+
throw new PmCliError(`Embedding output size mismatch (expected ${documents.length}, received ${vectors.length})`, EXIT_CODE.GENERIC_FAILURE);
|
|
245
|
+
}
|
|
246
|
+
const points = documents.map((document, index) => ({
|
|
113
247
|
id: document.front_matter.id,
|
|
114
|
-
vector:
|
|
248
|
+
vector: assertVector(vectors[index], `reindex embeddings output at index ${index}`),
|
|
115
249
|
payload: {
|
|
116
250
|
id: document.front_matter.id,
|
|
117
251
|
type: document.front_matter.type,
|
|
@@ -119,10 +253,51 @@ export async function runReindex(options, global) {
|
|
|
119
253
|
priority: document.front_matter.priority,
|
|
120
254
|
updated_at: document.front_matter.updated_at,
|
|
121
255
|
},
|
|
122
|
-
}))
|
|
256
|
+
}));
|
|
257
|
+
if (extensionVectorUpsert) {
|
|
258
|
+
try {
|
|
259
|
+
emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${extensionVectorUpsert.name} points=${points.length}`);
|
|
260
|
+
await Promise.resolve(extensionVectorUpsert.upsert({
|
|
261
|
+
points,
|
|
262
|
+
settings,
|
|
263
|
+
}));
|
|
264
|
+
emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${extensionVectorUpsert.name}`);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
if (!activeVectorStore) {
|
|
268
|
+
throw new PmCliError(`Extension vector adapter "${extensionVectorUpsert.name}" failed to upsert vectors: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
|
|
269
|
+
}
|
|
270
|
+
semanticWarnings.push(`Extension vector adapter "${extensionVectorUpsert.name}" failed; falling back to built-in vector store (${error instanceof Error ? error.message : String(error)})`);
|
|
271
|
+
emitReindexProgress(progressEnabled, "vector_upsert_fallback built_in_store");
|
|
272
|
+
await executeVectorUpsert(activeVectorStore, points);
|
|
273
|
+
emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else if (activeVectorStore) {
|
|
277
|
+
emitReindexProgress(progressEnabled, `vector_upsert_start adapter=${activeVectorStore.name} points=${points.length}`);
|
|
278
|
+
await executeVectorUpsert(activeVectorStore, points);
|
|
279
|
+
emitReindexProgress(progressEnabled, `vector_upsert_complete adapter=${activeVectorStore.name}`);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
throw new PmCliError(`No vector upsert executor available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
|
|
283
|
+
}
|
|
284
|
+
for (const document of documents) {
|
|
285
|
+
vectorizationLedgerEntries[document.front_matter.id] = document.front_matter.updated_at;
|
|
286
|
+
}
|
|
123
287
|
}
|
|
288
|
+
emitReindexProgress(progressEnabled, "writing keyword artifacts");
|
|
124
289
|
await writeFileAtomic(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
125
290
|
await writeFileAtomic(embeddingsPath, `${embeddingsLines}\n`);
|
|
291
|
+
const vectorizationWarnings = [];
|
|
292
|
+
if (mode !== "keyword") {
|
|
293
|
+
try {
|
|
294
|
+
emitReindexProgress(progressEnabled, "writing vectorization status ledger");
|
|
295
|
+
await writeVectorizationStatusLedger(pmRoot, vectorizationLedgerEntries);
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
vectorizationWarnings.push(`search_vectorization_status_ledger_write_failed:${error instanceof Error ? error.message : String(error)}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
126
301
|
const hookWarnings = [
|
|
127
302
|
...(await runActiveOnWriteHooks({
|
|
128
303
|
path: manifestPath,
|
|
@@ -139,6 +314,7 @@ export async function runReindex(options, global) {
|
|
|
139
314
|
total_items: documents.length,
|
|
140
315
|
})),
|
|
141
316
|
];
|
|
317
|
+
emitReindexProgress(progressEnabled, "done");
|
|
142
318
|
return {
|
|
143
319
|
ok: true,
|
|
144
320
|
mode,
|
|
@@ -147,7 +323,7 @@ export async function runReindex(options, global) {
|
|
|
147
323
|
manifest: MANIFEST_PATH,
|
|
148
324
|
embeddings: EMBEDDINGS_PATH,
|
|
149
325
|
},
|
|
150
|
-
warnings: [...semanticWarnings, ...hookWarnings],
|
|
326
|
+
warnings: [...semanticWarnings, ...vectorizationWarnings, ...hookWarnings],
|
|
151
327
|
generated_at: generatedAt,
|
|
152
328
|
};
|
|
153
329
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAkBlD,SAAS,SAAS,CAAC,GAAuB;IACxC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,qDAAqD,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,oBAAoB,CAAC;YACzB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAsB,EAAE,IAAuC;IACzF,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI;QACJ,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1D,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YACpD,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5D,YAAY,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtD,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;SACJ;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAsB;IACtD,OAAO,IAAI,CAAC,SAAS,CAAE,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAyC,CAAC,MAAM,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,MAAqB;IAC7E,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,uBAAuB,GAA2D,IAAI,CAAC;IAC3F,IAAI,iBAAiB,GAAqD,IAAI,CAAC;IAC/E,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAClB,iBAAiB,aAAa,sGAAsG,EACpI,SAAS,CAAC,KAAK,CAChB,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CAClB,iBAAiB,aAAa,uGAAuG,EACrI,SAAS,CAAC,KAAK,CAChB,CAAC;QACJ,CAAC;QACD,uBAAuB,GAAG,kBAAkB,CAAC,MAAM,CAAC;QACpD,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,CAAC;QACV,IAAI;QACJ,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,SAAS,CAAC,MAAM;QAC7B,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClC,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC5B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI;YAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;YACpC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ;YACxC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU;SAC7C,CAAC,CAAC;KACJ,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE1D,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnH,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,uBAAuB,IAAI,iBAAiB,EAAE,CAAC;QAC/F,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrF,MAAM,eAAe,GAAG,MAAM,gCAAgC,CAAC,uBAAuB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChH,gBAAgB,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,mBAAmB,CACvB,iBAAiB,EACjB,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAClC,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC5B,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;YACtC,OAAO,EAAE;gBACP,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;gBAC5B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI;gBAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;gBACpC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ;gBACxC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU;aAC7C;SACF,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,eAAe,CAAC,cAAc,EAAE,GAAG,eAAe,IAAI,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG;QACnB,GAAG,CAAC,MAAM,qBAAqB,CAAC;YAC9B,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,kBAAkB;SACvB,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,qBAAqB,CAAC;YAC9B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,oBAAoB;SACzB,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,qBAAqB,CAAC;YAC9B,IAAI;YACJ,WAAW,EAAE,SAAS,CAAC,MAAM;SAC9B,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,WAAW,EAAE,SAAS,CAAC,MAAM;QAC7B,SAAS,EAAE;YACT,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,eAAe;SAC5B;QACD,QAAQ,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,YAAY,CAAC;QAChD,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,+BAA+B,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC/H,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,GACpC,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,0CAA0C,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAmBlD,SAAS,yBAAyB,CAAC,OAAuB;IACxD,OAAO,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACpE,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB,EAAE,OAAe;IAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,qDAAqD,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,UAAoC,EACpC,YAAoC,EACpC,MAA4B;IAE5B,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACpG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC;QACtC,OAAO;YACL,YAAY,EAAE,WAAW;YACzB,IAAI;SACL,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAsB,EAAE,IAAuC;IACzF,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI;QACJ,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1D,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YACpD,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5D,YAAY,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtD,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;SACJ;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAsB;IACtD,OAAO,IAAI,CAAC,SAAS,CAAE,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAyC,CAAC,MAAM,CAAC,CAAC;AAClH,CAAC;AAuBD,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED,SAAS,+BAA+B,CACtC,QAAoB;IAEpB,MAAM,aAAa,GAAG,+BAA+B,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,wBAAwB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,+BAA+B,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAClF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,iBAAiB,GAAG,YAAY,CAAC,kBAAkB,IAAI,YAAY,CAAC,UAAU,CAAC;IACrF,MAAM,IAAI,GACR,wBAAwB,CAAE,iBAAwC,CAAC,IAAI,CAAC;QACxE,wBAAwB,CAAE,YAAY,CAAC,UAAiC,CAAC,IAAI,CAAC;QAC9E,YAAY,CAAC;IACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAI,iBAAqE,CAAC,UAAU,CAAC;IACrG,MAAM,eAAe,GAAI,iBAAqE,CAAC,WAAW,CAAC;IAC3G,MAAM,KAAK,GAAI,iBAAyC,CAAC,KAAK,CAAC;IAC/D,MAAM,kBAAkB,GACtB,OAAO,UAAU,KAAK,UAAU;QAC9B,CAAC,CAAE,UAAkC;QACrC,CAAC,CAAC,OAAO,eAAe,KAAK,UAAU;YACrC,CAAC,CAAE,eAAuC;YAC1C,CAAC,CAAC,SAAS,CAAC;IAClB,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAE,KAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAI,CAAC,kBAAkB,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,kBAAkB;QAC9B,KAAK,EAAE,aAAa;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,QAAoB;IACxD,MAAM,aAAa,GAAG,+BAA+B,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,mCAAmC,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,iBAAiB,GAAG,YAAY,CAAC,kBAAkB,IAAI,YAAY,CAAC,UAAU,CAAC;IACrF,MAAM,IAAI,GACR,wBAAwB,CAAE,iBAAwC,CAAC,IAAI,CAAC;QACxE,wBAAwB,CAAE,YAAY,CAAC,UAAiC,CAAC,IAAI,CAAC;QAC9E,WAAW,CAAC;IACd,MAAM,MAAM,GAAI,iBAA0C,CAAC,MAAM,CAAC;IAClE,IAAI,CAAC,IAAI,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,MAA+B;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,OAAe;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,UAAU,CAAC,8BAA8B,OAAO,EAAE,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,kBAAiG,EACjG,QAAoB,EACpB,YAAsB;IAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,wBAAwB,CAAC;IACnF,IAAI,kBAAkB,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CACnC,kBAAkB,CAAC,UAAU,CAAC;YAC5B,MAAM,EAAE,YAAY;YACpB,QAAQ;YACR,KAAK;SACN,CAAC,CACH,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,UAAU,CAClB,8BAA8B,kBAAkB,CAAC,IAAI,8CAA8C,EACnG,SAAS,CAAC,eAAe,CAC1B,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACnC,YAAY,CAAC,MAAM,EAAE,8BAA8B,kBAAkB,CAAC,IAAI,gCAAgC,KAAK,EAAE,CAAC,CACnH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAClB,8BAA8B,kBAAkB,CAAC,IAAI,uCAAuC,EAC5F,SAAS,CAAC,eAAe,CAC1B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAClC,kBAAkB,CAAC,KAAK,CAAC;YACvB,KAAK;YACL,QAAQ;YACR,KAAK;SACN,CAAC,CACH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,8BAA8B,kBAAkB,CAAC,IAAI,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,MAAqB;IAC7E,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC3D,mBAAmB,CAAC,eAAe,EAAE,cAAc,aAAa,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,QAAQ,GAAG,0CAA0C,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjG,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAC1F,MAAM,kBAAkB,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;IACrE,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACrE,IAAI,uBAAuB,GAA2D,IAAI,CAAC;IAC3F,IAAI,iBAAiB,GAAqD,IAAI,CAAC;IAC/E,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtD,MAAM,IAAI,UAAU,CAClB,iBAAiB,aAAa,iKAAiK,EAC/L,SAAS,CAAC,KAAK,CAChB,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CAClB,iBAAiB,aAAa,sKAAsK,EACpM,SAAS,CAAC,KAAK,CAChB,CAAC;QACJ,CAAC;QACD,uBAAuB,GAAG,kBAAkB,CAAC,MAAM,CAAC;QACpD,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,mBAAmB,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClH,mBAAmB,CAAC,eAAe,EAAE,gBAAgB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,CAAC;QACV,IAAI;QACJ,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,SAAS,CAAC,MAAM;QAC7B,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClC,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC5B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI;YAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;YACpC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ;YACxC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU;SAC7C,CAAC,CAAC;KACJ,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE1D,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnH,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,0BAA0B,GAA2B,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,mBAAmB,CAAC,eAAe,EAAE,yBAAyB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrF,IAAI,OAAO,GAAe,EAAE,CAAC;QAC7B,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,yBAAyB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC7B,MAAM,IAAI,UAAU,CAClB,8BAA8B,kBAAkB,CAAC,IAAI,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACjJ,SAAS,CAAC,eAAe,CAC1B,CAAC;gBACJ,CAAC;gBACD,gBAAgB,CAAC,IAAI,CACnB,8BAA8B,kBAAkB,CAAC,IAAI,gDAAgD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAC/J,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC7B,MAAM,IAAI,UAAU,CAClB,qDAAqD,aAAa,GAAG,EACrE,SAAS,CAAC,KAAK,CAChB,CAAC;YACJ,CAAC;YACD,MAAM,eAAe,GAAG,MAAM,gCAAgC,CAAC,uBAAuB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAChH,gBAAgB,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;QACpC,CAAC;QACD,mBAAmB,CAAC,eAAe,EAAE,8BAA8B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,UAAU,CAClB,4CAA4C,SAAS,CAAC,MAAM,cAAc,OAAO,CAAC,MAAM,GAAG,EAC3F,SAAS,CAAC,eAAe,CAC1B,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACjD,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC5B,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,sCAAsC,KAAK,EAAE,CAAC;YACnF,OAAO,EAAE;gBACP,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;gBAC5B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI;gBAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;gBACpC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ;gBACxC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU;aAC7C;SACF,CAAC,CAAC,CAAC;QACJ,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,mBAAmB,CAAC,eAAe,EAAE,+BAA+B,qBAAqB,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1H,MAAM,OAAO,CAAC,OAAO,CACnB,qBAAqB,CAAC,MAAM,CAAC;oBAC3B,MAAM;oBACN,QAAQ;iBACT,CAAC,CACH,CAAC;gBACF,mBAAmB,CAAC,eAAe,EAAE,kCAAkC,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC;YACvG,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,MAAM,IAAI,UAAU,CAClB,6BAA6B,qBAAqB,CAAC,IAAI,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC9I,SAAS,CAAC,eAAe,CAC1B,CAAC;gBACJ,CAAC;gBACD,gBAAgB,CAAC,IAAI,CACnB,6BAA6B,qBAAqB,CAAC,IAAI,oDAAoD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CACrK,CAAC;gBACF,mBAAmB,CAAC,eAAe,EAAE,uCAAuC,CAAC,CAAC;gBAC9E,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACrD,mBAAmB,CAAC,eAAe,EAAE,kCAAkC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;aAAM,IAAI,iBAAiB,EAAE,CAAC;YAC7B,mBAAmB,CAAC,eAAe,EAAE,+BAA+B,iBAAiB,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACtH,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACrD,mBAAmB,CAAC,eAAe,EAAE,kCAAkC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,UAAU,CAClB,yDAAyD,aAAa,GAAG,EACzE,SAAS,CAAC,KAAK,CAChB,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,0BAA0B,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC;QAC1F,CAAC;IACH,CAAC;IACD,mBAAmB,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAClE,MAAM,eAAe,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,eAAe,CAAC,cAAc,EAAE,GAAG,eAAe,IAAI,CAAC,CAAC;IAC9D,MAAM,qBAAqB,GAAa,EAAE,CAAC;IAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,mBAAmB,CAAC,eAAe,EAAE,qCAAqC,CAAC,CAAC;YAC5E,MAAM,8BAA8B,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,qBAAqB,CAAC,IAAI,CACxB,mDAAmD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5G,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG;QACnB,GAAG,CAAC,MAAM,qBAAqB,CAAC;YAC9B,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,kBAAkB;SACvB,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,qBAAqB,CAAC;YAC9B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,oBAAoB;SACzB,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,qBAAqB,CAAC;YAC9B,IAAI;YACJ,WAAW,EAAE,SAAS,CAAC,MAAM;SAC9B,CAAC,CAAC;KACJ,CAAC;IACF,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAE7C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,WAAW,EAAE,SAAS,CAAC,MAAM;QAC7B,SAAS,EAAE;YACT,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,eAAe;SAC5B;QACD,QAAQ,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,qBAAqB,EAAE,GAAG,YAAY,CAAC;QAC1E,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import jsonPatch from "fast-json-patch";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
2
3
|
import { pathExists, writeFileAtomic } from "../../core/fs/fs-utils.js";
|
|
3
4
|
import { appendHistoryEntry, createHistoryEntry } from "../../core/history/history.js";
|
|
5
|
+
import { enforceHistoryStreamPolicyForItem } from "../../core/history/history-stream-policy.js";
|
|
6
|
+
import { normalizeItemId, normalizeRawItemId } from "../../core/item/id.js";
|
|
4
7
|
import { canonicalDocument, serializeItemDocument } from "../../core/item/item-format.js";
|
|
8
|
+
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
5
9
|
import { acquireLock } from "../../core/lock/lock.js";
|
|
6
10
|
import { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from "../../core/shared/constants.js";
|
|
7
11
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
8
12
|
import { nowIso } from "../../core/shared/time.js";
|
|
9
13
|
import { orderObject, sha256Hex, stableStringify } from "../../core/shared/serialization.js";
|
|
10
|
-
import { runActiveOnWriteHooks } from "../../core/extensions/index.js";
|
|
14
|
+
import { getActiveExtensionRegistrations, runActiveOnWriteHooks } from "../../core/extensions/index.js";
|
|
11
15
|
import { locateItem, readLocatedItem } from "../../core/store/item-store.js";
|
|
12
|
-
import { getHistoryPath, getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
16
|
+
import { getHistoryPath, getItemPath, getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
13
17
|
import { readSettings } from "../../core/store/settings.js";
|
|
14
18
|
import { readHistoryEntries } from "./history.js";
|
|
15
19
|
const EMPTY_REPLAY_DOCUMENT = {
|
|
@@ -22,6 +26,12 @@ function toAuthor(candidate, defaultAuthor) {
|
|
|
22
26
|
return trimmed || "unknown";
|
|
23
27
|
}
|
|
24
28
|
function toReplayDocument(document) {
|
|
29
|
+
if (!document.front_matter || Object.keys(document.front_matter).length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
front_matter: {},
|
|
32
|
+
body: document.body ?? "",
|
|
33
|
+
};
|
|
34
|
+
}
|
|
25
35
|
const canonical = canonicalDocument(document);
|
|
26
36
|
return {
|
|
27
37
|
front_matter: orderObject(canonical.front_matter, FRONT_MATTER_KEY_ORDER),
|
|
@@ -70,7 +80,41 @@ function ensureReplayTarget(target, history) {
|
|
|
70
80
|
historyIndex: index,
|
|
71
81
|
};
|
|
72
82
|
}
|
|
73
|
-
function
|
|
83
|
+
function extractPatchFailureContext(patch, error) {
|
|
84
|
+
const context = {};
|
|
85
|
+
if (error instanceof Error && error.message.trim().length > 0) {
|
|
86
|
+
context.reason = error.message.trim();
|
|
87
|
+
}
|
|
88
|
+
if (typeof error !== "object" || error === null) {
|
|
89
|
+
return context;
|
|
90
|
+
}
|
|
91
|
+
const candidate = error;
|
|
92
|
+
if (typeof candidate.index === "number" && Number.isInteger(candidate.index) && candidate.index >= 0) {
|
|
93
|
+
context.patchIndex = candidate.index;
|
|
94
|
+
}
|
|
95
|
+
const operationRecord = typeof candidate.operation === "object" && candidate.operation !== null
|
|
96
|
+
? candidate.operation
|
|
97
|
+
: null;
|
|
98
|
+
if (operationRecord && typeof operationRecord.op === "string") {
|
|
99
|
+
context.op = operationRecord.op;
|
|
100
|
+
}
|
|
101
|
+
if (operationRecord && typeof operationRecord.path === "string") {
|
|
102
|
+
context.path = operationRecord.path;
|
|
103
|
+
}
|
|
104
|
+
if (operationRecord && typeof operationRecord.from === "string") {
|
|
105
|
+
context.from = operationRecord.from;
|
|
106
|
+
}
|
|
107
|
+
if ((context.op === undefined || context.path === undefined) && context.patchIndex !== undefined) {
|
|
108
|
+
const fallback = patch[context.patchIndex];
|
|
109
|
+
if (fallback) {
|
|
110
|
+
context.op = context.op ?? fallback.op;
|
|
111
|
+
context.path = context.path ?? fallback.path;
|
|
112
|
+
context.from = context.from ?? fallback.from;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return context;
|
|
116
|
+
}
|
|
117
|
+
function applyHistoryPatch(current, patch, entryNumber, entryOp) {
|
|
74
118
|
try {
|
|
75
119
|
const applied = jsonPatch.applyPatch(structuredClone(current), patch, true, false).newDocument;
|
|
76
120
|
if (typeof applied !== "object" ||
|
|
@@ -92,7 +136,16 @@ function applyHistoryPatch(current, patch, entryNumber) {
|
|
|
92
136
|
if (error instanceof PmCliError) {
|
|
93
137
|
throw error;
|
|
94
138
|
}
|
|
95
|
-
|
|
139
|
+
const failureContext = extractPatchFailureContext(patch, error);
|
|
140
|
+
const contextTokens = [
|
|
141
|
+
`history_op=${entryOp}`,
|
|
142
|
+
failureContext.patchIndex !== undefined ? `patch_index=${failureContext.patchIndex}` : null,
|
|
143
|
+
failureContext.op ? `op=${failureContext.op}` : null,
|
|
144
|
+
failureContext.path ? `path=${failureContext.path}` : null,
|
|
145
|
+
failureContext.from ? `from=${failureContext.from}` : null,
|
|
146
|
+
].filter((token) => token !== null);
|
|
147
|
+
const reasonSuffix = failureContext.reason ? ` ${failureContext.reason}` : "";
|
|
148
|
+
throw new PmCliError(`Failed to apply history patch at entry ${entryNumber} (${contextTokens.join(", ")}).${reasonSuffix}`, EXIT_CODE.GENERIC_FAILURE);
|
|
96
149
|
}
|
|
97
150
|
}
|
|
98
151
|
function replayToTarget(history, targetIndex) {
|
|
@@ -103,7 +156,7 @@ function replayToTarget(history, targetIndex) {
|
|
|
103
156
|
if (beforeHash !== entry.before_hash) {
|
|
104
157
|
throw new PmCliError(`History hash mismatch before replay at entry ${i + 1}.`, EXIT_CODE.GENERIC_FAILURE);
|
|
105
158
|
}
|
|
106
|
-
document = applyHistoryPatch(document, entry.patch, i + 1);
|
|
159
|
+
document = applyHistoryPatch(document, entry.patch, i + 1, entry.op);
|
|
107
160
|
const afterHash = replayHash(document);
|
|
108
161
|
if (afterHash !== entry.after_hash) {
|
|
109
162
|
throw new PmCliError(`History hash mismatch after replay at entry ${i + 1}.`, EXIT_CODE.GENERIC_FAILURE);
|
|
@@ -111,6 +164,58 @@ function replayToTarget(history, targetIndex) {
|
|
|
111
164
|
}
|
|
112
165
|
return document;
|
|
113
166
|
}
|
|
167
|
+
function ensureMaterializedRestoreTarget(replayDocument, target) {
|
|
168
|
+
if (Object.keys(replayDocument.front_matter).length > 0) {
|
|
169
|
+
return replayDocument;
|
|
170
|
+
}
|
|
171
|
+
throw new PmCliError(`Restore target ${target.raw} resolves to a deleted state; choose a version or timestamp where the item exists.`, EXIT_CODE.USAGE);
|
|
172
|
+
}
|
|
173
|
+
function replayCurrentDocument(history) {
|
|
174
|
+
const currentReplay = replayToTarget(history, history.length - 1);
|
|
175
|
+
if (Object.keys(currentReplay.front_matter).length === 0) {
|
|
176
|
+
return {
|
|
177
|
+
front_matter: {},
|
|
178
|
+
body: currentReplay.body,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return canonicalDocument({
|
|
182
|
+
front_matter: currentReplay.front_matter,
|
|
183
|
+
body: currentReplay.body,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async function resolveRestoreSubject(pmRoot, id, settings, typeToFolder) {
|
|
187
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);
|
|
188
|
+
if (located) {
|
|
189
|
+
const historyPath = getHistoryPath(pmRoot, located.id);
|
|
190
|
+
const historyPolicy = await enforceHistoryStreamPolicyForItem({
|
|
191
|
+
pmRoot,
|
|
192
|
+
settings,
|
|
193
|
+
itemId: located.id,
|
|
194
|
+
commandLabel: "restore",
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
id: located.id,
|
|
198
|
+
historyPath,
|
|
199
|
+
located,
|
|
200
|
+
historyPolicyWarnings: historyPolicy.warnings,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const normalizedId = normalizeItemId(id, settings.id_prefix);
|
|
204
|
+
const rawNormalizedId = normalizeRawItemId(id);
|
|
205
|
+
const candidateIds = normalizedId === rawNormalizedId ? [normalizedId] : [normalizedId, rawNormalizedId];
|
|
206
|
+
for (const candidateId of candidateIds) {
|
|
207
|
+
const historyPath = getHistoryPath(pmRoot, candidateId);
|
|
208
|
+
if (await pathExists(historyPath)) {
|
|
209
|
+
return {
|
|
210
|
+
id: candidateId,
|
|
211
|
+
historyPath,
|
|
212
|
+
located: null,
|
|
213
|
+
historyPolicyWarnings: [],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
218
|
+
}
|
|
114
219
|
function changedFields(beforeDocument, afterDocument) {
|
|
115
220
|
const beforeReplay = toReplayDocument(beforeDocument);
|
|
116
221
|
const afterReplay = toReplayDocument(afterDocument);
|
|
@@ -132,57 +237,86 @@ export async function runRestore(id, target, options, global) {
|
|
|
132
237
|
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
133
238
|
}
|
|
134
239
|
const settings = await readSettings(pmRoot);
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const historyPath = getHistoryPath(pmRoot, located.id);
|
|
140
|
-
const history = await readHistoryEntries(historyPath, located.id);
|
|
240
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
241
|
+
const subject = await resolveRestoreSubject(pmRoot, id, settings, typeRegistry.type_to_folder);
|
|
242
|
+
const resolvedId = subject.id;
|
|
243
|
+
const history = await readHistoryEntries(subject.historyPath, resolvedId);
|
|
141
244
|
if (history.length === 0) {
|
|
142
|
-
throw new PmCliError(`No history exists for ${
|
|
245
|
+
throw new PmCliError(`No history exists for ${resolvedId}; restore is unavailable.`, EXIT_CODE.NOT_FOUND);
|
|
143
246
|
}
|
|
144
247
|
const resolvedTarget = ensureReplayTarget(target, history);
|
|
145
|
-
const replayDocument = replayToTarget(history, resolvedTarget.historyIndex);
|
|
248
|
+
const replayDocument = ensureMaterializedRestoreTarget(replayToTarget(history, resolvedTarget.historyIndex), resolvedTarget);
|
|
146
249
|
const restoredDocument = canonicalDocument({
|
|
147
250
|
front_matter: replayDocument.front_matter,
|
|
148
251
|
body: replayDocument.body,
|
|
149
|
-
});
|
|
150
|
-
if (restoredDocument.front_matter.id !==
|
|
151
|
-
throw new PmCliError(`Restore target resolved to item ${restoredDocument.front_matter.id}, expected ${
|
|
252
|
+
}, { schema: settings.schema });
|
|
253
|
+
if (restoredDocument.front_matter.id !== resolvedId) {
|
|
254
|
+
throw new PmCliError(`Restore target resolved to item ${restoredDocument.front_matter.id}, expected ${resolvedId}.`, EXIT_CODE.GENERIC_FAILURE);
|
|
152
255
|
}
|
|
153
256
|
const author = toAuthor(options.author, settings.author_default);
|
|
154
|
-
const releaseLock = await acquireLock(pmRoot,
|
|
257
|
+
const releaseLock = await acquireLock(pmRoot, resolvedId, settings.locks.ttl_seconds, author, Boolean(options.force), settings.governance.force_required_for_stale_lock);
|
|
155
258
|
try {
|
|
156
|
-
const
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
259
|
+
const existingItemPath = subject.located?.itemPath ?? null;
|
|
260
|
+
const itemFormat = subject.located?.item_format ?? settings.item_format;
|
|
261
|
+
let resolvedCurrentDocument;
|
|
262
|
+
let resolvedOriginalRaw = null;
|
|
263
|
+
if (subject.located) {
|
|
264
|
+
const loaded = await readLocatedItem(subject.located, { schema: settings.schema });
|
|
265
|
+
resolvedCurrentDocument = loaded.document;
|
|
266
|
+
resolvedOriginalRaw = loaded.raw;
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
resolvedCurrentDocument = replayCurrentDocument(history);
|
|
270
|
+
}
|
|
271
|
+
const assigned = resolvedCurrentDocument.front_matter.assignee?.trim();
|
|
272
|
+
const ownershipWarnings = [];
|
|
273
|
+
const hasOwnershipConflict = assigned && assigned !== author && !options.force;
|
|
274
|
+
if (hasOwnershipConflict) {
|
|
275
|
+
if (settings.governance.ownership_enforcement === "strict") {
|
|
276
|
+
throw new PmCliError(`Item ${resolvedId} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
|
|
277
|
+
}
|
|
278
|
+
if (settings.governance.ownership_enforcement === "warn") {
|
|
279
|
+
ownershipWarnings.push(`ownership_warning:assignee_conflict:${resolvedId}:${assigned}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const serializedRestore = serializeItemDocument(restoredDocument, { format: itemFormat, schema: settings.schema });
|
|
283
|
+
const restoredItemPath = getItemPath(pmRoot, restoredDocument.front_matter.type, resolvedId, itemFormat, typeRegistry.type_to_folder);
|
|
284
|
+
await writeFileAtomic(restoredItemPath, serializedRestore);
|
|
285
|
+
if (existingItemPath && restoredItemPath !== existingItemPath) {
|
|
286
|
+
await fs.rm(existingItemPath);
|
|
160
287
|
}
|
|
161
|
-
const serializedRestore = serializeItemDocument(restoredDocument);
|
|
162
|
-
await writeFileAtomic(located.itemPath, serializedRestore);
|
|
163
288
|
const historyEntry = createHistoryEntry({
|
|
164
289
|
nowIso: nowIso(),
|
|
165
290
|
author,
|
|
166
291
|
op: "restore",
|
|
167
|
-
before:
|
|
292
|
+
before: resolvedCurrentDocument,
|
|
168
293
|
after: restoredDocument,
|
|
169
294
|
message: options.message,
|
|
170
295
|
});
|
|
171
296
|
try {
|
|
172
|
-
await appendHistoryEntry(historyPath, historyEntry);
|
|
297
|
+
await appendHistoryEntry(subject.historyPath, historyEntry);
|
|
173
298
|
}
|
|
174
299
|
catch (error) {
|
|
175
|
-
|
|
300
|
+
if (existingItemPath && resolvedOriginalRaw !== null && restoredItemPath !== existingItemPath) {
|
|
301
|
+
await writeFileAtomic(existingItemPath, resolvedOriginalRaw);
|
|
302
|
+
await fs.rm(restoredItemPath, { force: true });
|
|
303
|
+
}
|
|
304
|
+
else if (existingItemPath && resolvedOriginalRaw !== null) {
|
|
305
|
+
await writeFileAtomic(existingItemPath, resolvedOriginalRaw);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
await fs.rm(restoredItemPath, { force: true });
|
|
309
|
+
}
|
|
176
310
|
throw error;
|
|
177
311
|
}
|
|
178
312
|
const hookWarnings = [
|
|
179
313
|
...(await runActiveOnWriteHooks({
|
|
180
|
-
path:
|
|
314
|
+
path: restoredItemPath,
|
|
181
315
|
scope: "project",
|
|
182
316
|
op: "restore",
|
|
183
317
|
})),
|
|
184
318
|
...(await runActiveOnWriteHooks({
|
|
185
|
-
path: historyPath,
|
|
319
|
+
path: subject.historyPath,
|
|
186
320
|
scope: "project",
|
|
187
321
|
op: "restore:history",
|
|
188
322
|
})),
|
|
@@ -197,8 +331,8 @@ export async function runRestore(id, target, options, global) {
|
|
|
197
331
|
entry_ts: targetEntry.ts,
|
|
198
332
|
entry_op: targetEntry.op,
|
|
199
333
|
},
|
|
200
|
-
changed_fields: changedFields(
|
|
201
|
-
warnings: hookWarnings,
|
|
334
|
+
changed_fields: changedFields(resolvedCurrentDocument, restoredDocument),
|
|
335
|
+
warnings: [...subject.historyPolicyWarnings, ...ownershipWarnings, ...hookWarnings],
|
|
202
336
|
};
|
|
203
337
|
}
|
|
204
338
|
finally {
|