tesseract-agent 0.12.2-beta.3 → 0.12.2-beta.5

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.
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: comic-maker
3
+ description: Make a comic, manga or webtoon from an idea or a whole script — chapters, pages and panels with the same characters, speech balloons as real editable text, left to right or right to left — and edit it in the comic editor, by hand and by you. Saves as PDF, CBZ and a vertical strip. Use for comics, manga, graphic novels, webtoons, comic strips, gag strips and storybook comics. Not for one comic-style picture (image-generation) or an animated video (video-generation).
4
+ license: MIT
5
+ version: 1.0.0
6
+ metadata:
7
+ tesseract.summary: A comic, manga or webtoon from an idea or script, with real balloons you can edit, in PDF, CBZ and a vertical strip.
8
+ tesseract.category: media
9
+ tesseract.needs: desktop
10
+ tesseract.examples: "make a manga about two rival bakers | turn this script into a comic | make a webtoon episode from my story | change the words in the second balloon on page 3 | make my comic read right to left | save it as a CBZ"
11
+ tesseract.tools: app_studio, cast_list, cast_save, find_ideas, get_idea, image_inspect
12
+ ---
13
+
14
+ # Comics
15
+
16
+ The deliverable is a `.tscomic` in its own folder under `~/Documents/Tesseract/Comics/`, open in the comic editor beside
17
+ the chat, and whatever the person saves from it: a PDF, a CBZ, a vertical strip. The words are never in the pictures. A
18
+ panel holds a picture with no lettering; its balloons are text on top. That is the point of this maker: a line can
19
+ be changed or translated at any time, for free, and the picture stays as it is.
20
+
21
+ ## The rules, before anything else
22
+
23
+ - **Real people.** A real person appears only through a saved card that holds their consent (`cast_list`; `cast_save`
24
+ with `consent_from`). Never by name in words, never from a photo that is not on a card. The maker refuses a real
25
+ private person with no card, and the drawing refuses a card whose check has not passed: say why in one plain sentence
26
+ and offer a made-up character instead.
27
+ - **No public figures**, in any role, satire included. Nobody who looks under 18 in anything romantic or sexual, and
28
+ nothing sexual about a real person. A story about a real private person that could hurt them is declined.
29
+ - **Other people's characters and brands stay out.** No superhero, cartoon or game character the person does not own, by
30
+ name or by costume. An original character can do the same job. "In the style of" a living artist is declined; a
31
+ look (manga, noir, clear line) is fine.
32
+ - **Drawing costs money.** `panel.draw` with `artist: "model"` and `character.draw_reference` are paid pictures, one per
33
+ panel: say how many and roughly what it costs, and wait for a yes. `artist: "sketch"` is free, and so is every
34
+ word, layout and export.
35
+
36
+ ## Starting one
37
+
38
+ Use the maker for a new comic: `app_studio` `studio.start` `{ kind: "comic", about: <their words> }`. A pasted script goes
39
+ in `about` whole. It asks only what is left open, shows the plan beside the chat, and writes every chapter with
40
+ free sketches. No plan yet ("give me comic ideas for my bakery"): `find_ideas` with `category: "comics"`, offer two or
41
+ three, then `get_idea` the one they pick.
42
+
43
+ For a character who must look the same everywhere, use a saved card: "@maya" in what they said ties her to the card, and
44
+ its pictures go with every panel she is in. A made-up character gets a text sheet, the same fixed words said in
45
+ every panel; `character.draw_reference` draws one picture of them that then goes with every panel too. Do that before
46
+ drawing the panels, not after: it is what keeps a face the same.
47
+
48
+ ## Working in it
49
+
50
+ Everything goes through `documents.*` with the comic's `path`, and the person sees it happen.
51
+
52
+ | To | Command |
53
+ |---|---|
54
+ | See it all | `documents.read` with no arguments: chapters, characters, how many panels are drawn |
55
+ | See a page | `documents.read` `{ page: 3 }`; add `render: true` to get the page as a picture, and look at it |
56
+ | Change words | `balloon.set_text` `{ balloon, text }` |
57
+ | Add a line | `balloon.add` `{ panel, text, kind, speaker }` |
58
+ | Kinds of balloon | `speech`, `thought`, `shout`, `whisper`, `caption` (narration, no tail), `sfx` (a noise, no shape) |
59
+ | Place it | `balloon.move`, `balloon.resize`, `balloon.set_tail` (fractions of the panel), `balloon.set_vertical` for Japanese or Chinese |
60
+ | Pages | `page.add`, `page.delete`, `page.move`, `page.set_layout` (it refuses to lose a panel with work in it) |
61
+ | Panels | `panel.set_shot` (what is drawn), `panel.set_cast`, `panel.move`, `panel.resize`, `panel.crop`, `panel.set_picture` for their own art |
62
+ | Chapters | `chapter.add`, `chapter.rename`, `chapter.move`, `chapter.delete` |
63
+ | Reading order | `page.auto_order` from where things stand, or `panel.reorder`, `balloon.reorder`; `comic.show_order` numbers them on screen |
64
+ | Manga | `comic.set_direction` `{ direction: "rtl" }` mirrors every page, panels and balloons; the pictures are not flipped |
65
+ | Draw | `panel.draw` `{ panel }`, `{ page }` or `{ all: true }`, with `artist`; it keeps what is drawn if it stops |
66
+ | Touch up a picture | `panel.edit_picture` opens it in the image editor |
67
+ | Undo | `edit.undo`, `edit.redo` |
68
+ | Save it | `export.pdf`, `export.cbz`, `export.webtoon` |
69
+
70
+ Arguments may name a panel by id or by its number on the open page; `documents.commands` lists every command.
71
+
72
+ ## Good comics
73
+
74
+ - **One beat per panel, one idea per page.** A page turn is the comic's best trick: put the surprise on the first panel of
75
+ a new page.
76
+ - **Short lines.** About 20 words at most in a balloon, two balloons in most panels. If `documents.read` flags a balloon
77
+ `overflow`, cut the words first; make the balloon bigger only after that.
78
+ - **The shot never holds dialogue.** `shot` says place, action, camera and mood. A panel with text in the picture is a
79
+ panel that cannot be translated.
80
+ - **Vary the panels.** Wide for places, tight for faces, one big panel for the moment everything turns on.
81
+ - **Look at it.** After a page is drawn, `documents.read` `{ page, render: true }` and check that balloons do not cover
82
+ faces, tails point at the right mouth, and the reading order is the one you meant. Compare a character across
83
+ pages with `image_inspect` before saying they match.
84
+
85
+ ## Saving it
86
+
87
+ | Format | For | What it holds |
88
+ |---|---|---|
89
+ | `export.pdf` | printing, sending | every page at print size, chapters as bookmarks, the reading direction set, the words searchable where the letters are Latin |
90
+ | `export.cbz` | comic reader apps | pictures in reading order, with `ComicInfo.xml`; a right-to-left comic is marked as manga |
91
+ | `export.webtoon` | WEBTOON, Tapas, phones | each chapter stacked panel by panel in images 800 px wide and at most 1280 px tall, cut in the gaps, with a page to read them; a chapter too big for one episode is named |
92
+
93
+ They land in the comic's `Exports` folder. A CBZ and a strip are pictures by nature: to change a line, change it in the
94
+ comic and save again.
95
+
96
+ Hand-offs: `image-generation` for one picture; `video-generation` to animate a panel; `social-posts` to post pages.
@@ -2,7 +2,7 @@
2
2
  name: font-and-logo-design
