๐ŸŽ Get the FREE AI Skills Starter Guide โ€” Subscribe โ†’
BytesAgainBytesAgain
๐Ÿฆ€ ClawHub

NotebookLM Studio

by @jasontsaicc

Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map,...

Versionv2.1.3
Downloads800
Starsโญ 1
TERMINAL
clawhub install notebooklm-studio

๐Ÿ“– About This Skill


name: notebooklm-studio description: > Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map, slides, infographic, data table. Use when the user sends content and asks to generate learning materials, podcasts, videos, or study packages. version: 2.1.2 metadata: openclaw: requires: bins: [notebooklm, ffmpeg] emoji: "๐ŸŽ™๏ธ"

NotebookLM Studio

Import sources into NotebookLM, generate user-selected artifacts via CLI, download results locally.

Inputs

Collect from user message (ask only for missing fields):

  • Sources: URLs, YouTube links, text notes, or file attachments (PDF, Word, audio, image, Google Drive link)
  • Artifacts: User selects from 9 types (no default โ€” always ask):
  • - audio (podcast), video, report, quiz, flashcards, mind-map, slide-deck, infographic, data-table
  • Language (optional, default: zh_Hant): applied via notebooklm language set
  • - โš ๏ธ This is a GLOBAL setting โ€” affects all notebooks in the account
  • Artifact options (discussed in step 1b): format, style, length, difficulty, etc.
  • See references/artifact-options.md for all options per artifact type.
  • Custom instructions (optional): passed as description to generate commands
  • Telegram target (optional, OpenClaw only): chat_id for delivery
  • See references/source-types.md for source type detection rules. See references/artifacts.md for all 9 artifact types and CLI options.

    Workflow

    Steps are sequential gates โ€” do NOT skip or combine steps. Each numbered step must complete before the next begins. In particular:

  • Step 0 (auth precheck) must run and pass before any other CLI command.
  • Step 1b (options discussion) must get user confirmation before generation. Do not assume defaults unless the user explicitly says "use defaults."
  • 0. Auth precheck โ€” Verify the session is valid before doing any work:

       notebooklm auth check --test --json
       
    - "status": "ok" โ†’ proceed to step 1. - "status": "error" โ†’ stop immediately. Tell the user: > NotebookLM ็™ปๅ…ฅๅทฒ้ŽๆœŸ๏ผŒ่ซ‹ๅ…ˆ้‡ๆ–ฐ็™ปๅ…ฅ๏ผˆnotebooklm login๏ผ‰๏ผŒๅฎŒๆˆๅพŒๅ‘Š่จดๆˆ‘๏ผŒๆˆ‘ๅ†็นผ็บŒใ€‚ - Command itself fails (network error, CLI not found, etc.) โ†’ also stop and report the error. - --test is required โ€” without it, only local checks run, which can pass even with an expired session. - When the user confirms re-login, re-run this check before continuing.

    1. Parse input & configure artifacts โ€”

    1a. Select artifacts โ€” Detect source types from user message (URLs, files, text). Confirm which artifacts to generate.

    1b. Discuss options โ€” Before generating, confirm key options for each selected artifact. Refer to references/artifact-options.md for priority levels: - ASK options: must ask the user - OFFER options: state the default, let user decide whether to change - SILENT options: use defaults without asking - Options already specified by the user โ†’ skip - Present all questions in a single message (batch, not one-by-one)

    If user says "use defaults" โ†’ skip all questions, proceed with default values immediately.

    Example agent message (audio + video + report + quiz + flashcards + slides + infographic selected): > Before generating, a few options to confirm: > - Podcast: deep-dive / brief / critique / debate? > - Video: explainer / brief / cinematic? (cinematic uses Veo 3, takes 30-40 min) > - Report: briefing-doc / study-guide / blog-post / custom? > - Slides: detailed / presenter? > - Quiz & Flashcards: difficulty medium, quantity standard โ€” adjust? > - Infographic: style auto, or prefer a specific style (sketch-note, professional, bento-grid...)? > - Language: zh_Hant, OK? > > Or just say "use defaults" to start immediately.

    2. Derive slug โ€” Based on the sources and user message, generate a short kebab-case slug (2-4 words) that captures the core topic. This slug is used for both the notebook name and the output directory. - Examples: react-server-components, feynman-technique, taiwan-semiconductor-q4 - Keep it concise, lowercase, ASCII-only (transliterate non-ASCII if needed) - If the user provides a topic or title, prefer that as the basis

    3. Create notebook โ€”

       notebooklm create " "
       # โ†’ {"notebook_id": "xyz789", ...}  โ† capture notebook_id
       notebooklm use 
       mkdir -p ./output/
       

    4. Set language โ€”

       notebooklm language set 
       
    Use the language confirmed in step 1b. โš ๏ธ GLOBAL setting โ€” always set explicitly to avoid residual from previous runs.

    5. Add sources โ€” For each source:

       # URL, YouTube, or file path
       notebooklm source add ""

    # Google Drive notebooklm source add-drive "" </code></pre> For plain text โ†’ save to a <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.txt</code> file first, then <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source add "./temp_text.txt"</code>.</p><p style="margin:8px 0">6. <strong style="color:#e5e7eb">Generate artifacts</strong> โ€” Two-tier strategy for timeout safety:</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">โš ๏ธ Deduplication gate (Tier 2 only)</strong> โ€” Before generating Tier 2 artifacts, call <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">artifact list</code> <strong style="color:#e5e7eb">once</strong> and check all requested types in that single response: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> notebooklm artifact list --json # โ†’ [{"task_id": "abc123", "type": "slide-deck", "status": "processing"}, ...] </code></pre> For each Tier 2 artifact you are about to generate, look for entries where <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">type</code> matches (e.g., <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">slide-deck</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">audio</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">video</code>). If multiple entries match the same type, the non-terminal status takes priority (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">processing</code>/<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pending</code> > <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">completed</code> > <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">failed</code>): - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">processing</code> / <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pending</code> โ†’ <strong style="color:#e5e7eb">do NOT generate again</strong>. Take the existing <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">task_id</code>, go to step 9 (wait + deliver). - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">completed</code> โ†’ <strong style="color:#e5e7eb">do NOT generate again</strong>. Skip the wait โ€” go directly to download + deliver in step 9. - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">failed</code> โ†’ safe to re-generate. - No matching entry โ†’ proceed with generation.</p><p style="margin:8px 0"> If <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">artifact list</code> itself fails or returns an error, proceed with generation โ€” the dedup check is a safety net, not a hard gate. Duplicate generation wastes resources and causes confusion โ€” this gate prevents the most common operational error.</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">Tier 1 โ€” Immediate</strong> (use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code>, completes within timeout): <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> # Sync (instant) notebooklm generate mind-map</p><p style="margin:8px 0"> # Fast async (1-2 min) โ€” use options confirmed in step 1b notebooklm generate report --format <chosen_format> --wait notebooklm generate quiz --difficulty <chosen_difficulty> --quantity <chosen_quantity> --wait notebooklm generate flashcards --difficulty <chosen_difficulty> --quantity <chosen_quantity> --wait notebooklm generate data-table "<description>" --wait</p><p style="margin:8px 0"> # Medium async (2-5 min, borderline โ€” if timeout, retry or move to Tier 2) notebooklm generate infographic --style <chosen_style> --orientation <chosen_orientation> --wait </code></pre></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">Tier 2 โ€” Deferred</strong> (use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--json</code> without <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code>, capture <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">task_id</code> for step 9): <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> # Slow async โ€” use options confirmed in step 1b # Parse JSON output to extract task_id for polling notebooklm generate slide-deck --format <chosen_format> --json # โ†’ {"task_id": "abc123", "status": "pending"} โ† save task_id</p><p style="margin:8px 0"> notebooklm generate video --format <chosen_format> --style <chosen_style> --json # โ†’ {"task_id": "def456", "status": "pending"} โ† save task_id # Note: if cinematic, omit --style (ignored by Veo 3)</p><p style="margin:8px 0"> notebooklm generate audio "<description>" --format <chosen_format> --length <chosen_length> --json # โ†’ {"task_id": "ghi789", "status": "pending"} โ† save task_id </code></pre> Options accepted as defaults in step 1b can be omitted (CLI uses its own defaults). Parse each JSON response and save the <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">task_id</code> โ€” you will need it in step 9. Only generate the artifacts the user requested. Skip the rest. See <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">references/artifacts.md</code> โ†’ "Deferred Generation" for Tier 2 details.</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">Write delivery status</strong> โ€” Immediately after all Tier 2 generates are dispatched, write <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">./output/<slug>/delivery-status.json</code> so the recovery script can pick up if the agent times out: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> { "slug": "<slug>", "notebook_id": "<notebook_id>", "created_at": "<ISO 8601>", "artifacts": [ {"type": "slide-deck", "task_id": "<id>", "status": "pending", "output_path": "./output/<slug>/slides.pdf"}, {"type": "audio", "task_id": "<id>", "status": "pending", "output_path": "./output/<slug>/podcast.mp3"} ] } </code></pre> Update each artifact's <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">status</code> to <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">completed</code> or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">failed</code> as step 9 progresses. This file is the handoff contract between the agent and <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">scripts/recover_tier2_delivery.sh</code>. Telegram delivery is agent-only (requires OpenClaw <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">message</code> tool); the recovery script handles download + status tracking only.</p><p style="margin:8px 0">7. <strong style="color:#e5e7eb">Download Tier 1</strong> โ€” Each successful Tier 1 artifact into <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">./output/<slug>/</code>: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> notebooklm download mind-map ./output/<slug>/mindmap.json notebooklm download report ./output/<slug>/report.md notebooklm download quiz --format json ./output/<slug>/quiz.json notebooklm download flashcards --format json ./output/<slug>/flashcards.json notebooklm download data-table ./output/<slug>/data.csv notebooklm download infographic ./output/<slug>/infographic.png </code></pre></p><p style="margin:8px 0">8. <strong style="color:#e5e7eb">Report + Deliver Tier 1</strong> โ€” Present completed Tier 1 artifacts to user. If Tier 2 artifacts are pending, include a status note: > "Slides/Audio/Video are still generating, I'll send them when ready."</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">Telegram delivery</strong> (OpenClaw only) โ€” If <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">message</code> tool is available: 1. Text summary with Tier 2 pending status (always first) 2. Report โ†’ Quiz โ†’ Flashcards โ†’ Mind Map โ†’ Infographic โ†’ Data Table</p><p style="margin:8px 0"> See <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">references/telegram-delivery.md</code> for delivery contract. Skip Telegram delivery if running outside OpenClaw (e.g. Claude Code, Codex).</p><p style="margin:8px 0">9. <strong style="color:#e5e7eb">Poll + Deliver Tier 2</strong> โ€” Wait for each deferred artifact in order of expected speed (fastest first), then download and deliver as each completes: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> # Wait by expected completion order: slide-deck (fastest) โ†’ video โ†’ audio (slowest) # Uses --interval 5 (not default 2) since Tier 2 artifacts take minutes, not seconds notebooklm artifact wait <slide_task_id> --timeout 1800 --interval 5 --json # โ†’ {"status": "completed", ...} โ† task_id from generate is used as artifact_id here notebooklm download slide-deck ./output/<slug>/slides.pdf # โ†’ deliver to Telegram immediately</p><p style="margin:8px 0"> notebooklm artifact wait <video_task_id> --timeout 1800 --interval 5 --json # Note: if cinematic, use --timeout 2400 (generation takes 30-40 min) notebooklm download video ./output/<slug>/video.mp4 # โ†’ deliver to Telegram immediately</p><p style="margin:8px 0"> notebooklm artifact wait <audio_task_id> --timeout 1800 --interval 5 --json notebooklm download audio ./output/<slug>/podcast.mp3 bash scripts/compress_audio.sh ./output/<slug>/podcast.mp3 ./output/<slug>/podcast_compressed.mp3 # โ†’ deliver to Telegram immediately </code></pre> - <strong style="color:#e5e7eb">Order matters</strong>: wait for fastest artifact first (slide-deck โ†’ video โ†’ audio) to minimize idle time - On completion: download โ†’ post-process โ†’ deliver to Telegram โ†’ update <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delivery-status.json</code> status to <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">completed</code> - On failure: update status to <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">failed</code> with reason, notify user, continue to next artifact - On timeout: see timeout recovery below - Max wait: 30 minutes per artifact (covers worst-case audio/video) - If agent is about to exit with any artifact still <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pending</code>, tell the user: > "Tier 2 ่ฃœ้€ๆจกๅผๅทฒๅ•Ÿๅ‹•๏ผŒrecovery script ๆœƒๆฏ 5 ๅˆ†้˜ๆชขๆŸฅไธฆ่‡ชๅ‹•้€้”ใ€‚"</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">โš ๏ธ Timeout recovery</strong> โ€” If <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">artifact wait</code> returns <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">status: "timeout"</code>, the artifact is likely still generating. <strong style="color:#e5e7eb">NEVER re-generate</strong>. Instead: 1. Re-check status: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">notebooklm artifact poll <task_id> --json</code> 2. If <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">processing</code> โ†’ re-wait: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">notebooklm artifact wait <task_id> --timeout 1800 --interval 5 --json</code> 3. If <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">completed</code> โ†’ download and deliver 4. If <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">failed</code> โ†’ notify user with error, move to next artifact 5. If re-wait also times out (2+ total timeouts, ~60 min elapsed) โ†’ give up, notify user, suggest downloading from NotebookLM directly A timeout means the wait expired, not that generation failed. The task continues server-side. Re-generating creates duplicates and wastes time.</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Error handling</h3></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Auth errors</strong> โ†’ caught by step 0 precheck. If any CLI command later returns an authentication/session error (HTTP 401, "Not logged in", "session expired", token fetch failure), treat it as a mid-workflow auth failure โ€” stop, ask user to re-login, then re-run step 0 before resuming.</li> <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Tier 1 failure</strong>: retry up to 2 times, then include failure note in step 8 delivery.</li> <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Tier 2 failure</strong>: notify user per-artifact in step 9. Tier 1 is already delivered by this point, so Tier 2 failures never block text artifact delivery.</li> <li style="color:#94a3b8;margin:3px 0">Capture failure reason in delivery status.</li></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Delivery confirmation gate</h3></p><p style="margin:8px 0">Before reporting "complete" to the user, ALL of the following must be true: 1. Every requested artifact is either <strong style="color:#e5e7eb">successfully delivered</strong> or <strong style="color:#e5e7eb">reported as failed with reason</strong> 2. For Telegram delivery (OpenClaw): each <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">message</code> tool call (OpenClaw's built-in messaging tool) returned a success response with a <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">messageId</code> - If a send fails, retry once. If still failing, report the failure to the user โ€” do NOT silently skip 3. No artifact is still in <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">processing</code> or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pending</code> status without being tracked</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Never say "done" while any artifact is still pending delivery.</strong> If Tier 2 artifacts are still generating, say so explicitly and continue waiting. The task is not complete until everything is delivered or accounted for.</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Quality gate</h3></p><p style="margin:8px 0">Before delivery, verify: <li style="color:#94a3b8;margin:3px 0">Sources are concrete article/content pages (not category/index pages).</li> <li style="color:#94a3b8;margin:3px 0">Report contains actionable takeaways (not generic summary).</li> <li style="color:#94a3b8;margin:3px 0">Quiz tests key concepts and mechanics.</li> <li style="color:#94a3b8;margin:3px 0">Flashcards focus on terms, decisions, and trade-offs.</li> <li style="color:#94a3b8;margin:3px 0">Output respects requested language and length.</li></p><p style="margin:8px 0">See <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">references/output-contracts.md</code> for format specifications.</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Delivery template</h3></p><p style="margin:8px 0">1. Selection rationale (<=3 bullets) 2. Artifact list with paths/status (all 9 types if applicable) 3. Key takeaways (3-5 bullets) 4. Failures + fallback note (if any) 5. One discussion question</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Changelog</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">v2.1.0</h4></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Auth precheck gate</strong> โ€” step 0 runs <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">auth check --test --json</code> before any work; expired sessions fail fast instead of blowing up mid-generation.</li> <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Dedup gate</strong> โ€” step 6 checks <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">artifact list</code> before Tier 2 generation to prevent duplicate artifacts when agent retries or resumes.</li> <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Timeout recovery</strong> โ€” <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">artifact wait</code> timeout no longer triggers re-generation; polls status and re-waits, giving up only after 2 consecutive timeouts (~60 min).</li> <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Delivery confirmation gate</strong> โ€” agent cannot claim "done" until every artifact is delivered or explicitly reported as failed with reason.</li> <li style="color:#94a3b8;margin:3px 0"><strong style="color:#e5e7eb">Delivery status contract</strong> โ€” step 6 writes <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">delivery-status.json</code> after Tier 2 dispatch; step 9 updates it as artifacts complete. Enables cron-based recovery via <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">scripts/recover_tier2_delivery.sh</code> when agent times out.</li> </p></div></section></div><div class="two-col-side"></div></div></div><script> document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn => { btn.addEventListener('click', () => { const cmd = btn.getAttribute('data-cmd'); if (!cmd) return; navigator.clipboard.writeText(cmd).then(() => { const orig = btn.textContent; btn.textContent = 'Copied!'; setTimeout(() => btn.textContent = orig, 1500); }).catch(() => {}); }); }); </script><!--$--><!--/$--></main><footer style="background:var(--bg-primary);border-top:1px solid var(--border-secondary);margin-top:60px"><div style="border-top:1px solid var(--border-light);max-width:1200px;margin:0 auto;padding:24px 20px"><div style="display:flex;justify-content:space-between;flex-wrap:wrap;gap:24px;margin-bottom:24px"><div><div style="font-weight:700;color:var(--text-muted);margin-bottom:8px">BytesAgain</div><div style="color:var(--text-muted3);font-size:.82em;max-width:200px">Discover the best AI agent skills for your workflow.</div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Explore</div><div style="margin-bottom:6px"><a href="/skills" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Skills</a></div><div style="margin-bottom:6px"><a href="/articles" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Articles</a></div><div style="margin-bottom:6px"><a href="/use-case" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Cases</a></div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Company</div><div style="margin-bottom:6px"><a href="/about" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">About</a></div><div style="margin-bottom:6px"><a href="/contact" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Contact</a></div><div style="margin-bottom:6px"><a href="/privacy-policy" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Privacy Policy</a></div><div style="margin-bottom:6px"><a href="/terms" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Terms</a></div><div style="margin-bottom:6px"><a href="/feedback" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Feedback</a></div></div></div><div style="border-top:1px solid var(--border-light);padding-top:16px"><div style="color:var(--text-muted4);font-size:.8em;margin-bottom:8px">ยฉ <!-- -->2026<!-- --> BytesAgain. All rights reserved.</div><div style="color:var(--text-muted5);font-size:.75em;line-height:1.6;max-width:720px">BytesAgain is an independent skill directory. We index and link to third-party content (ClawHub, GitHub, LobeHub, Dify, etc.) for informational purposes only. All trademarks, skill names, and content are the property of their respective owners. BytesAgain does not claim ownership of any indexed content.</div></div></div></footer><button style="position:fixed;bottom:28px;right:28px;z-index:1000;width:48px;height:48px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#667eea,#00d4ff);color:#fff;font-size:1.3em;box-shadow:0 4px 20px #667eea66;display:flex;align-items:center;justify-content:center;transition:transform .2s">๐Ÿ’ฌ</button><script src="/_next/static/chunks/0ze4gu236oq96.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[62894,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"LangProvider\"]\n3:I[89220,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ThemeProvider\"]\n4:I[16988,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\ne:I[68027,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\",1]\n:HL[\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"style\"]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n5:Td5e,"])</script><script>self.__next_f.push([1,"[{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"description\":\"Search 60,000+ verified AI agent skills via MCP API or REST. Supports 7 languages. Free, no auth required.\",\"inLanguage\":[\"en\",\"zh\",\"es\",\"fr\",\"de\",\"ja\",\"ko\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://bytesagain.com/skills?q={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}},{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://bytesagain.com/og-image.png\"},\"description\":\"AI agent skill directory. Search 60,000+ skills, 1,000+ use cases, and community requests.\",\"foundingDate\":\"2026\",\"foundingLocation\":{\"@type\":\"Place\",\"name\":\"Global\"},\"sameAs\":[\"https://x.com/bytesagain\",\"https://github.com/bytesagain/ai-skills\",\"https://clawhub.ai/profile/bytesagain\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"email\":\"hello@bytesagain.com\",\"contactType\":\"customer support\"},\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"value\":1}},{\"@context\":\"https://schema.org\",\"@type\":\"WebApplication\",\"name\":\"BytesAgain AI Skills Search\",\"url\":\"https://bytesagain.com\",\"applicationCategory\":\"DeveloperApplication\",\"operatingSystem\":\"Web\",\"description\":\"Search engine and MCP API for 60,000+ AI agent skills. Semantic search, role recommendations, and use case packs.\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"},\"featureList\":[\"Search 60,000+ AI agent skills\",\"Role-based recommendations for developers, creators, and traders\",\"1,000+ curated use case packs\",\"Free MCP API and REST API\",\"Multi-language search (EN, ZH, ES, FR, DE, JA, KO)\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":\"https://bytesagain.com/skills?q={search_term_string}\",\"query-input\":\"required name=search_term_string\"},\"dateModified\":\"2026-07-19\"},{\"@context\":\"https://schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"What is BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"BytesAgain is a curated directory of 60,000+ AI agent skills from ClawHub, GitHub, LobeHub, and Dify. Search skills by keyword in 7 languages, browse by role (developer, creator, trader, marketer) or by use case.\"}},{\"@type\":\"Question\",\"name\":\"How do I find AI skills on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use the search bar on BytesAgain.com to search by keyword in 7 languages. You can also browse by role (developer, creator, trader, marketer) or by use case. Each skill shows install instructions for Claude, Cursor, OpenClaw, Continue, and more.\"}},{\"@type\":\"Question\",\"name\":\"Is BytesAgain free?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, BytesAgain is completely free. No registration required for searching skills. The MCP API is also free with rate limits.\"}},{\"@type\":\"Question\",\"name\":\"Does BytesAgain have an API for AI agents?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! BytesAgain provides a free MCP SSE endpoint at /api/mcp/sse for AI agents, plus a REST API at /api/mcp?action=search\u0026q=\u003cquery\u003e. No authentication needed.\"}},{\"@type\":\"Question\",\"name\":\"Can I request a new AI skill on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! Visit the Requests page on BytesAgain.com to submit a skill request. Your request will be visible to the community and notified to the site admin.\"}}]}]"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"skill\",\"notebooklm-studio\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skill\",{\"children\":[[\"slug\",\"notebooklm-studio\",\"d\",null],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"llms\",\"href\":\"/llms.txt\"}],[\"$\",\"link\",null,{\"rel\":\"llms-full\",\"href\":\"/llms-full.txt\"}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-3C1MM9FWYF\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.dataLayer = window.dataLayer || [];\\n function gtag(){dataLayer.push(arguments);}\\n gtag('js', new Date());\\n gtag('config', 'G-3C1MM9FWYF');\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"geist_9e050971-module__05dp7a__className\",\"style\":{\"margin\":0},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":\"100%\",\"background\":\"var(--bg-subscribe)\",\"borderBottom\":\"1px solid var(--border-primary)\",\"padding\":\"8px 20px\",\"textAlign\":\"center\",\"fontSize\":\".82em\",\"color\":\"#818cf8\"},\"children\":[\"๐ŸŽ \",[\"$\",\"strong\",null,{\"style\":{\"color\":\"var(--text-primary)\"},\"children\":\"Get the FREE AI Skills Starter Guide\"}],\" โ€” \",[\"$\",\"a\",null,{\"href\":\"/register\",\"style\":{\"color\":\"#00d4ff\",\"textDecoration\":\"underline\"},\"children\":\"Subscribe โ†’\"}]]}],[\"$\",\"$L4\",null,{}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$5\"}}],\"$L6\",\"$L7\",\"$L8\"]}]}]}]]}]]}],{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:I[39756,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n11:I[37457,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n12:I[22016,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0ka051yepewro.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"\"]\n13:I[90940,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n14:I[16397,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n16:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"OutletBoundary\"]\n17:\"$Sreact.suspense\"\n1a:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ViewportBoundary\"]\n1c:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"MetadataBoundary\"]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"main\",null,{\"children\":[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"main\",null,{\"style\":{\"minHeight\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"background\":\"#050611\",\"color\":\"#e5e7eb\"},\"children\":[[\"$\",\"style\",null,{\"children\":\"\\n .nf-box { text-align: center; padding: 60px 32px; }\\n .nf-code { font-size: 6rem; font-weight: 900; color: #22d3ee; line-height: 1; margin: 0; }\\n .nf-title { font-size: 1.8rem; font-weight: 800; margin: 12px 0 8px; }\\n .nf-desc { color: var(--text-muted2); font-size: 1rem; margin-bottom: 32px; max-width: 440px; }\\n .nf-link { display: inline-block; padding: 12px 28px; background: linear-gradient(135deg,#34d399,#22d3ee); color: #000; font-weight: 900; border-radius: 12px; text-decoration: none; }\\n \"}],[\"$\",\"div\",null,{\"className\":\"nf-box\",\"children\":[[\"$\",\"p\",null,{\"className\":\"nf-code\",\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"nf-title\",\"children\":\"Page Not Found\"}],[\"$\",\"p\",null,{\"className\":\"nf-desc\",\"children\":\"The skill or page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"$L12\",null,{\"className\":\"nf-link\",\"href\":\"/\",\"children\":\"Back to BytesAgain\"}]]}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]\n"])</script><script>self.__next_f.push([1,"7:[\"$\",\"$L13\",null,{}]\n8:[\"$\",\"$L14\",null,{}]\n9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L15\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@18\"}]}]]}]\n19:[]\nc:\"$W19\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1a\",null,{\"children\":\"$L1b\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1c\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1d\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"1b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1e:I[27201,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"IconMark\"]\n18:null\n"])</script><script>self.__next_f.push([1,"1d:[[\"$\",\"title\",\"0\",{\"children\":\"NotebookLM Studio โ€” AI Agent Skill | BytesAgain | BytesAgain\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map,...\"}],[\"$\",\"meta\",\"2\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"3\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"llms-txt\",\"content\":\"https://bytesagain.com/llms.txt\"}],[\"$\",\"meta\",\"5\",{\"name\":\"llms-full-txt\",\"content\":\"https://bytesagain.com/llms-full.txt\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://bytesagain.com/skill/notebooklm-studio\"}],[\"$\",\"meta\",\"7\",{\"name\":\"baidu-site-verification\",\"content\":\"codeva-0evUqX1TFs\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"NotebookLM Studio โ€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map,...\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://bytesagain.com/skill/notebooklm-studio\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"BytesAgain\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"NotebookLM Studio โ€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map,...\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1e\",\"23\",{}]]\n"])</script><script>self.__next_f.push([1,"1f:T1562,"])</script><script>self.__next_f.push([1,"\n .skill-page { max-width: 1100px; margin: 0 auto; padding: 32px 20px 80px; }\n .two-col { display: flex; gap: 32px; align-items: flex-start; }\n .two-col-main { flex: 1; min-width: 0; }\n .two-col-side { width: 300px; flex-shrink: 0; }\n @media (max-width: 860px) {\n .two-col { flex-direction: column; }\n .two-col-side { width: 100%; }\n }\n .breadcrumb { font-size: .82em; color: var(--text-muted2); margin-bottom: 28px; }\n .breadcrumb a { color: #818cf8; text-decoration: none; }\n .breadcrumb a:hover { text-decoration: underline; }\n .skill-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 20px; padding: 28px; margin-bottom: 24px; }\n .skill-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n .skill-badges { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .skill-top-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }\n .badge { display: inline-flex; align-items: center; gap: 5px; font-size: .75em; font-weight: 600; padding: 4px 12px; border-radius: 999px; border: 1px solid transparent; }\n .skill-title { font-size: 1.6em; font-weight: 800; color: var(--text-primary); margin: 0 0 4px; line-height: 1.2; }\n .skill-owner { font-size: .82em; color: var(--text-muted2); margin: 0 0 14px; }\n .skill-owner span { color: #818cf8; }\n .skill-desc { font-size: .92em; color: var(--text-secondary); line-height: 1.65; margin: 0 0 16px; }\n .skill-meta { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; padding-bottom: 16px; border-bottom: 1px solid var(--border-card); }\n .meta-item { display: flex; flex-direction: column; gap: 2px; }\n .meta-label { font-size: .7em; color: var(--text-muted5); text-transform: uppercase; letter-spacing: 1px; font-weight: 600; }\n .meta-value { font-size: .92em; color: var(--text-muted2); font-weight: 600; }\n .tags-row { display: flex; gap: 6px; flex-wrap: wrap; }\n .tag { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 3px 10px; text-decoration: none; }\n .tag:hover { background: #6366f125; }\n .install-box { background: var(--bg-deep); border: 1px solid var(--border-card); border-radius: 12px; overflow: hidden; margin-bottom: 24px; }\n .install-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; border-bottom: 1px solid var(--border-card); }\n .install-dots { display: flex; gap: 6px; }\n .dot { width: 10px; height: 10px; border-radius: 50%; }\n .install-label { font-size: .72em; color: var(--text-muted5); font-family: monospace; letter-spacing: 1px; }\n .install-body { padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n .install-cmd { color: var(--text-code);\n font-family: 'Courier New', monospace; font-size: 1em; }\n .copy-btn { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 5px 12px; cursor: pointer; white-space: nowrap; transition: all .15s; }\n .copy-btn:hover { background: #6366f125; }\n .btn-secondary { display: inline-flex; align-items: center; gap: 8px; padding: 13px 24px; background: transparent; border: 1px solid var(--border-card); border-radius: 10px; color: #6b7280; text-decoration: none; font-weight: 600; font-size: .95em; transition: all .15s; }\n .btn-secondary:hover { border-color: #818cf8; color: #818cf8; }\n .ours-badge { display: inline-flex; align-items: center; gap: 6px; font-size: .72em; font-weight: 700; color: #22d3ee; background: #22d3ee10; border: 1px solid #22d3ee30; border-radius: 999px; padding: 4px 14px; }\n .section-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 16px; padding: 22px 24px; margin-bottom: 20px; }\n .section-title { color: var(--text-primary); font-size: 1.08em; font-weight: 800; margin: 0 0 12px; display: flex; align-items: center; gap: 8px; }\n /* Script box */\n .script-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--bg-input); border-bottom: 1px solid var(--border-card); }\n .script-filename { font-size: .72em; color: var(--text-muted2); font-family: 'Courier New', monospace; }\n .script-copy-btn { font-size: .72em; color: #6366f1; background: none; border: 1px solid #6366f130; border-radius: 4px; padding: 2px 10px; cursor: pointer; }\n .script-copy-btn:hover { background: #6366f115; }\n .script-body { padding: 14px 16px; font-family: 'Courier New', monospace; font-size: .82em; line-height: 1.6; color: var(--text-code); overflow-x: auto; max-height: 420px; overflow-y: auto; white-space: pre; }\n /* Articles */\n .article-card { display: block; background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 10px; padding: 14px 16px; text-decoration: none; transition: border-color .15s; }\n .article-card:hover { border-color: #6366f1; }\n @media (max-width: 600px) {\n .skill-card { padding: 20px; }\n .skill-title { font-size: 1.5em; }\n }\n "])</script><script>self.__next_f.push([1,"15:[[\"$\",\"style\",null,{\"children\":\"$1f\"}],\"$L20\",\"$L21\"]\n"])</script><script>self.__next_f.push([1,"22:I[78297,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n23:T76ba,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\nname: notebooklm-studio\ndescription: \u003e\n Import sources (URLs, YouTube, files, text) into Google NotebookLM\n and generate user-selected artifacts: podcast, video, report, quiz,\n flashcards, mind map, slides, infographic, data table.\n Use when the user sends content and asks to generate learning\n materials, podcasts, videos, or study packages.\nversion: 2.1.2\nmetadata:\n openclaw:\n requires:\n bins: [notebooklm, ffmpeg]\n emoji: \"๐ŸŽ™๏ธ\"\n\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eNotebookLM Studio\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eImport sources into NotebookLM, generate user-selected artifacts via CLI, download results locally.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eInputs\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eCollect from user message (ask only for missing fields):\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSources\u003c/strong\u003e: URLs, YouTube links, text notes, or file attachments (PDF, Word, audio, image, Google Drive link)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eArtifacts\u003c/strong\u003e: User selects from 9 types (no default โ€” always ask):\u003c/li\u003e\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaudio\u003c/code\u003e (podcast), \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003evideo\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereport\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003equiz\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eflashcards\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emind-map\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eslide-deck\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003einfographic\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata-table\u003c/code\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eLanguage\u003c/strong\u003e (optional, default: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ezh_Hant\u003c/code\u003e): applied via \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enotebooklm language set\u003c/code\u003e\u003c/li\u003e\n - โš ๏ธ This is a \u003cstrong style=\"color:#e5e7eb\"\u003eGLOBAL\u003c/strong\u003e setting โ€” affects all notebooks in the account\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eArtifact options\u003c/strong\u003e (discussed in step 1b): format, style, length, difficulty, etc.\u003c/li\u003e\n See \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/artifact-options.md\u003c/code\u003e for all options per artifact type.\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eCustom instructions\u003c/strong\u003e (optional): passed as description to generate commands\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTelegram target\u003c/strong\u003e (optional, OpenClaw only): chat_id for delivery\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eSee \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/source-types.md\u003c/code\u003e for source type detection rules.\nSee \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/artifacts.md\u003c/code\u003e for all 9 artifact types and CLI options.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eWorkflow\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSteps are sequential gates โ€” do NOT skip or combine steps.\u003c/strong\u003e Each numbered step must complete before the next begins. In particular:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eStep 0 (auth precheck) must run and pass before any other CLI command.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eStep 1b (options discussion) must get user confirmation before generation. Do not assume defaults unless the user explicitly says \"use defaults.\"\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e0. \u003cstrong style=\"color:#e5e7eb\"\u003eAuth precheck\u003c/strong\u003e โ€” Verify the session is valid before doing any work:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e notebooklm auth check --test --json\n \u003c/code\u003e\u003c/pre\u003e\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e\"status\": \"ok\"\u003c/code\u003e โ†’ proceed to step 1.\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e\"status\": \"error\"\u003c/code\u003e โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003estop immediately\u003c/strong\u003e. Tell the user:\n \u003e NotebookLM ็™ปๅ…ฅๅทฒ้ŽๆœŸ๏ผŒ่ซ‹ๅ…ˆ้‡ๆ–ฐ็™ปๅ…ฅ๏ผˆ\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enotebooklm login\u003c/code\u003e๏ผ‰๏ผŒๅฎŒๆˆๅพŒๅ‘Š่จดๆˆ‘๏ผŒๆˆ‘ๅ†็นผ็บŒใ€‚\n - Command itself fails (network error, CLI not found, etc.) โ†’ also stop and report the error.\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--test\u003c/code\u003e is required โ€” without it, only local checks run, which can pass even with an expired session.\n - When the user confirms re-login, re-run this check before continuing.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. \u003cstrong style=\"color:#e5e7eb\"\u003eParse input \u0026 configure artifacts\u003c/strong\u003e โ€”\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003e1a. Select artifacts\u003c/strong\u003e โ€” Detect source types from user message (URLs, files, text). Confirm which artifacts to generate.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003e1b. Discuss options\u003c/strong\u003e โ€” Before generating, confirm key options for each selected artifact.\n Refer to \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/artifact-options.md\u003c/code\u003e for priority levels:\n - \u003cstrong style=\"color:#e5e7eb\"\u003eASK\u003c/strong\u003e options: must ask the user\n - \u003cstrong style=\"color:#e5e7eb\"\u003eOFFER\u003c/strong\u003e options: state the default, let user decide whether to change\n - \u003cstrong style=\"color:#e5e7eb\"\u003eSILENT\u003c/strong\u003e options: use defaults without asking\n - Options already specified by the user โ†’ skip\n - Present all questions in a single message (batch, not one-by-one)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e If user says \"use defaults\" โ†’ skip all questions, proceed with default values immediately.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e Example agent message (audio + video + report + quiz + flashcards + slides + infographic selected):\n \u003e Before generating, a few options to confirm:\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003ePodcast\u003c/strong\u003e: deep-dive / brief / critique / debate?\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003eVideo\u003c/strong\u003e: explainer / brief / cinematic? (cinematic uses Veo 3, takes 30-40 min)\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003eReport\u003c/strong\u003e: briefing-doc / study-guide / blog-post / custom?\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003eSlides\u003c/strong\u003e: detailed / presenter?\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003eQuiz \u0026 Flashcards\u003c/strong\u003e: difficulty \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emedium\u003c/code\u003e, quantity \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estandard\u003c/code\u003e โ€” adjust?\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003eInfographic\u003c/strong\u003e: style \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eauto\u003c/code\u003e, or prefer a specific style (sketch-note, professional, bento-grid...)?\n \u003e - \u003cstrong style=\"color:#e5e7eb\"\u003eLanguage\u003c/strong\u003e: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ezh_Hant\u003c/code\u003e, OK?\n \u003e\n \u003e Or just say \"use defaults\" to start immediately.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e2. \u003cstrong style=\"color:#e5e7eb\"\u003eDerive slug\u003c/strong\u003e โ€” Based on the sources and user message, generate a short kebab-case slug (2-4 words) that captures the core topic. This slug is used for both the notebook name and the output directory.\n - Examples: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereact-server-components\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efeynman-technique\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etaiwan-semiconductor-q4\u003c/code\u003e\n - Keep it concise, lowercase, ASCII-only (transliterate non-ASCII if needed)\n - If the user provides a topic or title, prefer that as the basis\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e3. \u003cstrong style=\"color:#e5e7eb\"\u003eCreate notebook\u003c/strong\u003e โ€”\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e notebooklm create \"\u003cslug\u003e \u003cYYYYMMDD\u003e\"\n # โ†’ {\"notebook_id\": \"xyz789\", ...} โ† capture notebook_id\n notebooklm use \u003cnotebook_id\u003e\n mkdir -p ./output/\u003cslug\u003e\n \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e4. \u003cstrong style=\"color:#e5e7eb\"\u003eSet language\u003c/strong\u003e โ€”\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e notebooklm language set \u003cconfirmed_language\u003e\n \u003c/code\u003e\u003c/pre\u003e\n Use the language confirmed in step 1b. โš ๏ธ GLOBAL setting โ€” always set explicitly to avoid residual from previous runs.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e5. \u003cstrong style=\"color:#e5e7eb\"\u003eAdd sources\u003c/strong\u003e โ€” For each source:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e # URL, YouTube, or file path\n notebooklm source add \"\u003curl_or_filepath\u003e\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e # Google Drive\n notebooklm source add-drive \u003cfile_id\u003e \"\u003ctitle\u003e\"\n \u003c/code\u003e\u003c/pre\u003e\n For plain text โ†’ save to a \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.txt\u003c/code\u003e file first, then \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource add \"./temp_text.txt\"\u003c/code\u003e.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e6. \u003cstrong style=\"color:#e5e7eb\"\u003eGenerate artifacts\u003c/strong\u003e โ€” Two-tier strategy for timeout safety:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eโš ๏ธ Deduplication gate (Tier 2 only)\u003c/strong\u003e โ€” Before generating Tier 2 artifacts, call \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eartifact list\u003c/code\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eonce\u003c/strong\u003e and check all requested types in that single response:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e notebooklm artifact list --json\n # โ†’ [{\"task_id\": \"abc123\", \"type\": \"slide-deck\", \"status\": \"processing\"}, ...]\n \u003c/code\u003e\u003c/pre\u003e\n For each Tier 2 artifact you are about to generate, look for entries where \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etype\u003c/code\u003e matches (e.g., \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eslide-deck\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaudio\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003evideo\u003c/code\u003e). If multiple entries match the same type, the non-terminal status takes priority (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eprocessing\u003c/code\u003e/\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending\u003c/code\u003e \u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecompleted\u003c/code\u003e \u003e \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efailed\u003c/code\u003e):\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eprocessing\u003c/code\u003e / \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending\u003c/code\u003e โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003edo NOT generate again\u003c/strong\u003e. Take the existing \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etask_id\u003c/code\u003e, go to step 9 (wait + deliver).\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecompleted\u003c/code\u003e โ†’ \u003cstrong style=\"color:#e5e7eb\"\u003edo NOT generate again\u003c/strong\u003e. Skip the wait โ€” go directly to download + deliver in step 9.\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efailed\u003c/code\u003e โ†’ safe to re-generate.\n - No matching entry โ†’ proceed with generation.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e If \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eartifact list\u003c/code\u003e itself fails or returns an error, proceed with generation โ€” the dedup check is a safety net, not a hard gate.\n Duplicate generation wastes resources and causes confusion โ€” this gate prevents the most common operational error.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eTier 1 โ€” Immediate\u003c/strong\u003e (use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e, completes within timeout):\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e # Sync (instant)\n notebooklm generate mind-map\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e # Fast async (1-2 min) โ€” use options confirmed in step 1b\n notebooklm generate report --format \u003cchosen_format\u003e --wait\n notebooklm generate quiz --difficulty \u003cchosen_difficulty\u003e --quantity \u003cchosen_quantity\u003e --wait\n notebooklm generate flashcards --difficulty \u003cchosen_difficulty\u003e --quantity \u003cchosen_quantity\u003e --wait\n notebooklm generate data-table \"\u003cdescription\u003e\" --wait\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e # Medium async (2-5 min, borderline โ€” if timeout, retry or move to Tier 2)\n notebooklm generate infographic --style \u003cchosen_style\u003e --orientation \u003cchosen_orientation\u003e --wait\n \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eTier 2 โ€” Deferred\u003c/strong\u003e (use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--json\u003c/code\u003e without \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e, capture \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etask_id\u003c/code\u003e for step 9):\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e # Slow async โ€” use options confirmed in step 1b\n # Parse JSON output to extract task_id for polling\n notebooklm generate slide-deck --format \u003cchosen_format\u003e --json\n # โ†’ {\"task_id\": \"abc123\", \"status\": \"pending\"} โ† save task_id\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e notebooklm generate video --format \u003cchosen_format\u003e --style \u003cchosen_style\u003e --json\n # โ†’ {\"task_id\": \"def456\", \"status\": \"pending\"} โ† save task_id\n # Note: if cinematic, omit --style (ignored by Veo 3)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e notebooklm generate audio \"\u003cdescription\u003e\" --format \u003cchosen_format\u003e --length \u003cchosen_length\u003e --json\n # โ†’ {\"task_id\": \"ghi789\", \"status\": \"pending\"} โ† save task_id\n \u003c/code\u003e\u003c/pre\u003e\n Options accepted as defaults in step 1b can be omitted (CLI uses its own defaults).\n Parse each JSON response and save the \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etask_id\u003c/code\u003e โ€” you will need it in step 9.\n Only generate the artifacts the user requested. Skip the rest.\n See \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/artifacts.md\u003c/code\u003e โ†’ \"Deferred Generation\" for Tier 2 details.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eWrite delivery status\u003c/strong\u003e โ€” Immediately after all Tier 2 generates are dispatched, write \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e./output/\u003cslug\u003e/delivery-status.json\u003c/code\u003e so the recovery script can pick up if the agent times out:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e {\n \"slug\": \"\u003cslug\u003e\",\n \"notebook_id\": \"\u003cnotebook_id\u003e\",\n \"created_at\": \"\u003cISO 8601\u003e\",\n \"artifacts\": [\n {\"type\": \"slide-deck\", \"task_id\": \"\u003cid\u003e\", \"status\": \"pending\", \"output_path\": \"./output/\u003cslug\u003e/slides.pdf\"},\n {\"type\": \"audio\", \"task_id\": \"\u003cid\u003e\", \"status\": \"pending\", \"output_path\": \"./output/\u003cslug\u003e/podcast.mp3\"}\n ]\n }\n \u003c/code\u003e\u003c/pre\u003e\n Update each artifact's \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estatus\u003c/code\u003e to \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecompleted\u003c/code\u003e or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efailed\u003c/code\u003e as step 9 progresses.\n This file is the handoff contract between the agent and \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/recover_tier2_delivery.sh\u003c/code\u003e.\n Telegram delivery is agent-only (requires OpenClaw \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emessage\u003c/code\u003e tool); the recovery script handles download + status tracking only.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e7. \u003cstrong style=\"color:#e5e7eb\"\u003eDownload Tier 1\u003c/strong\u003e โ€” Each successful Tier 1 artifact into \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e./output/\u003cslug\u003e/\u003c/code\u003e:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e notebooklm download mind-map ./output/\u003cslug\u003e/mindmap.json\n notebooklm download report ./output/\u003cslug\u003e/report.md\n notebooklm download quiz --format json ./output/\u003cslug\u003e/quiz.json\n notebooklm download flashcards --format json ./output/\u003cslug\u003e/flashcards.json\n notebooklm download data-table ./output/\u003cslug\u003e/data.csv\n notebooklm download infographic ./output/\u003cslug\u003e/infographic.png\n \u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e8. \u003cstrong style=\"color:#e5e7eb\"\u003eReport + Deliver Tier 1\u003c/strong\u003e โ€” Present completed Tier 1 artifacts to user.\n If Tier 2 artifacts are pending, include a status note:\n \u003e \"Slides/Audio/Video are still generating, I'll send them when ready.\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eTelegram delivery\u003c/strong\u003e (OpenClaw only) โ€” If \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emessage\u003c/code\u003e tool is available:\n 1. Text summary with Tier 2 pending status (always first)\n 2. Report โ†’ Quiz โ†’ Flashcards โ†’ Mind Map โ†’ Infographic โ†’ Data Table\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e See \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/telegram-delivery.md\u003c/code\u003e for delivery contract.\n Skip Telegram delivery if running outside OpenClaw (e.g. Claude Code, Codex).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e9. \u003cstrong style=\"color:#e5e7eb\"\u003ePoll + Deliver Tier 2\u003c/strong\u003e โ€” Wait for each deferred artifact in order of expected speed (fastest first), then download and deliver as each completes:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e # Wait by expected completion order: slide-deck (fastest) โ†’ video โ†’ audio (slowest)\n # Uses --interval 5 (not default 2) since Tier 2 artifacts take minutes, not seconds\n notebooklm artifact wait \u003cslide_task_id\u003e --timeout 1800 --interval 5 --json\n # โ†’ {\"status\": \"completed\", ...} โ† task_id from generate is used as artifact_id here\n notebooklm download slide-deck ./output/\u003cslug\u003e/slides.pdf\n # โ†’ deliver to Telegram immediately\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e notebooklm artifact wait \u003cvideo_task_id\u003e --timeout 1800 --interval 5 --json\n # Note: if cinematic, use --timeout 2400 (generation takes 30-40 min)\n notebooklm download video ./output/\u003cslug\u003e/video.mp4\n # โ†’ deliver to Telegram immediately\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e notebooklm artifact wait \u003caudio_task_id\u003e --timeout 1800 --interval 5 --json\n notebooklm download audio ./output/\u003cslug\u003e/podcast.mp3\n bash scripts/compress_audio.sh ./output/\u003cslug\u003e/podcast.mp3 ./output/\u003cslug\u003e/podcast_compressed.mp3\n # โ†’ deliver to Telegram immediately\n \u003c/code\u003e\u003c/pre\u003e\n - \u003cstrong style=\"color:#e5e7eb\"\u003eOrder matters\u003c/strong\u003e: wait for fastest artifact first (slide-deck โ†’ video โ†’ audio) to minimize idle time\n - On completion: download โ†’ post-process โ†’ deliver to Telegram โ†’ update \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelivery-status.json\u003c/code\u003e status to \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecompleted\u003c/code\u003e\n - On failure: update status to \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efailed\u003c/code\u003e with reason, notify user, continue to next artifact\n - On timeout: see timeout recovery below\n - Max wait: 30 minutes per artifact (covers worst-case audio/video)\n - If agent is about to exit with any artifact still \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending\u003c/code\u003e, tell the user:\n \u003e \"Tier 2 ่ฃœ้€ๆจกๅผๅทฒๅ•Ÿๅ‹•๏ผŒrecovery script ๆœƒๆฏ 5 ๅˆ†้˜ๆชขๆŸฅไธฆ่‡ชๅ‹•้€้”ใ€‚\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eโš ๏ธ Timeout recovery\u003c/strong\u003e โ€” If \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eartifact wait\u003c/code\u003e returns \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estatus: \"timeout\"\u003c/code\u003e, the artifact is likely still generating. \u003cstrong style=\"color:#e5e7eb\"\u003eNEVER re-generate\u003c/strong\u003e. Instead:\n 1. Re-check status: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enotebooklm artifact poll \u003ctask_id\u003e --json\u003c/code\u003e\n 2. If \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eprocessing\u003c/code\u003e โ†’ re-wait: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enotebooklm artifact wait \u003ctask_id\u003e --timeout 1800 --interval 5 --json\u003c/code\u003e\n 3. If \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecompleted\u003c/code\u003e โ†’ download and deliver\n 4. If \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003efailed\u003c/code\u003e โ†’ notify user with error, move to next artifact\n 5. If re-wait also times out (2+ total timeouts, ~60 min elapsed) โ†’ give up, notify user, suggest downloading from NotebookLM directly\n A timeout means the wait expired, not that generation failed. The task continues server-side. Re-generating creates duplicates and wastes time.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eError handling\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAuth errors\u003c/strong\u003e โ†’ caught by step 0 precheck. If any CLI command later returns an authentication/session error (HTTP 401, \"Not logged in\", \"session expired\", token fetch failure), treat it as a mid-workflow auth failure โ€” stop, ask user to re-login, then re-run step 0 before resuming.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTier 1 failure\u003c/strong\u003e: retry up to 2 times, then include failure note in step 8 delivery.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTier 2 failure\u003c/strong\u003e: notify user per-artifact in step 9. Tier 1 is already delivered by this point, so Tier 2 failures never block text artifact delivery.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eCapture failure reason in delivery status.\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eDelivery confirmation gate\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eBefore reporting \"complete\" to the user, ALL of the following must be true:\n1. Every requested artifact is either \u003cstrong style=\"color:#e5e7eb\"\u003esuccessfully delivered\u003c/strong\u003e or \u003cstrong style=\"color:#e5e7eb\"\u003ereported as failed with reason\u003c/strong\u003e\n2. For Telegram delivery (OpenClaw): each \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emessage\u003c/code\u003e tool call (OpenClaw's built-in messaging tool) returned a success response with a \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emessageId\u003c/code\u003e\n - If a send fails, retry once. If still failing, report the failure to the user โ€” do NOT silently skip\n3. No artifact is still in \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eprocessing\u003c/code\u003e or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epending\u003c/code\u003e status without being tracked\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eNever say \"done\" while any artifact is still pending delivery.\u003c/strong\u003e If Tier 2 artifacts are still generating, say so explicitly and continue waiting. The task is not complete until everything is delivered or accounted for.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eQuality gate\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eBefore delivery, verify:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eSources are concrete article/content pages (not category/index pages).\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eReport contains actionable takeaways (not generic summary).\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eQuiz tests key concepts and mechanics.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFlashcards focus on terms, decisions, and trade-offs.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eOutput respects requested language and length.\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eSee \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/output-contracts.md\u003c/code\u003e for format specifications.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eDelivery template\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. Selection rationale (\u003c=3 bullets)\n2. Artifact list with paths/status (all 9 types if applicable)\n3. Key takeaways (3-5 bullets)\n4. Failures + fallback note (if any)\n5. One discussion question\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eChangelog\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003ev2.1.0\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eAuth precheck gate\u003c/strong\u003e โ€” step 0 runs \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eauth check --test --json\u003c/code\u003e before any work; expired sessions fail fast instead of blowing up mid-generation.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eDedup gate\u003c/strong\u003e โ€” step 6 checks \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eartifact list\u003c/code\u003e before Tier 2 generation to prevent duplicate artifacts when agent retries or resumes.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eTimeout recovery\u003c/strong\u003e โ€” \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eartifact wait\u003c/code\u003e timeout no longer triggers re-generation; polls status and re-waits, giving up only after 2 consecutive timeouts (~60 min).\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eDelivery confirmation gate\u003c/strong\u003e โ€” agent cannot claim \"done\" until every artifact is delivered or explicitly reported as failed with reason.\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eDelivery status contract\u003c/strong\u003e โ€” step 6 writes \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelivery-status.json\u003c/code\u003e after Tier 2 dispatch; step 9 updates it as artifacts complete. Enables cron-based recovery via \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/recover_tier2_delivery.sh\u003c/code\u003e when agent times out.\u003c/li\u003e\n\u003c/p\u003e"])</script><script>self.__next_f.push([1,"20:[\"$\",\"div\",null,{\"className\":\"skill-page\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"NotebookLM Studio\\\",\\\"description\\\":\\\"Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map,...\\\",\\\"url\\\":\\\"https://bytesagain.com/skill/notebooklm-studio\\\",\\\"applicationCategory\\\":\\\"clawhub\\\",\\\"operatingSystem\\\":\\\"Any\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"},\\\"publisher\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"BytesAgain\\\",\\\"url\\\":\\\"https://bytesagain.com\\\"}}\"}}],[\"$\",\"div\",null,{\"className\":\"breadcrumb\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/\",\"children\":\"BytesAgain\"}],\" โ€บ \",[\"$\",\"a\",null,{\"href\":\"/skills\",\"children\":\"Skills\"}],\" โ€บ \",\"NotebookLM Studio\"]}],[\"$\",\"div\",null,{\"className\":\"two-col\",\"children\":[[\"$\",\"div\",null,{\"className\":\"two-col-main\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-card\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-badges\",\"children\":[[\"$\",\"span\",null,{\"className\":\"badge\",\"style\":{\"color\":\"#818cf8\",\"background\":\"#818cf822\",\"borderColor\":\"#818cf844\"},\"children\":[\"๐Ÿฆ€\",\" \",\"ClawHub\"]}],false]}],[\"$\",\"div\",null,{\"className\":\"skill-top-actions\",\"children\":[\"$\",\"$L22\",null,{\"slug\":\"notebooklm-studio\"}]}]]}],[\"$\",\"h1\",null,{\"className\":\"skill-title\",\"children\":\"NotebookLM Studio\"}],[\"$\",\"p\",null,{\"className\":\"skill-owner\",\"children\":[\"by \",[\"$\",\"span\",null,{\"children\":[\"@\",\"jasontsaicc\"]}]]}],[\"$\",\"p\",null,{\"className\":\"skill-desc\",\"children\":\"Import sources (URLs, YouTube, files, text) into Google NotebookLM and generate user-selected artifacts: podcast, video, report, quiz, flashcards, mind map,...\"}],[\"$\",\"div\",null,{\"className\":\"skill-meta\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Version\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"v\",\"2.1.3\"]}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Downloads\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"800\"}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Stars\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"โญ \",\"1\"]}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"style\":{\"flexDirection\":\"row\",\"gap\":6,\"alignItems\":\"center\"},\"children\":[[\"$\",\"a\",\"video\",{\"href\":\"/?q=video\",\"className\":\"tag\",\"children\":[\"#\",\"video\"]}],[\"$\",\"a\",\"audio\",{\"href\":\"/?q=audio\",\"className\":\"tag\",\"children\":[\"#\",\"audio\"]}],[\"$\",\"a\",\"legal\",{\"href\":\"/?q=legal\",\"className\":\"tag\",\"children\":[\"#\",\"legal\"]}],[\"$\",\"a\",\"education\",{\"href\":\"/?q=education\",\"className\":\"tag\",\"children\":[\"#\",\"education\"]}],[\"$\",\"a\",\"travel\",{\"href\":\"/?q=travel\",\"className\":\"tag\",\"children\":[\"#\",\"travel\"]}]]}]]}],[\"$\",\"div\",null,{\"style\":{\"marginTop\":6},\"children\":[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/jasontsaicc/notebooklm-studio\",\"target\":\"_blank\",\"rel\":\"noopener\",\"className\":\"btn-secondary\",\"style\":{\"padding\":\"6px 12px\",\"fontSize\":\".82em\",\"borderRadius\":8,\"background\":\"transparent\",\"border\":\"1px solid var(--border-card)\",\"color\":\"var(--text-muted2)\",\"textDecoration\":\"none\",\"whiteSpace\":\"nowrap\"},\"children\":[\"View on \",\"ClawHub\",\" โ†’\"]}]}]]}],[\"$\",\"div\",null,{\"className\":\"install-box\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-dots\",\"children\":[[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#ef4444\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#eab308\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#22c55e\"}}]]}],[\"$\",\"span\",null,{\"className\":\"install-label\",\"children\":\"TERMINAL\"}]]}],[\"$\",\"div\",null,{\"className\":\"install-body\",\"style\":{\"flexWrap\":\"wrap\"},\"children\":[[\"$\",\"code\",null,{\"className\":\"install-cmd\",\"children\":\"clawhub install notebooklm-studio\"}],[\"$\",\"button\",null,{\"className\":\"copy-btn\",\"data-cmd\":\"clawhub install notebooklm-studio\",\"style\":{\"fontWeight\":700},\"children\":\"Copy\"}]]}]]}],[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"๐Ÿ“– About This Skill\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$23\"}}]]}],null,null,null,null,null,null,null,false,false]}],\"$L24\"]}]]}]\n"])</script><script>self.__next_f.push([1,"21:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn =\u003e {\\n btn.addEventListener('click', () =\u003e {\\n const cmd = btn.getAttribute('data-cmd');\\n if (!cmd) return;\\n navigator.clipboard.writeText(cmd).then(() =\u003e {\\n const orig = btn.textContent;\\n btn.textContent = 'Copied!';\\n setTimeout(() =\u003e btn.textContent = orig, 1500);\\n }).catch(() =\u003e {});\\n });\\n });\\n \"}}]\n"])</script><script>self.__next_f.push([1,"25:I[71521,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n24:[\"$\",\"div\",null,{\"className\":\"two-col-side\",\"children\":[\"$\",\"$L25\",null,{\"category\":\"clawhub\",\"currentSlug\":\"notebooklm-studio\",\"name\":\"NotebookLM Studio\",\"tags\":[\"video\",\"audio\",\"legal\",\"education\",\"travel\",\"communication\"]}]}]\n"])</script></body></html>