Skip to main content

zagens_runtime/runtime_api/
router.rs

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