@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 +111 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +250 -18
- package/dist/index.d.ts +250 -18
- package/dist/index.js +105 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/entity-mention-slug.test.ts +380 -0
- package/src/__tests__/producer-types.test.ts +22 -0
- package/src/animals.ts +57 -0
- package/src/entity-mention-slug.ts +203 -0
- package/src/image-mention-slug.ts +47 -96
- package/src/index.ts +18 -0
- package/src/mention-token-grammar.ts +167 -0
- package/src/model-catalog.ts +2 -2
- package/src/producer-types.ts +6 -0
- package/src/types.ts +11 -5
- package/src/workflow-export.ts +34 -0
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:
|
|
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/
|
|
9920
|
-
var
|
|
9921
|
-
function
|
|
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
|
|
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 [
|
|
9939
|
-
if (!
|
|
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
|
|
9942
|
-
if (!Number.isInteger(
|
|
9943
|
-
if (parts.length === 2) return {
|
|
9944
|
-
if (!
|
|
9945
|
-
return {
|
|
9946
|
-
}
|
|
9947
|
-
|
|
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 =
|
|
9950
|
-
const knownSet = new Set(
|
|
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 =
|
|
9956
|
-
if (parsed && knownSet.has(parsed.
|
|
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
|
|
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;
|