3
3
  description: Turn a person's handwriting (a photo or a filled-in template) into an installable font — TTF, plus WOFF2 and CSS for the web — test that a font file really renders and covers the characters it should, and make wordmarks, monograms and simple logos as clean SVG. Use when someone wants a font from their handwriting or in a described style, wants a font file checked or previewed, or wants a wordmark or logo for a name or brand. Fonts in a described style and full brand kits are made in Tesseract's Fonts tab, which this skill hands over to; for illustrations, photos or painterly images use image-generation, for a project's colour and type tokens use design-system, and for a logo made with the person on the canvas beside the chat, or switched to from a picture or an app, use makers.
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.0.2
6
6
  metadata:
7
7
  tesseract.summary: "Fonts from handwriting, font files checked, a wordmark or logo as SVG to stated needs. Made beside the chat: makers."
8
8
  tesseract.category: design
@@ -18,8 +18,9 @@ same on every machine, checked at favicon size and on dark backgrounds. The agen
18
18
  blob is which letter, whether a glyph looks right); deterministic tools do the geometry. Never edit glyph
19
19
  outlines or path coordinates by hand.
20
20
 
21
- If the person wants a logo made with them beside the chat — a brand to look at and change, or a picture or an app
22
- they are switching into a logo — load `makers` now and start its logo maker.
21
+ A logo asked for in plain words ("make me a logo for my bakery") is the logo maker's: load `makers` now and start it,
22
+ before anything else here. So is a picture or an app they are switching into a logo. This skill is for what the maker
23
+ does not do: a font, a font file checked, or a logo as a named file ("a wordmark as an SVG").
23
24
 
24
25
  ## 1. Pick the route
25
26
 
@@ -2,12 +2,12 @@
2
2
  name: game-dev
3
3
  description: Make a small game people can play, or a generative or interactive art piece, in the browser — on the canvas beside the chat (render_canvas) or as an HTML file — an arcade, puzzle or platform game, a p5.js sketch, a flow field or particle piece, a shader, a three.js 3D scene. Covers the game loop, keyboard and touch input, a pause, both themes, phone width, no flashing, frame rate and memory, playing it once headless to prove it runs, and a concept-art loop for scenes that must look stunning. Use when someone wants to make, fix or polish a browser game, a sketch, generative art or an animated visual they can steer. For tools, forms and dashboards use interactive-ui; for static pages canvas-design; for pictures, sprites and textures image-generation (pixel sprites pixel-art); to play chess, play_chess.
4
4
  license: MIT
5
- version: 1.0.1
5
+ version: 1.1.0
6
6
  metadata:
7
7
  tesseract.summary: Make a small playable game or a generative art piece on the canvas or as a file, and prove it runs.
8
8
  tesseract.category: learning
9
9
  tesseract.examples: "make a little snake game I can play here | build me a generative art piece in p5.js I can reseed | my canvas game runs way too fast on the new monitor, fix it | programmier mir ein kleines Jump'n'Run, das man auch am Handy spielen kann | làm giúp mình một game 3D nhỏ bằng three.js chơi được trên điện thoại"
10
- tesseract.tools: render_canvas, generate_image, edit_image, image_inspect, design_judge, tesseract_spawn_subagent, browser_open, site_publish, ask_user
10
+ tesseract.tools: render_canvas, generate_image, edit_image, image_inspect, design_judge, tesseract_spawn_subagent, browser_open, site_publish, ask_user, make_playable_ad
11
11
  ---
