@nodaro/shared 2.16.0 → 2.17.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.
package/dist/index.cjs CHANGED
@@ -2053,9 +2053,9 @@ var AUDIO_MODELS = {
2053
2053
  family: "ElevenLabs",
2054
2054
  label: "ElevenLabs Dubbing",
2055
2055
  series: "ElevenLabs",
2056
- description: "Translate + dub a video into a new language. Async.",
2056
+ description: "Translate + dub audio or a whole video into a new language \u2014 video in, dubbed video out. Async.",
2057
2057
  useCases: ["dubbing", "multilingual"],
2058
- pricing: [{ identifier: "elevenlabs-dubbing", credits: 80 }]
2058
+ pricing: [{ identifier: "elevenlabs-dubbing", credits: 40, note: "per minute of the dubbed span (min 1)" }]
2059
2059
  },
2060
2060
  "elevenlabs-forced-alignment": {
2061
2061
  id: "elevenlabs-forced-alignment",
@@ -8857,6 +8857,18 @@ function getAnimalLabel(id, fallback) {
8857
8857
  if (fallback !== void 0) return fallback;
8858
8858
  return (id ?? "").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
8859
8859
  }
8860
+ function getAnimalPromptHint(id) {
8861
+ const a = getAnimal(id);
8862
+ return a ? `featuring a ${a.label.toLowerCase()}, ${a.description}` : "";
8863
+ }
8864
+ var PARENTHETICAL = /\([^)]*\)/g;
8865
+ function deriveAnimalTerm(label) {
8866
+ return label.replace(PARENTHETICAL, " ").toLowerCase().replace(/\s+/g, " ").trim();
8867
+ }
8868
+ function getAnimalTerm(id) {
8869
+ const a = getAnimal(id);
8870
+ return a ? a.term ?? deriveAnimalTerm(a.label) : "";
8871
+ }
8860
8872
  ANIMALS.map((a) => a.id);
