Skip to content
Merged

Jovan #541

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Use the saved storyboard, current entry and design/media/audio constraints. Befo

## Recipes and components

Keep inspection bounded to the current video project and the selected component directories. Use the catalog's variables, input rules and examples, then `video_component_read` / `video_component_write` for structured content; do not grep minified component scripts, cached tool output, or the whole runtime data directory to rediscover those contracts. Reuse action schemas already returned in this task instead of delegating schema lookup. After a repeated identical install/check failure, repair the reported fields or report the concrete blocker; do not repeat the same request or inspect engine internals in a production task. A runtime-review 503 is an unavailable preview service: retry once after Studio is ready, then return the saved draft and the blocker.

Reuse known choices/catalogs. Initial/structural assembly reads needed `core-v1-index.md`, `core-v1-video/catalog.md`, `core-v1-video/motion/catalog.md` metadata and selected `motion/component-map.md` overlays. Shortlist at most three scene bodies and three mapped components. Layouts supply spatial slots; selected recipes implement the content's temporal actions, not responsive website/PPT roots.

Use `media/video_recipe_catalog` for locally installable native and Shotcraft recipes; query missing needs/`recipeCategories` once (`limit <=20`, paginate missing results only). Match intent/useWhen/avoidWhen, authorized inputs, capacity, event/reading order, landing and genre energy before appearance. Read selected local `recipe.md`, manifest and actual implementation before mounting; retain its working motion rather than rebuilding cards with entrance effects. Imports need exact card/variant and pinned source/preview; unported references/hosted links are not executable auditions. Missing cards require the actual manifest and disclosure.
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ Feature work starts with the demo, not a PRD:

### Bundled social plugins

Maintain Xiaohongshu and Douyin in `examples/plugin-packages/xiaohongshu-ops` and `examples/plugin-packages/douyin-ops`. These directories are the authoritative source; the sibling repositories are recovery copies only. Do not push or publish plugin changes unless the user explicitly requests it. Keep the stable plugin IDs and user data paths so accounts, drafts, credentials and browser profiles survive updates. After each change, run the plugin package's own checks and tests, then verify installation or update through the host catalog and the affected fraimz flow. Development uses these local sources (closed packages from `dist/package`) and refreshes them on restart. Production desktop builds ship only internal `reference-context`; user plugins are independently signed cloud downloads. The catalog must not depend on `~/.ipollowork/local-plugin-packages`.
Maintain Xiaohongshu and Douyin in `examples/plugin-packages/xiaohongshu-ops` and `examples/plugin-packages/douyin-ops`. These directories are the authoritative source; the sibling repositories are recovery copies only. Do not push or publish plugin changes unless the user explicitly requests it. Keep the stable plugin IDs and user data paths so accounts, drafts, credentials and browser profiles survive updates. After each change, run the plugin package's own checks and tests, then verify installation or update through the host catalog and the affected fraimz flow. Development uses these local sources (closed packages from `dist/package`) and refreshes them on restart. Production desktop builds ship only internal `reference-context`. Personal manages the available local collection and installed/imported plugins; Public uses the online plugin API. Each view supports install, update from its own source and uninstall through the same installed-package lifecycle. The catalog must not depend on `~/.ipollowork/local-plugin-packages`.

### Mandatory AI Code Gate

Expand Down
2 changes: 1 addition & 1 deletion apps/app/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@ipollowork/app",
"private": true,
"version": "0.50.19",
"version": "0.50.23",
"type": "module",
"scripts": {
"test": "bun test --isolate tests/",
Expand Down
23 changes: 23 additions & 0 deletions apps/app/public/ext-plugin-workshop.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions apps/app/src/app/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,12 @@ img[src$="/ext-short-video.png"] {

/* Keep monochrome plugin marks readable on both dark and light icon tiles. */
:is(.dark, [data-theme="dark"]) img:is(
[src$="/ext-image-studio.png"],
[src$="/ext-xiaohongshu.png"],
[src$="/ext-douyin.png"],
[src$="/ext-wechat-channels.png"],
[src$="/ext-operation-recorder.png"],
[src$="/ext-plugin-workshop.svg"],
[src$="/ext-onto.png"],
[src$="/ext-short-video.png"]
) {
Expand Down
8 changes: 6 additions & 2 deletions apps/app/src/app/lib/desktop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ export async function desktopFetchViaMain(
let url: string;
let method: string | undefined;
let headers: Record<string, string> | undefined;
let body: string | undefined;
let body: string | ArrayBuffer | undefined;

if (typeof Request !== "undefined" && input instanceof Request) {
url = input.url;
Expand All @@ -416,7 +416,11 @@ export async function desktopFetchViaMain(
body = typeof init?.body === "string" ? init.body : undefined;
}

const result = await invokeElectronHelper("__fetch", url, { method, headers, body, timeoutMs, responseType });
if (init?.body instanceof Blob) body = await init.body.arrayBuffer();
else if (init?.body instanceof ArrayBuffer) body = init.body;
init?.signal?.throwIfAborted();
const result = await invokeElectronHelper("__fetch", url, { method, headers, body, timeoutMs, responseType, ...(init?.redirect === "error" ? { redirect: "error" } : {}) });
init?.signal?.throwIfAborted();
if (responseType === "arrayBuffer" && typeof result.body === "string") {
throw new Error("desktop_binary_fetch_requires_restart");
}
Expand Down
Loading
Loading