12
12
 
13
13
  # Game dev
@@ -135,3 +135,16 @@ Built from Hermes Agent's `p5js` skill, with its `dream-loop` skill merged in (M
135
135
  `LICENSE-MIT-NousResearch.txt`); dream-loop is itself adapted from Anshu Chimala's dream-loop (MIT, © 2026 Anshu
136
136
  Chimala, see `LICENSE-MIT-AnshuChimala.txt`). `templates/sketch.html` is adapted from the p5js viewer template;
137
137
  `scripts/game_check.mjs` and `templates/arcade.html` are written for Tesseract. Modified by Tesseract.
138
+
139
+ ## A playable ad of the game
140
+
141
+ `make_playable_ad` packs a browser game into the one file an ad network takes: every asset inside it, libraries from a
142
+ CDN fetched at export, the network's own install call, weighed against its limit (5 MB for most, 2 MB for one HTML to
143
+ Meta or Moloco). Three things keep a game fit for it:
144
+
145
+ - **Name assets whole.** `'assets/hero.png'` is found and embedded; `'assets/' + name + '.png'` is not, and the answer
146
+ lists what was left out.
147
+ - **Call the ad's hooks when it is an ad.** `window.tesseractAd?.cta()` at the install moment, `.end()` at win or loss,
148
+ `.retry()` on a replay. A game that calls none still gets a button and an end card.
149
+ - **Stay light.** A three.js game with no big models packs to about 1.2 MB as one HTML, and 0.35 MB zipped. An engine's
150
+ web build (Unity, Godot) does not fit: build a small browser version of its best minute for the ad.
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: image-generation
3
- description: Generate or edit images directly in the chat (OpenAI gpt-image-2 or Google Nano Banana Pro), including transparent-background PNGs. Use when the user asks to create, generate, draw, or make an image / picture / icon / logo / illustration, to edit an existing image, or to make variations of one. A logo with its brand, made with the person on the canvas beside the chat, is makers, and so is a picture they switch into a logo, an app or a video; a vector (SVG) wordmark is font-and-logo-design.
3
+ description: Generate or edit images directly in the chat (GPT Image 2.5 or Google Nano Banana 2), including transparent-background PNGs. Use when the user asks to create, generate, draw, or make an image / picture / icon / logo / illustration, to edit an existing image, or to make variations of one. A logo with its brand, made with the person on the canvas beside the chat, is makers, and so is a picture they switch into a logo, an app or a video; a vector (SVG) wordmark is font-and-logo-design.
4
4
  license: MIT
5
- version: 1.3.4
5
+ version: 1.3.5
6
6
  metadata:
7
7
  tesseract.summary: "One picture, icon or illustration generated or edited in the chat, transparent PNGs included."
8
8
  tesseract.category: media
@@ -15,10 +15,11 @@ metadata:
15
15
  You can generate images directly in the chat with the `generate_image` tool and edit existing
16
16
  images with the `edit_image` tool (both from the `tesseract-imagegen` MCP server).
17
17
  `generate_image` creates **4 images by default** and displays them to the user automatically.
18
- Two providers are supported, each using the user's own API key:
18
+ Three providers are supported, one with no key and two on the user's own API key:
19
19
 
20
- - **OpenAI** — `gpt-image-2`
21
- - **Google** — Nano Banana Pro (`gemini-3-pro-image`)
20
+ - **Tesseract** — `gpt-image-2.5-flare`, no key needed
21
+ - **OpenAI** — `gpt-image-2.5-flare`
22
+ - **Google** — Nano Banana 2 (`gemini-3.1-flash-image`)
22
23
 
23
24
  ## How to handle a request to generate an image
24
25
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: makers
3
3
  description: Tesseract's makers — the guided flows behind the Home cards that make a picture, a logo (a brand), a website, a mobile app, a video, a presentation, a personal assistant, a deep research report, a data analysis, a game (played in the browser on the canvas, or a real Unity, Unreal or Godot project), a skin for the Tesseract app itself, a new project folder set up the way the person describes, a piece of writing (an email, a letter, a blog post, a CV), a postcard, a set of social media posts or one of their photos enhanced, on a canvas beside the chat. Use whenever the person wants one of these made (in any chat, not only one opened from a card), when the conversation is already making one and the person answers it or asks for a change, and when they want to switch from one kind to another ("make it a logo instead", "now turn this into an app"). Code the person builds in a project of their own, or putting an existing site online, is build-website-or-app; a font, or a wordmark or logo as an SVG file to stated requirements, is font-and-logo-design.
4
- version: 1.0.9
4
+ version: 1.0.11
5
5
  metadata:
6
6
  tesseract.summary: "A logo, website, app, video or deck made for the person beside the chat, watched as it forms, or switched to another."
7
7
  tesseract.category: general
@@ -35,7 +35,21 @@ own tools, so prefer it.
35
35
  | `writing` | a piece of writing — an email, a letter, a blog post, a CV, a speech — outlined first, then drafted in a document they edit by hand and by asking; copied, saved as Word or PDF, or opened as an email |
36
36
  | `postcard` | a postcard: a picture with a headline on the front; the message, a stamp box and address lines on the back — turned over on the canvas, saved as a PDF at a real postcard size to print, or as pictures to send |
37
37
  | `social` | social media posts: a plan of posts, each with a caption written for every platform it goes to (Instagram, Facebook, LinkedIn, X, TikTok, Threads, Pinterest) and a matching picture — shown as each feed shows it, saved with a CSV the schedulers import |
