@mevdragon/vidfarm-devcli 0.2.13 → 0.3.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/README.md +11 -4
- package/SKILL.director.md +97 -0
- package/SKILL.platform.md +66 -6
- package/dist/src/cli.js +137 -1524
- package/dist/src/dev-serve.js +169 -0
- package/package.json +5 -24
- package/.env.example +0 -60
- package/auto-create-hyperframe-templates/AUTO_CREATE_HYPERFRAME_TEMPLATES.md +0 -275
- package/auto-create-hyperframe-templates/extractor-system-prompt.md +0 -128
- package/auto-create-hyperframe-templates/input-manifest.schema.json +0 -56
- package/auto-create-hyperframe-templates/lambda-memory-estimator.md +0 -118
- package/auto-create-hyperframe-templates/production-graph.schema.json +0 -314
- package/auto-create-hyperframe-templates/runbook.md +0 -198
- package/auto-create-hyperframe-templates/scripts/create-hyperframe-template.mjs +0 -368
- package/auto-create-hyperframe-templates/template-plan.schema.json +0 -311
- package/auto-create-hyperframe-templates/template-planner-prompt.md +0 -144
- package/auto-create-templates/AUTO_CREATE_TEMPLATES.md +0 -599
- package/auto-create-templates/extractor-system-prompt.md +0 -119
- package/auto-create-templates/production-graph.schema.json +0 -276
- package/auto-create-templates/runbook.md +0 -140
- package/auto-create-templates/template-plan.schema.json +0 -301
- package/auto-create-templates/template-planner-prompt.md +0 -137
- package/dist/src/account-pages-legacy.js +0 -9336
- package/dist/src/account-pages-legacy.js.map +0 -1
- package/dist/src/account-pages.js +0 -61
- package/dist/src/account-pages.js.map +0 -1
- package/dist/src/app.js +0 -14023
- package/dist/src/app.js.map +0 -1
- package/dist/src/cli.js.map +0 -1
- package/dist/src/composition-runtime.js +0 -581
- package/dist/src/composition-runtime.js.map +0 -1
- package/dist/src/config.js +0 -140
- package/dist/src/config.js.map +0 -1
- package/dist/src/context.js +0 -492
- package/dist/src/context.js.map +0 -1
- package/dist/src/dev-app-legacy.js +0 -694
- package/dist/src/dev-app-legacy.js.map +0 -1
- package/dist/src/dev-app.js +0 -6
- package/dist/src/dev-app.js.map +0 -1
- package/dist/src/domain.js +0 -2
- package/dist/src/domain.js.map +0 -1
- package/dist/src/editor-chat-history.js +0 -82
- package/dist/src/editor-chat-history.js.map +0 -1
- package/dist/src/editor-chat.js +0 -311
- package/dist/src/editor-chat.js.map +0 -1
- package/dist/src/frontend/flockposter-cache-store.js +0 -124
- package/dist/src/frontend/flockposter-cache-store.js.map +0 -1
- package/dist/src/frontend/homepage-client.js +0 -117
- package/dist/src/frontend/homepage-client.js.map +0 -1
- package/dist/src/frontend/homepage-shared.js +0 -4
- package/dist/src/frontend/homepage-shared.js.map +0 -1
- package/dist/src/frontend/homepage-store.js +0 -28
- package/dist/src/frontend/homepage-store.js.map +0 -1
- package/dist/src/frontend/homepage-view.js +0 -260
- package/dist/src/frontend/homepage-view.js.map +0 -1
- package/dist/src/frontend/page-runtime-client.js +0 -103
- package/dist/src/frontend/page-runtime-client.js.map +0 -1
- package/dist/src/frontend/page-runtime-store.js +0 -9
- package/dist/src/frontend/page-runtime-store.js.map +0 -1
- package/dist/src/frontend/sentry.js +0 -42
- package/dist/src/frontend/sentry.js.map +0 -1
- package/dist/src/frontend/template-editor-chat.js +0 -3767
- package/dist/src/frontend/template-editor-chat.js.map +0 -1
- package/dist/src/help-page.js +0 -333
- package/dist/src/help-page.js.map +0 -1
- package/dist/src/homepage.js +0 -919
- package/dist/src/homepage.js.map +0 -1
- package/dist/src/hyperframes/composition.js +0 -180
- package/dist/src/hyperframes/composition.js.map +0 -1
- package/dist/src/index.js +0 -16
- package/dist/src/index.js.map +0 -1
- package/dist/src/instrument.js +0 -30
- package/dist/src/instrument.js.map +0 -1
- package/dist/src/lib/crypto.js +0 -45
- package/dist/src/lib/crypto.js.map +0 -1
- package/dist/src/lib/dev-log.js +0 -54
- package/dist/src/lib/dev-log.js.map +0 -1
- package/dist/src/lib/display-name.js +0 -11
- package/dist/src/lib/display-name.js.map +0 -1
- package/dist/src/lib/ids.js +0 -24
- package/dist/src/lib/ids.js.map +0 -1
- package/dist/src/lib/images.js +0 -19
- package/dist/src/lib/images.js.map +0 -1
- package/dist/src/lib/json.js +0 -15
- package/dist/src/lib/json.js.map +0 -1
- package/dist/src/lib/template-dna.js +0 -543
- package/dist/src/lib/template-dna.js.map +0 -1
- package/dist/src/lib/template-paths.js +0 -28
- package/dist/src/lib/template-paths.js.map +0 -1
- package/dist/src/lib/template-style-options.js +0 -203
- package/dist/src/lib/template-style-options.js.map +0 -1
- package/dist/src/lib/time.js +0 -7
- package/dist/src/lib/time.js.map +0 -1
- package/dist/src/lib/video-quality-harness.js +0 -60
- package/dist/src/lib/video-quality-harness.js.map +0 -1
- package/dist/src/page-runtime.js +0 -2
- package/dist/src/page-runtime.js.map +0 -1
- package/dist/src/page-shell.js +0 -2393
- package/dist/src/page-shell.js.map +0 -1
- package/dist/src/primitive-context.js +0 -299
- package/dist/src/primitive-context.js.map +0 -1
- package/dist/src/primitive-registry.js +0 -2181
- package/dist/src/primitive-registry.js.map +0 -1
- package/dist/src/primitive-sdk.js +0 -4
- package/dist/src/primitive-sdk.js.map +0 -1
- package/dist/src/primitives/remotion/html-image.js +0 -30
- package/dist/src/primitives/remotion/html-image.js.map +0 -1
- package/dist/src/primitives/remotion/media-slideshow.js +0 -60
- package/dist/src/primitives/remotion/media-slideshow.js.map +0 -1
- package/dist/src/react-page-shell.js +0 -35
- package/dist/src/react-page-shell.js.map +0 -1
- package/dist/src/ready-post-schedule-component.js +0 -1515
- package/dist/src/ready-post-schedule-component.js.map +0 -1
- package/dist/src/registry.js +0 -296
- package/dist/src/registry.js.map +0 -1
- package/dist/src/runtime.js +0 -31
- package/dist/src/runtime.js.map +0 -1
- package/dist/src/services/api-call-history.js +0 -249
- package/dist/src/services/api-call-history.js.map +0 -1
- package/dist/src/services/auth.js +0 -152
- package/dist/src/services/auth.js.map +0 -1
- package/dist/src/services/billing.js +0 -231
- package/dist/src/services/billing.js.map +0 -1
- package/dist/src/services/chat-threads.js +0 -92
- package/dist/src/services/chat-threads.js.map +0 -1
- package/dist/src/services/fork-access.js +0 -94
- package/dist/src/services/fork-access.js.map +0 -1
- package/dist/src/services/ghostcut.js +0 -132
- package/dist/src/services/ghostcut.js.map +0 -1
- package/dist/src/services/hyperframes.js +0 -1014
- package/dist/src/services/hyperframes.js.map +0 -1
- package/dist/src/services/job-capacity.js +0 -14
- package/dist/src/services/job-capacity.js.map +0 -1
- package/dist/src/services/job-logs.js +0 -197
- package/dist/src/services/job-logs.js.map +0 -1
- package/dist/src/services/jobs.js +0 -136
- package/dist/src/services/jobs.js.map +0 -1
- package/dist/src/services/media-processing.js +0 -743
- package/dist/src/services/media-processing.js.map +0 -1
- package/dist/src/services/primitive-media-lambda.js +0 -280
- package/dist/src/services/primitive-media-lambda.js.map +0 -1
- package/dist/src/services/providers.js +0 -2870
- package/dist/src/services/providers.js.map +0 -1
- package/dist/src/services/rate-limits.js +0 -237
- package/dist/src/services/rate-limits.js.map +0 -1
- package/dist/src/services/remotion.js +0 -688
- package/dist/src/services/remotion.js.map +0 -1
- package/dist/src/services/serverless-auth.js +0 -374
- package/dist/src/services/serverless-auth.js.map +0 -1
- package/dist/src/services/serverless-jobs.js +0 -1074
- package/dist/src/services/serverless-jobs.js.map +0 -1
- package/dist/src/services/serverless-provider-keys.js +0 -401
- package/dist/src/services/serverless-provider-keys.js.map +0 -1
- package/dist/src/services/serverless-records.js +0 -1086
- package/dist/src/services/serverless-records.js.map +0 -1
- package/dist/src/services/serverless-template-configs.js +0 -67
- package/dist/src/services/serverless-template-configs.js.map +0 -1
- package/dist/src/services/storage.js +0 -382
- package/dist/src/services/storage.js.map +0 -1
- package/dist/src/services/template-certification.js +0 -475
- package/dist/src/services/template-certification.js.map +0 -1
- package/dist/src/services/template-loader.js +0 -99
- package/dist/src/services/template-loader.js.map +0 -1
- package/dist/src/services/template-runtime-bundles.js +0 -217
- package/dist/src/services/template-runtime-bundles.js.map +0 -1
- package/dist/src/services/template-sources.js +0 -1017
- package/dist/src/services/template-sources.js.map +0 -1
- package/dist/src/services/video-normalization.js +0 -2
- package/dist/src/services/video-normalization.js.map +0 -1
- package/dist/src/services/webhooks.js +0 -62
- package/dist/src/services/webhooks.js.map +0 -1
- package/dist/src/template-editor-pages.js +0 -6624
- package/dist/src/template-editor-pages.js.map +0 -1
- package/dist/src/template-editor-shell.js +0 -2713
- package/dist/src/template-editor-shell.js.map +0 -1
- package/dist/src/template-sdk.js +0 -4
- package/dist/src/template-sdk.js.map +0 -1
- package/dist/src/worker.js +0 -17
- package/dist/src/worker.js.map +0 -1
- package/public/assets/homepage-app.js +0 -54
- package/public/assets/homepage-client-app.js +0 -80
- package/public/assets/page-runtime-client-app.js +0 -94
- package/readme.secret.md +0 -89
- package/templates/vidfarm_template_0000/README.md +0 -106
- package/templates/vidfarm_template_0000/SKILL.md +0 -266
- package/templates/vidfarm_template_0000/assets/Abel-Regular.ttf +0 -0
- package/templates/vidfarm_template_0000/assets/DMSerifDisplay-Regular.ttf +0 -0
- package/templates/vidfarm_template_0000/assets/Montserrat[wght].ttf +0 -0
- package/templates/vidfarm_template_0000/assets/SourceCodePro[wght].ttf +0 -0
- package/templates/vidfarm_template_0000/assets/TikTokSans-SemiBold.ttf +0 -0
- package/templates/vidfarm_template_0000/assets/Yesteryear-Regular.ttf +0 -0
- package/templates/vidfarm_template_0000/composition.json +0 -11
- package/templates/vidfarm_template_0000/src/lib/images.js +0 -221
- package/templates/vidfarm_template_0000/src/remotion/Root.js +0 -33
- package/templates/vidfarm_template_0000/src/remotion/index.js +0 -3
- package/templates/vidfarm_template_0000/src/sdk.js +0 -3
- package/templates/vidfarm_template_0000/src/style-options.js +0 -200
- package/templates/vidfarm_template_0000/src/template-dna.js +0 -9
- package/templates/vidfarm_template_0000/src/template.js +0 -1566
- package/templates/vidfarm_template_0000/template.config.json +0 -21
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-app-legacy.js","sourceRoot":"","sources":["../../src/dev-app-legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAExF,MAAM,UAAU,YAAY,CAAC,KAAyE;IACpG,MAAM,IAAI,GAAG,iBAAiB,CAAC;QAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,SAAS;KACvB,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;QACrB,KAAK,EAAE,2BAA2B;QAClC,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE;;;YAGE,iBAAiB,EAAE;;;iCAGE,KAAK,CAAC,WAAW;;;;;;;;;;;;;;;gEAec,KAAK,CAAC,WAAW;;;;qEAIZ,KAAK,CAAC,SAAS,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAwJpE,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgYtB;QACD,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsHN;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/src/dev-app.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { renderDevApp as renderDevAppLegacy } from "./dev-app-legacy.js";
|
|
2
|
-
import { renderLegacyPageAsReact } from "./react-page-shell.js";
|
|
3
|
-
export function renderDevApp(...args) {
|
|
4
|
-
return renderLegacyPageAsReact(renderDevAppLegacy(...args));
|
|
5
|
-
}
|
|
6
|
-
//# sourceMappingURL=dev-app.js.map
|
package/dist/src/dev-app.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev-app.js","sourceRoot":"","sources":["../../src/dev-app.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,YAAY,CAAC,GAAG,IAA2C;IACzE,OAAO,uBAAuB,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/src/domain.js
DELETED
package/dist/src/domain.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/domain.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
const MAX_CHAT_PAYLOAD_STRING_LENGTH = 1200;
|
|
2
|
-
const MAX_CHAT_PAYLOAD_ARRAY_ITEMS = 24;
|
|
3
|
-
const MAX_CHAT_PAYLOAD_OBJECT_KEYS = 80;
|
|
4
|
-
const DATA_URL_PREFIX_REGEX = /^data:([^;,]+)[^,]*,/i;
|
|
5
|
-
const SECRET_HEADER_REGEX = /authorization|api[-_]?key|secret|token|vidfarm-api-key/i;
|
|
6
|
-
function summarizeLargeString(value) {
|
|
7
|
-
const dataUrlMatch = DATA_URL_PREFIX_REGEX.exec(value);
|
|
8
|
-
if (dataUrlMatch) {
|
|
9
|
-
return `[${dataUrlMatch[1]} data URL omitted, ${value.length.toLocaleString()} chars]`;
|
|
10
|
-
}
|
|
11
|
-
if (value.length > MAX_CHAT_PAYLOAD_STRING_LENGTH) {
|
|
12
|
-
return `${value.slice(0, MAX_CHAT_PAYLOAD_STRING_LENGTH)}... [truncated ${value.length.toLocaleString()} chars]`;
|
|
13
|
-
}
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
export function sanitizeChatPayload(value, depth = 0) {
|
|
17
|
-
if (value === null || value === undefined) {
|
|
18
|
-
return value;
|
|
19
|
-
}
|
|
20
|
-
if (typeof value === "string") {
|
|
21
|
-
return summarizeLargeString(value);
|
|
22
|
-
}
|
|
23
|
-
if (typeof value === "number" || typeof value === "boolean") {
|
|
24
|
-
return value;
|
|
25
|
-
}
|
|
26
|
-
if (typeof value === "bigint") {
|
|
27
|
-
return value.toString();
|
|
28
|
-
}
|
|
29
|
-
if (typeof value === "function" || typeof value === "symbol") {
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
if (depth >= 8) {
|
|
33
|
-
return "[nested payload omitted]";
|
|
34
|
-
}
|
|
35
|
-
if (Array.isArray(value)) {
|
|
36
|
-
const items = value
|
|
37
|
-
.slice(0, MAX_CHAT_PAYLOAD_ARRAY_ITEMS)
|
|
38
|
-
.map((entry) => sanitizeChatPayload(entry, depth + 1));
|
|
39
|
-
if (value.length > MAX_CHAT_PAYLOAD_ARRAY_ITEMS) {
|
|
40
|
-
items.push(`[${value.length - MAX_CHAT_PAYLOAD_ARRAY_ITEMS} more items omitted]`);
|
|
41
|
-
}
|
|
42
|
-
return items;
|
|
43
|
-
}
|
|
44
|
-
if (typeof value === "object") {
|
|
45
|
-
const output = {};
|
|
46
|
-
const entries = Object.entries(value);
|
|
47
|
-
for (const [key, entry] of entries.slice(0, MAX_CHAT_PAYLOAD_OBJECT_KEYS)) {
|
|
48
|
-
const sanitized = sanitizeChatPayload(entry, depth + 1);
|
|
49
|
-
if (sanitized !== undefined) {
|
|
50
|
-
output[key] = sanitized;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (entries.length > MAX_CHAT_PAYLOAD_OBJECT_KEYS) {
|
|
54
|
-
output.__omitted_keys = entries.length - MAX_CHAT_PAYLOAD_OBJECT_KEYS;
|
|
55
|
-
}
|
|
56
|
-
return output;
|
|
57
|
-
}
|
|
58
|
-
return String(value);
|
|
59
|
-
}
|
|
60
|
-
export function sanitizeHttpExchange(exchange) {
|
|
61
|
-
return {
|
|
62
|
-
...exchange,
|
|
63
|
-
request: {
|
|
64
|
-
...exchange.request,
|
|
65
|
-
headers: Object.fromEntries(Object.entries(exchange.request.headers).map(([key, value]) => [
|
|
66
|
-
key,
|
|
67
|
-
SECRET_HEADER_REGEX.test(key) ? "[redacted]" : summarizeLargeString(value)
|
|
68
|
-
])),
|
|
69
|
-
body: sanitizeChatPayload(exchange.request.body)
|
|
70
|
-
},
|
|
71
|
-
result: {
|
|
72
|
-
...exchange.result,
|
|
73
|
-
headers: Object.fromEntries(Object.entries(exchange.result.headers).map(([key, value]) => [
|
|
74
|
-
key,
|
|
75
|
-
SECRET_HEADER_REGEX.test(key) ? "[redacted]" : summarizeLargeString(value)
|
|
76
|
-
])),
|
|
77
|
-
body: sanitizeChatPayload(exchange.result.body),
|
|
78
|
-
error: exchange.result.error ? summarizeLargeString(exchange.result.error) : exchange.result.error
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=editor-chat-history.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-chat-history.js","sourceRoot":"","sources":["../../src/editor-chat-history.ts"],"names":[],"mappings":"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"}
|
package/dist/src/editor-chat.js
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
export const EDITOR_CHAT_PROVIDER_PRIORITY = [
|
|
2
|
-
"openai",
|
|
3
|
-
"gemini",
|
|
4
|
-
"openrouter",
|
|
5
|
-
"perplexity"
|
|
6
|
-
];
|
|
7
|
-
const EDITOR_CHAT_COMPACT_CHAR_THRESHOLD = 48_000;
|
|
8
|
-
const EDITOR_CHAT_COMPACT_RECENT_MESSAGES = 14;
|
|
9
|
-
const EDITOR_CHAT_COMPACT_MAX_SUMMARY_CHARS = 12_000;
|
|
10
|
-
const EDITOR_CHAT_COMPACT_MAX_MESSAGE_CHARS = 1_200;
|
|
11
|
-
export function defaultEditorChatModel(provider) {
|
|
12
|
-
switch (provider) {
|
|
13
|
-
case "openai":
|
|
14
|
-
return "gpt-5.4-mini";
|
|
15
|
-
case "gemini":
|
|
16
|
-
return "gemini-3.5-flash";
|
|
17
|
-
case "openrouter":
|
|
18
|
-
return "qwen/qwen3.6-plus";
|
|
19
|
-
case "perplexity":
|
|
20
|
-
return "sonar";
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export function buildTemplateEditorChatSystemPrompt(input) {
|
|
24
|
-
const routeLines = input.docsRoutes
|
|
25
|
-
.map((route) => `- ${route.method} ${route.path}: ${route.summary}`)
|
|
26
|
-
.join("\n");
|
|
27
|
-
return [
|
|
28
|
-
"You are Vidfarm's HyperFrames composition copilot.",
|
|
29
|
-
"Help the user understand and operate this composition through its timeline, layers, HyperFrames render primitive, and existing REST surface.",
|
|
30
|
-
"Be concrete. Prefer exact route names, payload fields, and tracer usage over generic advice.",
|
|
31
|
-
"If you mention a route or operation, only mention routes that exist in the provided composition context.",
|
|
32
|
-
"If attachments are present, reason about them as user-supplied reference assets for timeline layers, primitive image generation, primitive image edits, HyperFrames renders, or primitive AI video generation.",
|
|
33
|
-
"When the user wants to render the composition, prefer POST /api/v1/primitives/hyperframes/render when enough layer/timeline information is available.",
|
|
34
|
-
"Execute REST calls sequentially. Make one API call, inspect the response, then decide the next step.",
|
|
35
|
-
"A queued async POST job is enough inspection for that request. Do not poll it in the same response; continue launching any remaining requested outputs, then summarize the queued jobs.",
|
|
36
|
-
"Primitive routes under /api/v1/primitives are first-class allowed routes in this editor, even when the primitive is not specific to the current template.",
|
|
37
|
-
"Never say you cannot use primitive image generation, image edit, inpaint, HTML render, AI video generation, or video render routes directly from this editor chat; use the http_request tool when the requested primitive route exists.",
|
|
38
|
-
"All primitive POST routes require the same outer JSON envelope: top-level tracer, top-level payload containing the primitive-specific fields, and optional webhook_url.",
|
|
39
|
-
"When the user explicitly asks to use primitives or HyperFrames rendering, do not redirect them to old per-template operation routes unless the requested primitive route cannot accept the available inputs.",
|
|
40
|
-
"If the user asks to create, generate, or make a new image similar to an attached image, call POST /api/v1/primitives/images/generate with body { tracer, payload: { prompt, prompt_attachments: [exact attachment URL] } }.",
|
|
41
|
-
"Use POST /api/v1/primitives/images/edit only when the user wants to revise the attached/source image itself; its body is { tracer, payload: { source_image_url, instruction, reference_attachments? } }. Use POST /api/v1/primitives/images/generate when they want a new image inspired by or similar to the attachment.",
|
|
42
|
-
"If the user asks to modify an attached image and the message includes an attachment URL, call POST /api/v1/primitives/images/edit with source_image_url inside payload set to that exact URL and instruction inside payload set to the requested edit.",
|
|
43
|
-
"If the user asks to generate a new AI video from text or reference images, call POST /api/v1/primitives/videos/generate with body { tracer, payload: { prompt, input_references?, duration? } }. AI video duration is seconds; use duration: 4 for a 4-second video and never use duration_ms on /videos/generate. input_references must be direct image asset URLs, not webpage or social post URLs. Use frame_images for exact first/last-frame image-to-video.",
|
|
44
|
-
"If the user asks to render HTML/design into an image, call POST /api/v1/primitives/images/render-html. If the user asks to turn existing media URLs into a slideshow/video, call POST /api/v1/primitives/videos/render-slides. Primitive media utility routes are also allowed directly here, including /videos/trim, /videos/extract-audio, /videos/probe, /videos/extract-frame, /videos/mute, /videos/replace-audio, /videos/concat, /audio/trim, /audio/probe, /audio/concat, and /audio/normalize.",
|
|
45
|
-
"Brainstorm primitives are also available directly here. If the user explicitly asks for hooks, angles, awareness-stage advice, or a cold-start strategy questionnaire, call the matching brainstorm primitive immediately instead of brainstorming in chat from memory. Use POST /api/v1/primitives/brainstorm/coldstart with body { tracer, payload: { user_message }, webhook_url? } when the user is clueless and needs foundational strategy questions. Use /brainstorm/awareness_stages with body { tracer, payload: { offer_description }, webhook_url? } when they are unsure what type of ads to make. Use /brainstorm/angles with body { tracer, payload: { offer_description, problem_awareness, solution_awareness }, webhook_url? } when they want persuasive ad angles; problem_awareness must be problem_unaware or problem_aware, and solution_awareness must be solution_unaware or solution_aware. Use /brainstorm/hooks with body { tracer, payload: { offer_description }, webhook_url? } when they are stuck on openings and want many hooks.",
|
|
46
|
-
"When brainstorm jobs finish and the response includes a JSON artifact, tell the user to open and review that JSON in the chat UI because it contains the structured brainstorm output.",
|
|
47
|
-
"When the user asks for content ideas or says they do not know where to start, prefer this sequence: coldstart -> awareness_stages -> angles -> hooks, then choose a composition and layer plan from the resulting strategy.",
|
|
48
|
-
"When chaining one render or primitive output into another step, copy the exact nested payload returned by the previous response, such as result.renderVideoInput. Do not reconstruct, normalize, shorten, expand, or add job IDs to media URLs, S3 keys, durations, or slide arrays.",
|
|
49
|
-
"Never claim that you called a REST route, started rendering, concatenated slides, or created a job unless the http_request tool returned that result in this response.",
|
|
50
|
-
"Never invent or infer a job_id. Only mention a job_id that appears verbatim in an http_request tool response body or a job status response.",
|
|
51
|
-
"If you need to make an API call, call the http_request tool; do not write prose such as 'Here is the http_request call' unless the tool call has actually completed and the UI will show its exchange.",
|
|
52
|
-
"Do not fan out multiple operation calls, repeated polling bursts, or speculative retries in parallel.",
|
|
53
|
-
"Prefer the minimum number of API calls needed to complete the user's request, but if the user asks for N distinct generated outputs, make N sequential POST calls. Do not stop after the first queued job when the user asked for more than one output.",
|
|
54
|
-
"For composition or primitive routes that generate one card, post, render, or asset per job, do not collapse a counted request into one job unless the user explicitly asks for one combined job.",
|
|
55
|
-
"Treat tracers as the work-organization primitive. The current chat thread's tracers are the source of truth for API context.",
|
|
56
|
-
"Reuse the default request tracer for the current chat thread unless the user explicitly asks for a separate parallel stream.",
|
|
57
|
-
"When you start or revise work with a POST composition, HyperFrames render, or primitive route, include a tracer in the JSON body.",
|
|
58
|
-
"If the user asks for each output to have its own tracer, use a different readable tracer base for each POST request.",
|
|
59
|
-
"If the user asks for separate tracers for multiple outputs, also create a separate tracer-scoped chat thread for each output by calling frontend_action with action=create_thread for each tracer before or alongside the corresponding POST request.",
|
|
60
|
-
"If the user asks for each output to have its own chat thread, call frontend_action with action=create_thread for each tracer before or alongside the corresponding POST request.",
|
|
61
|
-
"If multiple tracers are available, mention which tracer you are using when it matters.",
|
|
62
|
-
"If the user asks to add, remove, switch tracers, or create a separate chat thread for a tracer, use the frontend_action tool so the page state updates directly.",
|
|
63
|
-
"If the user asks to add, remove, retime, reposition, resize, restyle, swap media, tag, note, group, ungroup, duplicate, or split layers on the composition timeline, call the editor_action tool. Supported action_type values are add_layer, remove_layer, set_layer_timing, set_layer_visual, set_layer_style, set_layer_media, set_layer_text, set_layer_identity, duplicate_layer, split_layer, group_layers, ungroup_layers, and replace_composition_html.",
|
|
64
|
-
"Each layer in editor_context includes element_id (data-hf-id), optional slug (data-hf-slug), and optional note (data-hf-note). layer_key on any editor_action may be EITHER the element_id or the slug — prefer the slug when the user (or a viral DNA blurb) refers to a layer by its human name like 'the hero_image'. Use set_layer_identity to add/change a layer's slug or note. Slugs are the stable AI-friendly handle: when planning viral DNA notes, reference the element by its slug (e.g., 'raise the {{hero_image}} to full canvas at 4s') so future turns can resolve it deterministically.",
|
|
65
|
-
"Treat the most recent <editor_context> block in the user message as the source of truth for current layer_keys, layer indices (called track in HTML: track=layer index, higher = drawn on top), durations, and composition_duration_seconds. Never invent layer_keys for remove/set/duplicate/split actions; only reference keys that appear there.",
|
|
66
|
-
"For add_layer, always supply a stable layer_key (e.g., vf-caption-hook, vf-hero-image, vf-narration-audio) so later tool calls in the same turn can reference the new layer without waiting for the next <editor_context>. The editor uses that layer_key as the new layer's id. Choose kind from video, image, audio, text, or html. Provide src (exact URL) for video/image/audio, text for text layers, and html for html layers. Pick a track index higher than every existing layer on the requested time range, or set start/duration so the range is collision-free. Default visual layers fill roughly the upper-middle of the canvas; text layers default to a lower-third band. Always include explanation.",
|
|
67
|
-
"When the user asks for AI-generated media in the timeline, first call http_request to the matching primitive route (e.g., /api/v1/primitives/images/generate, /videos/generate, /videos/render-slides, /images/edit), wait for the response, copy the exact returned media URL, then call editor_action with action_type=add_layer, src equal to that URL, and a chosen layer_key. Do not invent media URLs or describe media that was not returned by a tool result in this response.",
|
|
68
|
-
"Use set_layer_visual for geometry (x, y, width, height in %, plus font_size and border_radius in px). Use set_layer_style for text/color styling (color, background, background_style plain|outline|highlight-solid|highlight-translucent, font_family, font_weight, italic, underline, text_align, border_radius, font_size). Use set_layer_media to swap src, volume, muted, playback_start, or object_fit on media layers. Use set_layer_timing for start, duration, track index, playback_start.",
|
|
69
|
-
"Use duplicate_layer to clone an existing layer; supply layer_key for the source, and optionally start/duration/track/label on the duplicate. Use split_layer with layer_key and split_time to cut at a moment in the timeline. Use group_layers with layer_keys (>=2) and optional group_label; ungroup_layers with layer_keys of any grouped members.",
|
|
70
|
-
"Prefer one editor_action call per mutation. For a multi-layer composition, sequence calls: generate or fetch each asset, then add or edit each layer with its own editor_action call. Chain edits by reusing the layer_key you assigned during add_layer.",
|
|
71
|
-
"Layer/track ordering is the ONLY thing that controls visual stacking. `track` is both the timeline layer index AND the CSS z-index — the editor forces `z-index = track` on every layer at publish time. Higher track draws visually on top; lower track draws underneath. There is no separate z-index override — if the AI wants a layer above another, give it a higher track. If html/text overlays should sit ABOVE a video/image, their track must be a larger integer than the visual media below them.",
|
|
72
|
-
"When you REPLACE an existing layer with a different kind (e.g., remove a video and add an image in its place), first read the removed layer's `track`, `start`, `duration`, `x`, `y`, `width`, `height`, and (for media) `playback_start` from editor_context, then pass ALL of them to add_layer. If the removed layer has `is_full_canvas: true` OR `is_timeline_proxy: true`, the replacement MUST be full canvas — set x=0, y=0, width=100, height=100. Timeline-proxy videos always render full canvas (100%×100%) at publish time even though editor_context may show them as tiny placeholders — trust the `is_timeline_proxy` / `is_full_canvas` flags. Skipping the geometry leaves you with a small floating overlay while the rest of the frame is black.",
|
|
73
|
-
"Rule of thumb for replacements: (1) copy the removed layer's track (higher = drawn on top; keep the same so overlays stay in order), (2) copy start/duration exactly, (3) copy x/y/width/height exactly (or use 0/0/100/100 for full-canvas), (4) for video→image conversions, drop playback_start (images have no timeline). Never use the AI default geometry (12/18/54/32) for a replacement.",
|
|
74
|
-
"When you simply want to change a layer's media without moving it, prefer set_layer_media (kind must match: video↔video, image↔image, audio↔audio) — it keeps the same node, id, track, and geometry.",
|
|
75
|
-
"If polling a job, poll gently. Prefer about every 30 seconds rather than rapid repeated checks.",
|
|
76
|
-
"If the customer already has at least one saved provider key that should work for this composition, do not ask them to provide another API key.",
|
|
77
|
-
"For primitive AI video generation, use any compatible saved provider key already available for the customer: OpenAI defaults to sora-2, Gemini defaults to veo-3.0-generate-001, and OpenRouter defaults to bytedance/seedance-2.0. Do not ask for a different provider key when one of those providers is already saved.",
|
|
78
|
-
"If provider selection is unspecified, choose a supported saved provider automatically, update template config first when needed, and then continue.",
|
|
79
|
-
"If a run fails because the current composition config points at an unavailable provider, switch config to a saved supported provider and retry instead of asking the user to choose.",
|
|
80
|
-
"Prefer primitive image routes when the user wants a reusable asset edit or render that is not specific to one composition render.",
|
|
81
|
-
"Use the word create for composition experimentation and drafting. Use the word approve only for converting a finished output into a schedule-ready post.",
|
|
82
|
-
"When the user asks to approve, package, share, preview, or make a finished output schedule-ready, approve a post with POST /api/v1/approved/posts using only title, caption, pinned_comment when useful, media URLs, and the current tracer.",
|
|
83
|
-
"Before approving a rendered slideshow or carousel, inspect the finished generation result and build media from the final artifacts, not from job IDs, manifests, source prompts, or background-only images.",
|
|
84
|
-
"If the output has both a video version and slide/carousel frames, include both in one approved post media array: the final MP4 first with kind=\"video\" and role=\"primary\", followed by every finished slide frame image in order with kind=\"image\" and role=\"slide\".",
|
|
85
|
-
"For slide media, prefer result.renderVideoInput.slides[].imageUrl or result.slides[].frameImageUrl from the create-slideshow job. If you only have the render-video response, use its result.slides[].imageUrl only when those are finished captioned frame URLs; otherwise fetch the earlier slideshow job/logs for the same tracer before approving.",
|
|
86
|
-
"If the user explicitly supplies exact file URLs for approval, treat those URLs as an intentional override or backup source. Preserve the user's provided order, infer kind from file extension/content when needed, and still assign role=\"primary\" to the final video and role=\"slide\" to each carousel image.",
|
|
87
|
-
"Never approve only the MP4 when finished carousel slides exist. Never substitute backgroundImageUrl, thumbnail, manifest JSON, or a partial files array for the full finished slide carousel.",
|
|
88
|
-
"When approving a post from chat, include tracer in the JSON body. Do not send view_password unless the user explicitly asked for a different preview password; the server defaults it to password123.",
|
|
89
|
-
"After approving a post, return the post.share_url as a Markdown link so the user can open the preview page in a new tab.",
|
|
90
|
-
"Do not claim a post was approved unless POST /api/v1/approved/posts returned a post_id and share_url in the current response.",
|
|
91
|
-
"When the user asks to schedule an approved post, use POST /api/v1/approved/posts/:postId/schedules after you know the approved post id, destination channel id, and scheduled_at ISO timestamp.",
|
|
92
|
-
"For scheduling, resolve the user's named channel against the cached scheduling channels. Use destination_type=\"email\" for email pseudo-channels and destination_type=\"flockposter\" for FlockPoster/social channels.",
|
|
93
|
-
"If the channel name or date/time is ambiguous, ask a concise clarification question instead of guessing. If the user gives a local date/time without a timezone, ask for timezone unless the timezone is already explicit in the conversation.",
|
|
94
|
-
"Do not claim a post was scheduled unless POST /api/v1/approved/posts/:postId/schedules returned a schedule object in the current response.",
|
|
95
|
-
"",
|
|
96
|
-
`Composition title: ${input.templateTitle}`,
|
|
97
|
-
`Composition id: ${input.templateId}`,
|
|
98
|
-
`Composition slug: ${input.templateSlug}`,
|
|
99
|
-
`Editor page: ${input.page}`,
|
|
100
|
-
`Tracer id: ${input.tracerId ?? "none"}`,
|
|
101
|
-
`Available tracers: ${input.tracers.length ? input.tracers.join(", ") : "none"}`,
|
|
102
|
-
`Default request tracer: ${input.defaultRequestTracer ?? input.activeTracer ?? input.tracerId ?? "none"}`,
|
|
103
|
-
`Composition description: ${input.templateDescription}`,
|
|
104
|
-
"",
|
|
105
|
-
"Documented REST routes:",
|
|
106
|
-
routeLines || "- No routes documented."
|
|
107
|
-
].join("\n");
|
|
108
|
-
}
|
|
109
|
-
export function buildEditorChatSystemInstruction(input) {
|
|
110
|
-
const sections = [];
|
|
111
|
-
if (input.cachedContext?.directorSkill?.trim()) {
|
|
112
|
-
sections.push(`Director skill context:\n\n${input.cachedContext.directorSkill.trim()}`);
|
|
113
|
-
}
|
|
114
|
-
if (input.cachedContext?.templateSkill?.trim()) {
|
|
115
|
-
sections.push(`Composition skill context:\n\n${input.cachedContext.templateSkill.trim()}`);
|
|
116
|
-
}
|
|
117
|
-
sections.push([
|
|
118
|
-
`Saved providers for this customer: ${input.cachedContext?.availableProviders?.length ? input.cachedContext.availableProviders.join(", ") : "none"}.`,
|
|
119
|
-
`Current composition config: ${input.cachedContext?.currentTemplateConfig ? JSON.stringify(input.cachedContext.currentTemplateConfig, null, 2) : "none saved"}.`,
|
|
120
|
-
`Cached scheduling channels${input.cachedContext?.scheduleChannelsUpdatedAt ? ` as of ${input.cachedContext.scheduleChannelsUpdatedAt}` : ""}: ${input.cachedContext?.scheduleChannels?.length ? JSON.stringify(input.cachedContext.scheduleChannels, null, 2) : "none cached"}.`,
|
|
121
|
-
`Selected library posts${input.cachedContext?.selectedPostsUpdatedAt ? ` as of ${input.cachedContext.selectedPostsUpdatedAt}` : ""}: ${input.cachedContext?.selectedPosts?.length ? JSON.stringify(input.cachedContext.selectedPosts, null, 2) : "none selected"}.`,
|
|
122
|
-
"Operational rule: if the user asks to create or render something and saved providers exist, pick one automatically and call the config route when needed before running the render.",
|
|
123
|
-
"Operational rule: use REST routes sequentially and avoid parallel route bursts or aggressive polling loops.",
|
|
124
|
-
"Operational rule: organize work with tracers and keep each POST run attached to the correct tracer.",
|
|
125
|
-
"Operational rule: when the user asks for job status or why a queued/running job is taking long, inspect the job and its logs/debug route before answering. Distinguish queue wait, provider-key wait, active provider generation, HyperFrames rendering, artifact upload, and completion. Treat low running-job progress as a heartbeat unless logs prove it is real render progress; report elapsed time and the current phase instead of implying an exact percentage.",
|
|
126
|
-
"Operational rule: if approving a finished slideshow that also has a rendered video, include both versions in the approved post: MP4 first as primary video, then the full ordered carousel of finished captioned slide frame images as role=slide media.",
|
|
127
|
-
"Operational rule: if the user gives exact approval media URLs, use those URLs as the backup source of truth and package them with the correct video/slide roles.",
|
|
128
|
-
"Operational rule: if the user asks to schedule a post and cached scheduling channels are missing, ask them to connect or refresh channels before scheduling. If channels are present, match by id, name/title, handle, platform, or email label.",
|
|
129
|
-
"Operational rule: when selected library posts are present and the user says 'these posts' or similar, schedule exactly those post IDs unless the user narrows the set.",
|
|
130
|
-
"Tool honesty rule: job IDs, render status, concat success, and HTTP call claims must come from actual http_request tool results in the current response, never from memory or guesswork."
|
|
131
|
-
].join("\n"));
|
|
132
|
-
if (input.template) {
|
|
133
|
-
sections.push(buildTemplateEditorChatSystemPrompt(input.template));
|
|
134
|
-
}
|
|
135
|
-
if (input.currentDateTime?.trim()) {
|
|
136
|
-
sections.push([
|
|
137
|
-
"Current datetime for scheduling:",
|
|
138
|
-
input.currentDateTime.trim(),
|
|
139
|
-
"Use this timestamp to interpret relative dates like today, tomorrow, and next Friday."
|
|
140
|
-
].join("\n"));
|
|
141
|
-
}
|
|
142
|
-
return sections.filter((entry) => entry.trim().length > 0).join("\n\n");
|
|
143
|
-
}
|
|
144
|
-
export function formatEditorChatCurrentDateTime(clientContext) {
|
|
145
|
-
const lines = [];
|
|
146
|
-
const iso = clientContext?.currentDateTime?.trim();
|
|
147
|
-
const local = clientContext?.localDateTime?.trim();
|
|
148
|
-
const timeZone = clientContext?.timeZone?.trim();
|
|
149
|
-
if (iso) {
|
|
150
|
-
lines.push(`ISO timestamp: ${iso}`);
|
|
151
|
-
}
|
|
152
|
-
if (local) {
|
|
153
|
-
lines.push(`Browser local datetime: ${local}`);
|
|
154
|
-
}
|
|
155
|
-
if (timeZone) {
|
|
156
|
-
lines.push(`Browser timezone: ${timeZone}`);
|
|
157
|
-
}
|
|
158
|
-
return lines.join("\n");
|
|
159
|
-
}
|
|
160
|
-
function tryParseUrl(value) {
|
|
161
|
-
try {
|
|
162
|
-
return new URL(value);
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
function decodeDataUrl(value) {
|
|
169
|
-
const match = /^data:([^;,]+)?(?:;charset=[^;,]+)?;base64,(.+)$/i.exec(value);
|
|
170
|
-
if (!match) {
|
|
171
|
-
return null;
|
|
172
|
-
}
|
|
173
|
-
const mediaType = match[1]?.trim() || "application/octet-stream";
|
|
174
|
-
const data = Buffer.from(match[2], "base64");
|
|
175
|
-
return { mediaType, data };
|
|
176
|
-
}
|
|
177
|
-
export function toEditorChatModelMessages(messages) {
|
|
178
|
-
const result = [];
|
|
179
|
-
for (const entry of messages) {
|
|
180
|
-
if (!entry || typeof entry !== "object") {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
const role = entry.role;
|
|
184
|
-
if (role !== "user" && role !== "assistant" && role !== "system" && role !== "tool") {
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
if (role === "system") {
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
const content = Array.isArray(entry.content)
|
|
191
|
-
? entry.content
|
|
192
|
-
: [];
|
|
193
|
-
if (role === "user") {
|
|
194
|
-
const parts = [];
|
|
195
|
-
for (const part of content) {
|
|
196
|
-
if (part.type === "text" && typeof part.text === "string") {
|
|
197
|
-
parts.push({ type: "text", text: part.text });
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
if (part.type !== "file" || typeof part.data !== "string") {
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
const mediaType = typeof part.mediaType === "string" && part.mediaType.trim()
|
|
204
|
-
? part.mediaType.trim()
|
|
205
|
-
: "application/octet-stream";
|
|
206
|
-
const decoded = decodeDataUrl(part.data);
|
|
207
|
-
if (decoded) {
|
|
208
|
-
parts.push({
|
|
209
|
-
type: "file",
|
|
210
|
-
data: decoded.data,
|
|
211
|
-
mediaType: mediaType || decoded.mediaType
|
|
212
|
-
});
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
const url = tryParseUrl(part.data);
|
|
216
|
-
if (!url) {
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
parts.push({
|
|
220
|
-
type: "file",
|
|
221
|
-
data: url,
|
|
222
|
-
mediaType
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
result.push({ role: "user", content: parts });
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
if (role === "assistant") {
|
|
229
|
-
const parts = [];
|
|
230
|
-
for (const part of content) {
|
|
231
|
-
if (part.type === "text" && typeof part.text === "string") {
|
|
232
|
-
parts.push({ type: "text", text: part.text });
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
result.push({ role: "assistant", content: parts });
|
|
236
|
-
continue;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
return result;
|
|
240
|
-
}
|
|
241
|
-
function getModelMessageText(message) {
|
|
242
|
-
const content = message.content;
|
|
243
|
-
if (typeof content === "string") {
|
|
244
|
-
return content;
|
|
245
|
-
}
|
|
246
|
-
if (!Array.isArray(content)) {
|
|
247
|
-
return "";
|
|
248
|
-
}
|
|
249
|
-
return content
|
|
250
|
-
.map((part) => {
|
|
251
|
-
if (part && typeof part === "object" && "text" in part && typeof part.text === "string") {
|
|
252
|
-
return part.text;
|
|
253
|
-
}
|
|
254
|
-
if (part && typeof part === "object" && "type" in part && part.type === "file") {
|
|
255
|
-
const mediaType = "mediaType" in part && typeof part.mediaType === "string"
|
|
256
|
-
? part.mediaType
|
|
257
|
-
: "file";
|
|
258
|
-
return `[${mediaType} attachment]`;
|
|
259
|
-
}
|
|
260
|
-
return "";
|
|
261
|
-
})
|
|
262
|
-
.filter(Boolean)
|
|
263
|
-
.join("\n");
|
|
264
|
-
}
|
|
265
|
-
function estimateModelMessageChars(messages) {
|
|
266
|
-
return messages.reduce((total, message) => total + getModelMessageText(message).length, 0);
|
|
267
|
-
}
|
|
268
|
-
function truncateEditorChatSummaryText(value, maxChars) {
|
|
269
|
-
const normalized = value.trim().replace(/\s+/g, " ");
|
|
270
|
-
if (normalized.length <= maxChars) {
|
|
271
|
-
return normalized;
|
|
272
|
-
}
|
|
273
|
-
return `${normalized.slice(0, Math.max(0, maxChars - 32)).trimEnd()}... [truncated]`;
|
|
274
|
-
}
|
|
275
|
-
export function compactEditorChatModelMessages(messages) {
|
|
276
|
-
if (messages.length <= EDITOR_CHAT_COMPACT_RECENT_MESSAGES
|
|
277
|
-
|| estimateModelMessageChars(messages) <= EDITOR_CHAT_COMPACT_CHAR_THRESHOLD) {
|
|
278
|
-
return messages;
|
|
279
|
-
}
|
|
280
|
-
const recentMessages = messages.slice(-EDITOR_CHAT_COMPACT_RECENT_MESSAGES);
|
|
281
|
-
const oldMessages = messages.slice(0, -EDITOR_CHAT_COMPACT_RECENT_MESSAGES);
|
|
282
|
-
const summaryLines = [];
|
|
283
|
-
let summaryChars = 0;
|
|
284
|
-
for (const message of oldMessages) {
|
|
285
|
-
const line = `[${message.role}]: ${truncateEditorChatSummaryText(getModelMessageText(message), EDITOR_CHAT_COMPACT_MAX_MESSAGE_CHARS)}`;
|
|
286
|
-
if (summaryChars + line.length > EDITOR_CHAT_COMPACT_MAX_SUMMARY_CHARS) {
|
|
287
|
-
summaryLines.push(`[${oldMessages.length - summaryLines.length} earlier messages omitted]`);
|
|
288
|
-
break;
|
|
289
|
-
}
|
|
290
|
-
summaryLines.push(line);
|
|
291
|
-
summaryChars += line.length;
|
|
292
|
-
}
|
|
293
|
-
return [
|
|
294
|
-
{
|
|
295
|
-
role: "assistant",
|
|
296
|
-
content: [
|
|
297
|
-
{
|
|
298
|
-
type: "text",
|
|
299
|
-
text: [
|
|
300
|
-
"[Earlier in this conversation - compacted summary]",
|
|
301
|
-
"This summary preserves older turns so the current request can continue without resending the full transcript.",
|
|
302
|
-
"",
|
|
303
|
-
summaryLines.join("\n\n")
|
|
304
|
-
].join("\n")
|
|
305
|
-
}
|
|
306
|
-
]
|
|
307
|
-
},
|
|
308
|
-
...recentMessages
|
|
309
|
-
];
|
|
310
|
-
}
|
|
311
|
-
//# sourceMappingURL=editor-chat.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-chat.js","sourceRoot":"","sources":["../../src/editor-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { createStore } from "zustand/vanilla";
|
|
2
|
-
export const FLOCKPOSTER_CACHE_STORAGE_KEY = "vidfarm:flockposter-cache:v1";
|
|
3
|
-
const PUBLIC_SCOPE = "public";
|
|
4
|
-
const emptySnapshot = {
|
|
5
|
-
channels: [],
|
|
6
|
-
posts: [],
|
|
7
|
-
channelsUpdatedAt: null,
|
|
8
|
-
calendarUpdatedAt: null,
|
|
9
|
-
calendarRangeStart: null,
|
|
10
|
-
calendarRangeEnd: null
|
|
11
|
-
};
|
|
12
|
-
export function getFlockPosterCacheStorageKey(userId) {
|
|
13
|
-
return `${FLOCKPOSTER_CACHE_STORAGE_KEY}_${userId?.trim() || PUBLIC_SCOPE}`;
|
|
14
|
-
}
|
|
15
|
-
export function readFlockPosterCacheSnapshot(userId) {
|
|
16
|
-
if (typeof window === "undefined") {
|
|
17
|
-
return emptySnapshot;
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
const raw = window.localStorage.getItem(getFlockPosterCacheStorageKey(userId));
|
|
21
|
-
if (!raw) {
|
|
22
|
-
return emptySnapshot;
|
|
23
|
-
}
|
|
24
|
-
const parsed = JSON.parse(raw);
|
|
25
|
-
if (!parsed || typeof parsed !== "object") {
|
|
26
|
-
return emptySnapshot;
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
29
|
-
channels: Array.isArray(parsed.channels) ? parsed.channels : [],
|
|
30
|
-
posts: Array.isArray(parsed.posts) ? parsed.posts : [],
|
|
31
|
-
channelsUpdatedAt: typeof parsed.channelsUpdatedAt === "string" ? parsed.channelsUpdatedAt : null,
|
|
32
|
-
calendarUpdatedAt: typeof parsed.calendarUpdatedAt === "string" ? parsed.calendarUpdatedAt : null,
|
|
33
|
-
calendarRangeStart: typeof parsed.calendarRangeStart === "string" ? parsed.calendarRangeStart : null,
|
|
34
|
-
calendarRangeEnd: typeof parsed.calendarRangeEnd === "string" ? parsed.calendarRangeEnd : null
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return emptySnapshot;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function writeFlockPosterCacheSnapshot(snapshot, userId) {
|
|
42
|
-
if (typeof window === "undefined") {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
try {
|
|
46
|
-
window.localStorage.setItem(getFlockPosterCacheStorageKey(userId), JSON.stringify(snapshot));
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// Ignore storage failures and keep in-memory state only.
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export function createFlockPosterCacheStore(userId) {
|
|
53
|
-
const initial = readFlockPosterCacheSnapshot(userId);
|
|
54
|
-
return createStore((set, get) => ({
|
|
55
|
-
...initial,
|
|
56
|
-
setChannelsData: (channels) => {
|
|
57
|
-
const current = get();
|
|
58
|
-
const next = {
|
|
59
|
-
...current,
|
|
60
|
-
channels: [
|
|
61
|
-
...current.channels.filter(isEmailChannel),
|
|
62
|
-
...channels.filter((channel) => !isEmailChannel(channel))
|
|
63
|
-
],
|
|
64
|
-
channelsUpdatedAt: new Date().toISOString()
|
|
65
|
-
};
|
|
66
|
-
writeFlockPosterCacheSnapshot(next, userId);
|
|
67
|
-
set(next);
|
|
68
|
-
},
|
|
69
|
-
setCalendarData: (input) => {
|
|
70
|
-
const current = get();
|
|
71
|
-
const mergedChannels = dedupeChannels([...current.channels, ...input.channels]);
|
|
72
|
-
const mergedPosts = input.replaceRange
|
|
73
|
-
? mergePostsForRange(current.posts, input.posts, input.rangeStart, input.rangeEnd)
|
|
74
|
-
: dedupePosts([...current.posts, ...input.posts]);
|
|
75
|
-
const next = {
|
|
76
|
-
...current,
|
|
77
|
-
channels: mergedChannels,
|
|
78
|
-
posts: mergedPosts,
|
|
79
|
-
channelsUpdatedAt: new Date().toISOString(),
|
|
80
|
-
calendarUpdatedAt: new Date().toISOString(),
|
|
81
|
-
calendarRangeStart: expandRangeStart(current.calendarRangeStart, input.rangeStart),
|
|
82
|
-
calendarRangeEnd: expandRangeEnd(current.calendarRangeEnd, input.rangeEnd)
|
|
83
|
-
};
|
|
84
|
-
writeFlockPosterCacheSnapshot(next, userId);
|
|
85
|
-
set(next);
|
|
86
|
-
}
|
|
87
|
-
}));
|
|
88
|
-
}
|
|
89
|
-
function dedupeChannels(channels) {
|
|
90
|
-
return [...new Map(channels.map((channel) => [channel.id, channel])).values()];
|
|
91
|
-
}
|
|
92
|
-
function isEmailChannel(channel) {
|
|
93
|
-
return channel.id.startsWith("email:") || channel.platform?.toLowerCase() === "email";
|
|
94
|
-
}
|
|
95
|
-
function dedupePosts(posts) {
|
|
96
|
-
return [...new Map(posts.map((post) => [post.id, post])).values()];
|
|
97
|
-
}
|
|
98
|
-
function mergePostsForRange(currentPosts, nextPosts, rangeStart, rangeEnd) {
|
|
99
|
-
const startTime = Date.parse(rangeStart);
|
|
100
|
-
const endTime = Date.parse(rangeEnd);
|
|
101
|
-
if (Number.isNaN(startTime) || Number.isNaN(endTime)) {
|
|
102
|
-
return dedupePosts([...currentPosts, ...nextPosts]);
|
|
103
|
-
}
|
|
104
|
-
return dedupePosts([
|
|
105
|
-
...currentPosts.filter((post) => {
|
|
106
|
-
const scheduledTime = Date.parse(post.scheduledAt);
|
|
107
|
-
return Number.isNaN(scheduledTime) || scheduledTime < startTime || scheduledTime > endTime;
|
|
108
|
-
}),
|
|
109
|
-
...nextPosts
|
|
110
|
-
]);
|
|
111
|
-
}
|
|
112
|
-
function expandRangeStart(current, next) {
|
|
113
|
-
if (!current) {
|
|
114
|
-
return next;
|
|
115
|
-
}
|
|
116
|
-
return Date.parse(next) < Date.parse(current) ? next : current;
|
|
117
|
-
}
|
|
118
|
-
function expandRangeEnd(current, next) {
|
|
119
|
-
if (!current) {
|
|
120
|
-
return next;
|
|
121
|
-
}
|
|
122
|
-
return Date.parse(next) > Date.parse(current) ? next : current;
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=flockposter-cache-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flockposter-cache-store.js","sourceRoot":"","sources":["../../../src/frontend/flockposter-cache-store.ts"],"names":[],"mappings":"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"}
|