@patterkit/ops 0.24.1 → 0.25.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.
Files changed (3) hide show
  1. package/dist/index.d.ts +186 -10
  2. package/dist/index.js +1326 -911
  3. package/package.json +8 -8
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
- import { ProjectFile, Bundle, HostScopeRegistry, Scene, LocaleFile, AuthoringFile, ExtensionShard, GameData, CoverageDriver, GrammaticalGender, GameDataFieldType, GameDataNodeKind, DocumentationClass, DocLine, HandoffFile, Suggestion, LineBeat, Comment } from '@patterkit/model';
1
+ import { ProjectFile, Bundle, HostScopeRegistry, Scene, LocaleFile, AuthoringFile, ExtensionShard, GameData, CoverageDriver, GrammaticalGender, Effect, GameDataFieldType, GameDataNodeKind, DocumentationClass, DocLine, CastMember, HandoffFile, Suggestion, LineBeat, Comment } from '@patterkit/model';
2
2
  import { NamedScopesFile, MergedScopes, ScopesIssue, ScopesCatalogueEntry, ScopesFile } from '@wildwinter/scoperegistry/scopes';
3
3
  export { GAME_SCOPES_DIR, GAME_SCOPES_FILE, serialiseScopesFile } from '@wildwinter/scoperegistry/scopes';
4
4
  import { ScopeDeclaration, ScopeRegistry } from '@wildwinter/scoperegistry';
5
5
  import { ValidationIssue } from '@patterkit/core';
6
6
  import { ConditionIssue, ExtensionIssue, ExportInput } from '@patterkit/compiler';
7
7
  import { ChoiceOption, PlayError } from '@patterkit/runtime';
8
- import { VcsKind, BundlePosture, VcsFormat } from '@wildwinter/toolkit/vcs';
9
- export { BundlePosture } from '@wildwinter/toolkit/vcs';
10
8
  import { Dialect } from '@wildwinter/expr';
11
9
  export { renameStageInExpression } from '@wildwinter/expr';
10
+ import { VcsKind, BundlePosture, VcsFormat } from '@wildwinter/toolkit/vcs';
11
+ export { BundlePosture } from '@wildwinter/toolkit/vcs';
12
12
  import { Manifest } from '@wildwinter/toolkit/extensions';
13
13
  export { isUnsafeEntry } from '@wildwinter/toolkit/archive';
14
14
 
@@ -874,6 +874,24 @@ interface ApplyStats {
874
874
  /** Translations dropped because their beat is now action text. */
875
875
  dropped: number;
876
876
  }
877
+ /** A line a translated file names that the import left alone, by its id and the scene the file put it in. */
878
+ interface LocImportLine {
879
+ id: string;
880
+ scene: string;
881
+ }
882
+ /** A translation whose `{@ref}` placeholders or `<b>`/`<i>`/`<bi>` markup differ from the source's as it is now.
883
+ * It was imported all the same. `missing` is what the source has and the translation lacks, `extra` the reverse:
884
+ * each a placeholder as written (`{@gold}`) or a markup tag (`<b>`), once for each time it's short or over. */
885
+ interface LocMismatch extends LocImportLine {
886
+ missing: string[];
887
+ extra: string[];
888
+ }
889
+ /** What an import found beside what it wrote: the lines it skipped because the project has no such line, and
890
+ * the translations it imported whose placeholders or markup don't match the source. */
891
+ interface LocImportReport {
892
+ unknown: LocImportLine[];
893
+ mismatched: LocMismatch[];
894
+ }
877
895
  /** A text beat whose place in the loc files has changed since loc import last wrote them: `dropped` (its scene's
878
896
  * text is now action, so its translation goes at the next import) or `added` (no longer action, so it's sent
879
897
  * for translation from the next export). */
@@ -924,12 +942,45 @@ declare function extractLoc(loaded: LoadedProject, opts?: {
924
942
  }): LocCatalog;
