SYMBOL INDEX (248 symbols across 24 files) FILE: backend/app.py function _is_asset_editor_authed (line 117) | def _is_asset_editor_authed() -> bool: function _require_asset_editor_auth (line 121) | def _require_asset_editor_auth(): function add_no_cache_headers (line 128) | def add_no_cache_headers(response): function load_state (line 154) | def load_state(): function get_office_name_from_identity (line 204) | def get_office_name_from_identity(): function save_state (line 220) | def save_state(state: dict): function ensure_electron_standalone_snapshot (line 226) | def ensure_electron_standalone_snapshot(): function index (line 252) | def index(): function electron_standalone_page (line 270) | def electron_standalone_page(): function join_page (line 288) | def join_page(): function invite_page (line 298) | def invite_page(): function load_agents_state (line 325) | def load_agents_state(): function save_agents_state (line 329) | def save_agents_state(agents): function load_asset_positions (line 333) | def load_asset_positions(): function save_asset_positions (line 337) | def save_asset_positions(data): function load_asset_defaults (line 341) | def load_asset_defaults(): function save_asset_defaults (line 345) | def save_asset_defaults(data): function load_runtime_config (line 349) | def load_runtime_config(): function save_runtime_config (line 353) | def save_runtime_config(data): function _ensure_home_favorites_index (line 357) | def _ensure_home_favorites_index(): function _load_home_favorites_index (line 364) | def _load_home_favorites_index(): function _save_home_favorites_index (line 376) | def _save_home_favorites_index(data): function _maybe_apply_random_home_favorite (line 382) | def _maybe_apply_random_home_favorite(): function load_join_keys (line 420) | def load_join_keys(): function save_join_keys (line 424) | def save_join_keys(data): function _ensure_magick_or_ffmpeg_available (line 428) | def _ensure_magick_or_ffmpeg_available(): function _probe_animated_frame_size (line 436) | def _probe_animated_frame_size(upload_path: str): function _animated_to_spritesheet (line 464) | def _animated_to_spritesheet( function normalize_agent_state (line 563) | def normalize_agent_state(s): function _normalize_user_model (line 602) | def _normalize_user_model(model_name: str) -> str: function _provider_model_candidates (line 614) | def _provider_model_candidates(user_model: str): function _generate_rpg_background_to_webp (line 619) | def _generate_rpg_background_to_webp(out_webp_path: str, width: int = 12... function state_to_area (line 811) | def state_to_area(state): function get_agents (line 839) | def get_agents(): function agent_approve (line 892) | def agent_approve(): function agent_reject (line 916) | def agent_reject(): function join_agent (line 954) | def join_agent(): function leave_agent (line 1099) | def leave_agent(): function get_status (line 1147) | def get_status(): function agent_push (line 1157) | def agent_push(): function health (line 1235) | def health(): function get_yesterday_memo (line 1245) | def get_yesterday_memo(): function set_state_endpoint (line 1291) | def set_state_endpoint(): function assets_template_download (line 1312) | def assets_template_download(): function assets_list (line 1319) | def assets_list(): function _bg_generate_worker (line 1350) | def _bg_generate_worker(task_id: str, custom_prompt: str, speed_mode: str): function assets_generate_rpg_background (line 1405) | def assets_generate_rpg_background(): function assets_generate_rpg_background_poll (line 1450) | def assets_generate_rpg_background_poll(): function assets_restore_reference_background (line 1479) | def assets_restore_reference_background(): function assets_restore_last_generated_background (line 1527) | def assets_restore_last_generated_background(): function assets_home_favorites_list (line 1567) | def assets_home_favorites_list(): function assets_home_favorites_file (line 1597) | def assets_home_favorites_file(filename): function assets_home_favorites_save_current (line 1605) | def assets_home_favorites_save_current(): function assets_home_favorites_delete (line 1649) | def assets_home_favorites_delete(): function assets_home_favorites_apply (line 1681) | def assets_home_favorites_apply(): function assets_auth (line 1716) | def assets_auth(): function assets_auth_status (line 1729) | def assets_auth_status(): function assets_positions_get (line 1738) | def assets_positions_get(): function assets_positions_set (line 1749) | def assets_positions_set(): function assets_defaults_get (line 1778) | def assets_defaults_get(): function assets_defaults_set (line 1789) | def assets_defaults_set(): function gemini_config_get (line 1818) | def gemini_config_get(): function gemini_config_set (line 1837) | def gemini_config_set(): function assets_restore_default (line 1855) | def assets_restore_default(): function assets_restore_prev (line 1892) | def assets_restore_prev(): function assets_upload (line 1921) | def assets_upload(): FILE: backend/memo_utils.py function get_yesterday_date_str (line 14) | def get_yesterday_date_str() -> str: function sanitize_content (line 20) | def sanitize_content(text: str) -> str: function extract_memo_from_file (line 33) | def extract_memo_from_file(file_path: str) -> str: FILE: backend/security_utils.py function is_production_mode (line 12) | def is_production_mode() -> bool: function is_strong_secret (line 18) | def is_strong_secret(secret: str) -> bool: function is_strong_drawer_pass (line 30) | def is_strong_drawer_pass(pwd: str) -> bool: FILE: backend/store_utils.py function _load_json (line 13) | def _load_json(path: str): function _save_json (line 19) | def _save_json(path: str, data): function load_agents_state (line 25) | def load_agents_state(path: str, default_agents: list) -> list: function save_agents_state (line 37) | def save_agents_state(path: str, agents: list): function load_asset_positions (line 42) | def load_asset_positions(path: str) -> dict: function save_asset_positions (line 54) | def save_asset_positions(path: str, data: dict): function load_asset_defaults (line 59) | def load_asset_defaults(path: str) -> dict: function save_asset_defaults (line 71) | def save_asset_defaults(path: str, data: dict): function _normalize_user_model (line 76) | def _normalize_user_model(model_name: str) -> str: function load_runtime_config (line 88) | def load_runtime_config(path: str) -> dict: function save_runtime_config (line 105) | def save_runtime_config(path: str, data: dict): function load_join_keys (line 116) | def load_join_keys(path: str) -> dict: function save_join_keys (line 128) | def save_join_keys(path: str, data: dict): FILE: convert_to_webp.py function convert_to_webp (line 36) | def convert_to_webp(input_path, output_path, lossless=True, quality=85): function main (line 61) | def main(): FILE: desktop-pet/src-tauri/build.rs function main (line 1) | fn main() { FILE: desktop-pet/src-tauri/src/lib.rs type PetState (line 16) | pub struct PetState { type CfgFile (line 26) | struct CfgFile { type CharCfg (line 35) | struct CharCfg { type LayerCfg (line 44) | struct LayerCfg { type SpritesCfg (line 54) | struct SpritesCfg { type AnimCfg (line 61) | struct AnimCfg { function neg_one (line 69) | fn neg_one() -> i32 { type MapCfgFile (line 76) | struct MapCfgFile { type PoiCfg (line 93) | struct PoiCfg { type FullData (line 101) | struct FullData { type CharData (line 110) | struct CharData { type LayerItem (line 119) | struct LayerItem { type SpritesData (line 129) | struct SpritesData { type AnimItem (line 136) | struct AnimItem { type MapData (line 145) | struct MapData { type PoiOut (line 163) | struct PoiOut { type AppPaths (line 170) | struct AppPaths { type BackendProcess (line 175) | struct BackendProcess { method drop (line 180) | fn drop(&mut self) { function encode_image (line 188) | fn encode_image(path: &PathBuf) -> Result { function read_state_file (line 206) | fn read_state_file(state_path: &PathBuf) -> Result { function read_state_via_backend (line 212) | fn read_state_via_backend() -> Result { function read_state_with_fallback (line 235) | fn read_state_with_fallback(state_path: &PathBuf) -> Result>) -> Result>) -> Result>) -> Result Option { function find_project_root (line 402) | fn find_project_root() -> PathBuf { function spawn_backend (line 443) | fn spawn_backend(root: &PathBuf) -> Option { function wait_backend_ready (line 501) | fn wait_backend_ready() -> bool { function enter_minimize_mode (line 513) | fn enter_minimize_mode( function restore_main_window (line 545) | fn restore_main_window(app: tauri::AppHandle) -> Result<(), String> { function close_app (line 560) | fn close_app(app: tauri::AppHandle) { function open_external_url (line 565) | fn open_external_url(url: String) -> Result<(), String> { function run (line 593) | pub fn run() { FILE: desktop-pet/src-tauri/src/main.rs function main (line 3) | fn main() { FILE: electron-shell/main.js constant APP_NAME (line 6) | const APP_NAME = "Star Office UI"; constant BACKEND_HOST (line 7) | const BACKEND_HOST = process.env.STAR_BACKEND_HOST || "127.0.0.1"; constant BACKEND_PORT (line 9) | const BACKEND_PORT = Number.isFinite(rawBackendPort) && rawBackendPort >... constant BACKEND_BASE_URL (line 10) | const BACKEND_BASE_URL = `http://${BACKEND_HOST}:${BACKEND_PORT}`; function sleep (line 20) | function sleep(ms) { function tcpReachable (line 24) | function tcpReachable(host, port, timeoutMs = 500) { function waitBackendReady (line 42) | async function waitBackendReady(timeoutMs = 20000) { function findProjectRoot (line 52) | function findProjectRoot() { function resolveAppIconPath (line 83) | function resolveAppIconPath(projectRoot) { function applyAppIcon (line 96) | function applyAppIcon(projectRoot) { function readStateFile (line 108) | function readStateFile(statePath) { function readStateViaBackend (line 113) | function readStateViaBackend() { function readStateWithFallback (line 144) | async function readStateWithFallback(projectRoot) { function spawnBackend (line 153) | function spawnBackend(projectRoot) { function ensureElectronStandaloneSnapshot (line 181) | function ensureElectronStandaloneSnapshot(projectRoot) { function emitMini (line 194) | function emitMini(event, payload) { function emitMain (line 199) | function emitMain(event, payload) { function enterMiniMode (line 204) | async function enterMiniMode(projectRoot) { function openFrontendAndQuit (line 221) | async function openFrontendAndQuit() { function createAssetWindow (line 226) | function createAssetWindow(projectRoot) { function createWindows (line 281) | function createWindows(projectRoot) { function createTray (line 332) | function createTray(projectRoot) { function registerIpc (line 380) | function registerIpc(projectRoot) { function bootstrap (line 508) | async function bootstrap() { FILE: electron-shell/preload.js class LogicalSize (line 16) | class LogicalSize { method constructor (line 17) | constructor(width, height) { function ensureDragMoveHandlers (line 29) | function ensureDragMoveHandlers() { FILE: electron-shell/standalone-assets/game.js function checkWebPSupport (line 8) | function checkWebPSupport() { function checkWebPSupportFallback (line 20) | function checkWebPSupportFallback() { function getExt (line 30) | function getExt(pngFile) { function loadMemo (line 57) | async function loadMemo() { function updateLoadingProgress (line 78) | function updateLoadingProgress() { function hideLoadingOverlay (line 90) | function hideLoadingOverlay() { constant STATES (line 102) | const STATES = { constant BUBBLE_TEXTS (line 111) | const BUBBLE_TEXTS = { constant FETCH_INTERVAL (line 196) | const FETCH_INTERVAL = 2000; constant BLINK_INTERVAL (line 197) | const BLINK_INTERVAL = 2500; constant BUBBLE_INTERVAL (line 198) | const BUBBLE_INTERVAL = 8000; constant CAT_BUBBLE_INTERVAL (line 199) | const CAT_BUBBLE_INTERVAL = 18000; constant TYPEWRITER_DELAY (line 201) | const TYPEWRITER_DELAY = 50; constant AGENTS_FETCH_INTERVAL (line 204) | const AGENTS_FETCH_INTERVAL = 2500; constant AGENT_COLORS (line 207) | const AGENT_COLORS = { constant NAME_TAG_COLORS (line 215) | const NAME_TAG_COLORS = { constant AREA_POSITIONS (line 224) | const AREA_POSITIONS = { function setState (line 246) | function setState(state, detail) { function initGame (line 255) | async function initGame() { function preload (line 270) | function preload() { function create (line 312) | function create() { function update (line 590) | function update(time) { function normalizeState (line 663) | function normalizeState(s) { function fetchStatus (line 672) | function fetchStatus() { function moveStar (line 762) | function moveStar(time) { function showBubble (line 840) | function showBubble() { function showCatBubble (line 868) | function showCatBubble() { function fetchAgents (line 883) | function fetchAgents() { function getAreaPosition (line 910) | function getAreaPosition(area) { function renderAgent (line 917) | function renderAgent(agent) { FILE: electron-shell/standalone-assets/layout.js constant LAYOUT (line 9) | const LAYOUT = { FILE: frontend/game.js function checkWebPSupport (line 8) | function checkWebPSupport() { function checkWebPSupportFallback (line 20) | function checkWebPSupportFallback() { function getExt (line 30) | function getExt(pngFile) { function loadMemo (line 57) | async function loadMemo() { function updateLoadingProgress (line 78) | function updateLoadingProgress() { function hideLoadingOverlay (line 90) | function hideLoadingOverlay() { constant STATES (line 102) | const STATES = { constant BUBBLE_TEXTS (line 111) | const BUBBLE_TEXTS = { constant FETCH_INTERVAL (line 196) | const FETCH_INTERVAL = 2000; constant BLINK_INTERVAL (line 197) | const BLINK_INTERVAL = 2500; constant BUBBLE_INTERVAL (line 198) | const BUBBLE_INTERVAL = 8000; constant CAT_BUBBLE_INTERVAL (line 199) | const CAT_BUBBLE_INTERVAL = 18000; constant TYPEWRITER_DELAY (line 201) | const TYPEWRITER_DELAY = 50; constant AGENTS_FETCH_INTERVAL (line 204) | const AGENTS_FETCH_INTERVAL = 2500; constant AGENT_COLORS (line 207) | const AGENT_COLORS = { constant NAME_TAG_COLORS (line 215) | const NAME_TAG_COLORS = { constant AREA_POSITIONS (line 224) | const AREA_POSITIONS = { function setState (line 259) | function setState(state, detail) { function initGame (line 268) | async function initGame() { function preload (line 283) | function preload() { function create (line 325) | function create() { function update (line 621) | function update(time) { function normalizeState (line 694) | function normalizeState(s) { function fetchStatus (line 703) | function fetchStatus() { function moveStar (line 793) | function moveStar(time) { function showBubble (line 871) | function showBubble() { function showCatBubble (line 899) | function showCatBubble() { function fetchAgents (line 914) | function fetchAgents() { function getAreaPosition (line 944) | function getAreaPosition(area, slotIndex) { function renderAgent (line 950) | function renderAgent(agent) { FILE: frontend/layout.js constant LAYOUT (line 9) | const LAYOUT = { FILE: frontend/office-agent-push.py function load_local_state (line 53) | def load_local_state(): function save_local_state (line 68) | def save_local_state(data): function normalize_state (line 73) | def normalize_state(s): function map_detail_to_state (line 89) | def map_detail_to_state(detail, fallback_state="idle"): function _state_age_seconds (line 105) | def _state_age_seconds(data): function fetch_local_status (line 119) | def fetch_local_status(): function do_join (line 199) | def do_join(local): function do_push (line 220) | def do_push(local, status_data): function main (line 254) | def main(): FILE: gif_to_spritesheet.py function gif_to_spritesheet (line 7) | def gif_to_spritesheet(gif_path, output_path, target_height=64): FILE: office-agent-push.py function load_local_state (line 61) | def load_local_state(): function save_local_state (line 76) | def save_local_state(data): function normalize_state (line 81) | def normalize_state(s): function map_detail_to_state (line 97) | def map_detail_to_state(detail, fallback_state="idle"): function _state_age_seconds (line 113) | def _state_age_seconds(data): function fetch_local_status (line 127) | def fetch_local_status(): function do_join (line 207) | def do_join(local): function do_push (line 228) | def do_push(local, status_data): function main (line 262) | def main(): FILE: repack_star_working.py function main (line 36) | def main(): FILE: resize_map.py function resize_map (line 6) | def resize_map(input_path, output_path, target_short_edge=600): FILE: scripts/gemini_image_generate.py function detect_mime (line 42) | def detect_mime(path: str) -> str: function main (line 56) | def main(): FILE: scripts/security_check.py function run (line 21) | def run(cmd: list[str]) -> tuple[int, str, str]: function is_strong_secret (line 26) | def is_strong_secret(v: str) -> bool: function is_strong_pass (line 39) | def is_strong_pass(v: str) -> bool: function tracked_files (line 48) | def tracked_files() -> list[str]: function file_has_secret_pattern (line 55) | def file_has_secret_pattern(path: Path) -> list[str]: function main (line 73) | def main() -> int: FILE: scripts/smoke_test.py function req (line 30) | def req(method: str, url: str, body: dict | None = None, token: str = ""... function main (line 51) | def main() -> int: FILE: set_state.py function load_state (line 31) | def load_state(): function save_state (line 42) | def save_state(state): FILE: webp_to_spritesheet.py function webp_to_spritesheet (line 14) | def webp_to_spritesheet(in_path: str, out_path: str, frame_w: int, frame... function main (line 33) | def main():