3895 lines · 157.1 KB · Zig
RawDownload
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

Lines 1–500 of 3895.