38
+ | `comic` | a comic, manga or webtoon: from an idea or a whole script to chapters, pages and panels, the lines in real balloons, the same characters through the Cast, in the comic editor; saved as a PDF, a CBZ or a vertical strip (the `comic-maker` skill) |
38
39
  | `photo` | their own photo, enhanced: looked at, then the few steps it needs (light and colour, sharpening, a cut-out, made bigger — free, on this computer; restoring, colourising, retouching, restyling — with AI), shown before and after. `picture` is for a new picture |
40
+ | `spreadsheet` | a spreadsheet: a budget, a tracker, a schedule, an inventory, or their own data, with formulas, totals and a chart, in the spreadsheet editor |
41
+ | `pdf` | a PDF: one they fill in and sign, something made into a PDF (a document, pictures, a web page), or a form people can fill, in the PDF editor |
42
+ | `diagram` | a diagram: a flowchart, an org chart, a timeline, a mind map, a sequence, written as Mermaid and drawn beside its source |
43
+ | `drawing` | a vector drawing: an illustration, an icon, poster art, in the vector editor |
44
+ | `font` | a font: an original typeface from what it is for and how it should look, its letters drawn, kept as a .ttf and opened in the font editor |
45
+ | `audio` | a piece of audio: a podcast episode, a voice-over, a narration, a recording cleaned up, finished in the audio editor |
46
+ | `motion` | a motion graphic: an animated title, a lower third, a logo reveal, a short explainer, in the motion editor, exported to video |
47
+ | `wireframe` | a wireframe: grayscale screens of a page or an app linked into a clickable flow, or a blank canvas to build on |
48
+ | `invoice` | an invoice: who it is to, the lines, tax and due date, worked out and numbered on, as a Word document with its PDF and an email |
49
+ | `newsletter` | an email newsletter: sections planned with them, written and laid out as email-safe HTML to copy into a mailing tool |
50
+ | `form` | a form or survey: questions with simple logic, as a fillable PDF and a web page that collects answers |
51
+ | `remote` | a Remote Desktop connection: to one of their own computers, to someone else's, or someone reaching this one |
52
+ | `network` | a private network for their devices: made, then their computers, phones and people added, its map shown |
39
53
 
40
54
  ## The tool
41
55
 
@@ -2,12 +2,12 @@
2
2
  name: product-ads
3
3
  description: Make a finished short video ad for the person's own physical product — from a product photo, a saved product card or the page of the product in their own shop — in the shapes TikTok, Reels, Stories, Shorts, the Instagram and Facebook feeds, YouTube, LinkedIn, X and Pinterest want (9:16, 1:1, 4:5, 16:9), with packshots that move, clips or product effects made from them, an optional voice-over or a talking presenter (the person, or a character who agreed), music, the brand's colours, logo and words kept inside each platform's safe zone, and a call-to-action end card; priced once before anything is paid, then rendered per format and kept as editable projects, with free variants of the hook or call to action. Use when someone wants an ad, a promo clip or a set of ad variants for something they make or sell. Not for another company's product or brand, software demos from screen captures (product-videos), entertaining feed posts (social-posts), or researching competitors' ads (ad-research).
4
4
  license: MIT
5
- version: 1.1.1
5
+ version: 1.2.0
6
6
  metadata:
7
7
  tesseract.summary: A ready-to-post video ad for your own product in every platform's shape — priced once, editable.
8
8
  tesseract.category: media
9
9
  tesseract.examples: "give me ad ideas for my dental clinic | make a 15-second TikTok ad for my candles from this photo | turn my shop's product page into Reels and feed ads | haz un anuncio en vídeo de mi mochila para Instagram y YouTube | faça três versões do anúncio com ganchos diferentes | 用这张产品照片给我的茶叶做一个竖版广告视频"
10
- tesseract.tools: make_ad, find_ideas, get_idea, ask_form, edit_image, generate_image, image_inspect, image_providers_status, cast_list, cast_save, list_voices, list_effects, video_providers_status, list_camera_moves, extract_video_frames, probe_video, browser_open, browser_eval, check_video_job
10
+ tesseract.tools: make_ad, make_playable_ad, find_ideas, get_idea, ask_form, edit_image, generate_image, image_inspect, image_providers_status, cast_list, cast_save, list_voices, list_effects, video_providers_status, list_camera_moves, extract_video_frames, probe_video, browser_open, browser_eval, check_video_job
11
11
  ---
12
12
 
13
13
  # Product ads
@@ -57,6 +57,25 @@ rough cost — and `get_idea` the one they pick.
57
57
  - An idea is a starting point, not a script to copy: the person's product, voice and offer make it theirs. Creator
58
58
  formats are the `short-form-video` skill's; a promo that is not one product's ad is `promo-videos`.
59
59
 
60
+ ## A playable ad, for a game or an app
61
+
62
+ When the thing advertised is the person's own game or app and they want an ad people can play, this is not a video:
63
+ `make_playable_ad` packs a browser game from the game maker (or any folder with an `index.html`) as the one file an ad
64
+ network takes, with the network's own install call, inside its size limit. It is free. No game yet: start the game
65
+ maker for a short version of the game's best minute; a playable is 15 to 30 seconds of play, then the end card.
66
+
67
+ | Network | File | Limit | Needs |
68
+ |---|---|---|---|
69
+ | AppLovin, any MRAID network | one HTML | 5 MB | the store address |
70
+ | Unity Ads | one HTML | 5 MB | both store addresses |
71
+ | Meta, Moloco | one HTML | 2 MB | nothing more; Meta also wants a lead-in video |
72
+ | Google Ads, Mintegral | a zip | 5 MB | nothing more |
73
+ | TikTok | a zip with config.json | 5 MB | a picture or video beside it |
74
+ | Liftoff | one HTML | 5 MB | nothing more |
75
+
76
+ Only their own game and their own store pages. These limits were read from guides, not from every network's own page:
77
+ tell them to try each file in the network's preview tool before paying for a campaign.
78
+
60
79
  ## 1. Brief