8861
8873
  var ANIMAL_SUBCATEGORY_LABELS = {
8862
8874
  cats: "Cats",
@@ -9916,12 +9928,12 @@ function findLocationMentionTokens(prompt, knownLocationSlugs) {
9916
9928
  return tokens;
9917
9929
  }
9918
9930
 
9919
- // src/image-mention-slug.ts
9920
- var IMAGE_SLUG_PATTERN = /^[a-z][a-z0-9-]*$/;
9921
- function imageMentionSlug(name) {
9931
+ // src/mention-token-grammar.ts
9932
+ var MENTION_SLUG_PATTERN = /^[a-z][a-z0-9-]*$/;
9933
+ function mentionNameSlug(name) {
9922
9934
  return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
9923
9935
  }
9924
- function parseImageMentionToken(text) {
9936
+ function parseMentionToken(text) {
9925
9937
  if (!text.startsWith("@")) return null;
9926
9938
  let rest = text.slice(1);
9927
9939
  if (rest.length === 0 || !/^[a-z]/.test(rest)) return null;
@@ -9935,36 +9947,62 @@ function parseImageMentionToken(text) {
9935
9947
  }
9936
9948
  const parts = rest.split(":");
9937
9949
  if (parts.length < 2 || parts.length > 3) return null;
9938
- const [imageSlug, indexStr, third] = parts;
9939
- if (!IMAGE_SLUG_PATTERN.test(imageSlug)) return null;
9950
+ const [slug, indexStr, third] = parts;
9951
+ if (!MENTION_SLUG_PATTERN.test(slug)) return null;
9940
9952
  if (!/^\d+$/.test(indexStr)) return null;
9941
- const imageIndex = parseInt(indexStr, 10);
9942
- if (!Number.isInteger(imageIndex) || imageIndex < 1) return null;
9943
- if (parts.length === 2) return { imageSlug, imageIndex, ...lockField };
9944
- if (!IMAGE_SLUG_PATTERN.test(third)) return null;
9945
- return { imageSlug, imageIndex, role: third, ...lockField };
9946
- }
9947
- function findImageMentionTokens(prompt, knownImageSlugs) {
9953
+ const index = parseInt(indexStr, 10);
9954
+ if (!Number.isInteger(index) || index < 1) return null;
9955
+ if (parts.length === 2) return { slug, index, ...lockField };
9956
+ if (!MENTION_SLUG_PATTERN.test(third)) return null;
9957
+ return { slug, index, role: third, ...lockField };
9958
+ }
9959
+ var MENTION_TOKEN_REGEX = /(?:^|[^a-zA-Z0-9])(@[a-z][a-z0-9-]*:\d+(?::[a-z][a-z0-9-]*)?(?:~(?:no)?lock(?![a-z0-9-]))?)(?![:a-z0-9-])/g;
9960
+ function findMentionTokens(prompt, knownSlugs) {
9948
9961
  const tokens = [];
9949
- const regex = /(?:^|[^a-zA-Z0-9])(@[a-z][a-z0-9-]*:\d+(?::[a-z][a-z0-9-]*)?(?:~(?:no)?lock(?![a-z0-9-]))?)(?![:a-z0-9-])/g;
9950
- const knownSet = new Set(knownImageSlugs);
9962
+ const regex = new RegExp(MENTION_TOKEN_REGEX.source, "g");
9963
+ const knownSet = new Set(knownSlugs);
9951
9964
  for (const match of prompt.matchAll(regex)) {
9952
9965
  const token = match[1];
9953
9966
  const offset = (match.index ?? 0) + (match[0].length - token.length);
9954
9967
  if (/^\/[a-z]/.test(prompt.slice(offset + token.length))) continue;
9955
- const parsed = parseImageMentionToken(token);
9956
- if (parsed && knownSet.has(parsed.imageSlug)) {
9968
+ const parsed = parseMentionToken(token);
9969
+ if (parsed && knownSet.has(parsed.slug)) {
9957
9970
  tokens.push({ token, ...parsed, offset });
9958
9971
  }
9959
9972
  }
9960
9973
  return tokens;
9961
9974
  }
9975
+
9976
+ // src/image-mention-slug.ts
9977
+ function imageMentionSlug(name) {
9978
+ return mentionNameSlug(name);
9979
+ }
9980
+ function parseImageMentionToken(text) {
9981
+ const parsed = parseMentionToken(text);
9982
+ if (!parsed) return null;
9983
+ return {
9984
+ imageSlug: parsed.slug,
9985
+ imageIndex: parsed.index,
9986
+ ...parsed.role !== void 0 ? { role: parsed.role } : {},
9987
+ ...parsed.lock !== void 0 ? { lock: parsed.lock } : {}
9988
+ };
9989
+ }
9990
+ function findImageMentionTokens(prompt, knownImageSlugs) {
9991
+ return findMentionTokens(prompt, knownImageSlugs).map((t2) => ({
9992
+ token: t2.token,
9993
+ imageSlug: t2.slug,
9994
+ imageIndex: t2.index,
9995
+ ...t2.role !== void 0 ? { role: t2.role } : {},
9996
+ ...t2.lock !== void 0 ? { lock: t2.lock } : {},
9997
+ offset: t2.offset
9998
+ }));
9999
+ }
9962
10000
  function imageMentionSlugForRef(r) {
9963
10001
  if (r.source !== "wired-image" && r.source !== "manual") return null;
9964
10002
  if (r.isExtraRef === true) return null;
9965
10003
  if (!r.url || !r.defaultName) return null;
9966
10004
  const slug = imageMentionSlug(r.defaultName);
9967
- return IMAGE_SLUG_PATTERN.test(slug) ? slug : null;
10005
+ return MENTION_SLUG_PATTERN.test(slug) ? slug : null;
9968
10006
  }
9969
10007
  function knownImageSlugsFromRefs(refs) {
9970
10008
  const out = /* @__PURE__ */ new Set();
@@ -9975,6 +10013,46 @@ function knownImageSlugsFromRefs(refs) {
9975
10013
  return [...out];
9976
10014
  }
9977
10015
 
10016
+ // src/entity-mention-slug.ts
10017
+ function entityMentionSlug(name) {
10018
+ return mentionNameSlug(name);
10019
+ }
10020
+ function parseEntityMentionToken(text) {
10021
+ const parsed = parseMentionToken(text);
10022
+ if (!parsed) return null;
10023
+ return {
10024
+ entitySlug: parsed.slug,
10025
+ entityIndex: parsed.index,
10026
+ ...parsed.role !== void 0 ? { role: parsed.role } : {},
10027
+ ...parsed.lock !== void 0 ? { lock: parsed.lock } : {}
10028
+ };
10029
+ }
10030
+ function findEntityMentionTokens(prompt, knownEntitySlugs) {
10031
+ return findMentionTokens(prompt, knownEntitySlugs).map((t2) => ({
10032
+ token: t2.token,
10033
+ entitySlug: t2.slug,
10034
+ entityIndex: t2.index,
10035
+ ...t2.role !== void 0 ? { role: t2.role } : {},
10036
+ ...t2.lock !== void 0 ? { lock: t2.lock } : {},
10037
+ offset: t2.offset
10038
+ }));
10039
+ }
10040
+ function entityMentionSlugForRef(r) {
10041
+ if (r.source !== "wired-creature" && r.source !== "wired-object") return null;
10042
+ if (r.isExtraRef === true) return null;
10043
+ if (!r.url || !r.defaultName) return null;
10044
+ const slug = entityMentionSlug(r.defaultName);
10045
+ return MENTION_SLUG_PATTERN.test(slug) ? slug : null;
10046
+ }
10047
+ function knownEntitySlugsFromRefs(refs) {
10048
+ const out = /* @__PURE__ */ new Set();
10049
+ for (const r of refs) {
10050
+ const slug = entityMentionSlugForRef(r);
10051
+ if (slug) out.add(slug);
10052
+ }
10053
+ return [...out];
10054
+ }
10055
+
9978
10056
  // src/to-connected-references.ts
9979
10057
  function toConnectedReference(entity) {
9980
10058
  if (entity.kind === "character") {
@@ -12132,6 +12210,12 @@ var DYNAMIC_PRODUCER_TYPES = /* @__PURE__ */ new Set([
12132
12210
  // EVERY producer set or its outputs can't connect (was the "cannot connect
12133
12211
  // the outputs of voice-changer-pro" bug). Guarded by producer-types.test.ts.
12134
12212
  "voice-changer-pro",
12213
+ // Dubbing joined the dual-mode family with the full-surface upgrade:
12214
+ // audio in → dubbed audio; video in (or a video sourceUrl) → dubbed VIDEO
12215
+ // (+ audio sidecar). Same wiring contract as voice-changer; stays in
12216
+ // AUDIO_PRODUCER_TYPES as its default. Explicitly asserted in
12217
+ // producer-types.test.ts (the suite does not fail on omission).
12218
+ "dubbing",
12135
12219
  "reduce",
12136
12220
  // Dual-output time chunker (UI label "Split into Chunks"; type id stays
12137
12221
  // "split-media"): video in → video chunks, audio in → audio chunks — two
@@ -14278,6 +14362,8 @@ exports.effectiveReasoningEffort = effectiveReasoningEffort;
14278
14362
  exports.encodeProviderItem = encodeProviderItem;
14279
14363
  exports.ensureLocaleCatalogLoaded = ensureLocaleCatalogLoaded;
14280
14364
  exports.entityHydrationColumns = entityHydrationColumns;
14365
+ exports.entityMentionSlug = entityMentionSlug;
14366
+ exports.entityMentionSlugForRef = entityMentionSlugForRef;
14281
14367
  exports.entityScalarFields = entityScalarFields;
14282
14368
  exports.entitySlotSchema = entitySlotSchema;
14283
14369
  exports.entryMatchesQuery = entryMatchesQuery;
@@ -14303,6 +14389,7 @@ exports.extractVideoDurationFromNode = extractVideoDurationFromNode;
14303
14389
  exports.fieldKeyFromHandle = fieldKeyFromHandle;
14304
14390
  exports.filterCloneNodes = filterCloneNodes;
14305
14391
  exports.findCharacterMentionTokens = findCharacterMentionTokens;
14392
+ exports.findEntityMentionTokens = findEntityMentionTokens;
14306
14393
  exports.findImageMentionTokens = findImageMentionTokens;
14307
14394
  exports.findLocationMentionTokens = findLocationMentionTokens;
14308
14395
  exports.findSeedance2AudioOverLimit = findSeedance2AudioOverLimit;
@@ -14310,6 +14397,8 @@ exports.firstSightExtraRole = firstSightExtraRole;
14310
14397
  exports.flattenItems = flattenItems;
14311
14398
  exports.getAnimal = getAnimal;
14312
14399
  exports.getAnimalLabel = getAnimalLabel;
14400
+ exports.getAnimalPromptHint = getAnimalPromptHint;
14401
+ exports.getAnimalTerm = getAnimalTerm;
14313
14402
  exports.getAspectRatioOptions = getAspectRatioOptions;
14314
14403
  exports.getAudioCrossfadeCurve = getAudioCrossfadeCurve;
14315
14404
  exports.getCharacterFacet = getCharacterFacet;
@@ -14385,6 +14474,7 @@ exports.isVeoProvider = isVeoProvider;
14385
14474
  exports.isVideoAnalysisMixedTier = isVideoAnalysisMixedTier;
14386
14475
  exports.isVideoAnalysisTier = isVideoAnalysisTier;
14387
14476
  exports.jsonResultToList = jsonResultToList;
14477
+ exports.knownEntitySlugsFromRefs = knownEntitySlugsFromRefs;
14388
14478
  exports.knownImageSlugsFromRefs = knownImageSlugsFromRefs;
14389
14479
  exports.listBoardTemplates = listBoardTemplates;
14390
14480
  exports.listModels = listModels;
@@ -14418,6 +14508,7 @@ exports.normalizeRoleSlug = normalizeRoleSlug;
14418
14508
  exports.orderedLlmModels = orderedLlmModels;
14419
14509
  exports.parseAttributedDialogue = parseAttributedDialogue;
14420
14510
  exports.parseCharacterMentionToken = parseCharacterMentionToken;
14511
+ exports.parseEntityMentionToken = parseEntityMentionToken;
14421
14512
  exports.parseGroupHandle = parseGroupHandle;
14422
14513
  exports.parseHandleId = parseHandleId;
14423
14514
  exports.parseImageMentionToken = parseImageMentionToken;