pm-github 2026.10.19 → 2026.10.23

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.
@@ -0,0 +1,62 @@
1
+ import { type CommitItemMutationsOptions } from "@unbrained/pm-cli/sdk";
2
+ /** Stable machine-readable reasons for refusing identity work. */
3
+ export type IdentityRefusalCode = "invalid_options" | "incomplete_read" | "ambiguous_identity" | "stale_approval" | "unsupported_repair";
4
+ /** One item-to-identity edge; mentions never establish ownership. */
5
+ export interface IdentityEdge {
6
+ item: string;
7
+ identity: string;
8
+ source: string;
9
+ strength: "claim" | "mention";
10
+ }
11
+ /** Compact native ownership evidence without titles, bodies or provider payloads. */
12
+ export interface IdentityNode {
13
+ id: string;
14
+ ownership: "github" | "provider" | "mixed" | "local";
15
+ providers: string[];
16
+ native_owner: string | null;
17
+ }
18
+ /** Bounded graph page with complete-corpus counts and explicit continuation. */
19
+ export interface IdentityReport {
20
+ scanned: number;
21
+ identities: number;
22
+ collisions: number;
23
+ mentions: number;
24
+ total: number;
25
+ next: number | null;
26
+ nodes: IdentityNode[];
27
+ edges: IdentityEdge[];
28
+ }
29
+ /** A reviewable plan detaches only an exact GitHub provenance tag. */
30
+ export interface IdentityRepairPlan {
31
+ identity: string;
32
+ owner: string;
33
+ detach: string;
34
+ approval: string;
35
+ revision: string;
36
+ changes: {
37
+ field: "tags";
38
+ before: string[];
39
+ after: string[];
40
+ }[];
41
+ }
42
+ /** Diagnose all exact structured collisions and copied mentions with bounded identity pagination. */
43
+ export declare function exploreGithubIdentities(pmRoot: string, options?: {
44
+ limit?: number;
45
+ offset?: number;
46
+ identity?: string;
47
+ }): Promise<IdentityReport>;
48
+ /** Preview a scoped repair through real SDK semantic validation without touching the source tracker. */
49
+ export declare function planGithubIdentityRepair(pmRoot: string, key: string, owner: string, detach: string): Promise<IdentityRepairPlan>;
50
+ /** Apply an exact approved plan with a writer-lock recheck; replay verifies approval before SDK recovery. */
51
+ export declare function applyGithubIdentityRepair(pmRoot: string, request: {
52
+ identity: string;
53
+ owner: string;
54
+ detach: string;
55
+ approval: string;
56
+ author: string;
57
+ onTransition?: CommitItemMutationsOptions["onTransition"];
58
+ }): Promise<{
59
+ changed: boolean;
60
+ transaction: string;
61
+ }>;
62
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../identity.ts"],"names":[],"mappings":"AAGA,OAAO,EAGkB,KAAK,0BAA0B,EACvD,MAAM,uBAAuB,CAAC;AAM/B,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAOzI,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE;AAC/G,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACpJ,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAC1E,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAC;CAClF;AACD,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACpF,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CACjE;AAqCD,qGAAqG;AACrG,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAc3J;AA4BD,wGAAwG;AACxG,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAItI;AA6BD,6GAA6G;AAC7G,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,0BAA0B,CAAC,cAAc,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B7Q"}
@@ -0,0 +1,178 @@
1
+ /** Offline identity diagnosis and explicitly approved, single-item provenance repairs. */
2
+ import { createHash } from "node:crypto";
3
+ import { join } from "node:path";
4
+ import { resolvePmRoot, createPmCliExpectedError, pathExists, commitItemMutations, previewItemMutations, getHistoryPath, readHistorySnapshot, } from "@unbrained/pm-cli/sdk";
5
+ import { readRefreshItems } from "./refresh.js";
6
+ /** Throw an expected SDK error with a typed code and a concrete recovery instruction. */
7
+ function refuse(code, remedy) {
8
+ throw createPmCliExpectedError(`GitHub identity explorer: ${code}. ${remedy}`, {
9
+ exitCode: 2, context: { code, required: remedy },
10
+ });
11
+ }
12
+ /** Canonicalize exact GitHub locators; opaque external references retain provider semantics. */
13
+ function identity(value) {
14
+ const match = /^(?:gh:([^/\s]+\/[^#\s]+)#|https?:\/\/github\.com\/([^/\s]+\/[^/\s]+)\/(?:issues|pull)\/)([1-9]\d*)(?:\/?(?:[?#].*)?)?$/i.exec(value);
15
+ return match ? `gh:${(match[1] ?? match[2]).toLowerCase()}#${BigInt(match[3]).toString()}` : value;
16
+ }
17
+ /** Build edges from structured identity fields; prose URLs are explicitly weaker evidence. */
18
+ function graph(items) {
19
+ const nodes = [];
20
+ const edges = [];
21
+ for (const item of items) {
22
+ const id = item.id;
23
+ const providers = [...new Set(Object.keys(item).filter(key => /^(linear|jira|ado)_(?:.*_)?(?:id|key|url|identifier)$/i.test(key) && Boolean(item[key]) && (typeof item[key] !== "string" || item[key].trim() !== "")).map(key => key.split("_")[0].toLowerCase()))].sort();
24
+ const claims = [];
25
+ for (const tag of item.tags)
26
+ if (/^gh:[^/\s]+\/[^#\s]+#[1-9]\d*$/i.test(tag))
27
+ claims.push({ item: id, identity: identity(tag), source: "tag", strength: "claim" });
28
+ for (const source of ["external_ref", "github_url"]) {
29
+ const value = item[source];
30
+ if (typeof value === "string" && value.trim())
31
+ claims.push({ item: id, identity: identity(value), source, strength: "claim" });
32
+ }
33
+ const declared = /^GitHub issue(?:\s*:\s+|\s+)(https?:\/\/\S+)/i.exec(item.description);
34
+ if (declared && identity(declared[1]).startsWith("gh:"))
35
+ claims.push({ item: id, identity: identity(declared[1]), source: "declaration", strength: "claim" });
36
+ const github = claims.some(edge => edge.identity.startsWith("gh:"));
37
+ nodes.push({ id, providers, native_owner: typeof item.source_owner === "string" ? item.source_owner : null, ownership: providers.length ? (github && item.github_link_only !== true ? "mixed" : "provider") : github ? "github" : "local" });
38
+ edges.push(...claims);
39
+ for (const match of `${item.description}\n${item.body}`.matchAll(/https?:\/\/github\.com\/[^/\s<>]+\/[^/\s<>]+\/(?:issues|pull)\/[1-9]\d*/gi)) {
40
+ const key = identity(match[0]);
41
+ if (!claims.some(edge => edge.identity === key) && !edges.some(edge => edge.item === id && edge.identity === key && edge.strength === "mention"))
42
+ edges.push({ item: id, identity: key, source: "prose", strength: "mention" });
43
+ }
44
+ }
45
+ return { nodes, edges };
46
+ }
47
+ /** Read all statuses through the host's certified complete read, never a truncated CLI projection. */
48
+ async function read(pmRoot) {
49
+ try {
50
+ return await readRefreshItems(pmRoot);
51
+ }
52
+ catch {
53
+ refuse("incomplete_read", "Restore a complete readable tracker and retry; no repair is safe with omitted items.");
54
+ }
55
+ }
56
+ /** Diagnose all exact structured collisions and copied mentions with bounded identity pagination. */
57
+ export async function exploreGithubIdentities(pmRoot, options = {}) {
58
+ const { limit = 20, offset = 0 } = options;
59
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100 || !Number.isSafeInteger(offset) || offset < 0)
60
+ refuse("invalid_options", "Use limit 1..100 and a nonnegative integer offset.");
61
+ const items = await read(pmRoot);
62
+ const { nodes, edges } = graph(items);
63
+ const keys = [...new Set(edges.map(edge => edge.identity))].sort();
64
+ const contradictory = new Set(nodes.filter(node => new Set(edges.filter(edge => edge.item === node.id && edge.strength === "claim" && edge.identity.startsWith("gh:")).map(edge => edge.identity)).size > 1).map(node => node.id));
65
+ const collisions = keys.filter(key => new Set(edges.filter(edge => edge.identity === key && edge.strength === "claim").map(edge => edge.item)).size > 1 || edges.some(edge => edge.identity === key && edge.strength === "claim" && contradictory.has(edge.item)));
66
+ const selected = options.identity === undefined ? keys.filter(key => collisions.includes(key) || edges.some(edge => edge.identity === key && edge.strength === "mention")) : keys.filter(key => key === identity(options.identity));
67
+ const page = selected.slice(offset, offset + limit);
68
+ const shown = edges.filter(edge => page.includes(edge.identity));
69
+ return { scanned: items.length, identities: keys.length, collisions: collisions.length, mentions: edges.filter(edge => edge.strength === "mention").length,
70
+ total: selected.length, next: offset + limit < selected.length ? offset + limit : null,
71
+ nodes: nodes.filter(node => shown.some(edge => edge.item === node.id)), edges: shown };
72
+ }
73
+ /** Bind approval to exact request, complete graph evidence and item revisions. */
74
+ function digest(value) { return createHash("sha256").update(JSON.stringify(value)).digest("hex"); }
75
+ /** Refuse ownership ambiguity and build the only supported repair: detach a weak duplicate claim. */
76
+ function plan(items, key, owner, detach) {
77
+ const { nodes, edges } = graph(items);
78
+ const claims = edges.filter(edge => edge.identity === key && edge.strength === "claim");
79
+ const owners = [...new Set(claims.filter(edge => ["github_url", "declaration"].includes(edge.source)).map(edge => edge.item))];
80
+ const target = items.find(item => item.id === detach);
81
+ const ownerItem = items.find(item => item.id === owner);
82
+ if (ownerItem?.github_number !== undefined && String(ownerItem.github_number) !== key.split("#")[1]) {
83
+ refuse("ambiguous_identity", "The declared owner has a conflicting github_number. Reconcile its provider metadata before previewing another repair.");
84
+ }
85
+ if (!key.startsWith("gh:") || owner === detach || owners.length !== 1 || owners[0] !== owner || !target ||
86
+ nodes.find(node => node.id === owner).ownership === "mixed" ||
87
+ claims.some(edge => edge.item !== owner && edge.item !== detach) ||
88
+ !claims.some(edge => edge.item === detach) || claims.some(edge => edge.item === detach && !["tag", "external_ref"].includes(edge.source)) ||
89
+ target.source_owner ||
90
+ edges.some(edge => [owner, detach].includes(edge.item) && edge.strength === "claim" && edge.identity.startsWith("gh:") && edge.identity !== key) ||
91
+ target.github_link_only === false || Object.keys(target).some(field => /^github_/i.test(field))) {
92
+ refuse("ambiguous_identity", "Inspect the graph and provider records. Select one independently declared owner and a duplicate carrying only a GitHub tag; conflicting source metadata requires manual provider review.");
93
+ }
94
+ if (typeof target.external_ref === "string" && identity(target.external_ref) === key)
95
+ refuse("unsupported_repair", "The pinned SDK cannot clear core external_ref through audited item mutations. Repair that reference through its owning provider workflow; this command can detach GitHub tags only.");
96
+ const tags = target.tags;
97
+ const retained = tags.filter(tag => identity(tag) !== key);
98
+ const changes = [{ field: "tags", before: tags, after: retained }];
99
+ return { identity: key, owner, detach, changes, revision: target.updated_at, approval: digest({ key, owner, detach, changes, nodes, edges, revisions: items.map(item => [item.id, item.updated_at]) }) };
100
+ }
101
+ /** Preview a scoped repair through real SDK semantic validation without touching the source tracker. */
102
+ export async function planGithubIdentityRepair(pmRoot, key, owner, detach) {
103
+ const proposed = plan(await read(pmRoot), identity(key), owner, detach);
104
+ await previewItemMutations(transaction(pmRoot, proposed, "pm-github"));
105
+ return proposed;
106
+ }
107
+ /** Retain the scoped plan as an audit hint; recovery independently verifies its approval binding. */
108
+ function repairAudit(proposed) {
109
+ return `GitHub identity repair ${Buffer.from(JSON.stringify(proposed)).toString("base64url")}`;
110
+ }
111
+ /** Translate the narrow plan to a host-owned audited mutation and optimistic item guard. */
112
+ function transaction(pmRoot, proposed, author) {
113
+ const options = { removeTags: proposed.changes[0].before.filter(tag => identity(tag) === proposed.identity), comment: [repairAudit(proposed)] };
114
+ const mutations = [{ op: "update", id: proposed.detach, options, match: { key: "updated_at", value: proposed.revision } }];
115
+ return { pmRoot, author, transactionId: `github-identity-${proposed.approval}`, mutations };
116
+ }
117
+ /** Decode the tag-plan shape without treating audit text as permission to mutate. */
118
+ function auditedPlan(encoded) {
119
+ try {
120
+ const value = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
121
+ if (typeof value.revision !== "string" || !Number.isFinite(Date.parse(value.revision)) || value.changes.length !== 1 ||
122
+ value.changes[0].field !== "tags" || !Array.isArray(value.changes[0].before) || !value.changes[0].before.every(tag => typeof tag === "string") ||
123
+ !Array.isArray(value.changes[0].after) || !value.changes[0].after.every(tag => typeof tag === "string"))
124
+ throw new Error("invalid audit");
125
+ return value;
126
+ }
127
+ catch {
128
+ refuse("stale_approval", "The audit marker cannot reconstruct the approved tag mutation; inspect tracker history before retrying.");
129
+ }
130
+ }
131
+ /** Reconstruct the approved pre-state and authenticate audit hints against the original graph digest. */
132
+ function validateRecovery(items, target, saved) {
133
+ try {
134
+ const restored = items.map(item => item.id === target.id ? { ...item, tags: saved.changes[0].before, updated_at: saved.revision } : item);
135
+ const approved = plan(restored, saved.identity, saved.owner, saved.detach);
136
+ if (digest(approved) !== digest(saved) || digest(target.tags) !== digest(approved.changes[0].after))
137
+ throw new Error("unbound audit");
138
+ }
139
+ catch {
140
+ refuse("stale_approval", "The audit hint does not match the approved graph and exact tag mutation. Inspect history and preview again; no recovery was applied.");
141
+ }
142
+ }
143
+ /** Apply an exact approved plan with a writer-lock recheck; replay verifies approval before SDK recovery. */
144
+ export async function applyGithubIdentityRepair(pmRoot, request) {
145
+ if (!/^[a-f0-9]{64}$/.test(request.approval) || !request.author.trim())
146
+ refuse("invalid_options", "Supply the plan's full approval digest and a nonempty audit author.");
147
+ pmRoot = resolvePmRoot(process.cwd(), pmRoot);
148
+ const transactionId = `github-identity-${request.approval}`;
149
+ const items = await read(pmRoot);
150
+ const target = items.find(item => item.id === request.detach);
151
+ if (target) {
152
+ const history = await readHistorySnapshot(getHistoryPath(pmRoot, request.detach), request.detach);
153
+ const marker = history.entries.filter(entry => String(entry.message).startsWith(`bulk-item-transaction ${transactionId} `)).at(-1);
154
+ const encoded = marker && marker.message.endsWith(" apply") ? /GitHub identity repair ([A-Za-z0-9_-]+)/.exec(JSON.stringify(marker.patch))?.[1] : undefined;
155
+ if (encoded) {
156
+ const saved = auditedPlan(encoded);
157
+ const key = identity(request.identity);
158
+ if (saved.identity !== key || saved.owner !== request.owner || saved.detach !== request.detach || saved.approval !== request.approval ||
159
+ target.tags.some(tag => identity(tag) === key) || (typeof target.external_ref === "string" && identity(target.external_ref) === key))
160
+ refuse("stale_approval", "The approved scope changed or its repaired claim was reintroduced; inspect and preview again.");
161
+ validateRecovery(items, target, saved);
162
+ if (!await pathExists(join(pmRoot, "transactions", "sdk", `${transactionId}.json`)))
163
+ refuse("stale_approval", "The SDK transaction receipt is missing. Restore its verified journal before recovery; an item comment cannot authorize a new transaction.");
164
+ await commitItemMutations(transaction(pmRoot, saved, marker.author));
165
+ return { changed: false, transaction: transactionId };
166
+ }
167
+ }
168
+ const proposed = plan(items, identity(request.identity), request.owner, request.detach);
169
+ if (proposed.approval !== request.approval)
170
+ refuse("stale_approval", "Re-run the repair preview and review its new digest before applying.");
171
+ await commitItemMutations({ ...transaction(pmRoot, proposed, request.author), onTransition: async (context) => {
172
+ await request.onTransition?.(context);
173
+ if (context.transition === "prepared" && plan(await read(pmRoot), proposed.identity, proposed.owner, proposed.detach).approval !== request.approval)
174
+ refuse("stale_approval", "The tracker changed before the writer lock; preview and approve again.");
175
+ } });
176
+ return { changed: true, transaction: transactionId };
177
+ }
178
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../identity.ts"],"names":[],"mappings":"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"}
@@ -21,22 +21,48 @@ export interface ImportMatch {
21
21
  item?: PmItem;
22
22
  linkOnly: boolean;
23
23
  via: string;
24
+ citation_candidates?: CitationCandidate[];
25
+ }
26
+ /** Incidental references are review hints, never permission to transfer an item's ownership. */
27
+ export interface CitationCandidate {
28
+ id: string;
29
+ reason: "multiple_issues" | "missing_intent" | "adoption_disabled" | "normalization_limit" | "structured_owner";
30
+ }
31
+ /** A citation cannot pick an owner until the user tags exactly one candidate. */
32
+ export interface AmbiguousCitationPlan {
33
+ action: "ambiguous_citation";
34
+ issue: number;
35
+ candidates: string[];
36
+ remedy: string;
37
+ citation_candidates?: CitationCandidate[];
38
+ }
39
+ /** Carry a typed refusal from identity resolution into the batch's reviewable plan. */
40
+ export declare class AmbiguousCitationError extends Error {
41
+ readonly entry: AmbiguousCitationPlan;
42
+ /** Retain candidate IDs and the exact provenance tag needed to resolve the conflict. */
43
+ constructor(repo: string, number: number, candidates: string[], incidental?: CitationCandidate[]);
24
44
  }
25
45
  /** Match GitHub locators or provider back-links before creation, refusing multiple owners. */
26
- export declare function matchImportedIssue(items: readonly PmItem[], issue: GhIssue, tagged?: PmItem): ImportMatch;
46
+ export declare function matchImportedIssue(items: readonly PmItem[], issue: GhIssue, tagged?: PmItem, adoptCited?: boolean): ImportMatch;
27
47
  /** Read calendar release tags from the selected tracker checkout, including annotated tag dates. */
28
48
  export declare function readImportReleases(pmRoot: string): ImportRelease[];
29
49
  /** Fetch every timeline page; only closure-specific events may supply resolution evidence. */
30
50
  export declare function fetchImportTimeline(issue: GhIssue, repo: string, token?: string): Promise<unknown[]>;
31
51
  /** Accept only GitHub PR/commit evidence tied to the latest closure, excluding pre-reopen events. */
32
52
  export declare function importCloseReason(issue: GhIssue, events: readonly unknown[]): string;
53
+ /** Validate source date ordering and return the parsed closure, when supplied. */
54
+ export declare function validateImportLifetime(issue: Pick<GhIssue, "number" | "created_at" | "updated_at" | "closed_at">): number | undefined;
33
55
  /** Validate source lifetimes and assign the earliest release tag at or after the closure. */
34
56
  export declare function buildImportFidelity(issue: GhIssue, releases: readonly ImportRelease[], timeline: readonly unknown[]): ImportFidelity;
57
+ /** Project the import-owned metadata; undefined values remove stale native lifecycle fields. */
58
+ export declare function importFidelityFields(fidelity: ImportFidelity, linkOnly: boolean): Record<string, unknown>;
59
+ /** Compare source instants and tag sets without treating their serialized representation as a change. */
60
+ export declare function normalizeImportValue(field: string, value: unknown): unknown;
35
61
  /**
36
62
  * Finalize source metadata through public SDK lock, serialization and append-only history primitives.
37
63
  * High-level create/update reserve native timestamps. This import adapter appends a real
38
64
  * before/after event instead of editing past history; retrying identical metadata is a no-op.
39
65
  * Cross-provider owners retain their creation/completion dates, content and release.
40
66
  */
41
- export declare function persistImportFidelity(pmRoot: string, id: string, fidelity: ImportFidelity, linkOnly: boolean): Promise<void>;
67
+ export declare function persistImportFidelity(pmRoot: string, id: string, fidelity: ImportFidelity, linkOnly: boolean, normalizeFields?: boolean): Promise<void>;
42
68
  //# sourceMappingURL=import-fidelity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-fidelity.d.ts","sourceRoot":"","sources":["../import-fidelity.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAuB7H,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC5D,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AACD,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AA8B9E,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAWzG;AAED,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAOlE;AAaD,8FAA8F;AAC9F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA+B1G;AAED,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CA0BpF;AAED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,cAAc,CAgBpI;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ClI"}
1
+ {"version":3,"file":"import-fidelity.d.ts","sourceRoot":"","sources":["../import-fidelity.ts"],"names":[],"mappings":"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"}