SYMBOL INDEX (468 symbols across 57 files) FILE: dashboard/court_discuss.py function create_session (line 114) | def create_session(topic: str, official_ids: list[str], task_id: str = '... function advance_discussion (line 146) | def advance_discussion(session_id: str, user_message: str = None, function get_session (line 212) | def get_session(session_id: str) -> dict | None: function conclude_session (line 219) | def conclude_session(session_id: str) -> dict: function list_sessions (line 253) | def list_sessions() -> list[dict]: function destroy_session (line 268) | def destroy_session(session_id: str): function get_fate_event (line 272) | def get_fate_event() -> str: function _pick_chat_model (line 290) | def _pick_chat_model(models: list[dict]) -> str | None: function _read_copilot_token (line 300) | def _read_copilot_token() -> str | None: function _get_llm_config (line 321) | def _get_llm_config() -> dict | None: function _llm_complete (line 410) | def _llm_complete(system_prompt: str, user_prompt: str, max_tokens: int ... function _llm_discuss (line 478) | def _llm_discuss(session: dict, user_message: str = None, decree: str = ... function _llm_summarize (line 570) | def _llm_summarize(session: dict) -> str | None: function _simulated_discuss (line 650) | def _simulated_discuss(session: dict, user_message: str = None, decree: ... function _serialize (line 683) | def _serialize(session: dict) -> dict: FILE: dashboard/dist/assets/index-DQ-p_wPk.js function c (line 1) | function c(g){const P={};return g.integrity&&(P.integrity=g.integrity),g... function v (line 1) | function v(g){if(g.ep)return;g.ep=!0;const P=c(g);fetch(g.href,P)} function Zi (line 1) | function Zi(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.c... function mf (line 9) | function mf(){if(Qc)return ge;Qc=1;var o=Symbol.for("react.element"),f=S... function Rr (line 9) | function Rr(){return Kc||(Kc=1,Fi.exports=mf()),Fi.exports} function hf (line 17) | function hf(){if(Gc)return Tr;Gc=1;var o=Rr(),f=Symbol.for("react.elemen... function vf (line 17) | function vf(){return Yc||(Yc=1,$i.exports=hf()),$i.exports} function gf (line 25) | function gf(){return Xc||(Xc=1,(function(o){function f(_,G){var U=_.leng... function yf (line 25) | function yf(){return Zc||(Zc=1,Wi.exports=gf()),Wi.exports} function xf (line 33) | function xf(){if(Jc)return it;Jc=1;var o=Rr(),f=yf();function c(e){for(v... function kf (line 40) | function kf(){if(qc)return Bi.exports;qc=1;function o(){if(!(typeof __RE... function jf (line 40) | function jf(){if(eu)return Wl;eu=1;var o=kf();return Wl.createRoot=o.cre... function Ef (line 48) | function Ef(){if(nu)return Ki;nu=1;var o=Rr();function f(d,N){return d==... function _f (line 48) | function _f(){return ru||(ru=1,Qi.exports=Ef()),Qi.exports} function zf (line 56) | function zf(){if(lu)return Vi;lu=1;var o=Rr(),f=_f();function c(E,b){ret... function bf (line 56) | function bf(){return su||(su=1,Hi.exports=zf()),Hi.exports} function Df (line 56) | function Df(o,f=If,c){(uu?"production":void 0)!=="production"&&c&&!iu&&(... function gt (line 56) | async function gt(o){const f=await fetch(o,{cache:"no-store"});if(!f.ok)... function Pe (line 56) | async function Pe(o,f){return(await fetch(o,{method:"POST",headers:{"Con... function Ul (line 56) | function Ul(o){return Of[o]||"#6a9eff"} function Ji (line 56) | function Ji(o){const f=o.review_round||0;return o.state==="Menxia"&&f>1?... function ln (line 56) | function ln(o){return/^JJC-/i.test(o.id||"")} function Vl (line 56) | function Vl(o){return o.archived||["Done","Cancelled"].includes(o.state)} function qi (line 56) | function qi(o){const f=Af[o.state]??4;return du.map((c,v)=>({...c,status... function Uf (line 60) | function Uf(){Lr||(ee.getState().loadAll(),Lr=setInterval(()=>{const o=e... function Hf (line 60) | function Hf(){Lr&&(clearInterval(Lr),Lr=null)} function Vf (line 60) | function Vf(o){if(!o)return"";try{const f=new Date(o.includes("T")?o:o.r... function Qf (line 60) | function Qf({task:o}){const f=qi(o);return l.jsx("div",{className:"ec-pi... function Kf (line 60) | function Kf({task:o}){const f=ee(x=>x.setModalTaskId),c=ee(x=>x.toast),v... function Gf (line 60) | function Gf(){const o=ee(j=>j.liveStatus),f=ee(j=>j.edictFilter),c=ee(j=... function Yf (line 60) | function Yf(){var V;const o=ee(R=>R.liveStatus),f=ee(R=>R.agentsStatusDa... function Zf (line 60) | function Zf(){var d;const o=ee(N=>N.officialsData),f=ee(N=>N.selectedOff... function Jf (line 60) | function Jf({official:o,maxTk:f,onOpenTask:c}){const v=o.heartbeat||{sta... function tp (line 60) | function tp(){var M;const o=ee(x=>x.agentConfig),f=ee(x=>x.changeLog),c=... function rp (line 60) | function rp(){const o=ee(y=>y.agentConfig),f=ee(y=>y.loadAgentConfig),c=... function lp (line 60) | function lp(){const o=ee(v=>v.agentConfig),f={},c={};return o!=null&&o.a... function Hl (line 60) | function Hl(o){const f=(o.id||"").match(/^OC-(\w+)-/);return f?f[1]:(o.o... function pu (line 60) | function pu(o,f){let c=o.title||"";if(c==="heartbeat 会话")return"💓 心跳检测";... function mu (line 60) | function mu(o){const f=o.now||"";return f.includes("feishu/direct")?{ico... function sp (line 60) | function sp(o){const f=o.activity||[];for(let c=f.length-1;c>=0;c--){con... function ip (line 60) | function ip(){const o=ee(d=>d.liveStatus),f=ee(d=>d.sessFilter),c=ee(d=>... function op (line 60) | function op({task:o,labelMap:f,emojiMap:c,onClose:v}){const g=Hl(o),P=c[... function ap (line 60) | function ap(){const o=ee(E=>E.liveStatus),[f,c]=Q.useState("all"),[v,g]=... function cp (line 77) | function cp({task:o,onClose:f,onExport:c}){const v=o.flow_log||[],g=o.st... function up (line 77) | function up(){const o=ee(S=>S.tplCatFilter),f=ee(S=>S.setTplCatFilter),c... function dp (line 79) | function dp(){const o=ee(Z=>Z.morningBrief),f=ee(Z=>Z.subConfig),c=ee(Z=... function fp (line 79) | function fp({config:o,enabledSet:f,onToggleCat:c,onAddKeyword:v,onRemove... function mp (line 79) | function mp(o){const f=Math.max(0,o);if(f<60)return`${f}秒`;if(f<3600)ret... function Yi (line 79) | function Yi(o){if(!o)return"";if(typeof o=="number"){const f=new Date(o)... function hp (line 79) | function hp(){var Ee,je;const o=ee(_=>_.modalTaskId),f=ee(_=>_.setModalT... function vp (line 84) | function vp({todos:o,todoDone:f,todoTotal:c}){return l.jsxs("div",{class... function gp (line 84) | function gp({data:o,isDone:f,logRef:c}){if(!o)return null;const v=o.acti... function yp (line 84) | function yp({entry:o}){var v,g,P;const f=Yi(o.at),c=o.agent?l.jsx("span"... function xp (line 84) | function xp(){const o=ee(f=>f.toasts);return o.length?l.jsx("div",{class... function kp (line 84) | function kp(){const o=ee(O=>O.liveStatus),[f,c]=Q.useState(!1),[v,g]=Q.u... function Sp (line 84) | function Sp(){var ve;const[o,f]=Q.useState("setup"),[c,v]=Q.useState(new... function wp (line 84) | function wp({msg:o,officials:f}){var g;const c=Xi[o.official_id||""]||"#... function Np (line 84) | function Np(){const o=ee(d=>d.activeTab),f=ee(d=>d.setActiveTab),c=ee(d=... FILE: dashboard/server.py function cors_headers (line 67) | def cors_headers(h): function load_tasks (line 80) | def load_tasks(): function save_tasks (line 84) | def save_tasks(tasks): function handle_task_action (line 95) | def handle_task_action(task_id, action, reason): function handle_archive_task (line 144) | def handle_archive_task(task_id, archived, archive_all_done=False): function update_task_todos (line 170) | def update_task_todos(task_id, todos): function read_skill_content (line 183) | def read_skill_content(agent_id, skill_name): function add_skill_to_agent (line 210) | def add_skill_to_agent(agent_id, skill_name, description, trigger=''): function add_remote_skill (line 246) | def add_remote_skill(agent_id, skill_name, source_url, description=''): function get_remote_skills_list (line 366) | def get_remote_skills_list(): function update_remote_skill (line 413) | def update_remote_skill(agent_id, skill_name): function remove_remote_skill (line 445) | def remove_remote_skill(agent_id, skill_name): function _compute_checksum (line 477) | def _compute_checksum(content: str) -> str: function push_to_feishu (line 483) | def push_to_feishu(): function handle_create_task (line 531) | def handle_create_task(title, org='中书省', official='中书令', priority='norma... function handle_review_action (line 598) | def handle_review_action(task_id, action, comment=''): function _check_gateway_alive (line 668) | def _check_gateway_alive(): function _check_gateway_probe (line 678) | def _check_gateway_probe(): function _get_agent_session_status (line 688) | def _get_agent_session_status(agent_id): function _check_agent_process (line 713) | def _check_agent_process(agent_id): function _check_agent_workspace (line 725) | def _check_agent_workspace(agent_id): function get_agents_status (line 731) | def get_agents_status(): function wake_agent (line 817) | def wake_agent(agent_id, message=''): function _parse_iso (line 877) | def _parse_iso(ts): function _ensure_scheduler (line 886) | def _ensure_scheduler(task): function _scheduler_add_flow (line 914) | def _scheduler_add_flow(task, remark, to=''): function _scheduler_snapshot (line 923) | def _scheduler_snapshot(task, note=''): function _scheduler_mark_progress (line 934) | def _scheduler_mark_progress(task, note=''): function _update_task_scheduler (line 945) | def _update_task_scheduler(task_id, updater): function get_scheduler_state (line 957) | def get_scheduler_state(task_id): function handle_scheduler_retry (line 979) | def handle_scheduler_retry(task_id, reason=''): function handle_scheduler_escalate (line 1000) | def handle_scheduler_escalate(task_id, reason=''): function handle_scheduler_rollback (line 1034) | def handle_scheduler_rollback(task_id, reason=''): function handle_scheduler_scan (line 1064) | def handle_scheduler_scan(threshold_sec=600): function _startup_recover_queued_dispatches (line 1172) | def _startup_recover_queued_dispatches(): function handle_repair_flow_order (line 1194) | def handle_repair_flow_order(): function _collect_message_text (line 1238) | def _collect_message_text(msg): function _parse_activity_entry (line 1257) | def _parse_activity_entry(item): function get_agent_activity (line 1330) | def get_agent_activity(agent_id, limit=30, task_id=None): function _extract_keywords (line 1378) | def _extract_keywords(title): function get_agent_activity_by_keywords (line 1399) | def get_agent_activity_by_keywords(agent_id, keywords, limit=20): function get_agent_latest_segment (line 1485) | def get_agent_latest_segment(agent_id, limit=20): function _compute_phase_durations (line 1533) | def _compute_phase_durations(flow_log): function _compute_todos_summary (line 1580) | def _compute_todos_summary(todos): function _compute_todos_diff (line 1598) | def _compute_todos_diff(prev_todos, curr_todos): function get_task_activity (line 1621) | def get_task_activity(task_id): function dispatch_for_state (line 1882) | def dispatch_for_state(task_id, task, new_state, trigger='state-transiti... function handle_advance_state (line 2023) | def handle_advance_state(task_id, comment=''): class Handler (line 2059) | class Handler(BaseHTTPRequestHandler): method log_message (line 2060) | def log_message(self, fmt, *args): method handle_error (line 2067) | def handle_error(self): method handle (line 2070) | def handle(self): method do_OPTIONS (line 2076) | def do_OPTIONS(self): method send_json (line 2081) | def send_json(self, data, code=200): method send_file (line 2093) | def send_file(self, path: pathlib.Path, mime='text/html; charset=utf-8'): method _serve_static (line 2108) | def _serve_static(self, rel_path): method do_GET (line 2121) | def do_GET(self): method do_POST (line 2211) | def do_POST(self): function main (line 2530) | def main(): FILE: edict/backend/app/api/admin.py function deep_health (line 19) | async def deep_health(db: AsyncSession = Depends(get_db)): function pending_events (line 43) | async def pending_events( function migration_check (line 67) | async def migration_check(): function get_config (line 80) | async def get_config(): FILE: edict/backend/app/api/agents.py function list_agents (line 27) | async def list_agents(): function get_agent (line 39) | async def get_agent(agent_id: str): function get_agent_config (line 59) | async def get_agent_config(agent_id: str): FILE: edict/backend/app/api/events.py function list_events (line 20) | async def list_events( function stream_info (line 57) | async def stream_info(topic: str = Query(description="Stream topic")): function list_topics (line 65) | async def list_topics(): FILE: edict/backend/app/api/legacy.py function _find_by_legacy_id (line 22) | async def _find_by_legacy_id(db: AsyncSession, legacy_id: str) -> Task |... class LegacyTransition (line 37) | class LegacyTransition(BaseModel): class LegacyProgress (line 43) | class LegacyProgress(BaseModel): class LegacyTodoUpdate (line 48) | class LegacyTodoUpdate(BaseModel): function legacy_transition (line 53) | async def legacy_transition( function legacy_progress (line 77) | async def legacy_progress( function legacy_todos (line 93) | async def legacy_todos( function legacy_get (line 109) | async def legacy_get( FILE: edict/backend/app/api/tasks.py class TaskCreate (line 22) | class TaskCreate(BaseModel): class TaskTransition (line 32) | class TaskTransition(BaseModel): class TaskProgress (line 38) | class TaskProgress(BaseModel): class TaskTodoUpdate (line 43) | class TaskTodoUpdate(BaseModel): class TaskSchedulerUpdate (line 47) | class TaskSchedulerUpdate(BaseModel): class TaskOut (line 51) | class TaskOut(BaseModel): class Config (line 68) | class Config: function get_task_service (line 74) | async def get_task_service( function list_tasks (line 84) | async def list_tasks( function live_status (line 105) | async def live_status(svc: TaskService = Depends(get_task_service)): function task_stats (line 111) | async def task_stats(svc: TaskService = Depends(get_task_service)): function create_task (line 121) | async def create_task( function get_task (line 139) | async def get_task( function transition_task (line 152) | async def transition_task( function dispatch_task (line 176) | async def dispatch_task( function add_progress (line 191) | async def add_progress( function update_todos (line 205) | async def update_todos( function update_scheduler (line 219) | async def update_scheduler( FILE: edict/backend/app/api/websocket.py function websocket_endpoint (line 27) | async def websocket_endpoint(ws: WebSocket): function _relay_events (line 58) | async def _relay_events(pubsub, ws: WebSocket): function _handle_client_messages (line 80) | async def _handle_client_messages(ws: WebSocket): function task_websocket (line 104) | async def task_websocket(ws: WebSocket, task_id: str): function broadcast (line 142) | async def broadcast(event: dict): FILE: edict/backend/app/config.py class Settings (line 7) | class Settings(BaseSettings): method database_url (line 47) | def database_url(self) -> str: method database_url_sync (line 56) | def database_url_sync(self) -> str: function get_settings (line 74) | def get_settings() -> Settings: FILE: edict/backend/app/db.py class Base (line 25) | class Base(DeclarativeBase): function get_db (line 30) | async def get_db() -> AsyncSession: function init_db (line 44) | async def init_db(): FILE: edict/backend/app/main.py function lifespan (line 34) | async def lifespan(app: FastAPI): function health (line 76) | async def health(): function api_root (line 81) | async def api_root(): FILE: edict/backend/app/models/event.py class Event (line 16) | class Event(Base): method to_dict (line 38) | def to_dict(self) -> dict: FILE: edict/backend/app/models/task.py class TaskState (line 28) | class TaskState(str, enum.Enum): class Task (line 78) | class Task(Base): method to_dict (line 118) | def to_dict(self) -> dict: FILE: edict/backend/app/models/thought.py class Thought (line 16) | class Thought(Base): method to_dict (line 42) | def to_dict(self) -> dict: FILE: edict/backend/app/models/todo.py class Todo (line 16) | class Todo(Base): method to_dict (line 50) | def to_dict(self) -> dict: FILE: edict/backend/app/services/event_bus.py class EventBus (line 44) | class EventBus: method __init__ (line 47) | def __init__(self, redis_url: str | None = None): method connect (line 51) | async def connect(self): method close (line 61) | async def close(self): method redis (line 67) | def redis(self) -> aioredis.Redis: method _stream_key (line 71) | def _stream_key(self, topic: str) -> str: method publish (line 74) | async def publish( method ensure_consumer_group (line 107) | async def ensure_consumer_group(self, topic: str, group: str): method consume (line 117) | async def consume( method ack (line 150) | async def ack(self, topic: str, group: str, entry_id: str): method get_pending (line 156) | async def get_pending(self, topic: str, group: str, count: int = 10) -... method claim_stale (line 161) | async def claim_stale( method stream_info (line 186) | async def stream_info(self, topic: str) -> dict: function get_event_bus (line 200) | async def get_event_bus() -> EventBus: FILE: edict/backend/app/services/task_service.py class TaskService (line 29) | class TaskService: method __init__ (line 30) | def __init__(self, db: AsyncSession, event_bus: EventBus): method create_task (line 36) | async def create_task( method transition_state (line 98) | async def transition_state( method request_dispatch (line 153) | async def request_dispatch( method add_progress (line 177) | async def add_progress( method update_todos (line 196) | async def update_todos( method update_scheduler (line 207) | async def update_scheduler( method get_task (line 220) | async def get_task(self, task_id: uuid.UUID) -> Task: method list_tasks (line 223) | async def list_tasks( method get_live_status (line 245) | async def get_live_status(self) -> dict[str, Any]: method count_tasks (line 262) | async def count_tasks(self, state: TaskState | None = None) -> int: method _get_task (line 271) | async def _get_task(self, task_id: uuid.UUID) -> Task: FILE: edict/backend/app/workers/dispatch_worker.py class DispatchWorker (line 37) | class DispatchWorker: method __init__ (line 40) | def __init__(self, max_concurrent: int = 3): method start (line 46) | async def start(self): method stop (line 62) | async def stop(self): method _recover_pending (line 71) | async def _recover_pending(self): method _poll_cycle (line 80) | async def _poll_cycle(self): method _dispatch (line 91) | async def _dispatch(self, entry_id: str, event: dict): method _call_openclaw (line 144) | async def _call_openclaw( function run_dispatcher (line 190) | async def run_dispatcher(): FILE: edict/backend/app/workers/orchestrator_worker.py class OrchestratorWorker (line 47) | class OrchestratorWorker: method __init__ (line 50) | def __init__(self): method start (line 54) | async def start(self): method stop (line 75) | async def stop(self): method _recover_pending (line 80) | async def _recover_pending(self): method _poll_cycle (line 91) | async def _poll_cycle(self): method _handle_event (line 108) | async def _handle_event(self, topic: str, entry_id: str, event: dict): method _on_task_created (line 125) | async def _on_task_created(self, payload: dict, trace_id: str): method _on_task_status (line 144) | async def _on_task_status(self, event_type: str, payload: dict, trace_... method _on_task_completed (line 178) | async def _on_task_completed(self, payload: dict, trace_id: str): method _on_task_stalled (line 183) | async def _on_task_stalled(self, payload: dict, trace_id: str): function run_orchestrator (line 190) | async def run_orchestrator(): FILE: edict/frontend/src/App.tsx function App (line 18) | function App() { FILE: edict/frontend/src/api.ts constant API_BASE (line 6) | const API_BASE = import.meta.env.VITE_API_URL || ''; function fetchJ (line 10) | async function fetchJ(url: string): Promise { function postJ (line 16) | async function postJ(url: string, data: unknown): Promise { type ActionResult (line 114) | interface ActionResult { type FlowEntry (line 120) | interface FlowEntry { type TodoItem (line 127) | interface TodoItem { type Heartbeat (line 134) | interface Heartbeat { type Task (line 139) | interface Task { type SyncStatus (line 161) | interface SyncStatus { type LiveStatus (line 166) | interface LiveStatus { type AgentInfo (line 171) | interface AgentInfo { type SkillInfo (line 180) | interface SkillInfo { type KnownModel (line 186) | interface KnownModel { type AgentConfig (line 192) | interface AgentConfig { type ChangeLogEntry (line 198) | interface ChangeLogEntry { type OfficialInfo (line 206) | interface OfficialInfo { type OfficialsData (line 232) | interface OfficialsData { type AgentStatusInfo (line 238) | interface AgentStatusInfo { type GatewayStatus (line 248) | interface GatewayStatus { type AgentsStatusData (line 254) | interface AgentsStatusData { type MorningNewsItem (line 261) | interface MorningNewsItem { type MorningBrief (line 271) | interface MorningBrief { type SubCategoryConfig (line 277) | interface SubCategoryConfig { type CustomFeed (line 282) | interface CustomFeed { type SubConfig (line 288) | interface SubConfig { type ActivityEntry (line 295) | interface ActivityEntry { type PhaseDuration (line 316) | interface PhaseDuration { type TodosSummary (line 323) | interface TodosSummary { type ResourceSummary (line 331) | interface ResourceSummary { type TaskActivityData (line 337) | interface TaskActivityData { type SchedulerInfo (line 351) | interface SchedulerInfo { type SchedulerStateData (line 363) | interface SchedulerStateData { type SkillContentResult (line 370) | interface SkillContentResult { type ScanAction (line 379) | interface ScanAction { type CreateTaskPayload (line 387) | interface CreateTaskPayload { type RemoteSkillItem (line 396) | interface RemoteSkillItem { type RemoteSkillsListResult (line 407) | interface RemoteSkillsListResult { type CourtDiscussResult (line 417) | interface CourtDiscussResult { FILE: edict/frontend/src/components/ConfirmDialog.tsx type Props (line 3) | interface Props { function ConfirmDialog (line 12) | function ConfirmDialog({ title, message, okLabel, okClass, onOk, onCance... FILE: edict/frontend/src/components/CourtCeremony.tsx function CourtCeremony (line 4) | function CourtCeremony() { FILE: edict/frontend/src/components/CourtDiscussion.tsx constant OFFICIAL_COLORS (line 20) | const OFFICIAL_COLORS: Record = { constant EMOTION_EMOJI (line 26) | const EMOTION_EMOJI: Record = { constant COURT_POSITIONS (line 31) | const COURT_POSITIONS: Record = { type CourtMessage (line 41) | interface CourtMessage { type CourtSession (line 51) | interface CourtSession { function CourtDiscussion (line 67) | function CourtDiscussion() { function MessageBubble (line 693) | function MessageBubble({ FILE: edict/frontend/src/components/EdictBoard.tsx constant STATE_ORDER (line 5) | const STATE_ORDER: Record = { function MiniPipe (line 10) | function MiniPipe({ task }: { task: Task }) { function EdictCard (line 27) | function EdictCard({ task }: { task: Task }) { function EdictBoard (line 155) | function EdictBoard() { FILE: edict/frontend/src/components/MemorialPanel.tsx function MemorialPanel (line 5) | function MemorialPanel() { function MemorialDetailModal (line 103) | function MemorialDetailModal({ FILE: edict/frontend/src/components/ModelConfig.tsx constant FALLBACK_MODELS (line 5) | const FALLBACK_MODELS = [ constant CHANNELS (line 18) | const CHANNELS = [ function ModelConfig (line 28) | function ModelConfig() { FILE: edict/frontend/src/components/MonitorPanel.tsx function MonitorPanel (line 5) | function MonitorPanel() { FILE: edict/frontend/src/components/MorningPanel.tsx constant CAT_META (line 6) | const CAT_META: Record): string { function channelLabel (line 39) | function channelLabel(t: Task): { icon: string; text: string } { function lastMessage (line 49) | function lastMessage(t: Task): string { function SessionsPanel (line 63) | function SessionsPanel() { function SessionDetailModal (line 161) | function SessionDetailModal({ FILE: edict/frontend/src/components/SkillsConfig.tsx constant COMMUNITY_SOURCES (line 6) | const COMMUNITY_SOURCES = [ function SkillsConfig (line 56) | function SkillsConfig() { FILE: edict/frontend/src/components/TaskModal.tsx constant AGENT_LABELS (line 13) | const AGENT_LABELS: Record = { constant NEXT_LABELS (line 27) | const NEXT_LABELS: Record = { function fmtStalled (line 36) | function fmtStalled(sec: number): string { function fmtActivityTime (line 45) | function fmtActivityTime(ts: number | string | undefined): string { function TaskModal (line 55) | function TaskModal() { function TodoSection (line 401) | function TodoSection({ todos, todoDone, todoTotal }: { todos: TodoItem[]... function LiveActivitySection (line 438) | function LiveActivitySection({ function ActivityEntryView (line 602) | function ActivityEntryView({ entry: a }: { entry: ActivityEntry }) { FILE: edict/frontend/src/components/TemplatePanel.tsx function TemplatePanel (line 6) | function TemplatePanel() { FILE: edict/frontend/src/components/Toaster.tsx function Toaster (line 3) | function Toaster() { FILE: edict/frontend/src/store.ts constant PIPE (line 21) | const PIPE = [ constant PIPE_STATE_IDX (line 32) | const PIPE_STATE_IDX: Record = { constant DEPT_COLOR (line 37) | const DEPT_COLOR: Record = { constant STATE_LABEL (line 43) | const STATE_LABEL: Record = { function deptColor (line 49) | function deptColor(d: string): string { function stateLabel (line 53) | function stateLabel(t: Task): string { function isEdict (line 60) | function isEdict(t: Task): boolean { function isSession (line 64) | function isSession(t: Task): boolean { function isArchived (line 68) | function isArchived(t: Task): boolean { type PipeStatus (line 72) | type PipeStatus = { key: string; dept: string; icon: string; action: str... function getPipeStatus (line 74) | function getPipeStatus(t: Task): PipeStatus[] { type TabKey (line 84) | type TabKey = constant TAB_DEFS (line 88) | const TAB_DEFS: { key: TabKey; label: string; icon: string }[] = [ constant DEPTS (line 103) | const DEPTS = [ type TemplateParam (line 119) | interface TemplateParam { type Template (line 128) | interface Template { constant TEMPLATES (line 141) | const TEMPLATES: Template[] = [ constant TPL_CATS (line 242) | const TPL_CATS = [ type AppStore (line 252) | interface AppStore { function startPolling (line 410) | function startPolling() { function stopPolling (line 425) | function stopPolling() { function esc (line 434) | function esc(s: string | undefined | null): string { function timeAgo (line 443) | function timeAgo(iso: string | undefined): string { FILE: edict/migration/env.py function run_migrations_offline (line 29) | def run_migrations_offline() -> None: function do_run_migrations (line 42) | def do_run_migrations(connection: Connection) -> None: function run_async_migrations (line 48) | async def run_async_migrations() -> None: function run_migrations_online (line 62) | def run_migrations_online() -> None: FILE: edict/migration/migrate_json_to_pg.py function parse_old_task (line 55) | def parse_old_task(old: dict) -> dict: function migrate (line 96) | async def migrate(file_path: Path, dry_run: bool = False): function main (line 157) | def main(): FILE: edict/migration/versions/001_initial.py function upgrade (line 19) | def upgrade() -> None: function downgrade (line 105) | def downgrade() -> None: FILE: edict/scripts/kanban_update_edict.py function _sanitize_text (line 56) | def _sanitize_text(raw, max_len=80): function _sanitize_title (line 70) | def _sanitize_title(raw): function _sanitize_remark (line 74) | def _sanitize_remark(raw): function _is_valid_task_title (line 78) | def _is_valid_task_title(title): function _infer_agent_id (line 93) | def _infer_agent_id(): function _api_available (line 107) | def _api_available() -> bool: function _api_post (line 124) | def _api_post(path: str, data: dict) -> dict | None: function _api_put (line 142) | def _api_put(path: str, data: dict) -> dict | None: function _check_api (line 166) | def _check_api(): function _fallback_json (line 177) | def _fallback_json(): function cmd_create (line 190) | def cmd_create(task_id, title, state, org, official, remark=None): function cmd_state (line 221) | def cmd_state(task_id, new_state, now_text=None): function cmd_flow (line 243) | def cmd_flow(task_id, from_dept, to_dept, remark): function cmd_done (line 260) | def cmd_done(task_id, output_path='', summary=''): function cmd_block (line 277) | def cmd_block(task_id, reason): function cmd_progress (line 294) | def cmd_progress(task_id, now_text, todos_pipe='', tokens=0, cost=0.0, e... function cmd_todo (line 338) | def cmd_todo(task_id, todo_id, title, status='not-started', detail=''): FILE: scripts/apply_model_changes.py function rj (line 17) | def rj(path, default): function cleanup_backups (line 24) | def cleanup_backups(): function main (line 35) | def main(): FILE: scripts/fetch_morning_news.py function curl_rss (line 48) | def curl_rss(url, timeout=10): function _safe_parse_xml (line 61) | def _safe_parse_xml(xml_text, max_size=5*1024*1024): function parse_rss (line 75) | def parse_rss(xml_text): function match_category (line 106) | def match_category(item, category): function fetch_category (line 114) | def fetch_category(category, feeds, max_items=5): function main (line 146) | def main(): FILE: scripts/file_lock.py function _lock_path (line 24) | def _lock_path(path: pathlib.Path) -> pathlib.Path: function atomic_json_read (line 28) | def atomic_json_read(path: pathlib.Path, default: Any = None) -> Any: function atomic_json_update (line 44) | def atomic_json_update( function atomic_json_write (line 83) | def atomic_json_write(path: pathlib.Path, data: Any) -> None: FILE: scripts/kanban_update.py function load (line 74) | def load(): function _trigger_refresh (line 77) | def _trigger_refresh(): function find_task (line 85) | def find_task(tasks, task_id): function _sanitize_text (line 97) | def _sanitize_text(raw, max_len=80): function _sanitize_title (line 120) | def _sanitize_title(raw): function _sanitize_remark (line 125) | def _sanitize_remark(raw): function _infer_agent_id_from_runtime (line 130) | def _infer_agent_id_from_runtime(task=None): function _is_valid_task_title (line 158) | def _is_valid_task_title(title): function cmd_create (line 177) | def cmd_create(task_id, title, state, org, official, remark=None): function cmd_state (line 231) | def cmd_state(task_id, new_state, now_text=None): function cmd_flow (line 261) | def cmd_flow(task_id, from_dept, to_dept, remark): function cmd_done (line 279) | def cmd_done(task_id, output_path='', summary=''): function cmd_block (line 300) | def cmd_block(task_id, reason): function cmd_progress (line 316) | def cmd_progress(task_id, now_text, todos_pipe='', tokens=0, cost=0.0, e... function cmd_todo (line 407) | def cmd_todo(task_id, todo_id, title, status='not-started', detail=''): FILE: scripts/record_demo.py function main (line 11) | def main(): FILE: scripts/refresh_live_data.py function output_meta (line 13) | def output_meta(path): function main (line 21) | def main(): FILE: scripts/skill_manager.py function _download_file (line 34) | def _download_file(url: str, timeout: int = 30, retries: int = 3) -> str: function _compute_checksum (line 67) | def _compute_checksum(content: str) -> str: function add_remote (line 73) | def add_remote(agent_id: str, name: str, source_url: str, description: s... function list_remote (line 120) | def list_remote() -> bool: function update_remote (line 171) | def update_remote(agent_id: str, name: str) -> bool: function remove_remote (line 198) | def remove_remote(agent_id: str, name: str) -> bool: function _get_hub_url (line 231) | def _get_hub_url(skill_name): function import_official_hub (line 258) | def import_official_hub(agent_ids: list) -> bool: function main (line 314) | def main(): FILE: scripts/sync_agent_config.py function normalize_model (line 50) | def normalize_model(model_value, fallback='unknown'): function get_skills (line 58) | def get_skills(workspace: str): function _collect_openclaw_models (line 82) | def _collect_openclaw_models(cfg): function main (line 110) | def main(): function sync_scripts_to_workspaces (line 209) | def sync_scripts_to_workspaces(): function deploy_soul_files (line 252) | def deploy_soul_files(): FILE: scripts/sync_from_openclaw_runtime.py function write_status (line 20) | def write_status(**kwargs): function ms_to_str (line 24) | def ms_to_str(ts_ms): function state_from_session (line 33) | def state_from_session(age_ms, aborted): function detect_official (line 43) | def detect_official(agent_id): function load_activity (line 61) | def load_activity(session_file, limit=12): function build_task (line 131) | def build_task(agent_id, session_key, row, now_ms): function main (line 207) | def main(): FILE: scripts/sync_officials_stats.py function rj (line 39) | def rj(p, d): function _load_openclaw_cfg (line 47) | def _load_openclaw_cfg(): function normalize_model (line 54) | def normalize_model(model_value, fallback='anthropic/claude-sonnet-4-6'): function get_model (line 61) | def get_model(agent_id): function scan_agent (line 74) | def scan_agent(agent_id): function calc_cost (line 127) | def calc_cost(s, model): function get_task_stats (line 133) | def get_task_stats(org_label, tasks): function get_hb (line 150) | def get_hb(agent_id, live_tasks): function main (line 156) | def main(): FILE: scripts/take_screenshots.py function main (line 9) | def main(): FILE: scripts/utils.py function read_json (line 9) | def read_json(path, default=None): function now_iso (line 17) | def now_iso(): function today_str (line 22) | def today_str(fmt='%Y%m%d'): function safe_name (line 27) | def safe_name(s: str) -> bool: function validate_url (line 33) | def validate_url(url: str, allowed_schemes=('https',), allowed_domains=N... FILE: tests/test_e2e_kanban.py function _get_task (line 27) | def _get_task(tid): function _backup_and_restore (line 32) | def _backup_and_restore(): function test_dirty_title_cleaned (line 43) | def test_dirty_title_cleaned(): function test_pure_path_rejected (line 57) | def test_pure_path_rejected(): function test_normal_title (line 63) | def test_normal_title(): function test_flow_remark_cleaned (line 71) | def test_flow_remark_cleaned(): function test_short_title_rejected (line 82) | def test_short_title_rejected(): function test_prefix_stripped (line 88) | def test_prefix_stripped(): function test_state_update (line 96) | def test_state_update(): function test_done (line 106) | def test_done(): function test_done_not_overwritable (line 115) | def test_done_not_overwritable(): FILE: tests/test_file_lock.py function test_write_and_read (line 10) | def test_write_and_read(tmp_path): function test_read_missing_returns_default (line 19) | def test_read_missing_returns_default(tmp_path): function test_update_modifies_data (line 24) | def test_update_modifies_data(tmp_path): function test_update_creates_file (line 39) | def test_update_creates_file(tmp_path): function test_write_atomic_no_partial (line 50) | def test_write_atomic_no_partial(tmp_path): function test_unicode_roundtrip (line 59) | def test_unicode_roundtrip(tmp_path): FILE: tests/test_kanban.py function test_create_and_get (line 11) | def test_create_and_get(tmp_path): function test_move_state (line 31) | def test_move_state(tmp_path): function test_block_and_unblock (line 48) | def test_block_and_unblock(tmp_path): function test_flow_log (line 66) | def test_flow_log(tmp_path): function test_done (line 86) | def test_done(tmp_path): function test_progress (line 107) | def test_progress(tmp_path): function test_todo (line 132) | def test_todo(tmp_path): function test_progress_log_capped (line 154) | def test_progress_log_capped(tmp_path): FILE: tests/test_server.py function test_healthz (line 11) | def test_healthz(tmp_path):