61
80
 
62
81
  One `ask_form` for what is missing:
@@ -33,13 +33,31 @@ BROAD = {"#ai", "#tech", "#technology", "#business", "#worklife", "#work", "#pro
33
33
  DEAD = {"#fyp", "#foryou", "#foryoupage", "#viral", "#explore", "#explorepage", "#trending", "#like4like", "#likeforlike",
34
34
  "#followforfollow", "#follow4follow", "#f4f", "#l4l", "#followme"}
35
35
 
36
- AI_NOTE = re.compile(
37
- r"\((?:image|video|photo|picture|clip|art)?\s*(?:made|created|generated)\s+(?:with|by|using)\s+(?:ai|veo|midjourney|dall[- ·]?e|gpt[- ]?image)[^)]*\)"
38
- r"|\b(?:image|video|photo|picture|clip|this)\s+(?:was\s+)?(?:made|created|generated)\s+(?:with|by|using)\s+(?:ai|veo|midjourney|dall[- ·]?e|gpt[- ]?image)\b"
39
- r"|^\s*(?:made|created|generated)\s+(?:with|by|using)\s+(?:ai|veo)\b"
40
- r"|#(?:madewithai|aigenerated|aiart|generatedbyai)\b",
41
- re.IGNORECASE | re.MULTILINE,
42
- )
36
+ # The same list as packages/shared/src/ai-note.ts (the test keeps them level): a note on how it was MADE, in the languages
37
+ # the makers write in. Words about AI ("two AI agents", "AI-powered") are not one.
38
+ _ENGINE = r"ai|a\.i\.|artificial\s+intelligence|generative\s+ai|chatgpt|midjourney|dall[- ·]?e|gpt[- ]?image|stable\s+diffusion"
39
+ _ENGINE_AFTER_NOUN = _ENGINE + r"|veo|sora|gemini|claude|firefly|kling|flux"
40
+ _VERB = r"made|created|generated|produced|designed|drawn|written|edited|built|crafted|animated|rendered|illustrated|composed"
41
+ _HOW = r"with(?:\s+the\s+help\s+of)?|by|using|via"
42
+ _HOW_MUCH = r"(?:(?:entirely|fully|completely|partly|partially)\s+)?"
43
+ _NOUN = r"image|video|photo|picture|clip|art|artwork|visuals?|illustration|footage"
44
+ _PHRASES = [
45
+ rf"(?:{_VERB})\s+{_HOW_MUCH}(?:{_HOW})\s+(?:an?\s+|the\s+)?(?:{_ENGINE})",
46
+ rf"(?:{_NOUN}|this)\s+(?:(?:was|is)\s+)?(?:{_VERB})\s+{_HOW_MUCH}(?:{_HOW})\s+(?:an?\s+|the\s+)?(?:{_ENGINE_AFTER_NOUN})",
47
+ r"ai[- ](?:generated|made|created|produced)",
48
+ rf"(?:{_NOUN})\s*(?:by|:|credit:)\s*(?:{_ENGINE})",
49
+ r"(?:hech[oa]|cread[oa]|generad[oa]|producid[oa]|diseñad[oa])\s+(?:con|por|mediante)\s+(?:la\s+|una\s+)?(?:ia|inteligencia\s+artificial)",
50
+ r"(?:feit[oa]|criad[oa]|gerad[oa])\s+(?:com|por|pela)\s+(?:a\s+|uma\s+)?(?:ia|inteligência\s+artificial)",
51
+ r"(?:fait|faite|créée?|générée?|réalisée?|conçue?)\s+(?:avec|par)\s+(?:l['’]|une\s+)?(?:ia|intelligence\s+artificielle)",
52
+ r"(?:mit|durch|von)\s+(?:einer\s+)?(?:ki|künstlicher?\s+intelligenz)\s+(?:erstellt|generiert|gemacht|erzeugt)",
53
+ r"ki-(?:generiert|erstellt|erzeugt)\w*",
54
+ r"(?:fatt[oa]|creat[oa]|generat[oa]|realizzat[oa])\s+(?:con|da|dalla)\s+(?:l['’])?(?:ia|intelligenza\s+artificiale)",
55
+ r"(?:făcut[ăa]?|facut[ăa]?|creat[ăa]?|generat[ăa]?|realizat[ăa]?)\s+(?:cu\s+ajutorul|cu|de|prin)\s+(?:ai|ia|inteligen[țt][ăa]\s+artificial[ăa])",
56
+ r"(?:создан[оа]?|сделан[оа]?|сгенерирован[оа]?)\s+(?:с\s+помощью\s+|при\s+помощи\s+|с\s+)?(?:ии|нейросет\w*|искусственн\w*\s+интеллект\w*)",
57
+ ]
58
+ _HASHTAG = r"#(?:madewithai|madebyai|aigenerated|generatedbyai|createdwithai|createdbyai|aiart|aiartwork|aivideo|aiimage|aiphoto|aimade|aicreated)"
59
+ _JOINED = r"AI生成|AI製作|AI作成|AIで(?:作成|生成)|人工智能生成"
60
+ AI_NOTE = re.compile(rf"(?<!\w)(?:{'|'.join(_PHRASES)})(?!\w)|{_HASHTAG}(?!\w)|{_JOINED}", re.IGNORECASE)
43
61
  URL = re.compile(r"\b(?:https?://|www\.)\S+|\b[a-z0-9-]+\.(?:com|dev|app|io|ai|net|org)\b(?:/\S*)?", re.IGNORECASE)
44
62
  HASHTAG = re.compile(r"(?<![\w#])#\w+", re.UNICODE)
45
63
 
@@ -69,7 +69,7 @@ request or drop policy, approving, joining a network, join codes), any settings
69
69
  and sending the person's files to someone else (`drops.prepare` fills in the Send sheet — they press Send) is theirs.
