@patterkit/ops 1.0.0 → 1.1.0

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 +189 -9
  2. package/dist/index.js +568 -153
  3. package/package.json +8 -8
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
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';
1
+ import { ProjectFile, Bundle, HostScopeRegistry, Scene, LocaleFile, AuthoringFile, ExtensionShard, CastMember, GameData, CoverageDriver, GrammaticalGender, Effect, GameDataFieldType, GameDataNodeKind, DocumentationClass, DocLine, 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
- import { ConditionIssue, ExtensionIssue, ExportInput } from '@patterkit/compiler';
6
+ import { ConditionIssue, ExtensionIssue, ExtensionPools, ExportInput } from '@patterkit/compiler';
7
7
  import { ChoiceOption, PlayError } from '@patterkit/runtime';
8
8
  import { Dialect } from '@wildwinter/expr';
9
9
  export { renameStageInExpression } from '@wildwinter/expr';
@@ -288,6 +288,9 @@ interface ValidateResult {
288
288
  * refuses them; warnings (a missing manifest, an orphaned entry, a pin still carrying settings, a
289
289
  * `.gitattributes` with no merge rule for the data) don't. */
290
290
  extensions: ExtensionIssue[];
291
+ /** Each extension's pools (a pick's `{ "pool": name }` source), by extension and pool: the values the
292
+ * project's data holds, the commonest first, for an editor to suggest. */
293
+ extensionPools: ExtensionPools;
291
294
  /** Only ERRORS count: a warning (another tool's scope, say) never fails a build. */
292
295
  ok: boolean;
293
296
  }
@@ -316,7 +319,10 @@ interface AudioRung {
316
319
  interface AudioEntry {
317
320
  status: string;
318
321
  path: string;
322
+ /** The text hash the take was made from (its `PTRK` stamp), when it has one and the reader looked. */
319
323
  textHash?: string;
324
+ /** Placeholder Speech's request hash (its `PTPS` stamp): set only on a generated take. */
325
+ generated?: string;
320
326
  }
321
327
  /** beatId -> resolved audio. Absent ids are implicitly "missing". */
322
328
  type AudioSnapshot = Record<string, AudioEntry>;
@@ -348,11 +354,25 @@ declare function scanAudio(loaded: LoadedProject): AudioSnapshot | undefined;
348
354
  * doesn't derive status from folders, so callers fall back to the manual recording map as Patterpad does. */
349
355
  declare function scanAudioStatus(loaded: LoadedProject): Map<string, string> | undefined;
350
356
  /** Serialise a snapshot into the sidecar manifest JSON, with each absolute path made root-relative
351
- * (forward-slashed) against `<projectRoot>/<audioRoot>`. */
352
- declare function audioManifest(snapshot: AudioSnapshot, projectRoot: string, audioRoot: string): string;
353
- /** The manifest write for a snapshot, beside the audio; undefined when the project does not use Audio
354
- * Folders or no take has been found yet. */
355
- declare function audioManifestWrite(loaded: LoadedProject, snapshot: AudioSnapshot | undefined): PlannedWrite | undefined;
357
+ * (forward-slashed) against `<projectRoot>/<audioRoot>`. `opts.lines` keeps only takes whose line is in the
358
+ * project (a deleted line's take is left out straight away); `opts.leaveOut` drops takes on those statuses
359
+ * (a shipping manifest without Placeholder Speech). */
360
+ declare function audioManifest(snapshot: AudioSnapshot, projectRoot: string, audioRoot: string, opts?: {
361
+ lines?: ReadonlySet<string>;
362
+ leaveOut?: ReadonlySet<string>;
363
+ }): string;
364
+ /** The ids a manifest may name: every beat in the project (spoken lines, text, option prompts), less lines
365
+ * marked cut. A take for anything else (a deleted line, or one pasted under a new id) is left out. */
366
+ declare function manifestLineIds(loaded: LoadedProject): Set<string>;
367
+ /** The manifest write for a snapshot: beside the audio, or at `opts.path` (a shipping manifest, written to a
368
+ * build folder so it never overwrites the development one). Undefined when the project does not use Audio
369
+ * Folders or no take has been found yet; a snapshot whose takes are all for deleted lines still writes, so
370
+ * an old manifest naming them doesn't linger. `opts.leaveOutPlaceholderSpeech` drops the Placeholder Speech
371
+ * status's takes. */
372
+ declare function audioManifestWrite(loaded: LoadedProject, snapshot: AudioSnapshot | undefined, opts?: {
373
+ path?: string;
374
+ leaveOutPlaceholderSpeech?: boolean;
375
+ }): PlannedWrite | undefined;
356
376
 
357
377
  /** What a shipped build may not be built over. */
358
378
  interface ExportOptions {
@@ -387,11 +407,14 @@ interface BuildPlan {
387
407
  * (CLI review 2026-10, item 23). Patterpad's Build wrote bundle, scopes and audio manifest; its Auto
388
408
  * Rebuild skipped the scopes file; `patter export` never wrote the manifest. `bundlePath` overrides
389
409
  * where the bundle goes (the CLI's `-o`); `audio` is a snapshot the caller already holds (Patterpad's
390
- * live index), else the folders are scanned now.
410
+ * live index), else the folders are scanned now. `audioManifestPath` writes the audio manifest elsewhere (a
411
+ * shipping manifest), and `leaveOutPlaceholderSpeech` leaves Placeholder Speech's takes out of it.
391
412
  */
392
413
  declare function planBuild(loaded: LoadedProject, opts?: ExportOptions & {
393
414
  bundlePath?: string;
394
415
  audio?: AudioSnapshot;
416
+ audioManifestPath?: string;
417
+ leaveOutPlaceholderSpeech?: boolean;
395
418
  }): BuildPlan;
396
419
 
397
420
  /**
@@ -448,6 +471,154 @@ interface WebExport {
448
471
  }
449
472
  declare function runExportWeb(loaded: LoadedProject): WebExport;
450
473
 
474
+ /** The fixed output: low on purpose. */
475
+ declare const PLACEHOLDER_SAMPLE_RATE = 16000;
476
+ /** Where the key file is: the project's path (relative to the `.patter` folder, or `~/...`), else the
477
+ * `GOOGLE_APPLICATION_CREDENTIALS` environment variable, else gcloud's own sign-in (`gcloud auth
478
+ * application-default login`), where Google's libraries look last too. `source` says which, for the settings
479
+ * page. */
480
+ declare function resolveKeyFile(projectRoot: string, keyFile: string | undefined, env?: Record<string, string | undefined>): {
481
+ path?: string;
482
+ source: "project" | "environment" | "gcloud" | "none";
483
+ stored?: string;
484
+ };
485
+ /** Where `gcloud auth application-default login` keeps its sign-in: `CLOUDSDK_CONFIG` when set, else gcloud's
486
+ * config folder (`%APPDATA%\gcloud` on Windows, `~/.config/gcloud` elsewhere). */
487
+ declare function gcloudCredentialsPath(env?: Record<string, string | undefined>): string | undefined;
488
+ /** A stored key path made absolute: a leading `~/` is the home folder on every system (Node expands it nowhere),
489
+ * a relative path is against the project folder, forward slashes work everywhere. */
490
+ declare function expandKeyPath(projectRoot: string, stored: string): string;
491
+ /** How a chosen key file should be stored: `~/...` under the home folder, else relative to the project folder,
492
+ * always with forward slashes, so one stored path works on every system. */
493
+ declare function storedKeyPath(projectRoot: string, chosen: string): string;
494
+ /**
495
+ * A Google credential Placeholder Speech can use: a service account's JSON key, or gcloud's own sign-in for a
496
+ * person (`gcloud auth application-default login`, `"type": "authorized_user"`), which Google bills to its quota
497
+ * project. `projectId` is the project that's billed, `account` the email it acts as (empty when the file doesn't
498
+ * say).
499
+ */
500
+ type GoogleKey = {
501
+ readonly kind: "service-account";
502
+ readonly projectId: string;
503
+ readonly account: string;
504
+ readonly privateKey: string;
505
+ } | {
506
+ readonly kind: "user";
507
+ readonly projectId: string;
508
+ readonly account: string;
509
+ readonly clientId: string;
510
+ readonly clientSecret: string;
511
+ readonly refreshToken: string;
512
+ };
513
+ /** Read a Google credential file. Throws, in plain words, when it isn't one Placeholder Speech can use. */
514
+ declare function readGoogleKey(path: string): GoogleKey;
515
+ /** What a request to Google carries: the token, and for a person's sign-in the project to bill. */
516
+ interface GoogleAuth {
517
+ readonly token: string;
518
+ readonly quotaProject?: string;
519
+ }
520
+ /** A short-lived OAuth token for the key: minted from a signed JWT for a service account, or from the refresh
521
+ * token for a person's gcloud sign-in. */
522
+ declare function mintToken(key: GoogleKey, fetchFn?: typeof fetch): Promise<{
523
+ token: string;
524
+ expiresAt: number;
525
+ }>;
526
+ /** Why a request failed. `auth` and `forbidden` stop a run; `rate` backs off; `offline` stops quietly. */
527
+ type SpeechErrorKind = "auth" | "forbidden" | "rate" | "offline" | "bad-request" | "server";
528
+ declare class SpeechError extends Error {
529
+ readonly kind: SpeechErrorKind;
530
+ constructor(kind: SpeechErrorKind, message: string);
531
+ }
532
+ /** A plain-words line for a stopped run (the settings page and the notice). */
533
+ declare function describeSpeechError(e: unknown): string;
534
+ interface SpeechRequest {
535
+ text: string;
536
+ voice: string;
537
+ languageCode: string;
538
+ }
539
+ /** The request hash stamped as PTPS: everything that shapes the audio. */
540
+ declare function requestHash(r: SpeechRequest): string;
541
+ /** Ask Google for one line's speech: the raw WAV it returns (LINEAR16 comes with a WAV header). */
542
+ declare function synthesize(auth: string | GoogleAuth, r: SpeechRequest, fetchFn?: typeof fetch): Promise<Uint8Array>;
543
+ /** Trim leading and trailing silence from a 16-bit mono WAV (as scratch takes are), and stamp it. */
544
+ declare function finishTake(wav: Uint8Array, stamps: {
545
+ text: string;
546
+ request: string;
547
+ }): Uint8Array;
548
+ /** The generated stamp of a file on disk (PTPS, or Patterstage's PSVT), read from its chunk headers only;
549
+ * null when it has none or can't be read. */
550
+ declare function readGeneratedStampFromFile(path: string): string | null;
551
+ /** One line to make. */
552
+ interface PlaceholderTask {
553
+ beatId: string;
554
+ character: string;
555
+ request: SpeechRequest;
556
+ /** The PTPS value it will carry. */
557
+ hash: string;
558
+ /** The PTRK value: the line's text hash. */
559
+ textHash: string;
560
+ /** Where it goes. */
561
+ path: string;
562
+ }
563
+ /** Why a line was left alone. */
564
+ type PlaceholderSkip = "unchanged" | "better" | "not-ours" | "no-voice" | "unspoken";
565
+ interface PlaceholderPlan {
566
+ /** The status and folder speech goes in. */
567
+ status: string;
568
+ folder: string;
569
+ accent: string | undefined;
570
+ tasks: PlaceholderTask[];
571
+ skipped: Partial<Record<PlaceholderSkip, number>>;
572
+ }
573
+ interface PlanOptions {
574
+ /** Only these lines (Patterpad's "edited this session"); absent, every spoken line. */
575
+ only?: Set<string>;
576
+ /** Only this scene, by id. */
577
+ scene?: string;
578
+ /** Remake these lines even when their stamp matches (Make again). */
579
+ force?: Set<string> | "all";
580
+ /** The current audio snapshot; read from disk when absent. */
581
+ snapshot?: AudioSnapshot;
582
+ }
583
+ /** The voice a character speaks with: their own, else the default from the name and gender. */
584
+ declare function voiceFor(cast: CastMember[] | undefined, character: string, accent: string | undefined): string | undefined;
585
+ /** The accent in use: the project's choice, else the one its main language implies. */
586
+ declare function placeholderAccentOf(p: ProjectFile): string | undefined;
587
+ /** Work out what to make: every spoken line (or the ones asked for) whose placeholder take is missing or no
588
+ * longer matches its request, skipping lines with a take on a higher status (even an out-of-date one: speech
589
+ * under it would never be heard), files in the folder that a person put there, and lines with no voice.
590
+ * Undefined when the project doesn't have Placeholder Speech on with Audio Folders. */
591
+ declare function planPlaceholderSpeech(loaded: LoadedProject, opts?: PlanOptions): PlaceholderPlan | undefined;
592
+ interface RunOptions {
593
+ /** A fresh token when asked (minted once, then reused until near expiry), with the project to bill for a
594
+ * person's sign-in (`tokenSource`). */
595
+ token(): Promise<string | GoogleAuth>;
596
+ /** Write a finished take; return false to say it was skipped (a file someone else has open). */
597
+ write(path: string, bytes: Uint8Array): Promise<boolean>;
598
+ onProgress?(done: number, total: number, task: PlaceholderTask): void;
599
+ signal?: AbortSignal;
600
+ concurrency?: number;
601
+ fetchFn?: typeof fetch;
602
+ }
603
+ interface RunResult {
604
+ made: string[];
605
+ failed: Array<{
606
+ beatId: string;
607
+ error: string;
608
+ }>;
609
+ skippedLocked: string[];
610
+ stopped?: {
611
+ kind: SpeechErrorKind;
612
+ message: string;
613
+ };
614
+ notTried: number;
615
+ }
616
+ /** Make the planned takes, two at a time. Bad keys, a refused project, and no network stop the run with one
617
+ * reason; a rate limit backs off and retries, and stops only if it persists; other failures are counted. */
618
+ declare function runPlaceholderSpeech(tasks: PlaceholderTask[], o: RunOptions): Promise<RunResult>;
619
+ /** A token source for a key: mints once, refreshes near expiry. A person's sign-in bills its quota project. */
620
+ declare function tokenSource(key: GoogleKey, fetchFn?: typeof fetch): () => Promise<GoogleAuth>;
621
+
451
622
  interface PlayOptions {
452
623
  /** Scene id to start at (defaults to the bundle's first scene). */
453
624
  scene?: string;
@@ -707,6 +878,8 @@ declare function renderCoverageText(report: CoverageReport, sceneName?: (id: str
707
878
  order?: CoverageOrder;
708
879
  }): string[];
709
880
 
881
+ /** The SOURCE (default-locale) string table - the most-used `tableFor`. */
882
+ declare function sourceStrings(loaded: LoadedProject): Record<string, string>;
710
883
  /** Resolve where a flow starts: an explicit override, else the project's authored `start`, else `{}`
711
884
  * (the runtime's first-scene default). Shared by `runPlay` and `runCoverage`. A block named with no scene
712
885
  * is looked for in every scene (see `findBlockAnywhere`), so it is never silently dropped for the
@@ -814,6 +987,9 @@ interface ReportData {
814
987
  recordingTracked: boolean;
815
988
  writingLadder: string[];
816
989
  recordingLadder: string[];
990
+ /** With Placeholder Speech on: voiced lines still to record, counting those with only placeholder speech (and
991
+ * those flagged for re-record) with the ones with nothing. Undefined when Placeholder Speech is off. */
992
+ toRecord?: number;
817
993
  scenes: SceneReport[];
818
994
  characters: CharacterReport[];
819
995
  locales: LocaleReport[];
@@ -1946,6 +2122,10 @@ declare function renameCastKeys(shards: ReadonlyArray<{
1946
2122
  * their OLD name hashed to, in place, so the cue, the play window, and the readable script don't recolour
1947
2123
  * them. A slot already stored stays. Run on the new cast, in the same save as the rename. */
1948
2124
  declare function keepCastColours(cast: CastMember[], renames: ReadonlyMap<string, string>): void;
2125
+ /** A renamed member keeps their Placeholder Speech voice, as they keep their colour: one with no voice of
2126
+ * their own is given the default their OLD name hashed to, in place, so a rename doesn't remake their lines
2127
+ * in another voice. Only when the project has Placeholder Speech on (`accent` is its accent in use). */
2128
+ declare function keepPlaceholderVoices(cast: CastMember[], renames: ReadonlyMap<string, string>, accent: string | undefined): void;
1949
2129
  /** Old name -> new name, with no-ops and blanks dropped. Null when nothing is renamed. */
1950
2130
  declare function cleanCastRenames(renames: Record<string, string> | undefined): Map<string, string> | null;
1951
2131
  /** Rewrite the speaker of `scene`'s lines (option prompts among them) through `renames`, in place; all at
@@ -2206,4 +2386,4 @@ declare const REFUSE_MISSING_SHARE = 0.25;
2206
2386
  /** Plan an import. Reads the handoff record named in the document from the project. */
2207
2387
  declare function planEditableImport(loaded: LoadedProject, returned: ReturnedDoc, opts: ImportOptions): ImportPlan;
2208
2388
 
2209
- 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, applySceneNavOrder, 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, sceneFolderPaths, sceneIdForShard, sceneTextIds, scriptFontLicencePath, scriptFontLicences, scriptToDocx, scriptToPdf, serialiseHandoff, setCut, sidecarIssues, soundManifest, stageDialect, stageGateCount, staleParts, unresolvedClashes, unresolvedMarkIssues, useScriptFontFiles, valueAtClashPath, vcsConfigWrites, voiceScriptToXlsx, worldSettingsScopes, xlsxToCatalog };
2389
+ 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, type GoogleAuth, type GoogleKey, 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, PLACEHOLDER_SAMPLE_RATE, PROJECT_HANDLED, type PinPlan, type PinnedName, type PlaceholderPlan, type PlaceholderSkip, type PlaceholderTask, type PlanOptions, 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, type RunOptions, type RunResult, SCRIPT_FONT_FILES, SCRIPT_FONT_PACKAGES, SHARD_EXTENSIONS, type SceneReport, type ScriptDoc, type ScriptElement, type ScriptFace, type SearchFocus, type ShardText, SpeechError, type SpeechErrorKind, type SpeechRequest, 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, applySceneNavOrder, 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, describeSpeechError, detectMergeType, discoverGameScopes, drivableScopes, effectDescriber, expandKeyPath, exportBlockers, exportEditableScript, extractLoc, findMarkedShards, findProjectFile, finishTake, formatMarker, gameScopeTokens, gameScopesCatalogue, gameScopesSnapshot, gcloudCredentialsPath, handoffPath, handoffWrite, hostScopeTokens, importLocale, isSettableClash, issueMarkerCodes, jsonToCatalog, keepCastColours, keepPlaceholderVoices, leastReachedFirst, listGameDataFields, listOpenSuggestions, listProjectTags, loadProject, loadProjectLanding, loadedExtensions, locLineHomes, manifestLineIds, manifestPath, markerLength, mintToken, moveCastKeys, newHandoffId, parseHandoff, patterScopesFile, patterScopesStale, patterScopesWrite, pickAudio, placeholderAccentOf, planBuild, planEditableImport, planExtensionUpgrades, planPins, planPlaceholderSpeech, planReturnedWorld, planShareScopes, planWorldSave, poToCatalog, previewRegistry, projectManifests, projectStringSources, proposeCoverageDrivers, qualifierNamer, reachabilityIssues, readEditableDocx, readGameScopes, readGeneratedStampFromFile, readGoogleKey, readHandoff, readHandoffs, readMarker, readProjectManifest, renameCastInScene, renameCastKeys, renameCastStrings, renameGameDataStage, renameStage, renderCoverageText, renderPlay, renderReportText, requestHash, resolveDocumentation, resolveKeyFile, resolveStart, runCoverage, runCoverageAsync, runExport, runExportFull, runExportHtml, runExportWeb, runFieldBrowse, runFormat, runInit, runMerge, runPack, runPlaceholderSpeech, runPlay, runPropertyUsage, runReplace, runReport, runReportXlsx, runResolve, runScriptDoc, runSearch, runStatusBrowse, runTagBrowse, runUnpack, runUnpackMerge, runValidate, runVoiceScript, scanAudio, scanAudioStatus, sceneFolderPaths, sceneIdForShard, sceneTextIds, scriptFontLicencePath, scriptFontLicences, scriptToDocx, scriptToPdf, serialiseHandoff, setCut, sidecarIssues, soundManifest, sourceStrings, stageDialect, stageGateCount, staleParts, storedKeyPath, synthesize, tokenSource, unresolvedClashes, unresolvedMarkIssues, useScriptFontFiles, valueAtClashPath, vcsConfigWrites, voiceFor, voiceScriptToXlsx, worldSettingsScopes, xlsxToCatalog };