zagens_runtime/runtime_api/
router.rs1use axum::Router;
4use axum::middleware;
5use axum::routing::{get, post};
6
7use zagens_runtime_api::{compose_router, require_runtime_token};
8
9use super::stream;
10use super::{
11 RuntimeApiState, add_mcp_server, browse_thread_workspace, browse_workspace_by_root,
12 cancel_task, clear_tasks, compact_thread, create_automation, create_skill, create_task,
13 create_thread, delete_automation, delete_mcp_server, delete_session, discover_mcp,
14 edit_last_thread_turn, fork_thread, fork_thread_at_user_message, get_automation,
15 get_blackboard, get_mcp_server, get_office_environment, get_resume_task, get_routing_rules,
16 get_session, get_task, get_thread, get_thread_checklist, get_thread_context,
17 get_thread_harness_cycles, get_thread_harness_task_graph, get_thread_scratchpad_status,
18 get_topic_memory, get_usage, import_skill_local, init_thread_scratchpad, install_skill_remote,
19 interrupt_thread_turn, list_automation_runs, list_automations, list_blackboards,
20 list_mcp_calls, list_mcp_servers, list_mcp_tools, list_sessions, list_skills, list_tasks,
21 list_thread_snapshots, list_threads, list_threads_summary, merge_mcp_config_json,
22 pause_automation, persist_thread_session, read_thread_workspace_file,
23 read_workspace_file_by_root, rebuild_symbol_index, reload_mcp_config, resolve_approval,
24 restore_thread_snapshot, resume_automation, resume_session_thread, resume_thread,
25 run_automation, set_routing_rules, start_thread_turn, steer_thread_turn, update_automation,
26 update_mcp_server, update_thread, workspace_status,
27};
28
29pub fn build_router(state: RuntimeApiState) -> Router {
30 let cors_origins = state.cors_origins.clone();
31 let api_routes = Router::new()
32 .route("/v1/sessions", get(list_sessions))
33 .route("/v1/sessions/{id}", get(get_session).delete(delete_session))
34 .route(
35 "/v1/sessions/{id}/resume-thread",
36 post(resume_session_thread),
37 )
38 .route("/v1/resume-tasks/{thread_id}", get(get_resume_task))
39 .route("/v1/workspace/status", get(workspace_status))
40 .route("/v1/office/environment", get(get_office_environment))
41 .route("/v1/workspace/browse", get(browse_workspace_by_root))
42 .route("/v1/workspace/file", get(read_workspace_file_by_root))
43 .route("/v1/stream", post(stream::stream_turn))
44 .route("/v1/threads", get(list_threads).post(create_thread))
45 .route("/v1/threads/summary", get(list_threads_summary))
46 .route("/v1/threads/{id}", get(get_thread).patch(update_thread))
47 .route("/v1/threads/{id}/checklist", get(get_thread_checklist))
48 .route(
49 "/v1/threads/{id}/harness/task-graph",
50 get(get_thread_harness_task_graph),
51 )
52 .route(
53 "/v1/threads/{id}/harness/cycles",
54 get(get_thread_harness_cycles),
55 )
56 .route(
57 "/v1/threads/{id}/scratchpad/status",
58 get(get_thread_scratchpad_status),
59 )
60 .route(
61 "/v1/threads/{id}/scratchpad/init",
62 post(init_thread_scratchpad),
63 )
64 .route("/v1/threads/{id}/context", get(get_thread_context))
65 .route("/v1/threads/{id}/resume", post(resume_thread))
66 .route("/v1/threads/{id}/fork", post(fork_thread))
67 .route(
68 "/v1/threads/{id}/fork-at-user-message",
69 post(fork_thread_at_user_message),
70 )
71 .route(
72 "/v1/threads/{id}/edit-last-turn",
73 post(edit_last_thread_turn),
74 )
75 .route("/v1/threads/{id}/turns", post(start_thread_turn))
76 .route(
77 "/v1/threads/{id}/turns/{turn_id}/steer",
78 post(steer_thread_turn),
79 )
80 .route(
81 "/v1/threads/{id}/turns/{turn_id}/resolve-approval",
82 post(resolve_approval),
83 )
84 .route(
85 "/v1/threads/{id}/turns/{turn_id}/interrupt",
86 post(interrupt_thread_turn),
87 )
88 .route("/v1/threads/{id}/compact", post(compact_thread))
89 .route(
90 "/v1/threads/{id}/persist-session",
91 post(persist_thread_session),
92 )
93 .route("/v1/threads/{id}/snapshots", get(list_thread_snapshots))
94 .route(
95 "/v1/threads/{id}/snapshots/restore",
96 post(restore_thread_snapshot),
97 )
98 .route(
99 "/v1/threads/{id}/workspace/browse",
100 get(browse_thread_workspace),
101 )
102 .route(
103 "/v1/threads/{id}/workspace/file",
104 get(read_thread_workspace_file),
105 )
106 .route("/v1/threads/{id}/events", get(stream::stream_thread_events))
107 .route("/v1/tasks", get(list_tasks).post(create_task))
108 .route("/v1/tasks/clear", post(clear_tasks))
109 .route("/v1/tasks/{id}", get(get_task))
110 .route("/v1/tasks/{id}/cancel", post(cancel_task))
111 .route("/v1/blackboards", get(list_blackboards))
112 .route("/v1/blackboards/{id}", get(get_blackboard))
113 .route("/v1/topic-memory", get(get_topic_memory))
114 .route("/v1/skills", get(list_skills).post(create_skill))
115 .route("/v1/skills/import", post(import_skill_local))
116 .route("/v1/skills/install", post(install_skill_remote))
117 .route(
118 "/v1/apps/mcp/servers",
119 get(list_mcp_servers).post(add_mcp_server),
120 )
121 .route(
122 "/v1/apps/mcp/servers/{name}",
123 get(get_mcp_server)
124 .put(update_mcp_server)
125 .delete(delete_mcp_server),
126 )
127 .route("/v1/apps/mcp/config/merge", post(merge_mcp_config_json))
128 .route("/v1/apps/mcp/reload", post(reload_mcp_config))
129 .route("/v1/apps/mcp/discover", get(discover_mcp))
130 .route("/v1/apps/mcp/calls", get(list_mcp_calls))
131 .route("/v1/apps/mcp/tools", get(list_mcp_tools))
132 .route(
133 "/v1/automations",
134 get(list_automations).post(create_automation),
135 )
136 .route(
137 "/v1/automations/{id}",
138 get(get_automation)
139 .patch(update_automation)
140 .delete(delete_automation),
141 )
142 .route("/v1/automations/{id}/run", post(run_automation))
143 .route("/v1/automations/{id}/pause", post(pause_automation))
144 .route("/v1/automations/{id}/resume", post(resume_automation))
145 .route("/v1/automations/{id}/runs", get(list_automation_runs))
146 .route("/v1/usage", get(get_usage))
147 .route(
148 "/v1/apps/routing/rules",
149 get(get_routing_rules).put(set_routing_rules),
150 )
151 .route("/v1/symbol-index/rebuild", post(rebuild_symbol_index))
152 .route_layer(middleware::from_fn_with_state(
153 state.clone(),
154 require_runtime_token::<RuntimeApiState>,
155 ));
156
157 compose_router(state, &cors_origins, api_routes)
158}