70
70
 
71
71
  To **show** the person something, open it: `navigation.open_settings {section}` (general, appearance, shortcuts,
72
- runners, agent, voice, extensions, account, perks, team, privacy, remote-desktop, network, about),
72
+ projects, runners, agent, capabilities, voice, extensions, developer, account, perks, team, privacy, remote-desktop, network, about),
73
73
  `navigation.open_tab`, `navigation.open_file` — then `navigation.state` says what is in front. Or write a link to one
74
74
  panel — `tesseract://settings/<section>` with `appearance`, `editor`, `runners`, `agent`, `extensions`,
75
75
  `voice`, `image-edit`, `search`, `account`, `team`, `general`, `shortcuts`, `about`,
@@ -16,7 +16,7 @@ it runs in Chat and Plan too.
16
16
 
17
17
  ## navigation — `app_navigation` (the window; needs the app open on this machine)
18
18
  - `navigation.state` R — the project, the view, the tab in front, every tab open, the Settings page if open, which panels show.
19
- - `navigation.open_settings {section?}` (general, appearance, shortcuts, runners, agent, voice, extensions, account, perks, team, privacy, remote-desktop, network, about).
19
+ - `navigation.open_settings {section?}` (general, appearance, shortcuts, projects, runners, agent, capabilities, voice, extensions, developer, account, perks, team, privacy, remote-desktop, network, about).
20
20
  - `navigation.open_tab {tab: home|files|settings|computers|community|team|vault|remote-desktop|stage|fonts|whats-new|image-search|report-issue}` (team = Atrium).