925
943
  /** The authoring shard path for a scene (mirrors the flow stem), or `_project.patterx` for `@project`. */
926
944
  declare function authoringPath(loaded: LoadedProject, scene: string): string;
945
+ /** Every line id the project has, by the scene that holds it: each scene's beats (game events left out, as they
946
+ * carry no text) and option prompts, and the project-level strings (`@project`). What an import checks a
947
+ * translated file's ids against. */
948
+ declare function locLineHomes(loaded: Pick<LoadedProject, "project" | "scenes">, sourceTable: Record<string, string>): Map<string, string>;
949
+ /** What `source` has that `translation` lacks (`missing`) and the reverse (`extra`), as multisets, sorted. Null
950
+ * when they match. */
951
+ declare function compareLocTokens(source: string, translation: string): {
952
+ missing: string[];
953
+ extra: string[];
954
+ } | null;
955
+ /** The language a translated file is imported as, from what the file says (`fileLocale`) and what the person
956
+ * chose (`chosen`: the CLI's `--locale`, Patterpad's Language). A file for one language is refused as another
957
+ * unless `force` (the CLI's `--force-locale`); a file that names none (an older spreadsheet) takes the chosen
958
+ * language, with a warning; with neither there's nothing to go on. */
959
+ declare function importLocale(fileLocale: string | undefined, chosen: string | undefined, opts?: {
960
+ force?: boolean;
961
+ }): {
962
+ ok: true;
963
+ locale: string;
964
+ warning?: string;
965
+ } | {
966
+ ok: false;
967
+ reason: "none" | "mismatch";
968
+ error: string;
969
+ };
970
+ /** What a loc import tells a person beside its counts, for the CLI and Patterpad alike: the lines it skipped
971
+ * because the project doesn't have them, then the translations it imported whose placeholders or markup don't
972
+ * match the source, each with a heading and the lines indented under it. Empty when there's nothing to say. */
973
+ declare function describeLocImport(loaded: Pick<LoadedProject, "scenes">, report: LocImportReport): string[];
927
974
  /**
928
975
  * Write a catalog's translations back. Throws, writing nothing, when the catalogue names a locale the
929
976
  * project does not declare or a scene it does not have. Produces the loc-shard writes (one per scene touched) and stamps
930
977
  * `localisedAt[locale]` into the per-scene authoring shards (skipped when importing the default locale -
931
978
  * staleness is tracked against the source, not for it). Caller commits the returned writes.
932
979
  *
980
+ * A line the project doesn't have is skipped (not written, counted or stamped) and listed in the report; a line
981
+ * the file puts in another scene than the one holding it now goes to its own scene. A translation whose
982
+ * placeholders or markup differ from the source as it is now is imported and listed (the 2026-10-28 rulings).
983
+ *
933
984
  * Import conflict policy (decision 3a): a translation is accepted even when the source has since changed;
934
985
  * the stale flag stays derivable from `localisedAt` vs source `modifiedAt` and surfaces on the next export.
935
986
  */
@@ -938,6 +989,7 @@ declare function applyLoc(loaded: LoadedProject, catalog: LocCatalog, opts?: {
938
989
  }): {
939
990
  writes: PlannedWrite[];
940
991
  stats: ApplyStats;
992
+ report: LocImportReport;
941
993
  };
942
994
 
943
995
  /** The catalog IS the JSON shape: a stable, lossless, human-diffable envelope. */
@@ -953,8 +1005,9 @@ declare function poToCatalog(text: string): LocCatalog;
953
1005
  /** Render the catalog as an .xlsx workbook: a sheet per scene, translator-facing columns. */
954
1006
  declare function catalogToXlsx(catalog: LocCatalog): Promise<Buffer>;
