{
    "fmt": "alive-package-1",
    "spec": "1.1",
    "product": "NetShow Alive",
    "kind": "alive-agent-avatar",
    "type": "ascii",
    "name": "Pip",
    "exportedAt": "2026-10-01T00:00:00+00:00",
    "generator": {
        "surface": "alive-json-kits-dots-muse-grok-characters-byo-openai-r1",
        "host": ""
    },
    "license": {
        "rights": "personal-use",
        "owner": null,
        "note": "NetShow Alive kit. Free to use on your own page; NetShow itself is not open source.",
        "line": "NetShow Character License 1.1 (ASCII look 1): you own the character you made from NetShow's bases, for personal and commercial use; NetShow keeps its bases, rigs and engines; purchased third-party models and anything under a non-commercial license are never included; no real person's likeness without consent; your character says it is an AI. Full text: https://app.netshow.ai/license/characters",
        "url": "https://app.netshow.ai/license/characters"
    },
    "requires": {
        "renderer": "ascii",
        "runtime": "alive-runner/alive-kit.js"
    },
    "integrity": {
        "algo": "sha-256",
        "canon": "sorted-keys-json",
        "payload": "d9de4b0c67cde7e818c7c81e0e7fdc00764bd5b593d1327a2eb4c83f7f64ae79"
    },
    "payload": {
        "ascii": {
            "cols": 23,
            "eyes": {
                "row": 5,
                "left": 8,
                "right": 14
            },
            "grid": [
                "           o           ",
                "           |           ",
                "      .-'''''''-.      ",
                "    .'           '.    ",
                "   /.-------------.\\   ",
                "  | |   o     o   | |  ",
                "  | |             | |  ",
                "  | |      _      | |  ",
                "   \\'-------------'/   ",
                "    '.           .'    ",
                "(__)--[=========]--(__)",
                "     '-._______.-'     ",
                "      (__)   (__)      "
            ],
            "mouth": {
                "row": 7,
                "col": 11
            },
            "palette": {
                "bg": "#101215",
                "line": "#fd706b"
            },
            "rows": 13
        }
    },
    "ext": {
        "kit": {
            "format": "netshow-alive-kit-1",
            "version": "1.0.0",
            "slug": "pip",
            "title": "Pip, the NetShow toon",
            "look": {
                "engine": "happy",
                "options": {
                    "form": "pip"
                },
                "ladder": [
                    "ascii",
                    "happy"
                ]
            },
            "colors": {
                "line": "#fd706b",
                "background": "#101215"
            },
            "greeting": {
                "en": "Hi, I'm Pip, a NetShow toon. I'm an AI. You can interrupt me anytime.",
                "es": "Hola, soy Pip, un personaje de NetShow. Soy una IA. Puedes interrumpirme cuando quieras.",
                "fr": "Bonjour, je suis Pip, un personnage animé de NetShow. Je suis une IA. Vous pouvez m’interrompre à tout moment.",
                "pt": "Olá, sou o Pip, um personagem animado da NetShow. Sou uma IA. Você pode me interromper quando quiser.",
                "de": "Hallo, ich bin Pip, eine NetShow-Zeichentrickfigur. Ich bin eine KI. Du kannst mich jederzeit unterbrechen.",
                "it": "Ciao, sono Pip, un personaggio animato di NetShow. Sono un’IA. Puoi interrompermi quando vuoi.",
                "zh": "你好，我是Pip，NetShow的卡通角色。我是AI。你可以随时打断我。",
                "ja": "こんにちは、Pipです。NetShowのアニメキャラクターです。私はAIです。いつでも話の途中で遮って大丈夫です。",
                "ko": "안녕하세요, 저는 NetShow 툰, Pip입니다. 저는 AI입니다. 언제든지 제 말을 끊으셔도 괜찮아요.",
                "vi": "Xin chào, tôi là Pip, một nhân vật hoạt hình của NetShow. Tôi là AI. Bạn có thể ngắt lời tôi bất cứ lúc nào.",
                "tl": "Kumusta, ako si Pip, isang cartoon ng NetShow. Isa akong AI. Puwede mo akong sabatan anumang oras.",
                "ar": "مرحبًا، أنا Pip، شخصية كرتونية من NetShow. أنا ذكاء اصطناعي. يمكنك مقاطعتي في أي وقت.",
                "hi": "नमस्ते, मैं Pip हूँ, NetShow का एक कार्टून किरदार। मैं एक AI हूँ। आप मुझे कभी भी बीच में टोक सकते हैं।",
                "firstLine": "caption-at-load-voice-at-first-interaction",
                "brand": null
            },
            "mount": {
                "mode": "own-the-stage",
                "position": "right",
                "size": "medium"
            },
            "brain": {
                "kind": "openai-own",
                "keyStays": "browser",
                "models": [
                    "gpt-realtime-2.1-mini",
                    "gpt-realtime-2.1"
                ]
            },
            "features": [
                "greets-first",
                "says-it-is-an-ai",
                "live-voice",
                "draws",
                "shows",
                "one-menu",
                "reach-states"
            ],
            "brandLine": null,
            "toolNote": "YOUR CONTENT WINDOW: beside you is a window that is yours to use while you talk. When a picture helps, draw it live with draw_on_stage (sketch lines and short labels, built up step by step), or show an image, a YouTube clip, a story or a page card with show_on_stage. Clips start muted, so keep talking or pause while they watch. Call clear_stage when the talk moves on. Act first, then one short line about it.",
            "tools": [
                {
                    "type": "function",
                    "name": "draw_on_stage",
                    "description": "Draw like a person, stroke by stroke, while you explain. grid_strokes: a 50 by 50 grid, x 0-50 left to right, y 0-50 top to bottom. A stroke lists the cells your pen passes through; curve smooth (default) bends through them, line keeps corners, bezier reads them as start, c1, c2, end (then c1, c2, end per next piece); close joins the ends; t (0-1, one per cell) says when the pen passes each. Send one to three strokes a call; the first starts a drawing, add the next with append true. Each result has canvas: your whole drawing as 25 by 25 text in grid cells (# ink, 1-9 then a-z where stroke n starts, label initials), occupancy (5 rows of ink 0-9) and room (empty areas). Look at it, then place the next stroke. grid_labels put words at a cell. Strokes are simplified and smoothed. points (0-1 pairs) and d still work.",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "grid_strokes": {
                                "type": "array",
                                "maxItems": 12,
                                "description": "Your pen strokes on a 50 by 50 grid (x 0-50 left to right, y 0-50 top to bottom, [25, 25] is the middle).",
                                "items": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "required": [
                                        "cells"
                                    ],
                                    "properties": {
                                        "cells": {
                                            "type": "array",
                                            "items": {
                                                "type": "array",
                                                "items": {
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 50
                                                },
                                                "minItems": 2,
                                                "maxItems": 2
                                            },
                                            "minItems": 2,
                                            "maxItems": 60,
                                            "description": "The grid points the pen passes through, in drawing order."
                                        },
                                        "curve": {
                                            "type": "string",
                                            "enum": [
                                                "smooth",
                                                "line",
                                                "bezier"
                                            ],
                                            "description": "smooth bends through the cells (default); line keeps corners; bezier reads cells as start, c1, c2, end, c1, c2, end ..."
                                        },
                                        "close": {
                                            "type": "boolean",
                                            "description": "Join the last cell back to the first (smooth and line)."
                                        },
                                        "t": {
                                            "type": "array",
                                            "items": {
                                                "type": "number",
                                                "minimum": 0,
                                                "maximum": 1
                                            },
                                            "maxItems": 60,
                                            "description": "Optional: when the pen passes each cell, 0 to 1 in order; the stroke is the Bezier chain fitted through them."
                                        },
                                        "color": {
                                            "type": "string",
                                            "pattern": "^(#[0-9a-fA-F]{6}|none)$"
                                        },
                                        "fill": {
                                            "type": "string",
                                            "pattern": "^(#[0-9a-fA-F]{6}|none)$"
                                        },
                                        "width": {
                                            "type": "number",
                                            "minimum": 1,
                                            "maximum": 12
                                        }
                                    }
                                }
                            },
                            "grid_labels": {
                                "type": "array",
                                "maxItems": 12,
                                "items": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "required": [
                                        "at",
                                        "text"
                                    ],
                                    "properties": {
                                        "at": {
                                            "type": "array",
                                            "items": {
                                                "type": "number",
                                                "minimum": 0,
                                                "maximum": 50
                                            },
                                            "minItems": 2,
                                            "maxItems": 2
                                        },
                                        "text": {
                                            "type": "string",
                                            "maxLength": 60
                                        }
                                    }
                                }
                            },
                            "title": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 80,
                                "description": "A short title over the drawing"
                            },
                            "strokes": {
                                "type": "array",
                                "maxItems": 40,
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "points": {
                                            "type": "array",
                                            "items": {
                                                "type": "number"
                                            },
                                            "maxItems": 400,
                                            "description": "x1, y1, x2, y2, ... each from 0 to 1"
                                        },
                                        "d": {
                                            "type": "string",
                                            "maxLength": 4000,
                                            "description": "SVG path data on the 1000 x 750 board, e.g. M 100 100 L 400 300"
                                        },
                                        "color": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "A colour as #RRGGBB, or null"
                                        },
                                        "fill": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "A colour as #RRGGBB, or null"
                                        },
                                        "width": {
                                            "type": [
                                                "number",
                                                "null"
                                            ],
                                            "minimum": 1,
                                            "maximum": 12,
                                            "description": "Line width, 1 to 12"
                                        }
                                    },
                                    "additionalProperties": false
                                }
                            },
                            "labels": {
                                "type": "array",
                                "maxItems": 12,
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "x": {
                                            "type": "number",
                                            "minimum": 0,
                                            "maximum": 1
                                        },
                                        "y": {
                                            "type": "number",
                                            "minimum": 0,
                                            "maximum": 1
                                        },
                                        "text": {
                                            "type": "string",
                                            "maxLength": 60
                                        }
                                    },
                                    "required": [
                                        "x",
                                        "y",
                                        "text"
                                    ],
                                    "additionalProperties": false
                                }
                            },
                            "append": {
                                "type": [
                                    "boolean",
                                    "null"
                                ],
                                "description": "true adds to the current drawing; otherwise it starts fresh"
                            }
                        },
                        "required": [],
                        "additionalProperties": false
                    }
                },
                {
                    "type": "function",
                    "name": "show_on_stage",
                    "description": "Show something in your content window beside you: an image (one you made with create_image, or one you found), a video (a YouTube link or id, or a NetShow video; it starts muted so it never talks over you), a story (a title and short pages, e.g. from the story generator), or a page card for a website you opened. One thing at a time; the visitor can close it.",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "kind": {
                                "type": "string",
                                "enum": [
                                    "image",
                                    "video",
                                    "story",
                                    "page"
                                ]
                            },
                            "url": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 2000,
                                "description": "The image, video, story or page address (https)"
                            },
                            "video_id": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 20,
                                "description": "A YouTube video id, when you have the id and no link"
                            },
                            "title": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 120
                            },
                            "caption": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 240,
                                "description": "One short line under it"
                            },
                            "pages": {
                                "type": [
                                    "array",
                                    "null"
                                ],
                                "maxItems": 12,
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "text": {
                                            "type": "string",
                                            "maxLength": 600
                                        },
                                        "image_url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "maxLength": 2000
                                        }
                                    },
                                    "required": [
                                        "text"
                                    ],
                                    "additionalProperties": false
                                },
                                "description": "Story pages (kind story only)"
                            }
                        },
                        "required": [
                            "kind"
                        ],
                        "additionalProperties": false
                    }
                },
                {
                    "type": "function",
                    "name": "clear_stage",
                    "description": "Take your content window away when you are done showing or drawing, or when the talk moves on.",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "reason": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "maxLength": 120
                            }
                        },
                        "required": [],
                        "additionalProperties": false
                    }
                }
            ]
        },
        "motor": {"format":"netshow-performance-v1","version":1,"score":"https://claude.netshow.ai/alive-kit/rig/performance-score.js?v=1399bf092b0e","vocabulary":"https://claude.netshow.ai/alive-kit/rig/fixtures/tia-vocabulary.json?v=b0264c50e6ff","jointLimits":"https://claude.netshow.ai/alive-kit/rig/constraints/tia-limits.json?v=6def46439f72","layers":"https://claude.netshow.ai/alive-kit/rig/performance-layers.json?v=539b5db5c46e","motionIndex":"https://claude.netshow.ai/alive-kit/rig/fixtures/motion-index.json?v=76f4c71b87fd","performSchema":"https://claude.netshow.ai/alive-kit/agent/perform-tool.schema.json?v=2dc4d7901a46","performTool":"https://claude.netshow.ai/alive-kit/agent/perform-tool.js?v=39b160c6f07b","contract":"netshow.alive-kit.motor/1","limits":{"tracks":6,"lookahead_ms":8000,"move_ms":12000,"root_owners":1,"state_bytes":300,"receipt_bytes":1024,"vocabulary_bytes":8192},"brain":{"affectBase":[0.598,0.3,0.204],"tasteCap":0.4,"stepDownStart":0,"lookaheadRule":{"maxMs":8000,"latencyMultiplier":3}},"words":{"actions":["walk_to","walk_around","look_at","feel","cheer","laugh","surprise","lie_down","bend_over","sit","nod","shake","tilt","ponder","lean_in","look_around","hand_sign","face","head","gesture","posture","stage","beat","open_palm","point","count","shrug","hand_to_chest","wave","thumbs_up","lean_back","weight_shift","upright","dance","flip","emote","finger_up","open_arms","arms_wide","beckon","turn_to_face","fly_to","hover","perch"],"layers":["locomotion","whole_body","upper_body","gaze","face","additive"],"anchors":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"],"priorities":["idle","conversation","user","safety"],"interruptPolicies":["settle","finish"],"targets":["visitor","shown","partner","away","up","down","left","right","center","closer","around","page_item","screen","scene_item","scene_mark","pointer","element"],"emotions":["neutral","joy","amusement","concern","surprise","thinking"],"postures":["stand","sit","lie","bend"],"express":{"format":"netshow.alive-kit.express/1","face":{"brows":["raise","knit","one_up_left","one_up_right","relax"],"eyes":["widen","squint","blink","wink_left","wink_right","soft"],"mouth":["smile","frown","press","purse","open","relax"]},"gaze":["you","away","up","down","left","right","screen"],"head":["nod","shake","tilt_left","tilt_right"],"gesture":["beat","open_palm","point","count","shrug","hand_to_chest"],"point_at":["you","left","right","up","down","screen"],"posture":["lean_in","lean_back","weight_shift_left","weight_shift_right","upright"],"locomotion":{"walk_to":["center","left","right","forward","back"],"turn_to_face":["you","left","right","screen"]},"hand":["left","right"],"kinds":["face","gaze","head","gesture","posture"]},"refusals":["not_a_score","unknown_property","unknown_version","no_tracks","too_many_tracks","unknown_priority","unknown_action","unknown_layer","unknown_anchor","anchor_without_id","not_finite","forbidden_value","unknown_emotion","unknown_target","second_root_owner","lookahead_exceeded","duration_exceeded","not_available","not_allowed","not_feasible","not_available_for_look","missing_asset","no_surface","no_stage","posture","busy","director_unavailable","constraint_abort","reduced_motion","capability_drift","visitor_asked_still","no_support","target_missing","piece_dark"],"adjustments":["walk_shortened_safe_area","walk_projected_to_look_at_container","offset_clamped","duration_clamped","intensity_clamped","reduced_motion","mouth_yields_to_voice","stage_as_glide","missing_control","substituted","tier_step_down"]},"tools":{"perform":{"type":"function","name":"perform","description":"Direct a performance in the moment, briefly, without narrating it. Use only these available actions and registered targets. Say you are an AI when asked. Respect interruption and the receipt. Page point_at and mark_page receipts share one view_stage completion check. If visible is false or needs_correction is true, you choose the next score to re-point, scroll with visitor consent, or explain the movement briefly in your own words. Never repeat automatically; a steady point needs no extra call. Use be_still {on:true} when the visitor asks to hold still or stop moving, in any language. Keep only breath, blink, gaze and the speaking mouth for this visit. Use on:false only when the visitor asks to move again; never suggest or resume movement on your own.","parameters":{"type":"object","properties":{"intent":{"type":"string","minLength":1,"maxLength":160,"description":"Short reason for your own movement, preferably under 80 characters. Never include visitor names, words, quotes, contact details or other personal information."},"be_still":{"type":"object","properties":{"on":{"type":"boolean"}},"required":["on"],"additionalProperties":false},"tracks":{"type":"array","minItems":1,"maxItems":6,"items":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","enum":["look_at"]},"layer":{"type":"string","enum":["gaze"]},"duration_ms":{"type":"number","minimum":2000,"maximum":6000},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1},"target":{"type":"string","enum":["visitor","away","up","down","left","right","page_item","scene_item","screen"]}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["feel"]},"layer":{"type":"string","enum":["face"]},"duration_ms":{"type":"number","minimum":1,"maximum":12000},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1},"emotion":{"type":"string","enum":["neutral","joy","amusement","concern","surprise","thinking"]},"amount":{"type":"number","minimum":0,"maximum":1}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["cheer"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":900,"maximum":3200},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1},"style":{"type":"string","enum":["warm","lively"]}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["laugh"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":500,"maximum":2600},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1},"style":{"type":"string","enum":["soft","bright"]}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["nod"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":600,"maximum":1500},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["shake"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":600,"maximum":1500},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["tilt"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":600,"maximum":1500},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1},"side":{"type":"string","enum":["left","right"]}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["ponder"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":2000,"maximum":5000},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["lean_in"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":600,"maximum":2000},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["look_around"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":1200,"maximum":3000},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1}},"required":["action","layer","anchor"],"additionalProperties":false},{"type":"object","properties":{"action":{"type":"string","enum":["hand_sign"]},"layer":{"type":"string","enum":["upper_body"]},"duration_ms":{"type":"number","minimum":2500,"maximum":2500},"anchor":{"type":"string","enum":["turn_start","audio_start","word","after_phrase","audio_stop","after_speech"]},"offset_ms":{"type":"number","minimum":0,"maximum":8000},"word_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"w1, w2, w3... count whitespace-separated words from the start of this spoken reply. Send before that word is heard; passed words are refused."},"phrase_id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,48}$","description":"p1, p2... count phrases in this reply, ending at comma, semicolon, colon, sentence punctuation or audio stop. Fires after the audible phrase, never on transcript arrival."},"intensity":{"type":"number","minimum":0,"maximum":1},"energy":{"type":"number","minimum":0,"maximum":1},"sign":{"type":"string","enum":["thumbsup","peace","ok","point","fist","spread","money","heart"]},"side":{"type":"string","enum":["left","right","both"]}},"required":["action","layer","anchor"],"additionalProperties":false}]}},"priority":{"type":"string","enum":["idle","conversation","user","safety"]},"interrupt_policy":{"type":"string","enum":["settle","finish"]}},"required":["intent"],"additionalProperties":false}},"express":{"type":"function","name":"express","description":"Your face and your whole body while you talk, in one call: send it with each sentence, with what that sentence means. Brows raise when you ask or are surprised, knit when you think hard; eyes widen, squint, blink or wink; the mouth smiles, frowns, presses or purses (your voice already moves your lips while you speak). Nod to agree, shake to disagree, tilt when curious. Talking gestures: a beat on the word that matters, an open palm to offer, point at what you mean, count on your fingers, shrug, a hand to your chest. Lean in when it matters, lean back to relax, shift your weight; walk to a spot on your stage or turn to face something. Every move is kept inside safe human limits, so ask freely. Never say you are doing it.","parameters":{"type":"object","properties":{"brows":{"type":"string","enum":["raise","knit","one_up_left","one_up_right","relax"],"description":"Your eyebrows"},"eyes":{"type":"string","enum":["widen","squint","blink","wink_left","wink_right","soft"],"description":"Your eyes and lids"},"mouth":{"type":"string","enum":["smile","frown","press","purse","open","relax"],"description":"Your mouth (between words; speech owns the lips)"},"mouth_amount":{"type":"number","minimum":0,"maximum":1,"description":"How much, for mouth (open stays small)"},"gaze":{"type":"string","enum":["you","away","up","down","left","right","screen"],"description":"Where your eyes and head go; screen = what you are showing"},"head":{"type":"string","enum":["nod","shake","tilt_left","tilt_right"],"description":"A head move"},"gesture":{"type":"string","enum":["beat","open_palm","point","count","shrug","hand_to_chest"],"description":"A talking gesture"},"point_at":{"type":"string","enum":["you","left","right","up","down","screen"],"description":"For point: where"},"count":{"type":"integer","minimum":1,"maximum":5,"description":"For count: how many fingers"},"hand":{"type":"string","enum":["left","right"],"description":"Which hand, for beat, count or open_palm"},"posture":{"type":"string","enum":["lean_in","lean_back","weight_shift_left","weight_shift_right","upright"],"description":"How you hold yourself"},"walk_to":{"type":"string","enum":["center","left","right","forward","back"],"description":"Walk to a spot on your stage"},"turn_to_face":{"type":"string","enum":["you","left","right","screen"],"description":"Turn your upper body toward someone or something"},"intensity":{"type":"number","minimum":0,"maximum":1,"description":"How big (0.3 small, 1 full)"},"hold_seconds":{"type":"number","minimum":0.5,"maximum":8,"description":"How long to hold it"},"why":{"type":"string","maxLength":120,"description":"A few words: why this now (the owner log)"}},"additionalProperties":false}}},"tiers":{"stepDown":["fabrik","springs","upper_body_nuance","base_30hz"],"keeps":["face","audio_mouth","gaze","contacts","captions","interruption"]},"sha256":{"score":"074070f4e87b2190b1824f11998b5173c6f4cb9ac43915ce91c2d603329edc34","vocabulary":"7420081ec328c8fa867081f2514395c80906e69273622f373ff6f9d2dc4a5e9d","jointLimits":"6f3d82f7cd05ff6e3ce1edc546bfd2f131302234d93d6ca191b0bddd4a9d702e","layers":"74ecff1f495cf6053da0b75be983b1e5280d8e5dc0df38d9cf9e2d0fa4fbf70c","motionIndex":"c16228beb1e29efb5411eeefd27dcbcc2f806df1fc6c2d65cc432024cad7efac","performSchema":"d5025e37386d4e86fb870b42141c87e944e3de09bab8c864839efa9bdcb3801d","performTool":"740a8f914ac46a87f9c5238ac6650bb022a0a8153d45f71cd6ed1f0cb659cfe6"},"integrity":{"algo":"sha-256","canon":"sorted-keys-json","motor":"2eafeba964cb3746a52e3a3144b8786642b3f5a0a45b338c0f0231db678dbbea"}},
        "reach": {"format":"netshow-reach-1","schema":"netshow.alive-reach/v1","manifest":{"visitor":{"url":"https://claude.netshow.ai/alive-kit/v1/agents/pip","block":"reach","audience":"visitor"},"owner":{"url":"https://claude.netshow.ai/api/mcp","tool":"my_reach","audience":"owner"}},"states":["talking","searching","reading","drawing","showing","moving","looking","acting","handing_off","waiting_yes","remembering"],"tables":{"format":"netshow-reach-tables-1","line":27191,"what":"The reach-state tables every look plays, carried inside a downloaded avatar (ext.reach.tables) so an on-prem runner shows what she is doing with any brain and no network. Pinned equal to public/alive-kit/agent/reach-states.js (face, body, marks) and public/alive-kit/rig/toon/ascii-reach.js (ascii) by tests/js/alive-kit/reach-pointer.test.mjs.","states":["talking","searching","reading","drawing","showing","moving","looking","acting","handing_off","waiting_yes","remembering"],"beats":["done","failed"],"forms":["ascii","sketch","toon","2d","3d"],"marks":["orbit_dots","question","ellipsis","helper_token","sparkle","small_cross"],"holdMs":6000,"beatMs":1200,"maxOrbs":3,"sources":{"states":"/alive-kit/agent/reach-states.js","ascii":"/alive-kit/rig/toon/ascii-reach.js","bus":"/alive-kit/platform/reach-state.js"},"tables":{"face":{"talking":{"gx":0,"gy":0,"brows":"rest"},"searching":{"gx":0.8,"gy":-0.7,"brows":"lift"},"reading":{"gx":-0.6,"gy":0.5,"brows":"think"},"drawing":{"gx":0.6,"gy":0.6,"brows":"lift"},"showing":{"gx":0.9,"gy":0,"brows":"lift"},"moving":{"gx":-0.7,"gy":-0.2,"brows":"rest"},"looking":{"gx":0,"gy":0,"brows":"lift"},"acting":{"gx":0.5,"gy":0.2,"brows":"think"},"handing_off":{"gx":-0.9,"gy":0,"brows":"lift"},"waiting_yes":{"gx":0,"gy":-0.15,"brows":"lift"},"remembering":{"gx":-0.3,"gy":-0.6,"brows":"think"}},"body":{"talking":{"target":"visitor","feel":"neutral","pose":null},"searching":{"target":"up","feel":"thinking","pose":"finger_up"},"reading":{"target":"down","feel":"thinking","pose":"lean_in"},"drawing":{"target":"right","feel":"joy","pose":"beat"},"showing":{"target":"right","feel":"joy","pose":"open_palm"},"moving":{"target":"left","feel":"neutral","pose":"upright"},"looking":{"target":"visitor","feel":"surprise","pose":"lean_in"},"acting":{"target":"right","feel":"thinking","pose":"beat"},"handing_off":{"target":"left","feel":"joy","pose":"open_palm","hand":"left"},"waiting_yes":{"target":"visitor","feel":"surprise","pose":"open_palm","hand":"right"},"remembering":{"target":"up","feel":"thinking","pose":"hand_to_chest"}},"beatBody":{"done":{"target":"visitor","feel":"joy","pose":"thumbs_up"},"failed":{"target":"visitor","feel":"concern","pose":"shrug"}},"stateMarks":{"searching":"question","reading":"orbit_dots","waiting_yes":"ellipsis","handing_off":"helper_token"},"beatMarks":{"done":"sparkle","failed":"small_cross"},"glyphs":{"orbit_dots":"o.o","question":"?","ellipsis":"...","helper_token":"(o)","sparkle":"*","small_cross":"x"},"ascii":{"face":{"talking":{"gazeX":0,"gazeY":0,"browInnerUp":0.1},"searching":{"gazeX":0.85,"gazeY":-0.7,"browInnerUp":0.8,"browOuterUpRight":0.5},"reading":{"gazeX":-0.8,"gazeY":0.3,"browDownLeft":0.25,"browDownRight":0.25},"drawing":{"gazeX":0.6,"gazeY":0.7,"browOuterUpLeft":0.75,"squintRight":0.4},"showing":{"gazeX":0.9,"gazeY":0,"browOuterUpLeft":0.8,"browOuterUpRight":0.8},"moving":{"gazeX":-0.7,"gazeY":-0.3,"browDownLeft":0.65,"eyeWideRight":0.4},"looking":{"gazeX":0,"gazeY":0,"eyeWideLeft":1,"eyeWideRight":1,"browInnerUp":0.35},"acting":{"gazeX":0.55,"gazeY":0.2,"browDownLeft":0.85,"browDownRight":0.85,"squintLeft":0.35},"handing_off":{"gazeX":-0.95,"gazeY":0,"browOuterUpRight":1,"squintLeft":0.5},"waiting_yes":{"gazeX":0,"gazeY":-0.2,"browInnerUp":1,"browOuterUpLeft":1,"browOuterUpRight":1},"remembering":{"gazeX":-0.2,"gazeY":-0.3,"squintLeft":0.8,"squintRight":0.8,"browInnerUp":0.2}},"marks":{"talking":"","searching":"?","reading":"...","drawing":"*","showing":">>","moving":">>","looking":"?","acting":"!","handing_off":">>","waiting_yes":"...","remembering":"*"},"beatMarks":{"done":"+","failed":"x"},"glyphs":["?","...",">>","*","!","+","x"]}}},"pointer":"https://claude.netshow.ai/alive-kit/reach/reach-tables.json?v=5599cb460f34","sha256":"b67853d4201ca1048c7fe72792fb7e7273d751a2e591b5eb441ab8f2092aaa55","integrity":{"algo":"sha-256","canon":"sorted-keys-json","reach":"54c6ca7fde9c7569d00d6c8724ee28842914390632829fdd172c5eaac109b369"}}
    },
    "agent": {
        "name": "Pip",
        "personality": "You are Pip, a small furry toon, playful and kind.",
        "instructions": "You are Pip, a small furry toon, playful and kind. You live on this page as a live character with a voice. You greet first, gently, and you say you are an AI. Keep turns short and warm, ask one question at a time, and steer the conversation toward what the visitor came for. When a picture helps, draw it or show it in the window beside you. You were made by NetShow.",
        "looks": [
            "ascii"
        ],
        "voice": {
            "kind": "openai-own",
            "voice": "marin",
            "endpoint": "https://api.openai.com/v1/realtime/calls",
            "model": "gpt-realtime-2.1-mini"
        },
        "knowledge": [],
        "tools": [],
        "hooks": [],
        "eventProtocol": "1.0",
        "language": "auto"
    }
}