21
21
  - `navigation.open_file {path}` (the app's editor/viewer), `open_browser {url?}`, `open_panel {panel: conversations|files|terminal}`.
22
22
  - `navigation.split {direction: right|down}`, `close_tab` (the tab in front — never your own conversation), `reopen_closed_tab`.
@@ -14,7 +14,7 @@ by name, delete `~/.tesseract` or settings files, or reinstall the app on your o
14
14
  | A remote machine shows offline | `hosts.list` | It has to be on and signed in; repair runs on that machine itself |
15
15
  | Computer control cannot see or click | `permissions.status` for `screen-recording` and `accessibility` | `permissions.open_settings`, then relaunch Tesseract; check computer control is switched on in Settings |
16
16
  | Voice: nothing heard / no reply | `permissions.status {id: "microphone"}`; `voice.has_provider_key {provider: "gemini"}` | Grant the mic; add the key in `tesseract://settings/voice`. Realtime voice is the least proven part of the product — say so if it still fails |
17
- | Web search fails | `settings.has_search_key` | Brokered quota: 1,000 searches a month signed in, 10 signed out; sign in, or wait for the month to roll over |
17
+ | Web search fails | `settings.has_search_key` | Brokered quota: 1,000 searches a month signed in, 500 signed out; sign in, or wait for the month to roll over |
18
18
  | Images do not generate | `image_providers_status` / `image.list_providers` | Add an OpenAI or Google key in `tesseract://settings/image-edit` |
19
19
  | Video does not generate | `video_providers_status` | Sign in (free tier) or add a Google key in image-edit settings |
20
20
  | Music / speech / voice clone fail | `voice.has_provider_key {provider: "elevenlabs"}` | ElevenLabs key in `tesseract://settings/voice` |
@@ -2,7 +2,7 @@
2
2
  name: thumbnails
3
3
  description: Design the picture that gets a video clicked — YouTube thumbnails (1280×720), covers for Shorts, Reels and TikTok, and podcast or series cover art — from the video's promise and title, in three or four different concepts, built from a frame of the person's own video, their own photo or a saved character, a found photo or a generated scene, with the words set exactly in a bold font, checked at the size people really see it on a phone, and saved at the platform's size and file limit, ready for the youtube-channel skill to set. Use when someone wants a thumbnail, a cover or a set of thumbnail options to test, or wants an existing one made clearer or more clickable. Not for the video itself (video-generation, short-form-video), a social post picture (social-posts) or a logo (makers, font-and-logo-design).
4
4
  license: MIT
5
- version: 1.2.0
5
+ version: 1.2.1
6
6
  metadata:
7
7
  tesseract.summary: Clickable YouTube thumbnails and Shorts/Reels/podcast covers — concepts, exact text, phone-size check.
8
8
  tesseract.category: media
@@ -82,9 +82,9 @@ about 80 px tall on a 1280×720 frame:
82
82
  `app_documents` `documents.run` `text` (the editor's Type tool; `documents.commands` with filter "text" shows its
83
83
  argument — font, size, colour, position), crop to 16:9 with `crop` if needed, and `documents.save`.
84
84
  - **Or with `render_edl`**: one image segment (`durationSec: 1`), `output: { width: 1280, height: 720 }` (1080×1920 for
85
- a vertical cover), the words as `titles` (`bold: true`, `size` 120–200, `color`, no `box` — the renderer outlines
86
- and shadows the letters; `output.fontsDir` for the channel's own font), then `extract_video_frames` at 0.5 s gives
87
- the JPEG. A complete call for one concept:
85
+ a vertical cover), the words as `titles` (`bold: true`, `size` 120–200 on 1280×720, `color`, no `box` — the renderer
86
+ outlines and shadows the letters; `output.fontsDir` for the channel's own font), then `extract_video_frames` at 0.5 s
87
+ gives the JPEG. A complete call for one concept:
88
88
 
89
89
  ```json
90
90
  { "version": 1, "output": { "width": 1280, "height": 720, "name": "thumb-A" },
@@ -96,7 +96,9 @@ about 80 px tall on a 1280×720 frame:
96
96
  Titles do not wrap: break long ones with `\n`. Keep every letter inside x 0.05–0.78 and y 0.08–0.78 of a 16:9 frame
97
97
  (the duration stamp covers the bottom right). **Check the fit before rendering**: on 1280×720 at `size` 150 a character
98
98
  takes about 5% of the width, so a line of 10 spans half the frame: centre it far enough in that no letter is cut. On a
99
- 1080×1920 cover `size` is scaled up, so use `size` 70–85, at most 10 characters a line, centred at x 0.43.
99
+ 1080×1920 cover `size` is scaled up, so a character takes about 8% of the width at `size` 70: use `size` 60–70, at most
100
+ 9 characters a line, centred at x 0.43, and keep every letter inside x 0.05–0.82 and y 0.15–0.65 of the cover. A longer
101
+ line is cut off: break it with `\n` or use a shorter word, never a smaller size.
100
102
 
101
103
  **The order of calls:** `image_providers_status` → for their video: `probe_video`, `transcribe_video` and
102
104
  `extract_video_frames` at the moments the transcript points to (never at guessed times), `image_inspect` to pick; for
@@ -110,8 +112,8 @@ the image editor) → the phone check (§ 5) → the final file at the platform'
110
112
  is the emotion? Can you read every word?" If the answer is unclear at that size, simplify — fewer elements, bigger
111
113
  face, fewer words.
112
114
  - On YouTube the **bottom-right corner** is covered by the duration stamp: nothing important there. On vertical covers
113
- keep the top 12% and the bottom quarter clear (the app's name, caption and buttons) and the right-hand 15% free of
114
- faces and text.
115
+ the apps' name, caption and buttons cover everything outside x 0.05–0.82 and y 0.15–0.65: no face and no word there,
116
+ and look at both side edges for a letter cut off.
115
117
  - Compare the concepts side by side and say which you would test first and why.
116
118
 
117
119
  ## 6. Sizes and delivery
@@ -75,6 +75,7 @@ Ease into a moment and back out — the impact in slow motion, the jump frozen a
75
75
 
76
76
  ```json
77
77
  { "asset": "jump", "in": 0, "out": 6, "ramps": [ { "atSec": 2.4, "speed": 0.25, "holdSec": 2, "easeSec": 0.5 } ] }
78
+ { "asset": "jump", "in": 0, "out": 6, "ramps": [ { "preset": "hit-beat", "atSec": 2.4 } ] }
78
79
  ```
79
80
 
80
81
  | Field | Meaning |
@@ -85,6 +86,11 @@ Ease into a moment and back out — the impact in slow motion, the jump frozen a
85
86
  | `easeSec` | source seconds the speed takes to change before and after the moment, 0–2 (default 0.5; 0 = a hard switch) |
86
87
  | `pieces` | steps in each ease, 2–12 (default 5) |
87
88
 
89
+ A ramp can be asked for by name (`list_director_controls` `ramps`); a number given beside the name wins.
90
+ `hit-beat` snaps to slow motion on the moment, `slow-beat` and `deep-slow` savour it, `freeze-beat` and
91
+ `freeze-snap` stop it, `burst-in` and `build-up` rush into `atSec` and land on it, `burst-out` rushes away
92
+ from it, `wind-down` drains the speed, `surge` is a short push.
93
+
88
94
  Up to 4 ramps a segment, apart from each other; the segment needs `in` and `out` and cannot be
89
95
  `reverse`d. The rest of the segment plays at its own `speed`; the sound follows the picture
90
96
  (silent through a freeze). The renderer cuts the segment into pieces of one speed each, fitted to
@@ -60,7 +60,7 @@ packshots, 3D-style renders or a turntable → `3d-product-shots`; a video ad fo
60
60
  animated titles, a logo sting or 3D text → `motion-graphics`; the thumbnail or cover → `thumbnails`.
61
61
 
62
62
  Name the camera move instead of describing it: `camera_move` takes an id from `list_camera_moves`
63
- (for example `dolly-in`, `orbit`, `crane-up`, `crash-zoom-in`, `locked-off`) or two that stack, on
63
+ (for example `dolly-in`, `orbit`, `crane-up`, `crash-zoom-in`, `locked-off`) or up to three that stack, on
64
64
  `generate_video` and on each scene of `create_video_from_scenario`. Choose one per beat — see
65
65
  [references/prompting.md](references/prompting.md) § Camera moves.
66
66
 
@@ -30,8 +30,8 @@ shots — make it a scenario.
30
30
 
31
31
  ## Camera moves
32
32
 
33
- `camera_move` names the move instead of describing it: one id from `list_camera_moves`, or two that
34
- stack. Its camera sentence goes **in front of** the prompt (models drop camera language that comes
33
+ `camera_move` names the move instead of describing it: one id from `list_camera_moves`, or up to
34
+ three that stack. Its camera sentence goes **in front of** the prompt (models drop camera language that comes
35
35
  after the subject), so the prompt itself then describes the subject and the action, not the camera.
36
36
  `generate_video` takes it for the clip; `create_video_from_scenario` takes it per scene.
37
37
 
@@ -39,21 +39,33 @@ after the subject), so the prompt itself then describes the subject and the acti
39
39
 
40
40
  | The beat | Moves |
41
41
  |---|---|
42
- | Hook, first second | `fast-push-in`, `crash-zoom-in`, `fpv-dive` |
43
- | Reveal, realisation | `dolly-in`, `pull-back-reveal`, `tilt-up`, `focus-pull` |
44
- | Hero shot (person or product) | `orbit`, `arc-left` / `arc-right`, `turntable` |
45
- | Movement, travel | `tracking-side`, `follow-behind`, `car-mount`, `fpv-fly-through`, `hyperlapse` |
46
- | Establishing a place | `drone-flyover`, `drone-rise`, `crane-down` |
47
- | Someone talks, a product is shown | `locked-off`, `zoom-in`, `handheld` |
48
- | Tension, unease | `dutch-tilt`, `dolly-zoom`, `body-mount` |
49
- | Between two scenes | `whip-pan`, `pass-through`, `eye-dive` (give the next scene as the last picture) |
50
- | Ending | `crane-up`, `dolly-out`, `space-pull-back`, `rising-orbit` |
51
- | Time | `timelapse`, `slow-motion`, `frozen-moment` |
52
-
53
- **Stacking.** At most two per clip, of different kinds: a move plus a speed (`['crane-up',
54
- 'slow-motion']`, `['locked-off', 'timelapse']`) or two directions (`['dolly-in', 'arc-left']`).
55
- `dolly-zoom`, `frozen-moment`, `eye-dive` and `space-pull-back` are whole moves and stand alone;
56
- `locked-off` and `rising-orbit` pair only with a speed. The tool says so when a pair does not work.
42
+ | Hook, first second | `fast-push-in`, `crash-zoom-in`, `fpv-dive`, `zoom-bounce` |
43
+ | Reveal, realisation | `dolly-in`, `creep-in`, `pull-back-reveal`, `rise-over-reveal`, `tilt-up`, `focus-pull`, `focus-reveal` |
44
+ | Hero shot (person or product) | `orbit`, `half-orbit`, `low-orbit`, `arc-left` / `arc-right`, `turntable`, `motion-sweep` |
45
+ | Movement, travel | `tracking-side`, `follow-behind`, `leading-walk`, `car-mount`, `helmet-cam`, `handlebar-mount`, `fpv-fly-through`, `gimbal-glide`, `hyperlapse` |
46
+ | Establishing a place | `drone-flyover`, `drone-rise`, `drone-top-down`, `heli-aerial`, `crane-down`, `sweeping-crane` |
47
+ | Someone talks, a product is shown | `locked-off`, `near-still`, `still-top-shot`, `zoom-in`, `parallax-slide`, `handheld` |
48
+ | Tension, unease | `dutch-tilt`, `dolly-zoom`, `reverse-dolly-zoom`, `body-mount`, `high-corner`, `boat-sway` |
49
+ | Between two scenes | `whip-pan`, `whip-tilt`, `pass-through`, `foreground-wipe`, `eye-dive` (give the next scene as the last picture) |
50
+ | Ending | `crane-up`, `dolly-out`, `creep-out`, `drone-pull-away`, `space-pull-back`, `rising-orbit`, `defocus-out` |
51
+ | Time | `timelapse`, `slow-motion`, `frozen-moment`, `shutter-drag`, `stop-motion`, `undercranked` |
52
+
53
+ **Stacking.** Up to three moves in a clip, by a small grammar:
54
+
55
+ - `+` (or a list) runs moves **together**: `dolly-in + handheld + slow-motion` is a move, how the
56
+ camera is held and a speed. They must be of different kinds, may not pull the camera in opposite
57
+ directions (`crane-up + fpv-dive`), and at most two may travel through space. A fast snap
58
+ (`whip-pan`, `crash-zoom-in`) cannot run in `slow-motion`.
59
+ - `>` runs them **one after the other**: `crane-up > pan-left`, `locked-off > dolly-in`. Moves of one
60
+ kind and opposite moves are fine here. Give each step about three seconds of the clip.
61
+ - `dolly-zoom`, `reverse-dolly-zoom`, `frozen-moment`, `eye-dive` and `space-pull-back` are whole moves
62
+ and stand alone; `locked-off`, `near-still`, `high-corner`, `still-top-shot`, `rising-orbit` and
63
+ `barrel-roll` run together only with a speed.
64
+
65
+ The tool says why when a stack does not work.
66
+
67
+ **Unproven moves.** A move with `status: seed` in `list_camera_moves` has never been run live, so its
68
+ result is not known. Say so before spending on one, or pick a move without that mark.
57
69
 
58
70
  **Which model.** The plain moves (dolly, crane, pan, tilt, arc, zoom, handheld, drone) work on every
59
71
  model — Gemini Omni Flash, Kling and PixVerse. Fast, complex motion — `fpv-dive`, `fpv-fly-through`,