955
1007
  /** Parse an .xlsx workbook back into a catalog. Scene = the hidden Scene column (else, for an older export,
956
- * the sheet name); stale = Status "stale". `locale` is not carried in the sheet, so the caller supplies it
957
- * (--locale). Throws when a scene is not a plain scene id (see `checkCatalogField`). */
1008
+ * the sheet name); stale = Status "stale". `locale` (and the project and source language) come from the
1009
+ * hidden "Patter" sheet; an older export has none, so its `locale` is undefined and the caller supplies one.
1010
+ * Throws when a scene or locale is not a plain name (see `checkCatalogField`). */
958
1011
  declare function xlsxToCatalog(buffer: Buffer): Promise<LocCatalog>;
959
1012
 
960
1013
  interface VoiceLine {
@@ -968,6 +1021,9 @@ interface VoiceLine {
968
1021
  qualifier?: string;
969
1022
  /** The cast member's voice actor, if known. */
970
1023
  actor?: string;
1024
+ /** The line's inline performance direction (the parenthetical, `whispering`), when it has one. Language-neutral,
1025
+ * and plain text like `text`. */
1026
+ direction?: string;
971
1027
  /** The line's source-locale text. */
972
1028
  text: string;
973
1029
  /** `vo` notes: the line's own, plus the enclosing group/option's on the first line of a run. */
@@ -994,6 +1050,14 @@ declare function runVoiceScript(loaded: LoadedProject, opts?: {
994
1050
  /** Render the VO script as an .xlsx workbook (a single "Voice Script" sheet). */
995
1051
  declare function voiceScriptToXlsx(data: VoiceScript): Promise<Buffer>;
996
1052
 
1053
+ /** The cue colour for a speaker, as a bare hex (no '#'): the slot the cast stores for them when it's a
1054
+ * valid one, else the name's hash, as the editor's cue does. */
1055
+ declare function characterColour(name: string, stored?: unknown): string;
1056
+ /** The stored colour slot of each cast member who has one, by script name (for `characterColour`). */
1057
+ declare function castColours(cast: readonly {
1058
+ name: string;
1059
+ colour?: number;
1060
+ }[] | undefined): Map<string, number>;
997
1061
  /** A speaker cue as the script shows it: the character, then the speaker qualifier's name in brackets, the
998
1062
  * screenplay convention (`TAM (O.S.)`). Upper case, as every cue is set. The qualifier is how the line is
999
1063
  * delivered, never part of who says it, so a cue's colour and any counting stay on the character alone. */
@@ -1040,6 +1104,8 @@ type ScriptElement = {
1040
1104
  qualifierName?: string;
1041
1105
  direction?: string;
1042
1106
  runs: TextRun[];
1107
+ /** The speaker's stored colour slot (`CastMember.colour`), when the cast keeps one: pass it to `characterColour`. */
1108
+ colour?: number;
1043
1109
  }
1044
1110
  /** Text (speaker-less prose: on-screen text or action; the kind keeps its old name), upright in a soft ink, flush left. `id` is the beat. */
1045
1111
  | {
@@ -1058,14 +1124,14 @@ type ScriptElement = {
1058
1124
  snippet?: number;
1059
1125
  text: string;
1060
1126
  }
1061
- /** A selector group's label ("Choose", "One of · first match wins", "In sequence"). */
1127
+ /** A selector group's label ("Choose", "One of (first match wins)", "In sequence"). */
1062
1128
  | {
1063
1129
  kind: "group";
1064
1130
  id: string;
1065
1131
  indent: number;
1066
1132
  label: string;
1067
1133
  }
1068
- /** A branch's catch-all row header ("else · catch-all"). `id` is the catch-all row's node. */
1134
+ /** A branch's catch-all row header ("else (catch-all)"). `id` is the catch-all row's node. */
1069
1135
  | {
1070
1136
  kind: "else";
1071
1137
  id: string;
@@ -1092,7 +1158,7 @@ type ScriptElement = {
1092
1158
  snippet?: number;
1093
1159
  text: string;
1094
1160
  }
1095
- /** A game event, set apart right-aligned in accent mono: `⚙ game event · door.open`. `id` is the beat. */
1161
+ /** A game event, set apart right-aligned in accent mono: `⚙ game event: door.open`. `id` is the beat. */
1096
1162
  | {
1097
1163
  kind: "gameEvent";
1098
1164
  id: string;
@@ -1100,6 +1166,18 @@ type ScriptElement = {
1100
1166
  snippet?: number;
1101
1167
  text: string;
1102
1168
  }
1169
+ /** A snippet's or scene's effects in one phase, as a quiet line of plain words: `On end: sets gold to
1170
+ * gold + 5`. `begin` is a snippet's `onEnter` (shown before its beats) or a scene's `onEntry` (under its
1171
+ * heading); `end` is a snippet's `onExit` (after its beats, before any jump). The labels are the app's.
1172
+ * `id` is the snippet or scene. Shown, never edited: the editable script leaves it out of the record. */
1173
+ | {
1174
+ kind: "effect";
1175
+ id: string;
1176
+ phase: "begin" | "end";
1177
+ indent: number;
1178
+ snippet?: number;
1179
+ text: string;
1180
+ }
1103
1181
  /** A documentation note on the element above, when the caller asked for notes (`ScriptDocOptions.notes`).
1104
1182
  * `id` is the node or beat the note is on. The readable script asks for none. */
1105
1183
  | {
@@ -1126,6 +1204,8 @@ interface ScriptDoc {
1126
1204
  project: string;
1127
1205
  elements: ScriptElement[];
1128
1206
  }
1207
+ /** Effects as prose: one describer per project (its dialect knows the project's scopes). */
1208
+ declare function effectDescriber(dialect: Dialect, nodeLabel?: (id: string) => string): (effect: Effect) => string;
1129
1209
  /** Compute the readable script document. Pure: data out, no I/O. */
1130
1210
  declare function runScriptDoc(loaded: LoadedProject, opts?: ScriptDocOptions): ScriptDoc;
1131
1211
 
@@ -1710,6 +1790,91 @@ declare function classesForChannel(classes: DocumentationClass[], channel: strin
1710
1790
  */
1711
1791
  declare function resolveDocumentation(loaded: LoadedProject, channel: string): Map<string, DocLine[]>;
1712
1792
 
1793
+ /** What to do with one clash. */
1794
+ type Resolution = "ours" | "theirs" | "resolved";
1795
+ /** One decision: the clash's path, as the shard's `unresolved` entry names it, and what to do. */
1796
+ interface ResolutionDecision {
1797
+ path: string;
1798
+ decision: Resolution;
1799
+ }
1800
+ /** One `unresolved` entry, as the shard holds it. */
1801
+ interface UnresolvedClash {
1802
+ path: string;
1803
+ kind: string;
1804
+ base?: unknown;
1805
+ ours?: unknown;
1806
+ theirs?: unknown;
1807
+ }
1808
+ /** Thrown when a decision can't be applied: no such clash, or "theirs" for a clash that isn't one value. */
1809
+ declare class ResolutionError extends Error {
1810
+ }
1811
+ /** Can "theirs" be written for this clash? False for `moved`, `structural`, and a list's `:order`. */
1812
+ declare function isSettableClash(clash: {
1813
+ path: string;
1814
+ kind?: unknown;
1815
+ }): boolean;
1816
+ /** The `unresolved` entries of a parsed shard (none for a shard with no mark). An entry with no path can't
1817
+ * be named, so it isn't listed: validate still refuses it, and only an edit by hand clears it. */
1818
+ declare function unresolvedClashes(shard: unknown): UnresolvedClash[];
1819
+ /** One step of a clash path: a key after a dot, or a key in brackets. */
1820
+ interface ClashPathSegment {
1821
+ key: string;
1822
+ /** In brackets, unquoted: a key into a list. A JSON-quoted key is an object's key, as a dotted one is. */
1823
+ bracket: boolean;
1824
+ }
1825
+ /**
1826
+ * A clash path's steps, in order: `scene.blocks[b1].children[x].choiceText` is scene, blocks, [b1],
1827
+ * children, [x], choiceText. A trailing `:order` (the shared merge's order clash) is left off. A
1828
+ * bracketed key may hold anything but `]` (a message's `author|ts` has colons in it), or be JSON-quoted.
1829
+ */
1830
+ declare function clashPathSegments(path: string): ClashPathSegment[];
1831
+ /** The value at a clash path in a parsed shard, or undefined where there's none. */
1832
+ declare function valueAtClashPath(shard: unknown, path: string): unknown;
1833
+ /**
1834
+ * Apply a decision to each named clash of a marked shard, and answer the shard's new canonical text. "ours"
1835
+ * keeps the value and clears the entry, "theirs" writes their value at the path and clears it, "resolved"
1836
+ * clears it only. The entries no decision names stay; with none left, the `unresolved` key goes.
1837
+ *
1838
+ * Throws `ResolutionError` for a path the mark doesn't hold, and for "theirs" on a clash that isn't one
1839
+ * value (`isSettableClash`). The shard must parse (`parseSource`).
1840
+ */
1841
+ declare function applyResolutions(shardText: string, decisions: readonly ResolutionDecision[]): string;
1842
+ /** What a merge's `.patterconflict` sidecar says (merge.ts `MergeResult`, written beside the shard). */
1843
+ interface ConflictSidecar {
1844
+ type?: string;
1845
+ conflicts: Array<{
1846
+ id?: string;
1847
+ path: string;
1848
+ kind?: string;
1849
+ base?: unknown;
1850
+ ours?: unknown;
1851
+ theirs?: unknown;
1852
+ }>;
1853
+ warnings: Array<{
1854
+ id?: string;
1855
+ path: string;
1856
+ message: string;
1857
+ }>;
1858
+ }
1859
+ /** A shard carrying the `unresolved` mark: where it is, what it holds, its clashes, and its sidecar. */
1860
+ interface MarkedShard {
1861
+ /** The shard's path (absolute when `root` was). */
1862
+ file: string;
1863
+ /** The parsed shard, our side of each clash in place. */
1864
+ shard: Record<string, unknown>;
1865
+ clashes: UnresolvedClash[];
1866
+ /** The `.patterconflict` beside it, when there is one that parses. */
1867
+ sidecar?: ConflictSidecar;
1868
+ /** Where that sidecar is (set whenever the file exists, readable or not). */
1869
+ sidecarPath?: string;
1870
+ }
1871
+ /**
1872
+ * Every shard of the project at `root` that carries the `unresolved` mark, with its clashes and its sidecar:
1873
+ * what a resolver lists. The same walk and the same cheap test as validate's `unresolvedMarkIssues` (dot
1874
+ * folders skipped, a shard that won't parse left to the loader to report).
1875
+ */
1876
+ declare function findMarkedShards(root: string): MarkedShard[];
1877
+
1713
1878
  /** Where a project keeps an extension's manifest. */
1714
1879
  declare const manifestPath: (projectDir: string, id: string) => string;
1715
1880
  /**
@@ -1764,6 +1929,10 @@ declare function renameCastKeys(shards: ReadonlyArray<{
1764
1929
  manifest: unknown;
1765
1930
  }>, renames: ReadonlyMap<string, string>): CastKeyRewrite[];
1766
1931
 
1932
+ /** A renamed member keeps their colour (the hands-on fixes review): one with no stored slot is given the one
1933
+ * their OLD name hashed to, in place, so the cue, the play window, and the readable script don't recolour
1934
+ * them. A slot already stored stays. Run on the new cast, in the same save as the rename. */
1935
+ declare function keepCastColours(cast: CastMember[], renames: ReadonlyMap<string, string>): void;
1767
1936
  /** Old name -> new name, with no-ops and blanks dropped. Null when nothing is renamed. */
1768
1937
  declare function cleanCastRenames(renames: Record<string, string> | undefined): Map<string, string> | null;
1769
1938
  /** Rewrite the speaker of `scene`'s lines (option prompts among them) through `renames`, in place; all at
@@ -1941,7 +2110,14 @@ interface ReadParagraph {
1941
2110
  /** The paragraph style (Heading1, ...), when one is set. */
1942
2111
  style?: string;
1943
2112
  }
1944
- type ReadItem = ReadBox | ReadParagraph;
2113
+ /** An effect line ("On end: sets gold to gold + 5"): shown for context, not part of the handoff, so the
2114
+ * import skips it. Known by its paragraph style, or (where a tool dropped the style) by its phase label. */
2115
+ interface ReadEffect {
2116
+ kind: "effect";
2117
+ phase: "begin" | "end";
2118
+ text: ReadText;
2119
+ }
2120
+ type ReadItem = ReadBox | ReadParagraph | ReadEffect;
1945
2121
  interface ReadComment {
1946
2122
  id: string;
1947
2123
  author: string;
@@ -2017,4 +2193,4 @@ declare const REFUSE_MISSING_SHARE = 0.25;
2017
2193
  /** Plan an import. Reads the handoff record named in the document from the project. */
2018
2194
  declare function planEditableImport(loaded: LoadedProject, returned: ReturnedDoc, opts: ImportOptions): ImportPlan;
2019
2195
 
2020
- export { AUDIO_MANIFEST_FILE, AUDIO_MANIFEST_SCHEMA, AUTHORING_HANDLED, type ActionTextChange, type ApplyStats, type AudioEntry, type AudioRung, type AudioSnapshot, type BuildPlan, CONFLICT_SIDECAR, type CastKeyRewrite, type CharacterReport, type Conflict, type ConflictKind, type ContentError, type CoverageAsyncHooks, type CoverageBeat, type CoverageHooks, type CoverageOptions, type CoverageOrder, type CoverageReport, type DecisionPlan, type DecisionResult, type DocumentManifest, type EditableScript, type EditableScriptOptions, type ExportOptions, type ExtensionUpgrade, type FormatResult, GAME_SCOPES_OWNER, type GameDataStageRenameResult, type GameScopes, type GameScopesIssue, HANDOFF_DIR, type HandoffIssue, type HygieneIssue, type ImportOptions, type ImportPlan, type ImportProblem, type ImportReport, type InitOptions, type InitResult, type InitVcs, type LoadedManifest, type LoadedProject, type LocCatalog, type LocEntry, type LocaleReport, type MergeFileType, type MergeResult, type MergedShard, NotAPackError, type OpenSuggestion, PATTER_SCOPES_FILE, PATTER_SCOPES_OWNER, PATTER_VCS_FORMAT, PROJECT_HANDLED, type PinPlan, type PinnedName, type PlannedWrite, type PlayEvent, type PlayOptions, type PlayOutcome, type PlayResult, type ProvenanceCheck, RARE_REACH_PCT, REFUSE_MISSING_SHARE, type Random, type ReadBox, type ReadComment, type ReadItem, type ReadMarker, type ReadParagraph, type ReadText, type ReplaceField, type ReplaceHit, type ReplaceOptions, type ReplacePlan, type ReportData, type ReportTotals, type ResolveEntry, type ReturnedDoc, SCRIPT_FONT_FILES, SCRIPT_FONT_PACKAGES, SHARD_EXTENSIONS, type SceneReport, type ScriptDoc, type ScriptElement, type ScriptFace, type SearchFocus, type ShardText, type StageRenameResult, type StageTarget, type SuggestionDecision, type TrackedChange, type UnpackMergeResult, type UnpackResult, UnsafeEntryError, UnsupportedMergeError, type ValidateResult, type VoiceLine, type VoiceScript, type VoicedCounts, type WebExport, type WrittenCounts, actionTextChanges, actionTextIds, applyLoc, applySceneOrder, applySuggestionDecisions, applyWrites, audioFolderRungs, audioFoldersActive, audioManifest, audioManifestWrite, authoringPath, besideBundlePath, bundleOutputPath, catalogToJson, catalogToPo, catalogToXlsx, classesForChannel, cleanCastRenames, compileLoaded, cueLabel, currentBundlePosture, defaultBundlePath, defaultGameScopesDir, describeLocExport, detectMergeType, discoverGameScopes, drivableScopes, exportBlockers, exportEditableScript, extractLoc, findProjectFile, formatMarker, gameScopeTokens, gameScopesCatalogue, gameScopesSnapshot, handoffPath, handoffWrite, hostScopeTokens, issueMarkerCodes, jsonToCatalog, leastReachedFirst, listGameDataFields, listOpenSuggestions, listProjectTags, loadProject, loadProjectLanding, loadedExtensions, manifestPath, markerLength, moveCastKeys, newHandoffId, parseHandoff, patterScopesFile, patterScopesStale, patterScopesWrite, pickAudio, planBuild, planEditableImport, planExtensionUpgrades, planPins, planReturnedWorld, planShareScopes, planWorldSave, poToCatalog, previewRegistry, projectManifests, projectStringSources, proposeCoverageDrivers, qualifierNamer, reachabilityIssues, readEditableDocx, readGameScopes, readHandoff, readHandoffs, readMarker, readProjectManifest, renameCastInScene, renameCastKeys, renameCastStrings, renameGameDataStage, renameStage, renderCoverageText, renderPlay, renderReportText, resolveDocumentation, resolveStart, runCoverage, runCoverageAsync, runExport, runExportFull, runExportHtml, runExportWeb, runFieldBrowse, runFormat, runInit, runMerge, runPack, runPlay, runPropertyUsage, runReplace, runReport, runReportXlsx, runResolve, runScriptDoc, runSearch, runStatusBrowse, runTagBrowse, runUnpack, runUnpackMerge, runValidate, runVoiceScript, scanAudio, scanAudioStatus, sceneIdForShard, sceneTextIds, scriptFontLicencePath, scriptFontLicences, scriptToDocx, scriptToPdf, serialiseHandoff, setCut, sidecarIssues, soundManifest, stageDialect, stageGateCount, staleParts, unresolvedMarkIssues, useScriptFontFiles, vcsConfigWrites, voiceScriptToXlsx, worldSettingsScopes, xlsxToCatalog };
2196
+ export { AUDIO_MANIFEST_FILE, AUDIO_MANIFEST_SCHEMA, AUTHORING_HANDLED, type ActionTextChange, type ApplyStats, type AudioEntry, type AudioRung, type AudioSnapshot, type BuildPlan, CONFLICT_SIDECAR, type CastKeyRewrite, type CharacterReport, type ClashPathSegment, type Conflict, type ConflictKind, type ConflictSidecar, type ContentError, type CoverageAsyncHooks, type CoverageBeat, type CoverageHooks, type CoverageOptions, type CoverageOrder, type CoverageReport, type DecisionPlan, type DecisionResult, type DocumentManifest, type EditableScript, type EditableScriptOptions, type ExportOptions, type ExtensionUpgrade, type FormatResult, GAME_SCOPES_OWNER, type GameDataStageRenameResult, type GameScopes, type GameScopesIssue, HANDOFF_DIR, type HandoffIssue, type HygieneIssue, type ImportOptions, type ImportPlan, type ImportProblem, type ImportReport, type InitOptions, type InitResult, type InitVcs, type LoadedManifest, type LoadedProject, type LocCatalog, type LocEntry, type LocImportLine, type LocImportReport, type LocMismatch, type LocaleReport, type MarkedShard, type MergeFileType, type MergeResult, type MergedShard, NotAPackError, type OpenSuggestion, PATTER_SCOPES_FILE, PATTER_SCOPES_OWNER, PATTER_VCS_FORMAT, PROJECT_HANDLED, type PinPlan, type PinnedName, type PlannedWrite, type PlayEvent, type PlayOptions, type PlayOutcome, type PlayResult, type ProvenanceCheck, RARE_REACH_PCT, REFUSE_MISSING_SHARE, type Random, type ReadBox, type ReadComment, type ReadEffect, type ReadItem, type ReadMarker, type ReadParagraph, type ReadText, type ReplaceField, type ReplaceHit, type ReplaceOptions, type ReplacePlan, type ReportData, type ReportTotals, type Resolution, type ResolutionDecision, ResolutionError, type ResolveEntry, type ReturnedDoc, SCRIPT_FONT_FILES, SCRIPT_FONT_PACKAGES, SHARD_EXTENSIONS, type SceneReport, type ScriptDoc, type ScriptElement, type ScriptFace, type SearchFocus, type ShardText, type StageRenameResult, type StageTarget, type SuggestionDecision, type TrackedChange, type UnpackMergeResult, type UnpackResult, type UnresolvedClash, UnsafeEntryError, UnsupportedMergeError, type ValidateResult, type VoiceLine, type VoiceScript, type VoicedCounts, type WebExport, type WrittenCounts, actionTextChanges, actionTextIds, applyLoc, applyResolutions, applySceneOrder, applySuggestionDecisions, applyWrites, audioFolderRungs, audioFoldersActive, audioManifest, audioManifestWrite, authoringPath, besideBundlePath, bundleOutputPath, castColours, catalogToJson, catalogToPo, catalogToXlsx, characterColour, clashPathSegments, classesForChannel, cleanCastRenames, compareLocTokens, compileLoaded, cueLabel, currentBundlePosture, defaultBundlePath, defaultGameScopesDir, describeLocExport, describeLocImport, detectMergeType, discoverGameScopes, drivableScopes, effectDescriber, exportBlockers, exportEditableScript, extractLoc, findMarkedShards, findProjectFile, formatMarker, gameScopeTokens, gameScopesCatalogue, gameScopesSnapshot, handoffPath, handoffWrite, hostScopeTokens, importLocale, isSettableClash, issueMarkerCodes, jsonToCatalog, keepCastColours, leastReachedFirst, listGameDataFields, listOpenSuggestions, listProjectTags, loadProject, loadProjectLanding, loadedExtensions, locLineHomes, manifestPath, markerLength, moveCastKeys, newHandoffId, parseHandoff, patterScopesFile, patterScopesStale, patterScopesWrite, pickAudio, planBuild, planEditableImport, planExtensionUpgrades, planPins, planReturnedWorld, planShareScopes, planWorldSave, poToCatalog, previewRegistry, projectManifests, projectStringSources, proposeCoverageDrivers, qualifierNamer, reachabilityIssues, readEditableDocx, readGameScopes, readHandoff, readHandoffs, readMarker, readProjectManifest, renameCastInScene, renameCastKeys, renameCastStrings, renameGameDataStage, renameStage, renderCoverageText, renderPlay, renderReportText, resolveDocumentation, resolveStart, runCoverage, runCoverageAsync, runExport, runExportFull, runExportHtml, runExportWeb, runFieldBrowse, runFormat, runInit, runMerge, runPack, runPlay, runPropertyUsage, runReplace, runReport, runReportXlsx, runResolve, runScriptDoc, runSearch, runStatusBrowse, runTagBrowse, runUnpack, runUnpackMerge, runValidate, runVoiceScript, scanAudio, scanAudioStatus, sceneIdForShard, sceneTextIds, scriptFontLicencePath, scriptFontLicences, scriptToDocx, scriptToPdf, serialiseHandoff, setCut, sidecarIssues, soundManifest, stageDialect, stageGateCount, staleParts, unresolvedClashes, unresolvedMarkIssues, useScriptFontFiles, valueAtClashPath, vcsConfigWrites, voiceScriptToXlsx, worldSettingsScopes, xlsxToCatalog };