const std = @import("std");const builtin = @import("builtin");const build_options = @import("build_options");const io_mod = @import("core/shared/io.zig"); pub const version = "0.0.3"; const app_lifecycle = @import("core/app/app_lifecycle.zig");const auth_runtime = @import("core/auth/auth_runtime.zig");const api_key_validator = @import("core/auth/api_key_validator.zig");const oauth_transport = @import("core/auth/oauth_transport.zig");const js_host_auth = @import("core/auth/js_host_auth.zig");const credentials = @import("core/auth/credentials.zig");const secret = @import("core/auth/secret.zig");const model_cache_runtime = @import("core/app/model_cache_runtime.zig");const app_auth_runtime = @import("core/app/app_auth_runtime.zig");const app_host_config_runtime = @import("core/app/app_host_config_runtime.zig");const app_entry_runtime = @import("core/app/app_entry_runtime.zig");const acp_runner = @import("core/cli/acp_runner.zig");const acp_server = @import("acp/server.zig");const app_input_runtime = @import("core/app/app_input_runtime.zig");const core_input_runtime = @import("core/input/runtime.zig");const input_queue_runtime = @import("core/app/input_queue_runtime.zig");const app_bootstrap_runtime = @import("core/app/app_bootstrap_runtime.zig");const app_notification_runtime = @import("core/app/app_notification_runtime.zig");const app_permission_runtime = @import("core/app/app_permission_runtime.zig");const app_process_runtime = @import("core/app/app_process_runtime.zig");const prompt_history_runtime = @import("core/app/prompt_history_runtime.zig");const app_agent_runtime = @import("core/app/app_agent_runtime.zig");const app_runtime_setup = @import("core/app/app_runtime_setup.zig");const app_render_runtime = @import("core/app/app_render_runtime.zig");const app_session_runtime = @import("core/app/app_session_runtime.zig");const app_upgrade_runtime = @import("core/app/app_upgrade_runtime.zig");const app_worker_runtime = @import("core/app/app_worker_runtime.zig");const app_workspace_runtime = @import("core/app/app_workspace_runtime.zig");const app_callbacks = @import("core/app/app_callbacks.zig");const app_commands = @import("core/app/app_commands.zig");const change_tracker_mod = @import("core/workspace/change_tracker.zig");const context_contract = @import("core/workspace/context_contract.zig");const collections = @import("core/shared/collections.zig");const agent_steps = @import("core/config/agent_steps.zig");const config_runtime = @import("core/config/config_runtime.zig");const js_host_prompt_history = @import("core/session/js_host_prompt_history.zig");const model_capabilities = @import("core/config/model_capabilities.zig");const prompt_policy = @import("core/config/prompt_policy.zig");const builtin_commands = @import("builtins/commands.zig");const command_specs = @import("core/slash_commands/command_specs.zig");const builtin_context = @import("builtins/context.zig");const builtin_devbox = @import("builtins/devbox.zig");const builtin_gateway = @import("builtins/gateway.zig");const gateway_provider = @import("core/gateway/gateway_provider.zig");const generation_usage_provider = @import("core/session/generation_usage_provider.zig");const agent_stream_provider = @import("core/agent/stream_provider.zig");const builtin_hooks = @import("builtins/hooks.zig");const builtin_mcp = @import("builtins/mcp.zig");const builtin_modes = @import("builtins/modes.zig");const builtin_skills = @import("builtins/skills.zig");const host = @import("core/hosts/host.zig");const host_runtime_profile = @import("core/hosts/runtime_profile.zig");const js_host_url_opener = @import("core/hosts/js_host_url_opener.zig");const js_host_workspace = @import("core/hosts/js_host_workspace.zig");const host_target = @import("core/hosts/target.zig");const native_host = @import("core/hosts/native.zig");const debug_trace = @import("core/shared/debug_trace.zig");const display_width = @import("core/shared/display_width.zig");const file_index_mod = @import("core/workspace/file_index.zig");const mcp_command_provider = @import("core/mcp/command_provider.zig");const mcp_runtime_mod = @import("core/mcp/mcp_runtime.zig");const mcp_model_catalog = @import("core/mcp/model_catalog.zig");const mcp_access_policy = @import("core/mcp/access_policy.zig");const app_mcp_runtime = @import("core/app/app_mcp_runtime.zig");const skill_commands = @import("core/skills/skill_commands.zig");const skill_runtime = @import("core/skills/skill_runtime.zig");const cli_surface = @import("core/cli/cli_surface.zig");const hooks = @import("core/hooks/hooks.zig");const github_publish = @import("core/github/github_publish.zig");const subagent_domain = @import("core/subagent/domain.zig");const subagent_execution = @import("core/subagent/execution.zig");const types = @import("core/shared/types.zig");const image_attachments = @import("core/images/image_attachments.zig");const permissions = @import("core/permissions/permissions.zig");const sandbox = @import("core/permissions/sandbox.zig");const command_admission = @import("core/permissions/command_admission.zig");const permission_auto_classifier = @import("core/permissions/auto_classifier.zig");const auto_classifier_context = @import("core/permissions/auto_classifier_context.zig");const agent_runtime = @import("core/agent/agent_runtime.zig");const assistant_presentation = @import("core/agent/assistant_presentation.zig");const auto_upgrade = @import("core/upgrade/auto_upgrade.zig");const update_target = @import("core/upgrade/update_target.zig"); const compiled_update_channel = update_target.Channel.parse(build_options.update_channel) orelse @compileError("invalid compiled update channel");const background_runtime = @import("core/background/background_runtime.zig");const background_process_provider = @import( "core/execution/background_process_provider.zig",);const background_process = @import("tools/shell/background_process.zig");const process_supervisor = @import("core/background/process_supervisor.zig");const terminal_client_runtime = @import("core/terminal/client.zig");const terminal_direct_runtime = @import("core/terminal/direct_runtime.zig");const app_terminal_runtime = @import("core/app/app_terminal_runtime.zig");const app_terminal_takeover_runtime = @import("core/app/app_terminal_takeover_runtime.zig");const terminal_host = @import("core/terminal/host.zig");const terminal_native_session = @import("core/terminal/native_session.zig");const terminal_tmux_session = @import("core/terminal/tmux_session.zig");const session_runtime = @import("core/session/session.zig");const session_codec = @import("core/session/session_codec.zig");const session_child_store = @import("core/session/session_child_store.zig");const session_log = @import("core/session/session_log.zig");const builtin_tools = @import("builtins/tools.zig");const browser_workspace_tools = @import("builtins/browser_workspace_tools.zig");const tool_admission = @import("core/tooling/tool_admission.zig");const tool_advertisement = @import("core/tooling/tool_advertisement.zig");const command_output_content = @import("core/tooling/command_output_content.zig");const tool_dispatch = @import("core/tooling/tool_dispatch.zig");const tool_set_contract = @import("core/tooling/tool_set.zig");const tool_mcp_runtime = @import("core/tooling/tool_mcp_runtime.zig");const tool_runtime = @import("core/tooling/tool_runtime.zig");const web_fetch_runtime = @import("core/tooling/web_fetch_runtime.zig");const web_search_runtime = @import("core/tooling/web_search_runtime.zig");const worker_runtime = @import("core/agent/worker_runtime.zig");const question_prompt = @import("core/agent/question_prompt.zig");const gateway_client = @import("gateway/client.zig");const js_host_stream_provider = @import("gateway/js_host_stream_provider.zig");const js_host_model_catalog = @import("gateway/js_host_model_catalog.zig");const url_opener = @import("core/hosts/url_opener.zig");const event_loop = @import("ui/event_loop.zig");const wasm_terminal = if (host_target.is_wasm) @import("ui/terminal/wasm_terminal.zig") else struct {};const footer_runtime = @import("ui/footer/runtime.zig");const question_ui = @import("ui/footer/question_ui.zig");const ui_input = @import("ui/input/runtime.zig");const input_action = @import("core/input/input_action.zig");const paste_blocks = @import("core/input/pasted_blocks.zig");const paste_framing = @import("core/input/paste_framing.zig");const registered_entities = @import("core/input/registered_entities.zig");const entity_spans = @import("core/shared/entity_spans.zig");const ui_render = @import("ui/render.zig");const shell_runtime = @import("ui/shell_runtime.zig");const ui_terminal = @import("ui/terminal/terminal.zig");const cursor_probe = @import("ui/terminal/cursor_probe.zig");const ui_subagents = @import("ui/subagent/controller.zig");const transcript_runtime = @import("ui/transcript/runtime.zig");const resume_projection = @import("ui/transcript/resume_projection.zig");const assistant_pacer = @import("ui/assistant/pacer.zig");const approval_prompt = @import("core/permissions/approval_prompt.zig"); const Allocator = std.mem.Allocator;const Layout = types.Layout;const Metrics = types.Metrics;const StreamState = types.StreamState;const ToolCall = types.ToolCall;const ChatMessage = types.ChatMessage;const PermissionMode = types.PermissionMode;const ReasoningEffort = types.ReasoningEffort;const ToolPermissionDecision = types.ToolPermissionDecision;const PermissionGrant = types.PermissionGrant;const PermissionEngine = permissions.PermissionEngine;const QueuedPrompt = worker_runtime.QueuedPrompt;const WorkerRuntime = worker_runtime.WorkerRuntime;const SessionRuntime = session_runtime.SessionRuntime;const PromptHistoryRuntime = prompt_history_runtime.PromptHistoryRuntime;const BackgroundRuntime = background_runtime.BackgroundRuntime;const ToolExecutionResult = agent_runtime.ToolExecutionResult;const ApprovalPrompt = approval_prompt.ApprovalPrompt;const ApprovalScreenState = footer_runtime.ApprovalScreenState;const QuestionPrompt = question_prompt.QuestionPrompt;const InputRuntime = core_input_runtime.Runtime;const TerminalInputRuntime = ui_input.Runtime;const TerminalState = shell_runtime.TerminalState;const TranscriptRuntime = transcript_runtime.TranscriptRuntime;const ResumeProjection = resume_projection.ResumeProjection;const RawEnviron = io_mod.RawEnviron; const RuntimeContextSnapshot = background_runtime.RuntimeContextSnapshot; const footer_rows: u16 = 4;const active_poll_timeout_ms: i32 = 8;const idle_wasm_poll_timeout_ms: i32 = 16;const resize_debounce_ms: i64 = 100;const max_transcript_bytes: usize = 256 * 1024;const default_max_agent_steps: usize = agent_steps.default_max_agent_steps;const max_history_turns: usize = 8;const max_list_entries: usize = 100;const max_read_file_bytes: usize = 50 * 1024;const max_read_file_lines: usize = 400;const max_read_file_line_len: usize = 2000;const max_command_output_bytes: usize = 64 * 1024;const input_escape_timeout_ms: i64 = 30;const max_prompt_history: usize = 100; const ignored_list_entries = [_][]const u8{ ".git", ".zig-cache", "zig-out", "node_modules", ".next", "dist", "build", "coverage",}; fn dupeUniqueSkillBindingsFromTokens( alloc: Allocator, skill_tokens: []const registered_entities.SkillTokenSpan,) ![]worker_runtime.SkillBinding { if (skill_tokens.len == 0) return &.{}; var bindings: std.ArrayList(worker_runtime.SkillBinding) = .empty; errdefer { for (bindings.items) |binding| { alloc.free(binding.name); alloc.free(binding.path); } bindings.deinit(alloc); } for (skill_tokens) |token| { if (token.name.len == 0 or token.path.len == 0) continue; if (skillBindingPathSeen(bindings.items, token.path)) continue; const name_copy = try alloc.dupe(u8, token.name); var path_copy: []u8 = &.{}; var appended = false; errdefer if (!appended) { alloc.free(name_copy); if (path_copy.len > 0) alloc.free(path_copy); }; path_copy = try alloc.dupe(u8, token.path); try bindings.append(alloc, .{ .name = name_copy, .path = path_copy, }); appended = true; } if (bindings.items.len == 0) { bindings.deinit(alloc); return &.{}; } return try bindings.toOwnedSlice(alloc);} fn skillBindingPathSeen(bindings: []const worker_runtime.SkillBinding, path: []const u8) bool { for (bindings) |binding| { if (std.mem.eql(u8, binding.path, path)) return true; } return false;} fn dupeSkillDisplaySpansFromTokens( alloc: Allocator, skill_tokens: []const registered_entities.SkillTokenSpan,) ![]worker_runtime.SkillDisplaySpan { if (skill_tokens.len == 0) return &.{}; var spans: std.ArrayList(worker_runtime.SkillDisplaySpan) = .empty; errdefer { for (spans.items) |span| { alloc.free(span.name); alloc.free(span.path); } spans.deinit(alloc); } for (skill_tokens) |token| { if (token.name.len == 0 or token.path.len == 0) continue; const name_copy = try alloc.dupe(u8, token.name); var path_copy: []u8 = &.{}; var appended = false; errdefer if (!appended) { alloc.free(name_copy); if (path_copy.len > 0) alloc.free(path_copy); }; path_copy = try alloc.dupe(u8, token.path); try spans.append(alloc, .{ .raw_start = token.raw_start, .raw_end = token.raw_end, .name = name_copy, .path = path_copy, .display_source = token.display_source, .owns_trailing_separator = token.owns_trailing_separator, }); appended = true; } if (spans.items.len == 0) { spans.deinit(alloc); return &.{}; } return try spans.toOwnedSlice(alloc);} fn promptCardSkillTokensFromDisplaySpans( alloc: Allocator, skill_display_spans: []const worker_runtime.SkillDisplaySpan,) ![]registered_entities.SkillTokenSpan { if (skill_display_spans.len == 0) return &.{}; const tokens = try alloc.alloc(registered_entities.SkillTokenSpan, skill_display_spans.len); errdefer alloc.free(tokens); for (skill_display_spans, 0..) |span, i| { tokens[i] = .{ .raw_start = span.raw_start, .raw_end = span.raw_end, .name = span.name, .path = span.path, .display_source = span.display_source, .owns_trailing_separator = span.owns_trailing_separator, }; } return tokens;} test "skill submit snapshot keeps display spans exact while agent bindings dedupe" { const alloc = std.testing.allocator; const tokens = [_]registered_entities.SkillTokenSpan{ .{ .raw_start = "raw $review then ".len, .raw_end = "raw $review then $review".len, .name = "review", .path = "/tmp/.codex/skills/review", }, .{ .raw_start = "raw $review then $review and ".len, .raw_end = "raw $review then $review and $review".len, .name = "review", .path = "/tmp/.codex/skills/review", }, }; const bindings = try dupeUniqueSkillBindingsFromTokens(alloc, &tokens); defer worker_runtime.freeSkillBindings(alloc, bindings); const display_spans = try dupeSkillDisplaySpansFromTokens(alloc, &tokens); defer worker_runtime.freeSkillDisplaySpans(alloc, display_spans); try std.testing.expectEqual(@as(usize, 1), bindings.len); try std.testing.expectEqualStrings("review", bindings[0].name); try std.testing.expectEqual(@as(usize, 2), display_spans.len); try std.testing.expectEqual(tokens[0].raw_start, display_spans[0].raw_start); try std.testing.expectEqual(tokens[1].raw_start, display_spans[1].raw_start);} var resize_interlock = shell_runtime.ResizeApprovalInterlock{};const default_context_registry = context_contract.Registry{ .default_provider = builtin_context.provider };const WorkspaceHostRuntime = if (host_target.is_wasm) js_host_workspace.Runtime else struct {};const wasm_skill_root_policy: @import("core/skills/skill_contract.zig").RootPolicy = .{ .managed_root_source = null,};fn currentBuild() update_target.CurrentBuild { return .{ .channel = compiled_update_channel, .version = version, .revision = build_options.git_commit, };} const App = struct { pub const app_version = version; pub const host_profile = if (host_target.is_wasm) host_runtime_profile.wasm else host_runtime_profile.native; pub const input_limits = paste_framing.default_input_limits; pub const build_update_channel = compiled_update_channel; pub const build_revision = build_options.git_commit; const Self = @This(); const AgentAppRuntime = app_agent_runtime.Runtime(Self); const AuthAppRuntime = app_auth_runtime.Runtime(Self); const HostConfigAppRuntime = app_host_config_runtime.Runtime(Self); const BootstrapAppRuntime = app_bootstrap_runtime.Runtime(Self); const InputAppRuntime = app_input_runtime.Runtime(Self); const NotificationAppRuntime = app_notification_runtime.Runtime( Self, builtin_hooks.notifications.provider(Self), ); const HerdrAppRuntime = builtin_hooks.Runtime(Self); const RenderAppRuntime = app_render_runtime.Runtime(Self); const SessionAppRuntime = app_session_runtime.Runtime(Self); const UpgradeAppRuntime = app_upgrade_runtime.Runtime(Self); const WorkerAppRuntime = app_worker_runtime.Runtime(Self); const WorkspaceAppRuntime = app_workspace_runtime.Runtime(Self); fn devboxProvider(_: *Self) @import("core/execution/devbox_executor.zig").Provider { return builtin_devbox.provider; } pub fn contextRegistry(_: *const Self) context_contract.Registry { return default_context_registry; } pub fn workspaceHostInfo(self: *const Self) ?*const js_host_workspace.Info { if (comptime host_profile.js_host_workspace) return self.workspace_host.info(); return null; } pub fn workspaceExecutor(self: *const Self) ?js_host_workspace.Executor { if (comptime host_profile.js_host_workspace) return self.workspace_host.executor(); return null; } pub fn promptPolicy(_: *const Self) prompt_policy.Policy { return builtin_context.prompt_policy; } pub fn slashRegistry(_: *const Self) command_specs.SlashRegistry { return builtin_commands.slash_registry; } pub fn mcpCommandProvider(_: *const Self) mcp_command_provider.Provider { return builtin_mcp.command_provider; } pub fn skillsCommandProvider(_: *const Self) skill_commands.Provider { return builtin_skills.command_provider; } pub fn urlOpener(_: *const Self) host.UrlOpener { return if (comptime host_profile.url_opening) url_opener.native_opener else if (comptime host_profile.js_host_url_open) js_host_url_opener.opener else host.unavailable_url_opener; } pub fn creditsProvider(_: *const Self) gateway_provider.CreditsProvider { return builtin_gateway.credits_provider; } pub fn agentStreamProvider(_: *const Self) agent_stream_provider.Provider { return if (comptime host_target.is_wasm) js_host_stream_provider.provider() else builtin_gateway.agent_stream_provider; } pub fn cooperativeTransportPulse(self: *Self) !void { if (comptime !host_target.is_wasm) return; if (try event_loop.pump_ready_input( self.terminal, &self.should_exit, RenderAppRuntime.eventLoopCallbacks(self), )) |exit_cause| { if (exit_cause == .input_closed) self.should_exit = true; return; } try WorkerAppRuntime.tick( self, app_callbacks.Bindings(App).onTaskCompletion, app_callbacks.Bindings(App).workerEventHandlers(self), ); try self.flushRequestedFrame(); } pub fn secretStore(self: *const Self) host.SecretStore { return self.auth.secret_store; } pub fn clipboard(_: *const Self) host.Clipboard { return if (comptime host_profile.clipboard) native_host.clipboard else host.unavailable_clipboard; } pub fn terminalTitle(_: *const Self) host.TerminalTitle { return ui_render.terminal_title; } alloc: Allocator, terminal: TerminalState = .{}, auth: auth_runtime.Runtime = auth_runtime.Runtime.init( if (host_target.is_wasm) api_key_validator.unavailable_provider else builtin_gateway.api_key_validator, if (host_profile.js_host_auth) js_host_auth.oauth_provider else if (host_profile.native_auth) builtin_gateway.oauth_transport_provider else oauth_transport.unavailable_provider, if (host_target.is_wasm) host.unavailable_secret_store else native_host.secret_store, ), selected_model: std.ArrayList(u8) = .empty, model_cache: model_cache_runtime.Runtime = model_cache_runtime.Runtime.init(std.heap.c_allocator, builtin_gateway.models_path), workspace_root: []u8 = &.{}, workspace_host: WorkspaceHostRuntime = .{}, workspace: app_workspace_runtime.State = .{}, permission_engine: PermissionEngine = .{}, permission_state: app_permission_runtime.State = .{}, agent_step_limit: usize = default_max_agent_steps, web_fetch_runtime: web_fetch_runtime.Runtime = web_fetch_runtime.Runtime.init(.{}), web_search_runtime: web_search_runtime.Runtime = web_search_runtime.Runtime.init(.{ .provider = if (host_profile.web_search) builtin_gateway.default_web_search_provider else null, }), web_search_models_path: []const u8 = builtin_gateway.models_path, lifecycle_runtime: hooks.Runtime = hooks.Runtime.init(std.heap.c_allocator), lifecycle_view: hooks.RuntimeView = hooks.RuntimeView.empty(), notifications: builtin_hooks.notifications.State = .{}, herdr: builtin_hooks.Client = .{}, session: SessionRuntime = SessionRuntime.init( max_history_turns, if (host_profile.generation_usage) builtin_gateway.generation_usage_providerLines 1–500 of 3895. Load more
const std = @import("std"); const builtin = @import("builtin"); const build_options = @import("build_options"); const io_mod = @import("core/shared/io.zig"); pub const version = "0.0.3"; const app_lifecycle = @import("core/app/app_lifecycle.zig"); const auth_runtime = @import("core/auth/auth_runtime.zig"); const api_key_validator = @import("core/auth/api_key_validator.zig"); const oauth_transport = @import("core/auth/oauth_transport.zig"); const js_host_auth = @import("core/auth/js_host_auth.zig"); const credentials = @import("core/auth/credentials.zig"); const secret = @import("core/auth/secret.zig"); const model_cache_runtime = @import("core/app/model_cache_runtime.zig"); const app_auth_runtime = @import("core/app/app_auth_runtime.zig"); const app_host_config_runtime = @import("core/app/app_host_config_runtime.zig"); const app_entry_runtime = @import("core/app/app_entry_runtime.zig"); const acp_runner = @import("core/cli/acp_runner.zig"); const acp_server = @import("acp/server.zig"); const app_input_runtime = @import("core/app/app_input_runtime.zig"); const core_input_runtime = @import("core/input/runtime.zig"); const input_queue_runtime = @import("core/app/input_queue_runtime.zig"); const app_bootstrap_runtime = @import("core/app/app_bootstrap_runtime.zig"); const app_notification_runtime = @import("core/app/app_notification_runtime.zig"); const app_permission_runtime = @import("core/app/app_permission_runtime.zig"); const app_process_runtime = @import("core/app/app_process_runtime.zig"); const prompt_history_runtime = @import("core/app/prompt_history_runtime.zig"); const app_agent_runtime = @import("core/app/app_agent_runtime.zig"); const app_runtime_setup = @import("core/app/app_runtime_setup.zig"); const app_render_runtime = @import("core/app/app_render_runtime.zig"); const app_session_runtime = @import("core/app/app_session_runtime.zig"); const app_upgrade_runtime = @import("core/app/app_upgrade_runtime.zig"); const app_worker_runtime = @import("core/app/app_worker_runtime.zig"); const app_workspace_runtime = @import("core/app/app_workspace_runtime.zig"); const app_callbacks = @import("core/app/app_callbacks.zig"); const app_commands = @import("core/app/app_commands.zig"); const change_tracker_mod = @import("core/workspace/change_tracker.zig"); const context_contract = @import("core/workspace/context_contract.zig"); const collections = @import("core/shared/collections.zig"); const agent_steps = @import("core/config/agent_steps.zig"); const config_runtime = @import("core/config/config_runtime.zig"); const js_host_prompt_history = @import("core/session/js_host_prompt_history.zig"); const model_capabilities = @import("core/config/model_capabilities.zig"); const prompt_policy = @import("core/config/prompt_policy.zig"); const builtin_commands = @import("builtins/commands.zig"); const command_specs = @import("core/slash_commands/command_specs.zig"); const builtin_context = @import("builtins/context.zig"); const builtin_devbox = @import("builtins/devbox.zig"); const builtin_gateway = @import("builtins/gateway.zig"); const gateway_provider = @import("core/gateway/gateway_provider.zig"); const generation_usage_provider = @import("core/session/generation_usage_provider.zig"); const agent_stream_provider = @import("core/agent/stream_provider.zig"); const builtin_hooks = @import("builtins/hooks.zig"); const builtin_mcp = @import("builtins/mcp.zig"); const builtin_modes = @import("builtins/modes.zig"); const builtin_skills = @import("builtins/skills.zig"); const host = @import("core/hosts/host.zig"); const host_runtime_profile = @import("core/hosts/runtime_profile.zig"); const js_host_url_opener = @import("core/hosts/js_host_url_opener.zig"); const js_host_workspace = @import("core/hosts/js_host_workspace.zig"); const host_target = @import("core/hosts/target.zig"); const native_host = @import("core/hosts/native.zig"); const debug_trace = @import("core/shared/debug_trace.zig"); const display_width = @import("core/shared/display_width.zig"); const file_index_mod = @import("core/workspace/file_index.zig"); const mcp_command_provider = @import("core/mcp/command_provider.zig"); const mcp_runtime_mod = @import("core/mcp/mcp_runtime.zig"); const mcp_model_catalog = @import("core/mcp/model_catalog.zig"); const mcp_access_policy = @import("core/mcp/access_policy.zig"); const app_mcp_runtime = @import("core/app/app_mcp_runtime.zig"); const skill_commands = @import("core/skills/skill_commands.zig"); const skill_runtime = @import("core/skills/skill_runtime.zig"); const cli_surface = @import("core/cli/cli_surface.zig"); const hooks = @import("core/hooks/hooks.zig"); const github_publish = @import("core/github/github_publish.zig"); const subagent_domain = @import("core/subagent/domain.zig"); const subagent_execution = @import("core/subagent/execution.zig"); const types = @import("core/shared/types.zig"); const image_attachments = @import("core/images/image_attachments.zig"); const permissions = @import("core/permissions/permissions.zig"); const sandbox = @import("core/permissions/sandbox.zig"); const command_admission = @import("core/permissions/command_admission.zig"); const permission_auto_classifier = @import("core/permissions/auto_classifier.zig"); const auto_classifier_context = @import("core/permissions/auto_classifier_context.zig"); const agent_runtime = @import("core/agent/agent_runtime.zig"); const assistant_presentation = @import("core/agent/assistant_presentation.zig"); const auto_upgrade = @import("core/upgrade/auto_upgrade.zig"); const update_target = @import("core/upgrade/update_target.zig"); const compiled_update_channel = update_target.Channel.parse(build_options.update_channel) orelse @compileError("invalid compiled update channel"); const background_runtime = @import("core/background/background_runtime.zig"); const background_process_provider = @import( "core/execution/background_process_provider.zig", ); const background_process = @import("tools/shell/background_process.zig"); const process_supervisor = @import("core/background/process_supervisor.zig"); const terminal_client_runtime = @import("core/terminal/client.zig"); const terminal_direct_runtime = @import("core/terminal/direct_runtime.zig"); const app_terminal_runtime = @import("core/app/app_terminal_runtime.zig"); const app_terminal_takeover_runtime = @import("core/app/app_terminal_takeover_runtime.zig"); const terminal_host = @import("core/terminal/host.zig"); const terminal_native_session = @import("core/terminal/native_session.zig"); const terminal_tmux_session = @import("core/terminal/tmux_session.zig"); const session_runtime = @import("core/session/session.zig"); const session_codec = @import("core/session/session_codec.zig"); const session_child_store = @import("core/session/session_child_store.zig"); const session_log = @import("core/session/session_log.zig"); const builtin_tools = @import("builtins/tools.zig"); const browser_workspace_tools = @import("builtins/browser_workspace_tools.zig"); const tool_admission = @import("core/tooling/tool_admission.zig"); const tool_advertisement = @import("core/tooling/tool_advertisement.zig"); const command_output_content = @import("core/tooling/command_output_content.zig"); const tool_dispatch = @import("core/tooling/tool_dispatch.zig"); const tool_set_contract = @import("core/tooling/tool_set.zig"); const tool_mcp_runtime = @import("core/tooling/tool_mcp_runtime.zig"); const tool_runtime = @import("core/tooling/tool_runtime.zig"); const web_fetch_runtime = @import("core/tooling/web_fetch_runtime.zig"); const web_search_runtime = @import("core/tooling/web_search_runtime.zig"); const worker_runtime = @import("core/agent/worker_runtime.zig"); const question_prompt = @import("core/agent/question_prompt.zig"); const gateway_client = @import("gateway/client.zig"); const js_host_stream_provider = @import("gateway/js_host_stream_provider.zig"); const js_host_model_catalog = @import("gateway/js_host_model_catalog.zig"); const url_opener = @import("core/hosts/url_opener.zig"); const event_loop = @import("ui/event_loop.zig"); const wasm_terminal = if (host_target.is_wasm) @import("ui/terminal/wasm_terminal.zig") else struct {}; const footer_runtime = @import("ui/footer/runtime.zig"); const question_ui = @import("ui/footer/question_ui.zig"); const ui_input = @import("ui/input/runtime.zig"); const input_action = @import("core/input/input_action.zig"); const paste_blocks = @import("core/input/pasted_blocks.zig"); const paste_framing = @import("core/input/paste_framing.zig"); const registered_entities = @import("core/input/registered_entities.zig"); const entity_spans = @import("core/shared/entity_spans.zig"); const ui_render = @import("ui/render.zig"); const shell_runtime = @import("ui/shell_runtime.zig"); const ui_terminal = @import("ui/terminal/terminal.zig"); const cursor_probe = @import("ui/terminal/cursor_probe.zig"); const ui_subagents = @import("ui/subagent/controller.zig"); const transcript_runtime = @import("ui/transcript/runtime.zig"); const resume_projection = @import("ui/transcript/resume_projection.zig"); const assistant_pacer = @import("ui/assistant/pacer.zig"); const approval_prompt = @import("core/permissions/approval_prompt.zig"); const Allocator = std.mem.Allocator; const Layout = types.Layout; const Metrics = types.Metrics; const StreamState = types.StreamState; const ToolCall = types.ToolCall; const ChatMessage = types.ChatMessage; const PermissionMode = types.PermissionMode; const ReasoningEffort = types.ReasoningEffort; const ToolPermissionDecision = types.ToolPermissionDecision; const PermissionGrant = types.PermissionGrant; const PermissionEngine = permissions.PermissionEngine; const QueuedPrompt = worker_runtime.QueuedPrompt; const WorkerRuntime = worker_runtime.WorkerRuntime; const SessionRuntime = session_runtime.SessionRuntime; const PromptHistoryRuntime = prompt_history_runtime.PromptHistoryRuntime; const BackgroundRuntime = background_runtime.BackgroundRuntime; const ToolExecutionResult = agent_runtime.ToolExecutionResult; const ApprovalPrompt = approval_prompt.ApprovalPrompt; const ApprovalScreenState = footer_runtime.ApprovalScreenState; const QuestionPrompt = question_prompt.QuestionPrompt; const InputRuntime = core_input_runtime.Runtime; const TerminalInputRuntime = ui_input.Runtime; const TerminalState = shell_runtime.TerminalState; const TranscriptRuntime = transcript_runtime.TranscriptRuntime; const ResumeProjection = resume_projection.ResumeProjection; const RawEnviron = io_mod.RawEnviron; const RuntimeContextSnapshot = background_runtime.RuntimeContextSnapshot; const footer_rows: u16 = 4; const active_poll_timeout_ms: i32 = 8; const idle_wasm_poll_timeout_ms: i32 = 16; const resize_debounce_ms: i64 = 100; const max_transcript_bytes: usize = 256 * 1024; const default_max_agent_steps: usize = agent_steps.default_max_agent_steps; const max_history_turns: usize = 8; const max_list_entries: usize = 100; const max_read_file_bytes: usize = 50 * 1024; const max_read_file_lines: usize = 400; const max_read_file_line_len: usize = 2000; const max_command_output_bytes: usize = 64 * 1024; const input_escape_timeout_ms: i64 = 30; const max_prompt_history: usize = 100; const ignored_list_entries = [_][]const u8{ ".git", ".zig-cache", "zig-out", "node_modules", ".next", "dist", "build", "coverage", }; fn dupeUniqueSkillBindingsFromTokens( alloc: Allocator, skill_tokens: []const registered_entities.SkillTokenSpan, ) ![]worker_runtime.SkillBinding { if (skill_tokens.len == 0) return &.{}; var bindings: std.ArrayList(worker_runtime.SkillBinding) = .empty; errdefer { for (bindings.items) |binding| { alloc.free(binding.name); alloc.free(binding.path); } bindings.deinit(alloc); } for (skill_tokens) |token| { if (token.name.len == 0 or token.path.len == 0) continue; if (skillBindingPathSeen(bindings.items, token.path)) continue; const name_copy = try alloc.dupe(u8, token.name); var path_copy: []u8 = &.{}; var appended = false; errdefer if (!appended) { alloc.free(name_copy); if (path_copy.len > 0) alloc.free(path_copy); }; path_copy = try alloc.dupe(u8, token.path); try bindings.append(alloc, .{ .name = name_copy, .path = path_copy, }); appended = true; } if (bindings.items.len == 0) { bindings.deinit(alloc); return &.{}; } return try bindings.toOwnedSlice(alloc); } fn skillBindingPathSeen(bindings: []const worker_runtime.SkillBinding, path: []const u8) bool { for (bindings) |binding| { if (std.mem.eql(u8, binding.path, path)) return true; } return false; } fn dupeSkillDisplaySpansFromTokens( alloc: Allocator, skill_tokens: []const registered_entities.SkillTokenSpan, ) ![]worker_runtime.SkillDisplaySpan { if (skill_tokens.len == 0) return &.{}; var spans: std.ArrayList(worker_runtime.SkillDisplaySpan) = .empty; errdefer { for (spans.items) |span| { alloc.free(span.name); alloc.free(span.path); } spans.deinit(alloc); } for (skill_tokens) |token| { if (token.name.len == 0 or token.path.len == 0) continue; const name_copy = try alloc.dupe(u8, token.name); var path_copy: []u8 = &.{}; var appended = false; errdefer if (!appended) { alloc.free(name_copy); if (path_copy.len > 0) alloc.free(path_copy); }; path_copy = try alloc.dupe(u8, token.path); try spans.append(alloc, .{ .raw_start = token.raw_start, .raw_end = token.raw_end, .name = name_copy, .path = path_copy, .display_source = token.display_source, .owns_trailing_separator = token.owns_trailing_separator, }); appended = true; } if (spans.items.len == 0) { spans.deinit(alloc); return &.{}; } return try spans.toOwnedSlice(alloc); } fn promptCardSkillTokensFromDisplaySpans( alloc: Allocator, skill_display_spans: []const worker_runtime.SkillDisplaySpan, ) ![]registered_entities.SkillTokenSpan { if (skill_display_spans.len == 0) return &.{}; const tokens = try alloc.alloc(registered_entities.SkillTokenSpan, skill_display_spans.len); errdefer alloc.free(tokens); for (skill_display_spans, 0..) |span, i| { tokens[i] = .{ .raw_start = span.raw_start, .raw_end = span.raw_end, .name = span.name, .path = span.path, .display_source = span.display_source, .owns_trailing_separator = span.owns_trailing_separator, }; } return tokens; } test "skill submit snapshot keeps display spans exact while agent bindings dedupe" { const alloc = std.testing.allocator; const tokens = [_]registered_entities.SkillTokenSpan{ .{ .raw_start = "raw $review then ".len, .raw_end = "raw $review then $review".len, .name = "review", .path = "/tmp/.codex/skills/review", }, .{ .raw_start = "raw $review then $review and ".len, .raw_end = "raw $review then $review and $review".len, .name = "review", .path = "/tmp/.codex/skills/review", }, }; const bindings = try dupeUniqueSkillBindingsFromTokens(alloc, &tokens); defer worker_runtime.freeSkillBindings(alloc, bindings); const display_spans = try dupeSkillDisplaySpansFromTokens(alloc, &tokens); defer worker_runtime.freeSkillDisplaySpans(alloc, display_spans); try std.testing.expectEqual(@as(usize, 1), bindings.len); try std.testing.expectEqualStrings("review", bindings[0].name); try std.testing.expectEqual(@as(usize, 2), display_spans.len); try std.testing.expectEqual(tokens[0].raw_start, display_spans[0].raw_start); try std.testing.expectEqual(tokens[1].raw_start, display_spans[1].raw_start); } var resize_interlock = shell_runtime.ResizeApprovalInterlock{}; const default_context_registry = context_contract.Registry{ .default_provider = builtin_context.provider }; const WorkspaceHostRuntime = if (host_target.is_wasm) js_host_workspace.Runtime else struct {}; const wasm_skill_root_policy: @import("core/skills/skill_contract.zig").RootPolicy = .{ .managed_root_source = null, }; fn currentBuild() update_target.CurrentBuild { return .{ .channel = compiled_update_channel, .version = version, .revision = build_options.git_commit, }; } const App = struct { pub const app_version = version; pub const host_profile = if (host_target.is_wasm) host_runtime_profile.wasm else host_runtime_profile.native; pub const input_limits = paste_framing.default_input_limits; pub const build_update_channel = compiled_update_channel; pub const build_revision = build_options.git_commit; const Self = @This(); const AgentAppRuntime = app_agent_runtime.Runtime(Self); const AuthAppRuntime = app_auth_runtime.Runtime(Self); const HostConfigAppRuntime = app_host_config_runtime.Runtime(Self); const BootstrapAppRuntime = app_bootstrap_runtime.Runtime(Self); const InputAppRuntime = app_input_runtime.Runtime(Self); const NotificationAppRuntime = app_notification_runtime.Runtime( Self, builtin_hooks.notifications.provider(Self), ); const HerdrAppRuntime = builtin_hooks.Runtime(Self); const RenderAppRuntime = app_render_runtime.Runtime(Self); const SessionAppRuntime = app_session_runtime.Runtime(Self); const UpgradeAppRuntime = app_upgrade_runtime.Runtime(Self); const WorkerAppRuntime = app_worker_runtime.Runtime(Self); const WorkspaceAppRuntime = app_workspace_runtime.Runtime(Self); fn devboxProvider(_: *Self) @import("core/execution/devbox_executor.zig").Provider { return builtin_devbox.provider; } pub fn contextRegistry(_: *const Self) context_contract.Registry { return default_context_registry; } pub fn workspaceHostInfo(self: *const Self) ?*const js_host_workspace.Info { if (comptime host_profile.js_host_workspace) return self.workspace_host.info(); return null; } pub fn workspaceExecutor(self: *const Self) ?js_host_workspace.Executor { if (comptime host_profile.js_host_workspace) return self.workspace_host.executor(); return null; } pub fn promptPolicy(_: *const Self) prompt_policy.Policy { return builtin_context.prompt_policy; } pub fn slashRegistry(_: *const Self) command_specs.SlashRegistry { return builtin_commands.slash_registry; } pub fn mcpCommandProvider(_: *const Self) mcp_command_provider.Provider { return builtin_mcp.command_provider; } pub fn skillsCommandProvider(_: *const Self) skill_commands.Provider { return builtin_skills.command_provider; } pub fn urlOpener(_: *const Self) host.UrlOpener { return if (comptime host_profile.url_opening) url_opener.native_opener else if (comptime host_profile.js_host_url_open) js_host_url_opener.opener else host.unavailable_url_opener; } pub fn creditsProvider(_: *const Self) gateway_provider.CreditsProvider { return builtin_gateway.credits_provider; } pub fn agentStreamProvider(_: *const Self) agent_stream_provider.Provider { return if (comptime host_target.is_wasm) js_host_stream_provider.provider() else builtin_gateway.agent_stream_provider; } pub fn cooperativeTransportPulse(self: *Self) !void { if (comptime !host_target.is_wasm) return; if (try event_loop.pump_ready_input( self.terminal, &self.should_exit, RenderAppRuntime.eventLoopCallbacks(self), )) |exit_cause| { if (exit_cause == .input_closed) self.should_exit = true; return; } try WorkerAppRuntime.tick( self, app_callbacks.Bindings(App).onTaskCompletion, app_callbacks.Bindings(App).workerEventHandlers(self), ); try self.flushRequestedFrame(); } pub fn secretStore(self: *const Self) host.SecretStore { return self.auth.secret_store; } pub fn clipboard(_: *const Self) host.Clipboard { return if (comptime host_profile.clipboard) native_host.clipboard else host.unavailable_clipboard; } pub fn terminalTitle(_: *const Self) host.TerminalTitle { return ui_render.terminal_title; } alloc: Allocator, terminal: TerminalState = .{}, auth: auth_runtime.Runtime = auth_runtime.Runtime.init( if (host_target.is_wasm) api_key_validator.unavailable_provider else builtin_gateway.api_key_validator, if (host_profile.js_host_auth) js_host_auth.oauth_provider else if (host_profile.native_auth) builtin_gateway.oauth_transport_provider else oauth_transport.unavailable_provider, if (host_target.is_wasm) host.unavailable_secret_store else native_host.secret_store, ), selected_model: std.ArrayList(u8) = .empty, model_cache: model_cache_runtime.Runtime = model_cache_runtime.Runtime.init(std.heap.c_allocator, builtin_gateway.models_path), workspace_root: []u8 = &.{}, workspace_host: WorkspaceHostRuntime = .{}, workspace: app_workspace_runtime.State = .{}, permission_engine: PermissionEngine = .{}, permission_state: app_permission_runtime.State = .{}, agent_step_limit: usize = default_max_agent_steps, web_fetch_runtime: web_fetch_runtime.Runtime = web_fetch_runtime.Runtime.init(.{}), web_search_runtime: web_search_runtime.Runtime = web_search_runtime.Runtime.init(.{ .provider = if (host_profile.web_search) builtin_gateway.default_web_search_provider else null, }), web_search_models_path: []const u8 = builtin_gateway.models_path, lifecycle_runtime: hooks.Runtime = hooks.Runtime.init(std.heap.c_allocator), lifecycle_view: hooks.RuntimeView = hooks.RuntimeView.empty(), notifications: builtin_hooks.notifications.State = .{}, herdr: builtin_hooks.Client = .{}, session: SessionRuntime = SessionRuntime.init( max_history_turns, if (host_profile.generation_usage) builtin_gateway.generation_usage_provider