



  

<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

<script type="importmap">{"imports":{"react":"https://github.githubassets.com/assets/react-e27d1b3e03961e68.js","react-dom":"https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js","react-dom/client":"https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js","react-is":"https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js","react-reconciler":"https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js","react/compiler-runtime":"https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js","react/jsx-dev-runtime":"https://github.githubassets.com/assets/react-jsx-dev-runtime-ea55d68667d559e5.js","react/jsx-runtime":"https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js","scheduler":"https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js"}}</script>
<meta name="react-profiling" content="0" data-turbo-transient="true" />
<meta name="react-import-map" content="react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@777f63f87cd0" data-turbo-track="reload" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-e27d1b3e03961e68.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js" />

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-99f877e9ddfc0e51.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-48fdd0811afbab3c.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-79ad2ace604703b3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-24484a076f02295f.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-99f877e9ddfc0e51.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-48fdd0811afbab3c.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f4bf1142976e4bbf.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-f661b49995ba0bd8.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-0b38d22346321c92.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-f1c62c9e70259b9f.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-79ad2ace604703b3.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-24484a076f02295f.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-f50cacf0a86b9929.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-e61d4f4ca17852c2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-39c10993d5603fac.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-73236c840c0c7d90.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-0de76f07cc035b10.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-fd1500c8744e40d6.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-ed9ca172356fd545.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-1d2c7f7b52a6068b.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-54ba76e934a49d7c.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-456bd5deb85c7ecd.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-11ee8a031c040c1a.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-2d56bdb0166c0238.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_header_reorder","copilot_chat_max_upsell","copilot_chat_models_browser_cache","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_embedded_header_button","copilot_immersive_file_preview_keep_mounted","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_early_stop","copilot_mission_control_environment_list_icons","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_client_side_clone","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_session_filters","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_sunset","copilot_workbench_sunset_redirect","copilot_workbench_ubb","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","glc_code_quality_repo_settings_workflow_config","hide_github_models_ui","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_optimistic_updates","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_lazy_load_comment_box_suggestions","issues_optimistic_linked_branch_create","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_client_env_github_domain","memex_default_issue_create_repository","memex_lazy_hydrate_agent_tasks","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_checks_refetch_dedupe","merge_status_header_feedback","oauth_authorize_clickjacking_protection","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_commit_checks_dialog","pull_request_copilot_attribution_header","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_feedback_dialog","pull_request_virtualization_image_estimate","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_persistence","repo_pulls_dashboard_sidebar_links","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_banner_learn_copilot_sdk","site_global_nav_spark_models_removed","spark_prompt_secret_scanning","spark_server_connection_status","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","ui_service_compute_proxy_control","ui_service_referrer_metrics","ui_service_staleness_detection","update_issue_suggestions","user_code_paste_ux","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workbench_store_readonly","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-e3d808ee18eb9784.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-87f87519f2bbba0e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-74e9766bd696d26a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-ecf766ea8a2c7fd6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-8e3d9c5d57d50312.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-cd1b421ad0ad7ed5.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-324a60c8becccc53.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.b6099d51b9e67b57.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-86a8f5de995615f8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e88088f989b27670.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-7cdf4e0db98b997c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-6b3c07383371bf58.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-36f036c13c2e3a4c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/kw-866fd9513ae95106.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r1-b075aab3204f32f9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7c5d1669717041f8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-5126390ff433704d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j05-dce4d588268f0f7e.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-549d25d0f366a901.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-19d067aae228a2c9.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-f3f5d71440009c48.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-76b18916d0c8ec4d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-5109c77d7ac61078.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-fbb00aaa3ab9abdf.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/04n-51c49ba758739f13.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-024971cb63acad59.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-364e19c63d726e9a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6ny-c969fbae697a356f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/yhq-3a209035a30b1a09.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z1v-da5b33b877bfa358.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-09f85d22a6c8931b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9y-81cfe57dc9040f3e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-41a4cf04cbd99503.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0p-81491ed0d9d666e2.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-87fda981566a000c.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.5858534b1c27f133.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-0470abdd78fff242.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-12ebdc24dcff1ecc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-9a860680a5f230b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-363f0ebf4f62f310.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-bf6f21d7e7a43c35.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fe-7576d9b281e2106a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wsr-5fd3071e5a9061ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0n-ecadb2ffe6b01ba2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xv-51cb34754bda73a9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-6317ce1c31aed1db.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-d90ce3a169b741ed.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-de176c4ee471f2b3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/eag-d9eea130fa716df9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y2-87df441f1bc5a264.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/kcz-607e36c8a3751cf0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/x4-65dba777efd828f3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-1a09248f686325f6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi0-e2f78de823e39ca9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/on-95be29ba1ef725d9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-1dbc371cef78c3c1.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-c4edb8ab48c5846d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2z-c92998400310b94b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-038758dcbfe08dab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0k-b7df0a74912a42bf.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-915c6643cc0d7d44.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-93ae8b358505d372.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-69d9b60a1b1fcd59.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-8ea7978d3fcd114e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-a401e69a37d95bcc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-1c18210f6b9e2263.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-0a2e46387735f1f4.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-cb1e4ddbce4f007b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-9f5235d335ab624b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ko6-9e80f7ac359e3c43.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/uw-8c275f7ac25b7cf6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bsb-4f4ac8c20da73fac.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/w5-13e3a7548bb20af9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fm-c00a7677663ba326.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z-45022d3da7b8817e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/h0-010921512138e12f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5p-ae5db0820116fb43.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8vq-b2af216e992e11ef.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/g5-88f2a4514daa19ca.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-f5d51b571cd317cb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/arw-51e8918a1b75a80f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-5780cead61d34dfa.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.de7a55ca73db5693.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/z.812a998e1961b84d.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.13e027137438fd9f.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.3e1889ce559ebbdc.module.css" />

  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hu-1fc0b2a167afc025.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fb-ef2c91536abed646.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-1275ca430426c116.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.a2d74169820112df.module.css" />


  <title>codex-java-sdk/README.md at feature/1.0.x · easy-4-java/codex-java-sdk · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:ea911d8e-217c-0f8c-0c0b-57c52218f80e">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="BBC6:178631:1125A8B2:1002565B:6AAC9407" data-pjax-transient="true"/><meta name="html-safe-nonce" content="06fe029823cabe46e9f0f4c787fcbb7196c268592b2c1c5f9130c2e1fb68bf96" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQkM2OjE3ODYzMToxMTI1QThCMjoxMDAyNTY1Qjo2QUFDOTQwNyIsInZpc2l0b3JfaWQiOiI4OTg0MjA0ODk5Mjc2MDY3ODQ3IiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="017d0965e1d84fb77af1ffe8631d74e7137b492dd477fd2a6c0cf835333f4d8f" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1261770013" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="Codex CLI Java SDK — subprocess integration for OpenAI Codex agent - codex-java-sdk/README.md at feature/1.0.x · easy-4-java/codex-java-sdk">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/8af8ceccd93faa36b98c8649784b76bd6788b1a2f6bb16fd5d7932f072a79af3/easy-4-java/codex-java-sdk" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="codex-java-sdk/README.md at feature/1.0.x · easy-4-java/codex-java-sdk" /><meta name="twitter:description" content="Codex CLI Java SDK — subprocess integration for OpenAI Codex agent - easy-4-java/codex-java-sdk" />
  <meta property="og:image" content="https://opengraph.githubassets.com/8af8ceccd93faa36b98c8649784b76bd6788b1a2f6bb16fd5d7932f072a79af3/easy-4-java/codex-java-sdk" /><meta property="og:image:alt" content="Codex CLI Java SDK — subprocess integration for OpenAI Codex agent - easy-4-java/codex-java-sdk" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="codex-java-sdk/README.md at feature/1.0.x · easy-4-java/codex-java-sdk" /><meta property="og:url" content="https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md" /><meta property="og:description" content="Codex CLI Java SDK — subprocess integration for OpenAI Codex agent - easy-4-java/codex-java-sdk" />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="87b02277f1a88f71022c708b22655ead06f335ffb2f288301950607be673d70f" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="0c5c6e5334a905d8f9521e09eadcffba484d422e0d262e07ff922e6bc18b2ac6" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="ec4c7b86d7b57240253150b827ea48b04e08d8760dc6553d2a04f62000f3fe0c" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="b485a9e5d5fef3a0529256dd6518ebc1f40bea8817ed2111389eeb587e6b5499" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/easy-4-java/codex-java-sdk git https://github.com/easy-4-java/codex-java-sdk.git">

  <meta name="octolytics-dimension-user_id" content="307692851" /><meta name="octolytics-dimension-user_login" content="easy-4-java" /><meta name="octolytics-dimension-repository_id" content="1261770013" /><meta name="octolytics-dimension-repository_nwo" content="easy-4-java/codex-java-sdk" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="1261770013" /><meta name="octolytics-dimension-repository_network_root_nwo" content="easy-4-java/codex-java-sdk" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">


  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="150f67e4e80cef756826b1ec1ae31f40579d6bf6" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/l7j-2ddd8b435dadae28.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-3f2ae39a88fc8542.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.8ab0724db4d1b620.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          
          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2l-8671acba87bc0dcb.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/i26-f2ae65b837c90ae7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz5-23f28c0f388769c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/lht-26506ea833dda5be.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p1-76a75a6081059b19.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-82c347d20a13fb90.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-c4ca62c5e0e0318e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4s-c22d880230690e1f.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-5911ef094658e0d1.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.6a01c236ff527e7e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/4s.e3d02f110161be52.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Feasy-4-java%2Fcodex-java-sdk%2Fblob%2Ffeature%2F1.0.x%2FREADME.md","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow\u0026source=header-repo\u0026source_repo=easy-4-java%2Fcodex-java-sdk","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md\",\"user_id\":null}}","auth_hydro_click_hmac":"e0434ce61a2a32c5a4e88a32da879456a2e247cff6193b41342fb05f855002f1","overlay":false,"fixed":false}}</script>
  <div data-target="react-partial.reactRoot"><div data-color-mode="dark" data-light-theme="light" data-dark-theme="dark"><header class="MarketingHeader-module__root__Tk7n3 HeaderMktg header-logged-out" role="banner" data-marketing-header="true" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" data-is-top="true"><h2 class="MarketingHeader-module__visuallyHidden__sqKsl">Navigation Menu</h2><button type="button" class="MarketingHeader-module__backdrop__sw4RU" aria-label="Close navigation menu"></button><div class="MarketingHeader-module__bar__mBSyE"><div class="MarketingHeader-module__topRow__yeury"><div class="MarketingHeader-module__toggleSlot__hDxbh"><button type="button" class="HeaderMenuToggle-module__toggle__i8EiC" aria-label="Toggle navigation" aria-expanded="false"><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span></button></div><a href="/" aria-label="Homepage" class="HeaderLogo-module__logo__UFyHI" data-analytics-event="{&quot;action&quot;:&quot;homepage&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;logo&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;homepage_link_logo_header&quot;}"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg></a><div class="AuthCTAs-module__mobileActions__NNzeV"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/login?return_to=https%3A%2F%2Fgithub.com%2Feasy-4-java%2Fcodex-java-sdk%2Fblob%2Ffeature%2F1.0.x%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="e0434ce61a2a32c5a4e88a32da879456a2e247cff6193b41342fb05f855002f1"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_3dd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_3dd_">Appearance settings</div></div></div><div class="MarketingHeader-module__menu__GIy3y"><div class="MarketingHeader-module__menuWrapper__owstH"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_nd_">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5knd_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>GitHub Copilot</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Write better code with AI</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"></path></svg>GitHub Copilot app</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.52 1.12a3.578 3.578 0 0 1 6.078 2.98 3.578 3.578 0 0 1 2.982 6.08l-3.292 3.293a.252.252 0 0 0 0 .354l.843.843a.749.749 0 1 1-1.06 1.06l-.844-.843a1.75 1.75 0 0 1 0-2.474L13.52 9.12a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0L7.731 9.03A.75.75 0 0 1 6.67 7.97l2.85-2.85a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0l-4.799 4.8A.75.75 0 0 1 .72 5.92Z"></path><path d="M7.52 3.12a.749.749 0 1 1 1.06 1.06L5.731 7.03A2.079 2.079 0 0 0 8.67 9.97l2.85-2.85a.749.749 0 1 1 1.06 1.06l-2.849 2.85A3.578 3.578 0 0 1 4.67 5.97Z"></path></svg>MCP Registry</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Integrate external tools</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9knd_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path></svg>Actions</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Automate any workflow</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg>Codespaces</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Instant dev environments</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg>Issues</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Plan and track work</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>Code Review</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Manage code changes</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-quality" data-analytics-event="{&quot;action&quot;:&quot;code_quality&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_quality_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codescan-checkmark NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.28 6.28a.75.75 0 1 0-1.06-1.06L6.25 8.19l-.97-.97a.75.75 0 0 0-1.06 1.06l1.5 1.5a.75.75 0 0 0 1.06 0l3.5-3.5Z"></path><path d="M7.5 15a7.5 7.5 0 1 1 5.807-2.754l2.473 2.474a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2.474-2.473A7.472 7.472 0 0 1 7.5 15Zm0-13.5a6 6 0 1 0 4.094 10.386.748.748 0 0 1 .293-.292 6.002 6.002 0 0 0 1.117-6.486A6.002 6.002 0 0 0 7.5 1.5Z"></path></svg>Code Quality</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enforce quality at merge</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dknd_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Code security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Secure your code as you build</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg>Secret protection</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_hknd_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Why GitHub</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Blog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Changelog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all features</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_17d_">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_17d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5l7d_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Enterprises</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Small and medium teams</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Startups</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9l7d_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">App Modernization</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevSecOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">CI/CD</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all use cases</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dl7d_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dl7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Healthcare</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Financial services</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Manufacturing</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Government</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all industries</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all solutions</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_1nd_">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_1nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5lnd_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">AI</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Software Development</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all topics</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9lnd_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer stories</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Events &amp; webinars</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Ebooks &amp; reports</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Business insights</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Skills</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dlnd_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dlnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer support</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Community forum</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trust center</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all resources</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_27d_">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_27d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5m7d_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/open-source/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>GitHub Sponsors</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Fund open source developers</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9m7d_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security Lab</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Maintainer Community</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Stars</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Archive Program</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dm7d_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dm7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Topics</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trending</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_2nd_">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_2nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5mnd_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg>Enterprise platform</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9mnd_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>Copilot for Business</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Premium Support</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></span></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="MarketingNavigation-module__navLink__hUomM">Pricing</a></li></ul></nav><div class="MarketingHeader-module__ctaContainer__tBmPz"><div class="HeaderSearch-module__searchSlot__oVOUS"><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderSearch-module__trigger__zsF9q" type="button" aria-haspopup="dialog" aria-expanded="false" aria-label="Search or jump to, type / to search" data-analytics-event="{&quot;action&quot;:&quot;searchbar&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;context&quot;:&quot;global&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"><span class="HeaderSearch-module__content__kMpxU"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search HeaderSearch-module__icon__wcrHX" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg><span class="HeaderSearch-module__label__d1iWG">Search</span><kbd class="HeaderSearch-module__kbd__HNG0o" aria-hidden="true">/</kbd></span></span></span></button><div class="d-none"></div></div><div class="AuthCTAs-module__signInWrap__q2P60"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq AuthCTAs-module__desktopActionGap__UZuXT AuthCTAs-module__hiddenBelowLg__BfKBw" href="/login?return_to=https%3A%2F%2Fgithub.com%2Feasy-4-java%2Fcodex-java-sdk%2Fblob%2Ffeature%2F1.0.x%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="e0434ce61a2a32c5a4e88a32da879456a2e247cff6193b41342fb05f855002f1"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a></div><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--secondary___gHnw_ Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=easy-4-java%2Fcodex-java-sdk" data-analytics-event="{&quot;action&quot;:&quot;sign_up&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_up_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="e0434ce61a2a32c5a4e88a32da879456a2e247cff6193b41342fb05f855002f1"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-secondary___eJ0_a">Sign up</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_fbd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_fbd_">Appearance settings</div></div></div></div></div><div class="MarketingHeader-module__bottomBorder__uZT38" aria-hidden="true"></div></header></div></div>
</react-partial>



      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-0642834f-134a-4273-922f-9e0386bbdef5" aria-labelledby="tooltip-09dfb16c-0d89-4eb3-88b3-def6e4207ff2" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-09dfb16c-0d89-4eb3-88b3-def6e4207ff2" for="icon-button-0642834f-134a-4273-922f-9e0386bbdef5" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>





  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      
    


    








  

    <div id="repository-container-header"  class="tmp-pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace>

        <div class="d-flex flex-nowrap flex-justify-end tmp-mb-3  tmp-px-3 tmp-px-lg-5" style="gap: 1rem;">

          <div class="flex-auto min-width-0 width-fit">
              
  <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2 tmp-mr-2">
    <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
</svg>
    
    <span class="author flex-self-stretch" itemprop="author">
      <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/easy-4-java/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/easy-4-java">
        easy-4-java
</a>    </span>
    <span class="mx-1 flex-self-stretch color-fg-muted">/</span>
    <strong itemprop="name" class="mr-2 flex-self-stretch">
      <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/easy-4-java/codex-java-sdk">codex-java-sdk</a>
    </strong>

    <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span>
  </div>


          </div>

          <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;">
              <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;">
    
      

  <li>
            <a href="/login?return_to=%2Feasy-4-java%2Fcodex-java-sdk" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="428770a3bb89930b83dc0ba8bc5e0771f573ad44bbbf54c95a9a205e75070fc6" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2 tmp-mr-2">
    <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path>
</svg>Notifications
</a>    <tool-tip id="tooltip-0abdbcb7-dc38-4f7c-af38-77ce35232aa8" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip>

  </li>

  <li>
          <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Feasy-4-java%2Fcodex-java-sdk" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:1261770013,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="65c7cf7bc6f395b9a308c6c3ce2d0565e98ad74087d7dc29f62aae452551fae6" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2 tmp-mr-2">
    <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
</svg>Fork
    <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="0" data-view-component="true" class="Counter">0</span>
</a>
  </li>

  <li>
        <div data-view-component="true" class="BtnGroup d-flex">
        <a href="/login?return_to=%2Feasy-4-java%2Fcodex-java-sdk" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:1261770013,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="1d1d190f0cf5072f6a3c322b795680f3c5dc39732d168b96029a40af98d7ecce" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2 tmp-mr-2">
    <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path>
</svg><span data-view-component="true" class="d-inline">
          Star
</span>          <span id="repo-stars-counter-star" aria-label="0 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="0" data-view-component="true" class="Counter js-social-count">0</span>
</a></div>
  </li>

</ul>

          </div>
        </div>

          <div id="responsive-meta-container" data-turbo-replace>
</div>


            <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 tmp-px-3 px-md-4 tmp-px-md-4 px-lg-5 tmp-px-lg-5">

  <ul data-view-component="true" class="UnderlineNav-body list-style-none">
      <li data-view-component="true" class="d-inline-flex">
  <a id="code-tab" href="/easy-4-java/codex-java-sdk" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /easy-4-java/codex-java-sdk" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-command-id="repositories:go-to-code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Code&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        <span data-content="Code">Code</span>
          <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="issues-tab" href="/easy-4-java/codex-java-sdk/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /easy-4-java/codex-java-sdk/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-command-id="repositories:go-to-issues" data-react-nav="issues-react" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Issues&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        <span data-content="Issues">Issues</span>
          <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="pull-requests-tab" href="/easy-4-java/codex-java-sdk/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /easy-4-java/codex-java-sdk/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-command-id="repositories:go-to-pull-requests" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Pull requests&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        <span data-content="Pull requests">Pull requests</span>
          <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="actions-tab" href="/easy-4-java/codex-java-sdk/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /easy-4-java/codex-java-sdk/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-command-id="repositories:go-to-actions" data-react-nav="actions-workflows" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Actions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        <span data-content="Actions">Actions</span>
          <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="projects-tab" href="/easy-4-java/codex-java-sdk/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /easy-4-java/codex-java-sdk/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-command-id="repositories:go-to-projects" data-react-nav="repo" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Projects&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path>
</svg>
        <span data-content="Projects">Projects</span>
          <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="security-and-quality-tab" href="/easy-4-java/codex-java-sdk/security" data-tab-item="i5security-and-quality-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /easy-4-java/codex-java-sdk/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-command-id="repositories:go-to-security" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Security and quality&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span data-content="Security and quality">Security and quality</span>
          <span id="security-and-quality-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="insights-tab" href="/easy-4-java/codex-java-sdk/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /easy-4-java/codex-java-sdk/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-command-id="repositories:go-to-insights" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Insights&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        <span data-content="Insights">Insights</span>
          <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
</ul>
    <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 tmp-pr-3 pr-md-4 tmp-pr-md-4 pr-lg-5 tmp-pr-lg-5 right-0">      <action-menu data-select-variant="none" data-view-component="true">
  <focus-group direction="vertical" mnemonics retain>
    <button id="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-button" popovertarget="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-overlay" aria-controls="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-list" aria-haspopup="true" aria-labelledby="tooltip-ed291b39-0d69-4e9c-a2ca-0fc10bbaa46a" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual">
    <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path>
</svg>
</button><tool-tip id="tooltip-ed291b39-0d69-4e9c-a2ca-0fc10bbaa46a" for="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip>


<anchored-position data-target="action-menu.overlay" id="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-overlay" anchor="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true">
  <div data-view-component="true" class="Overlay Overlay--size-auto">
    
      <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone">          <action-list>
  <div data-view-component="true">
    <ul aria-labelledby="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-button" id="action-menu-7d7da531-6c8f-44a2-bc58-ab0e1c9a6e9b-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap">
        <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-8280735c-2ac3-4007-98e4-2c2e238800c2" href="/easy-4-java/codex-java-sdk" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Code
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-695ea796-c599-4167-86d3-32aae7a84125" href="/easy-4-java/codex-java-sdk/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Issues
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-c0890968-eb89-4747-b549-6b1fdaef7823" href="/easy-4-java/codex-java-sdk/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Pull requests
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-d5421a3d-6671-406f-8c5d-b18fb087e388" href="/easy-4-java/codex-java-sdk/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Actions
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-673bb693-cef9-445f-a746-ad292a32070c" href="/easy-4-java/codex-java-sdk/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table">
    <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Projects
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i5security-and-quality-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-b73be228-6aa4-4d77-aed6-f23d893ae14c" href="/easy-4-java/codex-java-sdk/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Security and quality
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-1bdf2622-6659-4d33-b521-29a7c7977f56" href="/easy-4-java/codex-java-sdk/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Insights
</span>      
</a>
  
</li>
</ul>    
</div></action-list>


</div>
      
</div></anchored-position>  </focus-group>
</action-menu></div>
</nav>

    </div>
  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":[{"level":1,"text":"codex-java-sdk","anchor":"codex-java-sdk","htmlText":"codex-java-sdk"},{"level":2,"text":"Table of Contents","anchor":"table-of-contents","htmlText":"Table of Contents"},{"level":2,"text":"1. Project Overview","anchor":"1-project-overview","htmlText":"1. Project Overview"},{"level":2,"text":"2. Features \u0026 Status","anchor":"2-features--status","htmlText":"2. Features \u0026amp; Status"},{"level":2,"text":"3. Requirements \u0026 Compatibility","anchor":"3-requirements--compatibility","htmlText":"3. Requirements \u0026amp; Compatibility"},{"level":2,"text":"4. Architecture \u0026 Modules","anchor":"4-architecture--modules","htmlText":"4. Architecture \u0026amp; Modules"},{"level":2,"text":"5. Installation","anchor":"5-installation","htmlText":"5. Installation"},{"level":2,"text":"6. Quick Start","anchor":"6-quick-start","htmlText":"6. Quick Start"},{"level":2,"text":"7. Configuration","anchor":"7-configuration","htmlText":"7. Configuration"},{"level":3,"text":"7.1 CodexAppServerConfig (app-server WebSocket route)","anchor":"71-codexappserverconfig-app-server-websocket-route","htmlText":"7.1 CodexAppServerConfig (app-server WebSocket route)"},{"level":2,"text":"8. Core Usage / API","anchor":"8-core-usage--api","htmlText":"8. Core Usage / API"},{"level":3,"text":"8.1 JSONL events","anchor":"81-jsonl-events","htmlText":"8.1 JSONL events"},{"level":3,"text":"8.2 Session lifecycle","anchor":"82-session-lifecycle","htmlText":"8.2 Session lifecycle"},{"level":3,"text":"8.3 App-server WebSocket route (remote Codex)","anchor":"83-app-server-websocket-route-remote-codex","htmlText":"8.3 App-server WebSocket route (remote Codex)"},{"level":3,"text":"8.4 App-server protocol operations","anchor":"84-app-server-protocol-operations","htmlText":"8.4 App-server protocol operations"},{"level":2,"text":"9. Testing \u0026 Build","anchor":"9-testing--build","htmlText":"9. Testing \u0026amp; Build"},{"level":2,"text":"10. Versioning \u0026 Branches","anchor":"10-versioning--branches","htmlText":"10. Versioning \u0026amp; Branches"},{"level":2,"text":"11. Contributing \u0026 License","anchor":"11-contributing--license","htmlText":"11. Contributing \u0026amp; License"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ecodex-java-sdk\u003c/h1\u003e\u003ca id=\"user-content-codex-java-sdk\" class=\"anchor\" aria-label=\"Permalink: codex-java-sdk\" href=\"#codex-java-sdk\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md\"\u003eEnglish\u003c/a\u003e | \u003ca href=\"/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/easy-4-java/codex-java-sdk\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/73c8af188f1d95f850ffe7f7dffd6e1d0e9c08e0f140b3ba3d63ffc9c37a1b77/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6176612d32312d6f72616e6765\" alt=\"Java\" data-canonical-src=\"https://img.shields.io/badge/Java-21-orange\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e \u003ca href=\"https://www.apache.org/licenses/LICENSE-2.0.txt\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a21a9e0b02a2eaf1910bbf168de84e00ae1eb7b0fde8c5ceec0e7caa61920adf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d677265656e\" alt=\"License\" data-canonical-src=\"https://img.shields.io/badge/license-Apache%202.0-green\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eJava SDK for the \u003ca href=\"https://github.com/openai/codex\"\u003eCodex CLI\u003c/a\u003e with two\nintegration routes: a subprocess wrapper that drives the local \u003ccode\u003ecodex\u003c/code\u003e\nagent (exec, interactive sessions, session resume / fork / archive, doctor,\nreview), and a JSON-RPC 2.0 over WebSocket client for a remote Codex\napp-server (\u003ccode\u003ethread/start\u003c/code\u003e → \u003ccode\u003eturn/start\u003c/code\u003e → notification stream).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTable of Contents\u003c/h2\u003e\u003ca id=\"user-content-table-of-contents\" class=\"anchor\" aria-label=\"Permalink: Table of Contents\" href=\"#table-of-contents\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#1-project-overview\"\u003e1. Project Overview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2-features--status\"\u003e2. Features \u0026amp; Status\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#3-requirements--compatibility\"\u003e3. Requirements \u0026amp; Compatibility\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#4-architecture--modules\"\u003e4. Architecture \u0026amp; Modules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#5-installation\"\u003e5. Installation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#6-quick-start\"\u003e6. Quick Start\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#7-configuration\"\u003e7. Configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#8-core-usage--api\"\u003e8. Core Usage / API\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#9-testing--build\"\u003e9. Testing \u0026amp; Build\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#10-versioning--branches\"\u003e10. Versioning \u0026amp; Branches\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#11-contributing--license\"\u003e11. Contributing \u0026amp; License\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1. Project Overview\u003c/h2\u003e\u003ca id=\"user-content-1-project-overview\" class=\"anchor\" aria-label=\"Permalink: 1. Project Overview\" href=\"#1-project-overview\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003ecodex-java-sdk\u003c/code\u003e lets Java applications integrate the\n\u003ca href=\"https://github.com/openai/codex\"\u003eCodex CLI\u003c/a\u003e agent (\u003ccode\u003ecodex\u003c/code\u003e) through two\nroutes. Neither route is a direct OpenAI API client.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eCLI route (local subprocess)\u003c/strong\u003e — every call maps to a real \u003ccode\u003ecodex\u003c/code\u003e\ncommand line invocation.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eApp-server route (remote long connection)\u003c/strong\u003e — a JSON-RPC 2.0 over\nWebSocket client for a running Codex app-server.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe SDK covers:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eExec mode\u003c/strong\u003e — \u003ccode\u003ecodex exec \u0026lt;prompt\u0026gt;\u003c/code\u003e with model, sandbox, JSONL output, web\nsearch, output files, output schema, images, config overrides and ephemeral runs.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInteractive sessions\u003c/strong\u003e — \u003ccode\u003ecodex [prompt]\u003c/code\u003e and full session lifecycle:\n\u003ccode\u003eresume\u003c/code\u003e / \u003ccode\u003eresumeLast\u003c/code\u003e / \u003ccode\u003efork\u003c/code\u003e / \u003ccode\u003earchive\u003c/code\u003e / \u003ccode\u003eunarchive\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eParsed models\u003c/strong\u003e — \u003ccode\u003eCodexEvent\u003c/code\u003e (JSONL events), \u003ccode\u003eCodexSession\u003c/code\u003e, \u003ccode\u003eCodexDoctorReport\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUtilities\u003c/strong\u003e — \u003ccode\u003edoctor\u003c/code\u003e, \u003ccode\u003ereview\u003c/code\u003e, \u003ccode\u003elogin\u003c/code\u003e / \u003ccode\u003elogout\u003c/code\u003e, MCP management, \u003ccode\u003eupdate\u003c/code\u003e,\n\u003ccode\u003efeatures\u003c/code\u003e, shell \u003ccode\u003ecompletion\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eApp-server WebSocket route\u003c/strong\u003e — \u003ccode\u003eCodexAppServerClient\u003c/code\u003e with per-turn\nconnections, \u003ccode\u003ethread/start\u003c/code\u003e / \u003ccode\u003ethread/resume\u003c/code\u003e reuse via a bounded\n\u003ccode\u003esessionKey → threadId\u003c/code\u003e LRU, streaming agent-message deltas and\n\u003ccode\u003eturn/completed\u003c/code\u003e finalization.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eWhat it is \u003cstrong\u003enot\u003c/strong\u003e:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eNot an OpenAI API client (no direct HTTP calls to the OpenAI API).\u003c/li\u003e\n\u003cli\u003eNot a replacement for the \u003ccode\u003ecodex\u003c/code\u003e binary — the CLI must be installed and runnable\n(local route), or a Codex app-server must be reachable (WebSocket route).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eTypical scenarios:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eScenario\u003c/th\u003e\n\u003cth align=\"left\"\u003eWhat you use\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eOne-shot coding task\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexClient.exec(prompt)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eMachine-readable event stream\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eexecAndParse(prompt)\u003c/code\u003e → \u003ccode\u003eList\u0026lt;CodexEvent\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eLong-running interactive agent\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003estartSession(prompt)\u003c/code\u003e / \u003ccode\u003eresumeSession(sessionId)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eReproduce a session in a sandbox\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eforkSession(sessionId)\u003c/code\u003e / \u003ccode\u003eexecResume(sessionId, prompt)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eEnvironment diagnostics\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edoctorSummary()\u003c/code\u003e / \u003ccode\u003edoctorJson()\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eRemote agent with session continuity\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexAppServerClient.runTurn(request)\u003c/code\u003e with \u003ccode\u003esessionKey\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2. Features \u0026amp; Status\u003c/h2\u003e\u003ca id=\"user-content-2-features--status\" class=\"anchor\" aria-label=\"Permalink: 2. Features \u0026amp; Status\" href=\"#2-features--status\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eCapability\u003c/th\u003e\n\u003cth align=\"left\"\u003eStatus\u003c/th\u003e\n\u003cth align=\"left\"\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ecodex exec\u003c/code\u003e non-interactive mode\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eexec\u003c/code\u003e, \u003ccode\u003eexec(model)\u003c/code\u003e, \u003ccode\u003eexec(ExecOptions)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eExec variants\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eexecInDir\u003c/code\u003e, \u003ccode\u003eexecEphemeral\u003c/code\u003e, \u003ccode\u003eexecWithSearch\u003c/code\u003e, \u003ccode\u003eexecToFile\u003c/code\u003e, \u003ccode\u003eexecWithSchema\u003c/code\u003e, \u003ccode\u003eexecWithImage\u003c/code\u003e, \u003ccode\u003eexecWithConfigOverrides\u003c/code\u003e, \u003ccode\u003eexecDangerously\u003c/code\u003e, \u003ccode\u003eexecBypassHookTrust\u003c/code\u003e, \u003ccode\u003eexecWithEnable\u003c/code\u003e / \u003ccode\u003eexecWithDisable\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eJSONL event parsing\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eexecAndParse(prompt)\u003c/code\u003e → \u003ccode\u003eList\u0026lt;CodexEvent\u0026gt;\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eInteractive sessions\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003estartSession()\u003c/code\u003e, \u003ccode\u003estartSession(prompt)\u003c/code\u003e, \u003ccode\u003estartSession(GlobalOptions, prompt)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eSession lifecycle\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eresumeSession\u003c/code\u003e, \u003ccode\u003eresumeLastSession\u003c/code\u003e, \u003ccode\u003eforkSession\u003c/code\u003e, \u003ccode\u003eforkLastSession\u003c/code\u003e, \u003ccode\u003earchiveSession\u003c/code\u003e, \u003ccode\u003eunarchiveSession\u003c/code\u003e, \u003ccode\u003eexecResume\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eDoctor \u0026amp; review\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edoctor\u003c/code\u003e, \u003ccode\u003edoctorJson\u003c/code\u003e, \u003ccode\u003edoctorSummary\u003c/code\u003e, \u003ccode\u003ereview\u003c/code\u003e, \u003ccode\u003ereviewCommit\u003c/code\u003e, \u003ccode\u003ereviewBase\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eAuth / MCP / misc\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003elogin\u003c/code\u003e, \u003ccode\u003eloginWithApiKey\u003c/code\u003e, \u003ccode\u003eloginWithAccessToken\u003c/code\u003e, \u003ccode\u003eloginDeviceAuth\u003c/code\u003e, \u003ccode\u003eloginStatus\u003c/code\u003e, \u003ccode\u003elogout\u003c/code\u003e, \u003ccode\u003emcpList\u003c/code\u003e / \u003ccode\u003emcpAdd\u003c/code\u003e / \u003ccode\u003emcpGet\u003c/code\u003e / \u003ccode\u003emcpRemove\u003c/code\u003e / \u003ccode\u003emcpLogin\u003c/code\u003e / \u003ccode\u003emcpLogout\u003c/code\u003e, \u003ccode\u003eupdate\u003c/code\u003e, \u003ccode\u003efeatures\u003c/code\u003e, \u003ccode\u003ecompletion\u003c/code\u003e, \u003ccode\u003eapp\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eSession admin\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003earchiveSession\u003c/code\u003e, \u003ccode\u003eunarchiveSession\u003c/code\u003e, \u003ccode\u003equeue\u003c/code\u003e, \u003ccode\u003edeleteSession\u003c/code\u003e, \u003ccode\u003edeleteSessionForce\u003c/code\u003e, \u003ccode\u003eagents\u003c/code\u003e, \u003ccode\u003emigrateRollouts\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eApp-server WebSocket route\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexAppServerClient.runTurn\u003c/code\u003e / \u003ccode\u003erunTurnAsync\u003c/code\u003e, \u003ccode\u003ethread/start\u003c/code\u003e / \u003ccode\u003ethread/resume\u003c/code\u003e, agent-message deltas, \u003ccode\u003esessionKey → threadId\u003c/code\u003e LRU (1000)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eApp-server protocol surface\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ethread/list\u003c/code\u003e / \u003ccode\u003eread\u003c/code\u003e / \u003ccode\u003efork\u003c/code\u003e / \u003ccode\u003earchive\u003c/code\u003e / \u003ccode\u003eunarchive\u003c/code\u003e / \u003ccode\u003edelete\u003c/code\u003e, \u003ccode\u003eturn/interrupt\u003c/code\u003e / \u003ccode\u003eturn/steer\u003c/code\u003e, \u003ccode\u003emodel/list\u003c/code\u003e-style escape hatch \u003ccode\u003eexecRpc\u003c/code\u003e; \u003ccode\u003eturnId\u003c/code\u003e exposed via \u003ccode\u003eonTurnStarted\u003c/code\u003e + \u003ccode\u003eAppServerTurnResult\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eCLI typed additions\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edebugModels(Bundled)\u003c/code\u003e / \u003ccode\u003edebugPromptInput\u003c/code\u003e, \u003ccode\u003emcpAddUrl(WithBearer)\u003c/code\u003e, \u003ccode\u003epluginAdd/List/Remove\u003c/code\u003e + \u003ccode\u003epluginMarketplace*\u003c/code\u003e, \u003ccode\u003ecloudExec\u003c/code\u003e / \u003ccode\u003ecloudList\u003c/code\u003e, \u003ccode\u003efeaturesEnable/Disable/List\u003c/code\u003e, \u003ccode\u003ereviewPrompt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eConfig model\u003c/td\u003e\n\u003ctd align=\"left\"\u003eActive development\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexClientConfig\u003c/code\u003e POJO (plain, Spring-bindable), \u003ccode\u003eCodexAppServerConfig\u003c/code\u003e POJO\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: \u003ccode\u003ecodex mcp-server\u003c/code\u003e was removed upstream — \u003ccode\u003eCodexClient.mcpServer()\u003c/code\u003e\nis deprecated in favour of \u003ccode\u003eappServer(...)\u003c/code\u003e. \u003ccode\u003eExecOptions\u003c/code\u003e additionally\nsupports \u003ccode\u003e--ignore-rules\u003c/code\u003e / \u003ccode\u003e--ignore-user-config\u003c/code\u003e, and \u003ccode\u003eGlobalOptions\u003c/code\u003e\nsupports \u003ccode\u003e--remote\u003c/code\u003e / \u003ccode\u003e--remote-auth-token-env\u003c/code\u003e for daemon-backed TUI runs.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAssumption\u003c/strong\u003e: the capability statuses above reflect the current state of\nthe active branch; the module is under active development.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3. Requirements \u0026amp; Compatibility\u003c/h2\u003e\u003ca id=\"user-content-3-requirements--compatibility\" class=\"anchor\" aria-label=\"Permalink: 3. Requirements \u0026amp; Compatibility\" href=\"#3-requirements--compatibility\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eRequirement\u003c/th\u003e\n\u003cth align=\"left\"\u003eVersion / Notes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eJDK\u003c/td\u003e\n\u003ctd align=\"left\"\u003e21+\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eMaven\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3.0+ (enforced; Maven Wrapper \u003ccode\u003e./mvnw\u003c/code\u003e included)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eCodex CLI\u003c/td\u003e\n\u003ctd align=\"left\"\u003eLocal route: \u003ccode\u003ecodex\u003c/code\u003e must be installed and available (\u003ccode\u003elocalExecutable\u003c/code\u003e configures the path)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eCodex app-server\u003c/td\u003e\n\u003ctd align=\"left\"\u003eWebSocket route only: a reachable app-server (\u003ccode\u003ebaseUrl\u003c/code\u003e accepts ws/wss/http/https)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: the app-server WebSocket route uses the JDK built-in\n\u003ccode\u003ejava.net.http.HttpClient\u003c/code\u003e (JDK 11+). It is available on the \u003ccode\u003efeature/2.0.x\u003c/code\u003e\nand \u003ccode\u003efeature/3.0.x\u003c/code\u003e lines; the \u003ccode\u003efeature/1.0.x\u003c/code\u003e (JDK 8) line ships the CLI\nroute only.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eVersion lines:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eBranch\u003c/th\u003e\n\u003cth align=\"left\"\u003eJDK\u003c/th\u003e\n\u003cth align=\"left\"\u003eVersion\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efeature/1.0.x\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e8\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e1.0.x.*\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efeature/2.0.x\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e17\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2.0.x.*\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efeature/3.0.x\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e21\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e3.0.x.*\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4. Architecture \u0026amp; Modules\u003c/h2\u003e\u003ca id=\"user-content-4-architecture--modules\" class=\"anchor\" aria-label=\"Permalink: 4. Architecture \u0026amp; Modules\" href=\"#4-architecture--modules\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"+------------------+   +---------------------------------------------+\n| Java application |   | codex-java-sdk                               |\n|                  |--\u0026gt;|  Route 1 (local): CodexClient (facade)       |\n| prompt / options |   |    | CodexCli (command mapping)             |\n|                  |   |    |   | CodexCliExecutor                   |\n|                  |   |    |   |   `codex` child process            |\n|                  |   |    |   CodexCliResult                       |\n|                  |   |  Route 2 (remote): CodexAppServerClient      |\n|                  |   |    | JSON-RPC 2.0 over WebSocket            |\n|                  |   |    | thread/start -\u0026gt; turn/start -\u0026gt; events   |\n|                  |   | CodexEvent/CodexSession/CodexDoctorReport    |\n+------------------+   +-------------------+-------------------------+\n                                           |\n                                           v\n                     +-------------------------------------------+\n                     | Local `codex` CLI (route 1) or remote     |\n                     | Codex app-server (route 2)                |\n                     +-------------------------------------------+\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003e+------------------+   +---------------------------------------------+\n| Java application |   | codex-java-sdk                               |\n|                  |--\u0026gt;|  Route 1 (local): CodexClient (facade)       |\n| prompt / options |   |    | CodexCli (command mapping)             |\n|                  |   |    |   | CodexCliExecutor                   |\n|                  |   |    |   |   `codex` child process            |\n|                  |   |    |   CodexCliResult                       |\n|                  |   |  Route 2 (remote): CodexAppServerClient      |\n|                  |   |    | JSON-RPC 2.0 over WebSocket            |\n|                  |   |    | thread/start -\u0026gt; turn/start -\u0026gt; events   |\n|                  |   | CodexEvent/CodexSession/CodexDoctorReport    |\n+------------------+   +-------------------+-------------------------+\n                                           |\n                                           v\n                     +-------------------------------------------+\n                     | Local `codex` CLI (route 1) or remote     |\n                     | Codex app-server (route 2)                |\n                     +-------------------------------------------+\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSingle-module Maven project (\u003ccode\u003epackaging: jar\u003c/code\u003e). No child modules.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eArtifact\u003c/th\u003e\n\u003cth align=\"left\"\u003eResponsibility\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eio.github.easy4j:codex-java-sdk\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCLI facade, command mapping, subprocess executor, WebSocket app-server client, results \u0026amp; parsed models\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eKey packages:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003ePackage\u003c/th\u003e\n\u003cth align=\"left\"\u003eContents\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eio.github.easy4j.codex\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexClient\u003c/code\u003e, \u003ccode\u003eCodexClientConfig\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eio.github.easy4j.codex.cli\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexCli\u003c/code\u003e, \u003ccode\u003eCodexCliExecutor\u003c/code\u003e, \u003ccode\u003eCodexCliResult\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eio.github.easy4j.codex.appserver\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexAppServerClient\u003c/code\u003e, \u003ccode\u003eCodexAppServerConfig\u003c/code\u003e, \u003ccode\u003eAppServerTurnRequest\u003c/code\u003e, \u003ccode\u003eAppServerTurnResult\u003c/code\u003e, \u003ccode\u003eThreadMappingCache\u003c/code\u003e, \u003ccode\u003eCodexAppServerException\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eio.github.easy4j.codex.model\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eCodexEvent\u003c/code\u003e, \u003ccode\u003eCodexSession\u003c/code\u003e, \u003ccode\u003eCodexDoctorReport\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e5. Installation\u003c/h2\u003e\u003ca id=\"user-content-5-installation\" class=\"anchor\" aria-label=\"Permalink: 5. Installation\" href=\"#5-installation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe project is \u003cstrong\u003enot yet published to Maven Central\u003c/strong\u003e. Snapshots/releases are\ndistributed through the Aliyun Maven repository and GitHub Releases.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMaven:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-text-xml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026lt;dependency\u0026gt;\n    \u0026lt;groupId\u0026gt;io.github.easy4j\u0026lt;/groupId\u0026gt;\n    \u0026lt;artifactId\u0026gt;codex-java-sdk\u0026lt;/artifactId\u0026gt;\n    \u0026lt;version\u0026gt;3.0.x.x.20260630-SNAPSHOT\u0026lt;/version\u0026gt;\n\u0026lt;/dependency\u0026gt;\"\u003e\u003cpre\u003e\u0026lt;\u003cspan class=\"pl-ent\"\u003edependency\u003c/span\u003e\u0026gt;\n    \u0026lt;\u003cspan class=\"pl-ent\"\u003egroupId\u003c/span\u003e\u0026gt;io.github.easy4j\u0026lt;/\u003cspan class=\"pl-ent\"\u003egroupId\u003c/span\u003e\u0026gt;\n    \u0026lt;\u003cspan class=\"pl-ent\"\u003eartifactId\u003c/span\u003e\u0026gt;codex-java-sdk\u0026lt;/\u003cspan class=\"pl-ent\"\u003eartifactId\u003c/span\u003e\u0026gt;\n    \u0026lt;\u003cspan class=\"pl-ent\"\u003eversion\u003c/span\u003e\u0026gt;3.0.x.x.20260630-SNAPSHOT\u0026lt;/\u003cspan class=\"pl-ent\"\u003eversion\u003c/span\u003e\u0026gt;\n\u0026lt;/\u003cspan class=\"pl-ent\"\u003edependency\u003c/span\u003e\u0026gt;\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eGradle:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-groovy notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"implementation 'io.github.easy4j:codex-java-sdk:3.0.x.x.20260630-SNAPSHOT'\"\u003e\u003cpre\u003eimplementation \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eio.github.easy4j:codex-java-sdk:3.0.x.x.20260630-SNAPSHOT\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e6. Quick Start\u003c/h2\u003e\u003ca id=\"user-content-6-quick-start\" class=\"anchor\" aria-label=\"Permalink: 6. Quick Start\" href=\"#6-quick-start\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import io.github.easy4j.codex.CodexClient;\nimport io.github.easy4j.codex.CodexClientConfig;\nimport io.github.easy4j.codex.cli.CodexCliResult;\n\npublic class CodexDemo {\n\n    public static void main(String[] args) {\n        CodexClientConfig config = new CodexClientConfig();\n        config.setLocalExecutable(\u0026quot;codex\u0026quot;);   // or an absolute path\n        config.setLocalTimeoutSeconds(600);\n\n        try (CodexClient client = new CodexClient(config)) {\n            CodexCliResult result = client.exec(\u0026quot;Write a Java hello world\u0026quot;);\n            System.out.println(\u0026quot;exit=\u0026quot; + result.getExitCode());\n            System.out.println(result.getStdout());\n        }\n    }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eCodexClient\u003c/span\u003e;\n\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eCodexClientConfig\u003c/span\u003e;\n\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecli\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eCodexCliResult\u003c/span\u003e;\n\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexDemo\u003c/span\u003e {\n\n    \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003estatic\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003emain\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e[] \u003cspan class=\"pl-s1\"\u003eargs\u003c/span\u003e) {\n        \u003cspan class=\"pl-smi\"\u003eCodexClientConfig\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexClientConfig\u003c/span\u003e();\n        \u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003esetLocalExecutable\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"codex\"\u003c/span\u003e);   \u003cspan class=\"pl-c\"\u003e// or an absolute path\u003c/span\u003e\n        \u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003esetLocalTimeoutSeconds\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e600\u003c/span\u003e);\n\n        \u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e (\u003cspan class=\"pl-smi\"\u003eCodexClient\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexClient\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e)) {\n            \u003cspan class=\"pl-smi\"\u003eCodexCliResult\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eexec\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Write a Java hello world\"\u003c/span\u003e);\n            \u003cspan class=\"pl-smi\"\u003eSystem\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eprintln\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"exit=\"\u003c/span\u003e + \u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetExitCode\u003c/span\u003e());\n            \u003cspan class=\"pl-smi\"\u003eSystem\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eprintln\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetStdout\u003c/span\u003e());\n        }\n    }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eExpected result: \u003ccode\u003ecodex exec \"Write a Java hello world\"\u003c/code\u003e runs locally;\n\u003ccode\u003eresult.getExitCode()\u003c/code\u003e is \u003ccode\u003e0\u003c/code\u003e on success and \u003ccode\u003eresult.getStdout()\u003c/code\u003e contains the\nagent's answer.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e7. Configuration\u003c/h2\u003e\u003ca id=\"user-content-7-configuration\" class=\"anchor\" aria-label=\"Permalink: 7. Configuration\" href=\"#7-configuration\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eCodexClientConfig\u003c/code\u003e is a plain POJO (Spring \u003ccode\u003e@ConfigurationProperties\u003c/code\u003e-bindable).\nThere is no configuration file of its own. Key fields:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eField\u003c/th\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eDefault\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003elocalExecutable\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ecodex\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCLI executable name or absolute path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003elocalTimeoutSeconds\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e600\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCommand execution timeout (seconds)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003elocalProbeTimeoutSeconds\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e5\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eTimeout for the CLI availability probe\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edefaultModel\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDefault model\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edefaultSandbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eSandbox mode (\u003ccode\u003eread-only\u003c/code\u003e, \u003ccode\u003eworkspace-write\u003c/code\u003e, \u003ccode\u003edanger-full-access\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edefaultApprovalPolicy\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eApproval policy (\u003ccode\u003euntrusted\u003c/code\u003e, \u003ccode\u003eon-request\u003c/code\u003e, \u003ccode\u003enever\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edefaultProfile\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDefault config profile\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eossProvider\u003c/code\u003e / \u003ccode\u003elocalProvider\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean / String\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOSS provider / local provider (\u003ccode\u003elmstudio\u003c/code\u003e, \u003ccode\u003eollama\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eskipGitRepoCheck\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eSkip git repo checks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eephemeral\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eEphemeral session (no persistence)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ejsonOutput\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eJSONL output\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eoutputSchema\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOutput schema file path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003esearch\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eEnable web search\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eimage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eImage file path\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003econfigOverrides\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString[]\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eConfig overrides (\u003ccode\u003e-c key=value\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eoutputFile\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOutput file path (\u003ccode\u003eoutput-last-message\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eworkingDir\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eWorking directory\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edangerouslyBypassApprovalsAndSandbox\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eSkip all approvals and sandbox (dangerous)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edangerouslyBypassHookTrust\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eSkip hook trust checks\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003estrictConfig\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eboolean\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eFail on unknown config fields\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eenable\u003c/code\u003e / \u003ccode\u003edisable\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString[]\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eFeatures to enable / disable\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e7.1 \u003ccode\u003eCodexAppServerConfig\u003c/code\u003e (app-server WebSocket route)\u003c/h3\u003e\u003ca id=\"user-content-71-codexappserverconfig-app-server-websocket-route\" class=\"anchor\" aria-label=\"Permalink: 7.1 CodexAppServerConfig (app-server WebSocket route)\" href=\"#71-codexappserverconfig-app-server-websocket-route\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUpgrade notes (3.0.x.x.20260630+)\u003c/strong\u003e: CLI-route arguments are now passed\nto the child process raw — multi-word prompts no longer arrive at \u003ccode\u003ecodex\u003c/code\u003e\nwrapped in embedded literal quotes. Non-zero CLI exits now preserve the real\nexit code and both captured streams instead of collapsing to \u003ccode\u003eexitCode=-1\u003c/code\u003e\nwith empty output. A bearer token over a plaintext \u003ccode\u003ews://\u003c/code\u003e connection logs a\nwarning; prefer \u003ccode\u003ewss://\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003ePlain POJO (Spring \u003ccode\u003e@ConfigurationProperties\u003c/code\u003e-bindable). Field names mirror the\ncommonly used \u003ccode\u003eCodexEndpoint\u003c/code\u003e binding:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eField\u003c/th\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eDefault\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ebaseUrl\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eApp-server base URL (\u003ccode\u003ews://\u003c/code\u003e/\u003ccode\u003ewss://\u003c/code\u003e as-is, \u003ccode\u003ehttp://\u003c/code\u003e/\u003ccode\u003ehttps://\u003c/code\u003e upgraded)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etoken\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eString\u003c/td\u003e\n\u003ctd align=\"left\"\u003e-\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBearer token sent as \u003ccode\u003eAuthorization: Bearer \u0026lt;token\u0026gt;\u003c/code\u003e on the handshake\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003econnectTimeoutMillis\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e5000\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eTCP/TLS + WebSocket handshake timeout\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ereadTimeoutMillis\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e120000\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUpper bound for a whole turn (connect → \u003ccode\u003eturn/completed\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003emaxSessionMappings\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e1000\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBound of the \u003ccode\u003esessionKey → threadId\u003c/code\u003e LRU; evicted sessions start fresh threads\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003emaxFrameChars\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e1048576\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eFrame accumulation hard cap; oversized server frames fail the turn (\u003ccode\u003e\u0026lt;= 0\u003c/code\u003e = unbounded)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003emaxContentChars\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eint\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e1048576\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePer-turn agent-message content cap; excess is truncated with a warning (\u003ccode\u003e\u0026lt;= 0\u003c/code\u003e = unbounded)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8. Core Usage / API\u003c/h2\u003e\u003ca id=\"user-content-8-core-usage--api\" class=\"anchor\" aria-label=\"Permalink: 8. Core Usage / API\" href=\"#8-core-usage--api\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8.1 JSONL events\u003c/h3\u003e\u003ca id=\"user-content-81-jsonl-events\" class=\"anchor\" aria-label=\"Permalink: 8.1 JSONL events\" href=\"#81-jsonl-events\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"try (CodexClient client = new CodexClient(config)) {\n    // codex exec --json \u0026lt;prompt\u0026gt;, parsed into typed events\n    List\u0026lt;CodexEvent\u0026gt; events = client.execAndParse(\u0026quot;Fix the failing test\u0026quot;);\n    events.forEach(event -\u0026gt; System.out.println(event.getType() + \u0026quot; -\u0026gt; \u0026quot; + event.getMessage()));\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e (\u003cspan class=\"pl-smi\"\u003eCodexClient\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexClient\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e)) {\n    \u003cspan class=\"pl-c\"\u003e// codex exec --json \u0026lt;prompt\u0026gt;, parsed into typed events\u003c/span\u003e\n    \u003cspan class=\"pl-smi\"\u003eList\u003c/span\u003e\u0026lt;\u003cspan class=\"pl-smi\"\u003eCodexEvent\u003c/span\u003e\u0026gt; \u003cspan class=\"pl-s1\"\u003eevents\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eexecAndParse\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Fix the failing test\"\u003c/span\u003e);\n    \u003cspan class=\"pl-s1\"\u003eevents\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eforEach\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e -\u0026gt; \u003cspan class=\"pl-smi\"\u003eSystem\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eprintln\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetType\u003c/span\u003e() + \u003cspan class=\"pl-s\"\u003e\" -\u0026gt; \"\u003c/span\u003e + \u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetMessage\u003c/span\u003e()));\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8.2 Session lifecycle\u003c/h3\u003e\u003ca id=\"user-content-82-session-lifecycle\" class=\"anchor\" aria-label=\"Permalink: 8.2 Session lifecycle\" href=\"#82-session-lifecycle\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"try (CodexClient client = new CodexClient(config)) {\n    client.exec(\u0026quot;first task\u0026quot;);                  // creates a persisted session\n    client.resumeSession(\u0026quot;session-id\u0026quot;);         // resume an interactive session\n    client.forkSession(\u0026quot;session-id\u0026quot;);           // fork into a new session\n    client.archiveSession(\u0026quot;session-id\u0026quot;);        // archive a session\n    client.execResume(\u0026quot;session-id\u0026quot;, \u0026quot;continue\u0026quot;);// non-interactive resume\n    client.doctorSummary();                     // environment diagnostics\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e (\u003cspan class=\"pl-smi\"\u003eCodexClient\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexClient\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e)) {\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eexec\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"first task\"\u003c/span\u003e);                  \u003cspan class=\"pl-c\"\u003e// creates a persisted session\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eresumeSession\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"session-id\"\u003c/span\u003e);         \u003cspan class=\"pl-c\"\u003e// resume an interactive session\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eforkSession\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"session-id\"\u003c/span\u003e);           \u003cspan class=\"pl-c\"\u003e// fork into a new session\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003earchiveSession\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"session-id\"\u003c/span\u003e);        \u003cspan class=\"pl-c\"\u003e// archive a session\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eexecResume\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"session-id\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"continue\"\u003c/span\u003e);\u003cspan class=\"pl-c\"\u003e// non-interactive resume\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003edoctorSummary\u003c/span\u003e();                     \u003cspan class=\"pl-c\"\u003e// environment diagnostics\u003c/span\u003e\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8.3 App-server WebSocket route (remote Codex)\u003c/h3\u003e\u003ca id=\"user-content-83-app-server-websocket-route-remote-codex\" class=\"anchor\" aria-label=\"Permalink: 8.3 App-server WebSocket route (remote Codex)\" href=\"#83-app-server-websocket-route-remote-codex\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import io.github.easy4j.codex.appserver.AppServerTurnRequest;\nimport io.github.easy4j.codex.appserver.AppServerTurnResult;\nimport io.github.easy4j.codex.appserver.CodexAppServerClient;\nimport io.github.easy4j.codex.appserver.CodexAppServerConfig;\n\nCodexAppServerConfig config = new CodexAppServerConfig();\nconfig.setBaseUrl(\u0026quot;ws://codex-host:8081\u0026quot;);   // http(s) is upgraded to ws(s) automatically\nconfig.setToken(\u0026quot;capability-token\u0026quot;);\nconfig.setReadTimeoutMillis(120_000);\n\ntry (CodexAppServerClient client = new CodexAppServerClient(config)) {\n    AppServerTurnResult result = client.runTurn(AppServerTurnRequest.builder()\n            .prompt(\u0026quot;Fix the failing test\u0026quot;)\n            .sessionKey(\u0026quot;chat-42\u0026quot;)                                  // enables thread/resume reuse\n            .onDelta(delta -\u0026gt; System.out.print(delta))              // agentMessage deltas, in order\n            .build());\n    System.out.println(result.getThreadId() + \u0026quot; -\u0026gt; \u0026quot; + result.getContent());\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eappserver\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eAppServerTurnRequest\u003c/span\u003e;\n\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eappserver\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eAppServerTurnResult\u003c/span\u003e;\n\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eappserver\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eCodexAppServerClient\u003c/span\u003e;\n\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eio\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003egithub\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eeasy4j\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ecodex\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eappserver\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eCodexAppServerConfig\u003c/span\u003e;\n\n\u003cspan class=\"pl-smi\"\u003eCodexAppServerConfig\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexAppServerConfig\u003c/span\u003e();\n\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003esetBaseUrl\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"ws://codex-host:8081\"\u003c/span\u003e);   \u003cspan class=\"pl-c\"\u003e// http(s) is upgraded to ws(s) automatically\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003esetToken\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"capability-token\"\u003c/span\u003e);\n\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003esetReadTimeoutMillis\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e120_000\u003c/span\u003e);\n\n\u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e (\u003cspan class=\"pl-smi\"\u003eCodexAppServerClient\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexAppServerClient\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e)) {\n    \u003cspan class=\"pl-smi\"\u003eAppServerTurnResult\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003erunTurn\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003eAppServerTurnRequest\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ebuilder\u003c/span\u003e()\n            .\u003cspan class=\"pl-en\"\u003eprompt\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Fix the failing test\"\u003c/span\u003e)\n            .\u003cspan class=\"pl-en\"\u003esessionKey\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"chat-42\"\u003c/span\u003e)                                  \u003cspan class=\"pl-c\"\u003e// enables thread/resume reuse\u003c/span\u003e\n            .\u003cspan class=\"pl-en\"\u003eonDelta\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003edelta\u003c/span\u003e -\u0026gt; \u003cspan class=\"pl-smi\"\u003eSystem\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003edelta\u003c/span\u003e))              \u003cspan class=\"pl-c\"\u003e// agentMessage deltas, in order\u003c/span\u003e\n            .\u003cspan class=\"pl-en\"\u003ebuild\u003c/span\u003e());\n    \u003cspan class=\"pl-smi\"\u003eSystem\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eout\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eprintln\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetThreadId\u003c/span\u003e() + \u003cspan class=\"pl-s\"\u003e\" -\u0026gt; \"\u003c/span\u003e + \u003cspan class=\"pl-s1\"\u003eresult\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetContent\u003c/span\u003e());\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8.4 App-server protocol operations\u003c/h3\u003e\u003ca id=\"user-content-84-app-server-protocol-operations\" class=\"anchor\" aria-label=\"Permalink: 8.4 App-server protocol operations\" href=\"#84-app-server-protocol-operations\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"try (CodexAppServerClient client = new CodexAppServerClient(config)) {\n    List\u0026lt;AppServerThread\u0026gt; threads = client.listThreads(20);\n    AppServerThread forked = client.forkThread(\u0026quot;th_123\u0026quot;);\n    client.steerTurn(\u0026quot;th_123\u0026quot;, \u0026quot;turn_9\u0026quot;, \u0026quot;也检查一下测试覆盖率\u0026quot;);   // redirect a running turn\n    client.interruptTurn(\u0026quot;th_123\u0026quot;, \u0026quot;turn_9\u0026quot;);                      // cancel a running turn\n    client.archiveThread(\u0026quot;th_123\u0026quot;);\n    String raw = client.execRpc(\u0026quot;model/list\u0026quot;, Map.of(\u0026quot;limit\u0026quot;, 10)); // escape hatch\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e (\u003cspan class=\"pl-smi\"\u003eCodexAppServerClient\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCodexAppServerClient\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003econfig\u003c/span\u003e)) {\n    \u003cspan class=\"pl-smi\"\u003eList\u003c/span\u003e\u0026lt;\u003cspan class=\"pl-smi\"\u003eAppServerThread\u003c/span\u003e\u0026gt; \u003cspan class=\"pl-s1\"\u003ethreads\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003elistThreads\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e20\u003c/span\u003e);\n    \u003cspan class=\"pl-smi\"\u003eAppServerThread\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eforked\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eforkThread\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"th_123\"\u003c/span\u003e);\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003esteerTurn\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"th_123\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"turn_9\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"也检查一下测试覆盖率\"\u003c/span\u003e);   \u003cspan class=\"pl-c\"\u003e// redirect a running turn\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003einterruptTurn\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"th_123\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"turn_9\"\u003c/span\u003e);                      \u003cspan class=\"pl-c\"\u003e// cancel a running turn\u003c/span\u003e\n    \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003earchiveThread\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"th_123\"\u003c/span\u003e);\n    \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eraw\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003eclient\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eexecRpc\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"model/list\"\u003c/span\u003e, \u003cspan class=\"pl-smi\"\u003eMap\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eof\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"limit\"\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e)); \u003cspan class=\"pl-c\"\u003e// escape hatch\u003c/span\u003e\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLifecycle calls run over a short-lived connection with the documented\ntolerant \u003ccode\u003einitialize\u003c/code\u003e handshake; thread state is server-side, so\n\u003ccode\u003esteerTurn\u003c/code\u003e / \u003ccode\u003einterruptTurn\u003c/code\u003e work while the original turn connection is\nstill streaming. Running turns expose their id via\n\u003ccode\u003eAppServerTurnRequest.onTurnStarted\u003c/code\u003e and \u003ccode\u003eAppServerTurnResult.getTurnId()\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe turn maps to \u003ccode\u003ethread/start\u003c/code\u003e (or \u003ccode\u003ethread/resume\u003c/code\u003e when \u003ccode\u003esessionKey\u003c/code\u003e already\nmaps to a thread id) → \u003ccode\u003eturn/start\u003c/code\u003e → \u003ccode\u003eitem/completed\u003c/code\u003e (only agent messages\nsurface) → \u003ccode\u003eturn/completed\u003c/code\u003e. Unknown notifications are logged at debug level\nand never interrupt the turn. Failures — connection, JSON-RPC error,\n\u003ccode\u003eturn/failed\u003c/code\u003e, \u003ccode\u003eerror\u003c/code\u003e, premature close or read timeout — surface as\n\u003ccode\u003eCodexAppServerException\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e9. Testing \u0026amp; Build\u003c/h2\u003e\u003ca id=\"user-content-9-testing--build\" class=\"anchor\" aria-label=\"Permalink: 9. Testing \u0026amp; Build\" href=\"#9-testing--build\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./mvnw clean verify\"\u003e\u003cpre\u003e./mvnw clean verify\u003c/pre\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eThe build is configured with the JaCoCo Maven plugin (report + \u003ccode\u003echeck\u003c/code\u003e goal with a\n90% line-coverage rule bound to the \u003ccode\u003everify\u003c/code\u003e phase; \u003ccode\u003ehaltOnFailure=false\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eThe active branch ships a full test suite (206 tests on \u003ccode\u003efeature/3.0.x\u003c/code\u003e), including\nend-to-end WebSocket contract tests against an in-process fake app-server.\u003c/li\u003e\n\u003cli\u003eCI workflow: \u003ccode\u003e.github/workflows/ci.yml\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e10. Versioning \u0026amp; Branches\u003c/h2\u003e\u003ca id=\"user-content-10-versioning--branches\" class=\"anchor\" aria-label=\"Permalink: 10. Versioning \u0026amp; Branches\" href=\"#10-versioning--branches\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eBranch\u003c/th\u003e\n\u003cth align=\"left\"\u003eJDK\u003c/th\u003e\n\u003cth align=\"left\"\u003eVersion\u003c/th\u003e\n\u003cth align=\"left\"\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efeature/1.0.x\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e8\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e1.0.x.*\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCurrent branch, JDK 8 baseline, active development\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efeature/2.0.x\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e17\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2.0.x.*\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eJDK 17 line\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efeature/3.0.x\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e21\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e3.0.x.*\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eJDK 21 line\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eMaintenance policy: the \u003ccode\u003e1.0.x\u003c/code\u003e line receives bug fixes and compatibility updates\nfor the JDK 8 baseline. New features targeting newer JDKs land on the \u003ccode\u003e2.0.x\u003c/code\u003e /\n\u003ccode\u003e3.0.x\u003c/code\u003e lines. Releases are published to the Aliyun Maven repository and as\nGitHub Releases; the project is not yet published to Maven Central.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e11. Contributing \u0026amp; License\u003c/h2\u003e\u003ca id=\"user-content-11-contributing--license\" class=\"anchor\" aria-label=\"Permalink: 11. Contributing \u0026amp; License\" href=\"#11-contributing--license\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eContributions are welcome — please open issues or pull requests on GitHub.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLicensed under the \u003ca href=\"https://www.apache.org/licenses/LICENSE-2.0.txt\" rel=\"nofollow\"\u003eApache License, Version 2.0\u003c/a\u003e.\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"codex-java-sdk","fully_qualified_name":"codex-java-sdk","kind":"section_1","ident_start":2,"ident_end":16,"extent_start":0,"extent_end":17591,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":16}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":356,"utf16_col":0}}},{"name":"Table of Contents","fully_qualified_name":"Table of Contents","kind":"section_2","ident_start":671,"ident_end":688,"extent_start":668,"extent_end":1217,"ident_utf16":{"start":{"line_number":12,"utf16_col":3},"end":{"line_number":12,"utf16_col":20}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":26,"utf16_col":0}}},{"name":"1. Project Overview","fully_qualified_name":"1. Project Overview","kind":"section_2","ident_start":1220,"ident_end":1239,"extent_start":1217,"extent_end":3227,"ident_utf16":{"start":{"line_number":26,"utf16_col":3},"end":{"line_number":26,"utf16_col":22}},"extent_utf16":{"start":{"line_number":26,"utf16_col":0},"end":{"line_number":68,"utf16_col":0}}},{"name":"2. Features \u0026 Status","fully_qualified_name":"2. Features \u0026 Status","kind":"section_2","ident_start":3230,"ident_end":3250,"extent_start":3227,"extent_end":5843,"ident_utf16":{"start":{"line_number":68,"utf16_col":3},"end":{"line_number":68,"utf16_col":23}},"extent_utf16":{"start":{"line_number":68,"utf16_col":0},"end":{"line_number":93,"utf16_col":0}}},{"name":"3. Requirements \u0026 Compatibility","fully_qualified_name":"3. Requirements \u0026 Compatibility","kind":"section_2","ident_start":5846,"ident_end":5877,"extent_start":5843,"extent_end":6632,"ident_utf16":{"start":{"line_number":93,"utf16_col":3},"end":{"line_number":93,"utf16_col":34}},"extent_utf16":{"start":{"line_number":93,"utf16_col":0},"end":{"line_number":115,"utf16_col":0}}},{"name":"4. Architecture \u0026 Modules","fully_qualified_name":"4. Architecture \u0026 Modules","kind":"section_2","ident_start":6635,"ident_end":6660,"extent_start":6632,"extent_end":8622,"ident_utf16":{"start":{"line_number":115,"utf16_col":3},"end":{"line_number":115,"utf16_col":28}},"extent_utf16":{"start":{"line_number":115,"utf16_col":0},"end":{"line_number":153,"utf16_col":0}}},{"name":"5. Installation","fully_qualified_name":"5. Installation","kind":"section_2","ident_start":8625,"ident_end":8640,"extent_start":8622,"extent_end":9069,"ident_utf16":{"start":{"line_number":153,"utf16_col":3},"end":{"line_number":153,"utf16_col":18}},"extent_utf16":{"start":{"line_number":153,"utf16_col":0},"end":{"line_number":174,"utf16_col":0}}},{"name":"6. Quick Start","fully_qualified_name":"6. Quick Start","kind":"section_2","ident_start":9072,"ident_end":9086,"extent_start":9069,"extent_end":9928,"ident_utf16":{"start":{"line_number":174,"utf16_col":3},"end":{"line_number":174,"utf16_col":17}},"extent_utf16":{"start":{"line_number":174,"utf16_col":0},"end":{"line_number":201,"utf16_col":0}}},{"name":"7. Configuration","fully_qualified_name":"7. Configuration","kind":"section_2","ident_start":9931,"ident_end":9947,"extent_start":9928,"extent_end":13133,"ident_utf16":{"start":{"line_number":201,"utf16_col":3},"end":{"line_number":201,"utf16_col":19}},"extent_utf16":{"start":{"line_number":201,"utf16_col":0},"end":{"line_number":252,"utf16_col":0}}},{"name":"7.1 `CodexAppServerConfig` (app-server WebSocket route)","fully_qualified_name":"7.1 `CodexAppServerConfig` (app-server WebSocket route)","kind":"section_3","ident_start":11694,"ident_end":11749,"extent_start":11690,"extent_end":13133,"ident_utf16":{"start":{"line_number":230,"utf16_col":4},"end":{"line_number":230,"utf16_col":59}},"extent_utf16":{"start":{"line_number":230,"utf16_col":0},"end":{"line_number":252,"utf16_col":0}}},{"name":"8. Core Usage / API","fully_qualified_name":"8. Core Usage / API","kind":"section_2","ident_start":13136,"ident_end":13155,"extent_start":13133,"extent_end":16363,"ident_utf16":{"start":{"line_number":252,"utf16_col":3},"end":{"line_number":252,"utf16_col":22}},"extent_utf16":{"start":{"line_number":252,"utf16_col":0},"end":{"line_number":326,"utf16_col":0}}},{"name":"8.1 JSONL events","fully_qualified_name":"8.1 JSONL events","kind":"section_3","ident_start":13161,"ident_end":13177,"extent_start":13157,"extent_end":13478,"ident_utf16":{"start":{"line_number":254,"utf16_col":4},"end":{"line_number":254,"utf16_col":20}},"extent_utf16":{"start":{"line_number":254,"utf16_col":0},"end":{"line_number":264,"utf16_col":0}}},{"name":"8.2 Session lifecycle","fully_qualified_name":"8.2 Session lifecycle","kind":"section_3","ident_start":13482,"ident_end":13503,"extent_start":13478,"extent_end":14026,"ident_utf16":{"start":{"line_number":264,"utf16_col":4},"end":{"line_number":264,"utf16_col":25}},"extent_utf16":{"start":{"line_number":264,"utf16_col":0},"end":{"line_number":277,"utf16_col":0}}},{"name":"8.3 App-server WebSocket route (remote Codex)","fully_qualified_name":"8.3 App-server WebSocket route (remote Codex)","kind":"section_3","ident_start":14030,"ident_end":14075,"extent_start":14026,"extent_end":15059,"ident_utf16":{"start":{"line_number":277,"utf16_col":4},"end":{"line_number":277,"utf16_col":49}},"extent_utf16":{"start":{"line_number":277,"utf16_col":0},"end":{"line_number":300,"utf16_col":0}}},{"name":"8.4 App-server protocol operations","fully_qualified_name":"8.4 App-server protocol operations","kind":"section_3","ident_start":15063,"ident_end":15097,"extent_start":15059,"extent_end":16363,"ident_utf16":{"start":{"line_number":300,"utf16_col":4},"end":{"line_number":300,"utf16_col":38}},"extent_utf16":{"start":{"line_number":300,"utf16_col":0},"end":{"line_number":326,"utf16_col":0}}},{"name":"9. Testing \u0026 Build","fully_qualified_name":"9. Testing \u0026 Build","kind":"section_2","ident_start":16366,"ident_end":16384,"extent_start":16363,"extent_end":16789,"ident_utf16":{"start":{"line_number":326,"utf16_col":3},"end":{"line_number":326,"utf16_col":21}},"extent_utf16":{"start":{"line_number":326,"utf16_col":0},"end":{"line_number":338,"utf16_col":0}}},{"name":"10. Versioning \u0026 Branches","fully_qualified_name":"10. Versioning \u0026 Branches","kind":"section_2","ident_start":16792,"ident_end":16817,"extent_start":16789,"extent_end":17383,"ident_utf16":{"start":{"line_number":338,"utf16_col":3},"end":{"line_number":338,"utf16_col":28}},"extent_utf16":{"start":{"line_number":338,"utf16_col":0},"end":{"line_number":351,"utf16_col":0}}},{"name":"11. Contributing \u0026 License","fully_qualified_name":"11. Contributing \u0026 License","kind":"section_2","ident_start":17386,"ident_end":17412,"extent_start":17383,"extent_end":17591,"ident_utf16":{"start":{"line_number":351,"utf16_col":3},"end":{"line_number":351,"utf16_col":29}},"extent_utf16":{"start":{"line_number":351,"utf16_col":0},"end":{"line_number":356,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1261770013,"defaultBranch":"feature/1.0.x","name":"codex-java-sdk","ownerLogin":"easy-4-java","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-06-07T05:59:36.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/307692851?v=4","public":true,"private":false,"isOrgOwned":true,"isArchived":false},"currentUser":null,"uploadToken":"Tql5KhQ134ZiXqCpbdQRw6OgyyRjIof5zNzn7IKRIl6KwOndWdrN3IfneUm4UT_F-q8IexZA2ZuBk4yuwuIdqw","allShortcutsEnabled":false,"treeExpanded":true,"path":"README.md","symbolsExpanded":false,"refInfo":{"name":"feature/1.0.x","listCacheKey":"v0:1789647581.0","canEdit":false,"currentOid":"f1e94598bb5e87fea59384c8a80db01abaf02fb1"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":".mvn","path":".mvn","contentType":"directory"},{"name":"maven","path":"maven","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"README.zh-CN.md","path":"README.zh-CN.md","contentType":"file"},{"name":"mvnw","path":"mvnw","contentType":"file"},{"name":"mvnw.cmd","path":"mvnw.cmd","contentType":"file"},{"name":"pom.xml","path":"pom.xml","contentType":"file"}],"totalCount":10}},"fileTreeProcessingTime":60.045821,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"feature/1.0.x","listCacheKey":"v0:1789647581.0","canEdit":false,"refType":"branch","currentOid":"f1e94598bb5e87fea59384c8a80db01abaf02fb1","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"README.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/easy-4-java/codex-java-sdk/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"README.md","displayUrl":"https://github.com/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md?raw=true","headerInfo":{"blobSize":"17.2 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"eb9b980","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Feasy-4-java%2Fcodex-java-sdk%2Fblob%2Ffeature%2F1.0.x%2FREADME.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"356","truncatedSloc":"286"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/easy-4-java/codex-java-sdk/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/easy-4-java/codex-java-sdk/raw/refs/heads/feature/1.0.x/README.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":"/easy-4-java/.github/blob/f59832c18bb17bb89833528be85ebcf0f9c3b28c/.github/FUNDING.yml","showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["# codex-java-sdk","","[English](./README.md) | [简体中文](./README.zh-CN.md)","","[![Java](https://img.shields.io/badge/Java-21-orange)](https://github.com/easy-4-java/codex-java-sdk) [![License](https://img.shields.io/badge/license-Apache%202.0-green)](https://www.apache.org/licenses/LICENSE-2.0.txt)","","\u003e Java SDK for the [Codex CLI](https://github.com/openai/codex) with two","\u003e integration routes: a subprocess wrapper that drives the local `codex`","\u003e agent (exec, interactive sessions, session resume / fork / archive, doctor,","\u003e review), and a JSON-RPC 2.0 over WebSocket client for a remote Codex","\u003e app-server (`thread/start` → `turn/start` → notification stream).","","## Table of Contents","","- [1. Project Overview](#1-project-overview)","- [2. Features \u0026 Status](#2-features--status)","- [3. Requirements \u0026 Compatibility](#3-requirements--compatibility)","- [4. Architecture \u0026 Modules](#4-architecture--modules)","- [5. Installation](#5-installation)","- [6. Quick Start](#6-quick-start)","- [7. Configuration](#7-configuration)","- [8. Core Usage / API](#8-core-usage--api)","- [9. Testing \u0026 Build](#9-testing--build)","- [10. Versioning \u0026 Branches](#10-versioning--branches)","- [11. Contributing \u0026 License](#11-contributing--license)","","## 1. Project Overview","","`codex-java-sdk` lets Java applications integrate the","[Codex CLI](https://github.com/openai/codex) agent (`codex`) through two","routes. Neither route is a direct OpenAI API client.","","- **CLI route (local subprocess)** — every call maps to a real `codex`","  command line invocation.","- **App-server route (remote long connection)** — a JSON-RPC 2.0 over","  WebSocket client for a running Codex app-server.","","The SDK covers:","","- **Exec mode** — `codex exec \u003cprompt\u003e` with model, sandbox, JSONL output, web","  search, output files, output schema, images, config overrides and ephemeral runs.","- **Interactive sessions** — `codex [prompt]` and full session lifecycle:","  `resume` / `resumeLast` / `fork` / `archive` / `unarchive`.","- **Parsed models** — `CodexEvent` (JSONL events), `CodexSession`, `CodexDoctorReport`.","- **Utilities** — `doctor`, `review`, `login` / `logout`, MCP management, `update`,","  `features`, shell `completion`.","- **App-server WebSocket route** — `CodexAppServerClient` with per-turn","  connections, `thread/start` / `thread/resume` reuse via a bounded","  `sessionKey → threadId` LRU, streaming agent-message deltas and","  `turn/completed` finalization.","","What it is **not**:","","- Not an OpenAI API client (no direct HTTP calls to the OpenAI API).","- Not a replacement for the `codex` binary — the CLI must be installed and runnable","  (local route), or a Codex app-server must be reachable (WebSocket route).","","Typical scenarios:","","| Scenario | What you use |","| :--- | :--- |","| One-shot coding task | `CodexClient.exec(prompt)` |","| Machine-readable event stream | `execAndParse(prompt)` → `List\u003cCodexEvent\u003e` |","| Long-running interactive agent | `startSession(prompt)` / `resumeSession(sessionId)` |","| Reproduce a session in a sandbox | `forkSession(sessionId)` / `execResume(sessionId, prompt)` |","| Environment diagnostics | `doctorSummary()` / `doctorJson()` |","| Remote agent with session continuity | `CodexAppServerClient.runTurn(request)` with `sessionKey` |","","## 2. Features \u0026 Status","","| Capability | Status | Notes |","| :--- | :--- | :--- |","| `codex exec` non-interactive mode | Active development | `exec`, `exec(model)`, `exec(ExecOptions)` |","| Exec variants | Active development | `execInDir`, `execEphemeral`, `execWithSearch`, `execToFile`, `execWithSchema`, `execWithImage`, `execWithConfigOverrides`, `execDangerously`, `execBypassHookTrust`, `execWithEnable` / `execWithDisable` |","| JSONL event parsing | Active development | `execAndParse(prompt)` → `List\u003cCodexEvent\u003e` |","| Interactive sessions | Active development | `startSession()`, `startSession(prompt)`, `startSession(GlobalOptions, prompt)` |","| Session lifecycle | Active development | `resumeSession`, `resumeLastSession`, `forkSession`, `forkLastSession`, `archiveSession`, `unarchiveSession`, `execResume` |","| Doctor \u0026 review | Active development | `doctor`, `doctorJson`, `doctorSummary`, `review`, `reviewCommit`, `reviewBase` |","| Auth / MCP / misc | Active development | `login`, `loginWithApiKey`, `loginWithAccessToken`, `loginDeviceAuth`, `loginStatus`, `logout`, `mcpList` / `mcpAdd` / `mcpGet` / `mcpRemove` / `mcpLogin` / `mcpLogout`, `update`, `features`, `completion`, `app` |","| Session admin | Active development | `archiveSession`, `unarchiveSession`, `queue`, `deleteSession`, `deleteSessionForce`, `agents`, `migrateRollouts` |","| App-server WebSocket route | Active development | `CodexAppServerClient.runTurn` / `runTurnAsync`, `thread/start` / `thread/resume`, agent-message deltas, `sessionKey → threadId` LRU (1000) |","| App-server protocol surface | Active development | `thread/list` / `read` / `fork` / `archive` / `unarchive` / `delete`, `turn/interrupt` / `turn/steer`, `model/list`-style escape hatch `execRpc`; `turnId` exposed via `onTurnStarted` + `AppServerTurnResult` |","| CLI typed additions | Active development | `debugModels(Bundled)` / `debugPromptInput`, `mcpAddUrl(WithBearer)`, `pluginAdd/List/Remove` + `pluginMarketplace*`, `cloudExec` / `cloudList`, `featuresEnable/Disable/List`, `reviewPrompt` |","| Config model | Active development | `CodexClientConfig` POJO (plain, Spring-bindable), `CodexAppServerConfig` POJO |","","\u003e **Note**: `codex mcp-server` was removed upstream — `CodexClient.mcpServer()`","\u003e is deprecated in favour of `appServer(...)`. `ExecOptions` additionally","\u003e supports `--ignore-rules` / `--ignore-user-config`, and `GlobalOptions`","\u003e supports `--remote` / `--remote-auth-token-env` for daemon-backed TUI runs.","","\u003e **Assumption**: the capability statuses above reflect the current state of","\u003e the active branch; the module is under active development.","","## 3. Requirements \u0026 Compatibility","","| Requirement | Version / Notes |","| :--- | :--- |","| JDK | 21+ |","| Maven | 3.0+ (enforced; Maven Wrapper `./mvnw` included) |","| Codex CLI | Local route: `codex` must be installed and available (`localExecutable` configures the path) |","| Codex app-server | WebSocket route only: a reachable app-server (`baseUrl` accepts ws/wss/http/https) |","","\u003e **Note**: the app-server WebSocket route uses the JDK built-in","\u003e `java.net.http.HttpClient` (JDK 11+). It is available on the `feature/2.0.x`","\u003e and `feature/3.0.x` lines; the `feature/1.0.x` (JDK 8) line ships the CLI","\u003e route only.","","Version lines:","","| Branch | JDK | Version |","| :--- | :--- | :--- |","| `feature/1.0.x` | 8 | `1.0.x.*` |","| `feature/2.0.x` | 17 | `2.0.x.*` |","| `feature/3.0.x` | 21 | `3.0.x.*` |","","## 4. Architecture \u0026 Modules","","```text","+------------------+   +---------------------------------------------+","| Java application |   | codex-java-sdk                               |","|                  |--\u003e|  Route 1 (local): CodexClient (facade)       |","| prompt / options |   |    | CodexCli (command mapping)             |","|                  |   |    |   | CodexCliExecutor                   |","|                  |   |    |   |   `codex` child process            |","|                  |   |    |   CodexCliResult                       |","|                  |   |  Route 2 (remote): CodexAppServerClient      |","|                  |   |    | JSON-RPC 2.0 over WebSocket            |","|                  |   |    | thread/start -\u003e turn/start -\u003e events   |","|                  |   | CodexEvent/CodexSession/CodexDoctorReport    |","+------------------+   +-------------------+-------------------------+","                                           |","                                           v","                     +-------------------------------------------+","                     | Local `codex` CLI (route 1) or remote     |","                     | Codex app-server (route 2)                |","                     +-------------------------------------------+","```","","Single-module Maven project (`packaging: jar`). No child modules.","","| Artifact | Responsibility |","| :--- | :--- |","| `io.github.easy4j:codex-java-sdk` | CLI facade, command mapping, subprocess executor, WebSocket app-server client, results \u0026 parsed models |","","Key packages:","","| Package | Contents |","| :--- | :--- |","| `io.github.easy4j.codex` | `CodexClient`, `CodexClientConfig` |","| `io.github.easy4j.codex.cli` | `CodexCli`, `CodexCliExecutor`, `CodexCliResult` |","| `io.github.easy4j.codex.appserver` | `CodexAppServerClient`, `CodexAppServerConfig`, `AppServerTurnRequest`, `AppServerTurnResult`, `ThreadMappingCache`, `CodexAppServerException` |","| `io.github.easy4j.codex.model` | `CodexEvent`, `CodexSession`, `CodexDoctorReport` |","","## 5. Installation","","The project is **not yet published to Maven Central**. Snapshots/releases are","distributed through the Aliyun Maven repository and GitHub Releases.","","Maven:","","```xml","\u003cdependency\u003e","    \u003cgroupId\u003eio.github.easy4j\u003c/groupId\u003e","    \u003cartifactId\u003ecodex-java-sdk\u003c/artifactId\u003e","    \u003cversion\u003e3.0.x.x.20260630-SNAPSHOT\u003c/version\u003e","\u003c/dependency\u003e","```","","Gradle:","","```groovy","implementation 'io.github.easy4j:codex-java-sdk:3.0.x.x.20260630-SNAPSHOT'","```","","## 6. Quick Start","","```java","import io.github.easy4j.codex.CodexClient;","import io.github.easy4j.codex.CodexClientConfig;","import io.github.easy4j.codex.cli.CodexCliResult;","","public class CodexDemo {","","    public static void main(String[] args) {","        CodexClientConfig config = new CodexClientConfig();","        config.setLocalExecutable(\"codex\");   // or an absolute path","        config.setLocalTimeoutSeconds(600);","","        try (CodexClient client = new CodexClient(config)) {","            CodexCliResult result = client.exec(\"Write a Java hello world\");","            System.out.println(\"exit=\" + result.getExitCode());","            System.out.println(result.getStdout());","        }","    }","}","```","","Expected result: `codex exec \"Write a Java hello world\"` runs locally;","`result.getExitCode()` is `0` on success and `result.getStdout()` contains the","agent's answer.","","## 7. Configuration","","`CodexClientConfig` is a plain POJO (Spring `@ConfigurationProperties`-bindable).","There is no configuration file of its own. Key fields:","","| Field | Type | Default | Description |","| :--- | :--- | :--- | :--- |","| `localExecutable` | String | `codex` | CLI executable name or absolute path |","| `localTimeoutSeconds` | int | `600` | Command execution timeout (seconds) |","| `localProbeTimeoutSeconds` | int | `5` | Timeout for the CLI availability probe |","| `defaultModel` | String | - | Default model |","| `defaultSandbox` | String | - | Sandbox mode (`read-only`, `workspace-write`, `danger-full-access`) |","| `defaultApprovalPolicy` | String | - | Approval policy (`untrusted`, `on-request`, `never`) |","| `defaultProfile` | String | - | Default config profile |","| `ossProvider` / `localProvider` | boolean / String | - | OSS provider / local provider (`lmstudio`, `ollama`) |","| `skipGitRepoCheck` | boolean | `false` | Skip git repo checks |","| `ephemeral` | boolean | `false` | Ephemeral session (no persistence) |","| `jsonOutput` | boolean | `true` | JSONL output |","| `outputSchema` | String | - | Output schema file path |","| `search` | boolean | `false` | Enable web search |","| `image` | String | - | Image file path |","| `configOverrides` | String[] | - | Config overrides (`-c key=value`) |","| `outputFile` | String | - | Output file path (`output-last-message`) |","| `workingDir` | String | - | Working directory |","| `dangerouslyBypassApprovalsAndSandbox` | boolean | `false` | Skip all approvals and sandbox (dangerous) |","| `dangerouslyBypassHookTrust` | boolean | `false` | Skip hook trust checks |","| `strictConfig` | boolean | `false` | Fail on unknown config fields |","| `enable` / `disable` | String[] | - | Features to enable / disable |","","### 7.1 `CodexAppServerConfig` (app-server WebSocket route)","","\u003e **Upgrade notes (3.0.x.x.20260630+)**: CLI-route arguments are now passed","\u003e to the child process raw — multi-word prompts no longer arrive at `codex`","\u003e wrapped in embedded literal quotes. Non-zero CLI exits now preserve the real","\u003e exit code and both captured streams instead of collapsing to `exitCode=-1`","\u003e with empty output. A bearer token over a plaintext `ws://` connection logs a","\u003e warning; prefer `wss://`.","","Plain POJO (Spring `@ConfigurationProperties`-bindable). Field names mirror the","commonly used `CodexEndpoint` binding:","","| Field | Type | Default | Description |","| :--- | :--- | :--- | :--- |","| `baseUrl` | String | - | App-server base URL (`ws://`/`wss://` as-is, `http://`/`https://` upgraded) |","| `token` | String | - | Bearer token sent as `Authorization: Bearer \u003ctoken\u003e` on the handshake |","| `connectTimeoutMillis` | int | `5000` | TCP/TLS + WebSocket handshake timeout |","| `readTimeoutMillis` | int | `120000` | Upper bound for a whole turn (connect → `turn/completed`) |","| `maxSessionMappings` | int | `1000` | Bound of the `sessionKey → threadId` LRU; evicted sessions start fresh threads |","| `maxFrameChars` | int | `1048576` | Frame accumulation hard cap; oversized server frames fail the turn (`\u003c= 0` = unbounded) |","| `maxContentChars` | int | `1048576` | Per-turn agent-message content cap; excess is truncated with a warning (`\u003c= 0` = unbounded) |","","## 8. Core Usage / API","","### 8.1 JSONL events","","```java","try (CodexClient client = new CodexClient(config)) {","    // codex exec --json \u003cprompt\u003e, parsed into typed events","    List\u003cCodexEvent\u003e events = client.execAndParse(\"Fix the failing test\");","    events.forEach(event -\u003e System.out.println(event.getType() + \" -\u003e \" + event.getMessage()));","}","```","","### 8.2 Session lifecycle","","```java","try (CodexClient client = new CodexClient(config)) {","    client.exec(\"first task\");                  // creates a persisted session","    client.resumeSession(\"session-id\");         // resume an interactive session","    client.forkSession(\"session-id\");           // fork into a new session","    client.archiveSession(\"session-id\");        // archive a session","    client.execResume(\"session-id\", \"continue\");// non-interactive resume","    client.doctorSummary();                     // environment diagnostics","}","```","","### 8.3 App-server WebSocket route (remote Codex)","","```java","import io.github.easy4j.codex.appserver.AppServerTurnRequest;","import io.github.easy4j.codex.appserver.AppServerTurnResult;","import io.github.easy4j.codex.appserver.CodexAppServerClient;","import io.github.easy4j.codex.appserver.CodexAppServerConfig;","","CodexAppServerConfig config = new CodexAppServerConfig();","config.setBaseUrl(\"ws://codex-host:8081\");   // http(s) is upgraded to ws(s) automatically","config.setToken(\"capability-token\");","config.setReadTimeoutMillis(120_000);","","try (CodexAppServerClient client = new CodexAppServerClient(config)) {","    AppServerTurnResult result = client.runTurn(AppServerTurnRequest.builder()","            .prompt(\"Fix the failing test\")","            .sessionKey(\"chat-42\")                                  // enables thread/resume reuse","            .onDelta(delta -\u003e System.out.print(delta))              // agentMessage deltas, in order","            .build());","    System.out.println(result.getThreadId() + \" -\u003e \" + result.getContent());","}","```","","### 8.4 App-server protocol operations","","```java","try (CodexAppServerClient client = new CodexAppServerClient(config)) {","    List\u003cAppServerThread\u003e threads = client.listThreads(20);","    AppServerThread forked = client.forkThread(\"th_123\");","    client.steerTurn(\"th_123\", \"turn_9\", \"也检查一下测试覆盖率\");   // redirect a running turn","    client.interruptTurn(\"th_123\", \"turn_9\");                      // cancel a running turn","    client.archiveThread(\"th_123\");","    String raw = client.execRpc(\"model/list\", Map.of(\"limit\", 10)); // escape hatch","}","```","","Lifecycle calls run over a short-lived connection with the documented","tolerant `initialize` handshake; thread state is server-side, so","`steerTurn` / `interruptTurn` work while the original turn connection is","still streaming. Running turns expose their id via","`AppServerTurnRequest.onTurnStarted` and `AppServerTurnResult.getTurnId()`.","","The turn maps to `thread/start` (or `thread/resume` when `sessionKey` already","maps to a thread id) → `turn/start` → `item/completed` (only agent messages","surface) → `turn/completed`. Unknown notifications are logged at debug level","and never interrupt the turn. Failures — connection, JSON-RPC error,","`turn/failed`, `error`, premature close or read timeout — surface as","`CodexAppServerException`.","","## 9. Testing \u0026 Build","","```bash","./mvnw clean verify","```","","- The build is configured with the JaCoCo Maven plugin (report + `check` goal with a","  90% line-coverage rule bound to the `verify` phase; `haltOnFailure=false`).","- The active branch ships a full test suite (206 tests on `feature/3.0.x`), including","  end-to-end WebSocket contract tests against an in-process fake app-server.","- CI workflow: `.github/workflows/ci.yml`.","","## 10. Versioning \u0026 Branches","","| Branch | JDK | Version | Notes |","| :--- | :--- | :--- | :--- |","| `feature/1.0.x` | 8 | `1.0.x.*` | Current branch, JDK 8 baseline, active development |","| `feature/2.0.x` | 17 | `2.0.x.*` | JDK 17 line |","| `feature/3.0.x` | 21 | `3.0.x.*` | JDK 21 line |","","Maintenance policy: the `1.0.x` line receives bug fixes and compatibility updates","for the JDK 8 baseline. New features targeting newer JDKs land on the `2.0.x` /","`3.0.x` lines. Releases are published to the Aliyun Maven repository and as","GitHub Releases; the project is not yet published to Maven Central.","","## 11. Contributing \u0026 License","","Contributions are welcome — please open issues or pull requests on GitHub.","","Licensed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)."],"stylingDirectives":[[[0,16,"pl-mh"],[2,16,"pl-en"]],[],[[0,1,"pl-s"],[8,9,"pl-s"],[9,10,"pl-s"],[10,21,"pl-corl"],[21,22,"pl-s"],[25,26,"pl-s"],[30,31,"pl-s"],[31,32,"pl-s"],[32,49,"pl-corl"],[49,50,"pl-s"]],[],[[0,1,"pl-s"],[1,3,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,52,"pl-corl"],[52,54,"pl-s"],[54,55,"pl-s"],[55,100,"pl-corl"],[100,101,"pl-s"],[102,103,"pl-s"],[103,105,"pl-s"],[112,113,"pl-s"],[113,114,"pl-s"],[114,169,"pl-corl"],[169,171,"pl-s"],[171,172,"pl-s"],[172,219,"pl-corl"],[219,220,"pl-s"]],[],[[0,72,"pl-ent"],[0,2,"pl-ent"],[19,20,"pl-s"],[29,30,"pl-s"],[30,31,"pl-s"],[31,62,"pl-corl"],[62,63,"pl-s"]],[[0,72,"pl-ent"],[0,2,"pl-ent"],[65,66,"pl-s"],[66,71,"pl-c1"],[71,72,"pl-s"]],[[0,77,"pl-ent"],[0,2,"pl-ent"]],[[0,70,"pl-ent"],[0,2,"pl-ent"]],[[0,67,"pl-ent"],[0,2,"pl-ent"],[14,15,"pl-s"],[15,27,"pl-c1"],[27,28,"pl-s"],[31,32,"pl-s"],[32,42,"pl-c1"],[42,43,"pl-s"]],[[0,0,"pl-ent"]],[[0,20,"pl-mh"],[3,20,"pl-en"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[22,23,"pl-s"],[23,24,"pl-s"],[24,43,"pl-corl"],[43,44,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[23,24,"pl-s"],[24,25,"pl-s"],[25,44,"pl-corl"],[44,45,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[34,35,"pl-s"],[35,36,"pl-s"],[36,66,"pl-corl"],[66,67,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[28,29,"pl-s"],[29,30,"pl-s"],[30,54,"pl-corl"],[54,55,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[18,19,"pl-s"],[19,20,"pl-s"],[20,35,"pl-corl"],[35,36,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,33,"pl-corl"],[33,34,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[19,20,"pl-s"],[20,21,"pl-s"],[21,37,"pl-corl"],[37,38,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[22,23,"pl-s"],[23,24,"pl-s"],[24,42,"pl-corl"],[42,43,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[21,22,"pl-s"],[22,23,"pl-s"],[23,40,"pl-corl"],[40,41,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[28,29,"pl-s"],[29,30,"pl-s"],[30,54,"pl-corl"],[54,55,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[29,30,"pl-s"],[30,31,"pl-s"],[31,56,"pl-corl"],[56,57,"pl-s"]],[],[[0,22,"pl-mh"],[3,22,"pl-en"]],[],[[0,1,"pl-s"],[1,15,"pl-c1"],[15,16,"pl-s"]],[[0,1,"pl-s"],[10,11,"pl-s"],[11,12,"pl-s"],[12,43,"pl-corl"],[43,44,"pl-s"],[52,53,"pl-s"],[53,58,"pl-c1"],[58,59,"pl-s"]],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[32,34,"pl-s"],[63,64,"pl-s"],[64,69,"pl-c1"],[69,70,"pl-s"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[45,47,"pl-s"]],[],[],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[13,15,"pl-s"],[18,19,"pl-s"],[19,38,"pl-c1"],[38,39,"pl-s"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[24,26,"pl-s"],[29,30,"pl-s"],[30,44,"pl-c1"],[44,45,"pl-s"]],[[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[13,14,"pl-s"],[14,24,"pl-c1"],[24,25,"pl-s"],[28,29,"pl-s"],[29,33,"pl-c1"],[33,34,"pl-s"],[37,38,"pl-s"],[38,45,"pl-c1"],[45,46,"pl-s"],[49,50,"pl-s"],[50,59,"pl-c1"],[59,60,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[17,19,"pl-s"],[22,23,"pl-s"],[23,33,"pl-c1"],[33,34,"pl-s"],[51,52,"pl-s"],[52,64,"pl-c1"],[64,65,"pl-s"],[67,68,"pl-s"],[68,85,"pl-c1"],[85,86,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[13,15,"pl-s"],[18,19,"pl-s"],[19,25,"pl-c1"],[25,26,"pl-s"],[28,29,"pl-s"],[29,35,"pl-c1"],[35,36,"pl-s"],[38,39,"pl-s"],[39,44,"pl-c1"],[44,45,"pl-s"],[48,49,"pl-s"],[49,55,"pl-c1"],[55,56,"pl-s"],[74,75,"pl-s"],[75,81,"pl-c1"],[81,82,"pl-s"]],[[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[20,21,"pl-s"],[21,31,"pl-c1"],[31,32,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[30,32,"pl-s"],[35,36,"pl-s"],[36,56,"pl-c1"],[56,57,"pl-s"]],[[15,16,"pl-s"],[16,28,"pl-c1"],[28,29,"pl-s"],[32,33,"pl-s"],[33,46,"pl-c1"],[46,47,"pl-s"]],[[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"]],[[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"]],[],[[11,13,"pl-s"],[16,18,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"],[28,29,"pl-s"],[29,34,"pl-c1"],[34,35,"pl-s"]],[],[],[],[],[[0,1,"pl-ml"],[11,12,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,50,"pl-c1"],[50,51,"pl-s"],[52,53,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[34,35,"pl-s"],[35,55,"pl-c1"],[55,56,"pl-s"],[59,60,"pl-s"],[60,76,"pl-c1"],[76,77,"pl-s"],[78,79,"pl-ml"]],[[0,1,"pl-ml"],[33,34,"pl-ml"],[35,36,"pl-s"],[36,56,"pl-c1"],[56,57,"pl-s"],[60,61,"pl-s"],[61,85,"pl-c1"],[85,86,"pl-s"],[87,88,"pl-ml"]],[[0,1,"pl-ml"],[35,36,"pl-ml"],[37,38,"pl-s"],[38,60,"pl-c1"],[60,61,"pl-s"],[64,65,"pl-s"],[65,94,"pl-c1"],[94,95,"pl-s"],[96,97,"pl-ml"]],[[0,1,"pl-ml"],[26,27,"pl-ml"],[28,29,"pl-s"],[29,44,"pl-c1"],[44,45,"pl-s"],[48,49,"pl-s"],[49,61,"pl-c1"],[61,62,"pl-s"],[63,64,"pl-ml"]],[[0,1,"pl-ml"],[39,40,"pl-ml"],[41,42,"pl-s"],[42,79,"pl-c1"],[79,80,"pl-s"],[86,87,"pl-s"],[87,97,"pl-c1"],[97,98,"pl-s"],[99,100,"pl-ml"]],[],[[0,23,"pl-mh"],[3,23,"pl-en"]],[],[[0,1,"pl-ml"],[13,14,"pl-ml"],[22,23,"pl-ml"],[30,31,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"],[21,22,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[36,37,"pl-ml"],[57,58,"pl-ml"],[59,60,"pl-s"],[60,64,"pl-c1"],[64,65,"pl-s"],[67,68,"pl-s"],[68,79,"pl-c1"],[79,80,"pl-s"],[82,83,"pl-s"],[83,100,"pl-c1"],[100,101,"pl-s"],[102,103,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,49,"pl-c1"],[49,50,"pl-s"],[52,53,"pl-s"],[53,66,"pl-c1"],[66,67,"pl-s"],[69,70,"pl-s"],[70,84,"pl-c1"],[84,85,"pl-s"],[87,88,"pl-s"],[88,98,"pl-c1"],[98,99,"pl-s"],[101,102,"pl-s"],[102,116,"pl-c1"],[116,117,"pl-s"],[119,120,"pl-s"],[120,133,"pl-c1"],[133,134,"pl-s"],[136,137,"pl-s"],[137,160,"pl-c1"],[160,161,"pl-s"],[163,164,"pl-s"],[164,179,"pl-c1"],[179,180,"pl-s"],[182,183,"pl-s"],[183,202,"pl-c1"],[202,203,"pl-s"],[205,206,"pl-s"],[206,220,"pl-c1"],[220,221,"pl-s"],[224,225,"pl-s"],[225,240,"pl-c1"],[240,241,"pl-s"],[242,243,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[43,44,"pl-ml"],[45,46,"pl-s"],[46,66,"pl-c1"],[66,67,"pl-s"],[70,71,"pl-s"],[71,87,"pl-c1"],[87,88,"pl-s"],[89,90,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[44,45,"pl-ml"],[46,47,"pl-s"],[47,61,"pl-c1"],[61,62,"pl-s"],[64,65,"pl-s"],[65,85,"pl-c1"],[85,86,"pl-s"],[88,89,"pl-s"],[89,124,"pl-c1"],[124,125,"pl-s"],[126,127,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[41,42,"pl-ml"],[43,44,"pl-s"],[44,57,"pl-c1"],[57,58,"pl-s"],[60,61,"pl-s"],[61,78,"pl-c1"],[78,79,"pl-s"],[81,82,"pl-s"],[82,93,"pl-c1"],[93,94,"pl-s"],[96,97,"pl-s"],[97,112,"pl-c1"],[112,113,"pl-s"],[115,116,"pl-s"],[116,130,"pl-c1"],[130,131,"pl-s"],[133,134,"pl-s"],[134,150,"pl-c1"],[150,151,"pl-s"],[153,154,"pl-s"],[154,164,"pl-c1"],[164,165,"pl-s"],[166,167,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-ml"],[39,40,"pl-ml"],[41,42,"pl-s"],[42,48,"pl-c1"],[48,49,"pl-s"],[51,52,"pl-s"],[52,62,"pl-c1"],[62,63,"pl-s"],[65,66,"pl-s"],[66,79,"pl-c1"],[79,80,"pl-s"],[82,83,"pl-s"],[83,89,"pl-c1"],[89,90,"pl-s"],[92,93,"pl-s"],[93,105,"pl-c1"],[105,106,"pl-s"],[108,109,"pl-s"],[109,119,"pl-c1"],[119,120,"pl-s"],[121,122,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[41,42,"pl-ml"],[43,44,"pl-s"],[44,49,"pl-c1"],[49,50,"pl-s"],[52,53,"pl-s"],[53,68,"pl-c1"],[68,69,"pl-s"],[71,72,"pl-s"],[72,92,"pl-c1"],[92,93,"pl-s"],[95,96,"pl-s"],[96,111,"pl-c1"],[111,112,"pl-s"],[114,115,"pl-s"],[115,126,"pl-c1"],[126,127,"pl-s"],[129,130,"pl-s"],[130,136,"pl-c1"],[136,137,"pl-s"],[139,140,"pl-s"],[140,147,"pl-c1"],[147,148,"pl-s"],[151,152,"pl-s"],[152,158,"pl-c1"],[158,159,"pl-s"],[162,163,"pl-s"],[163,169,"pl-c1"],[169,170,"pl-s"],[173,174,"pl-s"],[174,183,"pl-c1"],[183,184,"pl-s"],[187,188,"pl-s"],[188,196,"pl-c1"],[196,197,"pl-s"],[200,201,"pl-s"],[201,210,"pl-c1"],[210,211,"pl-s"],[213,214,"pl-s"],[214,220,"pl-c1"],[220,221,"pl-s"],[223,224,"pl-s"],[224,232,"pl-c1"],[232,233,"pl-s"],[235,236,"pl-s"],[236,246,"pl-c1"],[246,247,"pl-s"],[249,250,"pl-s"],[250,253,"pl-c1"],[253,254,"pl-s"],[255,256,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,54,"pl-c1"],[54,55,"pl-s"],[57,58,"pl-s"],[58,74,"pl-c1"],[74,75,"pl-s"],[77,78,"pl-s"],[78,83,"pl-c1"],[83,84,"pl-s"],[86,87,"pl-s"],[87,100,"pl-c1"],[100,101,"pl-s"],[103,104,"pl-s"],[104,122,"pl-c1"],[122,123,"pl-s"],[125,126,"pl-s"],[126,132,"pl-c1"],[132,133,"pl-s"],[135,136,"pl-s"],[136,151,"pl-c1"],[151,152,"pl-s"],[153,154,"pl-ml"]],[[0,1,"pl-ml"],[29,30,"pl-ml"],[50,51,"pl-ml"],[52,53,"pl-s"],[53,81,"pl-c1"],[81,82,"pl-s"],[85,86,"pl-s"],[86,98,"pl-c1"],[98,99,"pl-s"],[101,102,"pl-s"],[102,114,"pl-c1"],[114,115,"pl-s"],[118,119,"pl-s"],[119,132,"pl-c1"],[132,133,"pl-s"],[157,158,"pl-s"],[158,179,"pl-c1"],[179,180,"pl-s"],[192,193,"pl-ml"]],[[0,1,"pl-ml"],[30,31,"pl-ml"],[51,52,"pl-ml"],[53,54,"pl-s"],[54,65,"pl-c1"],[65,66,"pl-s"],[69,70,"pl-s"],[70,74,"pl-c1"],[74,75,"pl-s"],[78,79,"pl-s"],[79,83,"pl-c1"],[83,84,"pl-s"],[87,88,"pl-s"],[88,95,"pl-c1"],[95,96,"pl-s"],[99,100,"pl-s"],[100,109,"pl-c1"],[109,110,"pl-s"],[113,114,"pl-s"],[114,120,"pl-c1"],[120,121,"pl-s"],[123,124,"pl-s"],[124,138,"pl-c1"],[138,139,"pl-s"],[142,143,"pl-s"],[143,153,"pl-c1"],[153,154,"pl-s"],[156,157,"pl-s"],[157,167,"pl-c1"],[167,168,"pl-s"],[188,189,"pl-s"],[189,196,"pl-c1"],[196,197,"pl-s"],[199,200,"pl-s"],[200,206,"pl-c1"],[206,207,"pl-s"],[220,221,"pl-s"],[221,234,"pl-c1"],[234,235,"pl-s"],[238,239,"pl-s"],[239,258,"pl-c1"],[258,259,"pl-s"],[260,261,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[43,44,"pl-ml"],[45,46,"pl-s"],[46,66,"pl-c1"],[66,67,"pl-s"],[70,71,"pl-s"],[71,87,"pl-c1"],[87,88,"pl-s"],[90,91,"pl-s"],[91,112,"pl-c1"],[112,113,"pl-s"],[115,116,"pl-s"],[116,137,"pl-c1"],[137,138,"pl-s"],[141,142,"pl-s"],[142,160,"pl-c1"],[160,161,"pl-s"],[163,164,"pl-s"],[164,173,"pl-c1"],[173,174,"pl-s"],[177,178,"pl-s"],[178,187,"pl-c1"],[187,188,"pl-s"],[190,191,"pl-s"],[191,218,"pl-c1"],[218,219,"pl-s"],[221,222,"pl-s"],[222,234,"pl-c1"],[234,235,"pl-s"],[236,237,"pl-ml"]],[[0,1,"pl-ml"],[15,16,"pl-ml"],[36,37,"pl-ml"],[38,39,"pl-s"],[39,56,"pl-c1"],[56,57,"pl-s"],[89,90,"pl-s"],[90,110,"pl-c1"],[110,111,"pl-s"],[117,118,"pl-ml"]],[],[[0,79,"pl-ent"],[0,2,"pl-ent"],[2,4,"pl-s"],[8,10,"pl-s"],[12,13,"pl-s"],[13,29,"pl-c1"],[29,30,"pl-s"],[54,55,"pl-s"],[55,78,"pl-c1"],[78,79,"pl-s"]],[[0,73,"pl-ent"],[0,2,"pl-ent"],[29,30,"pl-s"],[30,44,"pl-c1"],[44,45,"pl-s"],[47,48,"pl-s"],[48,59,"pl-c1"],[59,60,"pl-s"]],[[0,73,"pl-ent"],[0,2,"pl-ent"],[11,12,"pl-s"],[12,26,"pl-c1"],[26,27,"pl-s"],[30,31,"pl-s"],[31,51,"pl-c1"],[51,52,"pl-s"],[58,59,"pl-s"],[59,72,"pl-c1"],[72,73,"pl-s"]],[[0,77,"pl-ent"],[0,2,"pl-ent"],[11,12,"pl-s"],[12,20,"pl-c1"],[20,21,"pl-s"],[24,25,"pl-s"],[25,48,"pl-c1"],[48,49,"pl-s"]],[[0,0,"pl-ent"]],[[0,76,"pl-ent"],[0,2,"pl-ent"],[2,4,"pl-s"],[14,16,"pl-s"]],[[0,60,"pl-ent"],[0,2,"pl-ent"]],[[0,0,"pl-ent"]],[[0,34,"pl-mh"],[3,34,"pl-en"]],[],[[0,1,"pl-ml"],[14,15,"pl-ml"],[32,33,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"]],[[0,1,"pl-ml"],[6,7,"pl-ml"],[12,13,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[40,41,"pl-s"],[41,47,"pl-c1"],[47,48,"pl-s"],[59,60,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[27,28,"pl-s"],[28,33,"pl-c1"],[33,34,"pl-s"],[68,69,"pl-s"],[69,84,"pl-c1"],[84,85,"pl-s"],[107,108,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[67,68,"pl-s"],[68,75,"pl-c1"],[75,76,"pl-s"],[104,105,"pl-ml"]],[],[[0,64,"pl-ent"],[0,2,"pl-ent"],[2,4,"pl-s"],[8,10,"pl-s"]],[[0,78,"pl-ent"],[0,2,"pl-ent"],[2,3,"pl-s"],[3,27,"pl-c1"],[27,28,"pl-s"],[63,64,"pl-s"],[64,77,"pl-c1"],[77,78,"pl-s"]],[[0,75,"pl-ent"],[0,2,"pl-ent"],[6,7,"pl-s"],[7,20,"pl-c1"],[20,21,"pl-s"],[33,34,"pl-s"],[34,47,"pl-c1"],[47,48,"pl-s"]],[[0,13,"pl-ent"],[0,2,"pl-ent"]],[[0,0,"pl-ent"]],[],[],[[0,1,"pl-ml"],[9,10,"pl-ml"],[15,16,"pl-ml"],[25,26,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"],[21,22,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,32,"pl-c1"],[32,33,"pl-s"],[34,35,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,33,"pl-c1"],[33,34,"pl-s"],[35,36,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,33,"pl-c1"],[33,34,"pl-s"],[35,36,"pl-ml"]],[],[[0,28,"pl-mh"],[3,28,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,70,"pl-c1"]],[[0,71,"pl-c1"]],[[0,71,"pl-c1"]],[[0,70,"pl-c1"]],[[0,70,"pl-c1"]],[[0,70,"pl-c1"]],[[0,70,"pl-c1"]],[[0,71,"pl-c1"]],[[0,70,"pl-c1"]],[[0,70,"pl-c1"]],[[0,71,"pl-c1"]],[[0,70,"pl-c1"]],[[0,44,"pl-c1"]],[[0,44,"pl-c1"]],[[0,66,"pl-c1"]],[[0,66,"pl-c1"]],[[0,66,"pl-c1"]],[[0,66,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[29,30,"pl-s"],[30,44,"pl-c1"],[44,45,"pl-s"]],[],[[0,1,"pl-ml"],[11,12,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,34,"pl-c1"],[34,35,"pl-s"],[36,37,"pl-ml"],[141,142,"pl-ml"]],[],[],[],[[0,1,"pl-ml"],[10,11,"pl-ml"],[21,22,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,25,"pl-c1"],[25,26,"pl-s"],[27,28,"pl-ml"],[29,30,"pl-s"],[30,41,"pl-c1"],[41,42,"pl-s"],[44,45,"pl-s"],[45,62,"pl-c1"],[62,63,"pl-s"],[64,65,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[31,32,"pl-ml"],[33,34,"pl-s"],[34,42,"pl-c1"],[42,43,"pl-s"],[45,46,"pl-s"],[46,62,"pl-c1"],[62,63,"pl-s"],[65,66,"pl-s"],[66,80,"pl-c1"],[80,81,"pl-s"],[82,83,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,60,"pl-c1"],[60,61,"pl-s"],[63,64,"pl-s"],[64,84,"pl-c1"],[84,85,"pl-s"],[87,88,"pl-s"],[88,108,"pl-c1"],[108,109,"pl-s"],[111,112,"pl-s"],[112,131,"pl-c1"],[131,132,"pl-s"],[134,135,"pl-s"],[135,153,"pl-c1"],[153,154,"pl-s"],[156,157,"pl-s"],[157,180,"pl-c1"],[180,181,"pl-s"],[182,183,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,31,"pl-c1"],[31,32,"pl-s"],[33,34,"pl-ml"],[35,36,"pl-s"],[36,46,"pl-c1"],[46,47,"pl-s"],[49,50,"pl-s"],[50,62,"pl-c1"],[62,63,"pl-s"],[65,66,"pl-s"],[66,83,"pl-c1"],[83,84,"pl-s"],[85,86,"pl-ml"]],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[15,17,"pl-s"],[51,53,"pl-s"]],[],[],[],[],[[0,3,"pl-s"],[3,6,"pl-en"]],[[1,11,"pl-ent"]],[[5,12,"pl-ent"],[31,38,"pl-ent"]],[[5,15,"pl-ent"],[32,42,"pl-ent"]],[[5,12,"pl-ent"],[40,47,"pl-ent"]],[[2,12,"pl-ent"]],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,9,"pl-en"],[9,9,"pl-c1"]],[[0,74,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,17,"pl-mh"],[3,17,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,6,"pl-k"],[7,41,"pl-smi"]],[[0,6,"pl-k"],[7,47,"pl-smi"]],[[0,6,"pl-k"],[7,48,"pl-smi"]],[],[[0,6,"pl-k"],[7,12,"pl-k"],[13,22,"pl-en"]],[],[[4,10,"pl-k"],[11,17,"pl-k"],[18,22,"pl-k"],[23,27,"pl-en"],[28,34,"pl-k"],[37,41,"pl-v"]],[[8,25,"pl-smi"],[33,34,"pl-k"],[35,38,"pl-k"],[39,56,"pl-smi"]],[[14,15,"pl-k"],[34,41,"pl-s"],[34,35,"pl-pds"],[40,41,"pl-pds"],[46,68,"pl-c"],[46,48,"pl-c"]],[[14,15,"pl-k"],[38,41,"pl-c1"]],[],[[8,11,"pl-k"],[13,24,"pl-smi"],[32,33,"pl-k"],[34,37,"pl-k"],[38,49,"pl-smi"]],[[12,26,"pl-smi"],[34,35,"pl-k"],[42,43,"pl-k"],[48,74,"pl-s"],[48,49,"pl-pds"],[73,74,"pl-pds"]],[[12,18,"pl-smi"],[18,19,"pl-k"],[22,23,"pl-k"],[31,38,"pl-s"],[31,32,"pl-pds"],[37,38,"pl-pds"],[39,40,"pl-k"],[47,48,"pl-k"]],[[12,18,"pl-smi"],[18,19,"pl-k"],[22,23,"pl-k"],[37,38,"pl-k"]],[],[],[],[[0,3,"pl-s"]],[],[[17,18,"pl-s"],[18,55,"pl-c1"],[55,56,"pl-s"]],[[0,1,"pl-s"],[1,21,"pl-c1"],[21,22,"pl-s"],[26,27,"pl-s"],[27,28,"pl-c1"],[28,29,"pl-s"],[45,46,"pl-s"],[46,64,"pl-c1"],[64,65,"pl-s"]],[],[],[[0,19,"pl-mh"],[3,19,"pl-en"]],[],[[0,1,"pl-s"],[1,18,"pl-c1"],[18,19,"pl-s"],[44,45,"pl-s"],[45,69,"pl-c1"],[69,70,"pl-s"]],[],[],[[0,1,"pl-ml"],[8,9,"pl-ml"],[15,16,"pl-ml"],[25,26,"pl-ml"],[39,40,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"],[21,22,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[20,21,"pl-ml"],[29,30,"pl-ml"],[31,32,"pl-s"],[32,37,"pl-c1"],[37,38,"pl-s"],[39,40,"pl-ml"],[78,79,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,22,"pl-c1"],[22,23,"pl-s"],[24,25,"pl-ml"],[30,31,"pl-ml"],[32,33,"pl-s"],[33,36,"pl-c1"],[36,37,"pl-s"],[38,39,"pl-ml"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,27,"pl-c1"],[27,28,"pl-s"],[29,30,"pl-ml"],[35,36,"pl-ml"],[37,38,"pl-s"],[38,39,"pl-c1"],[39,40,"pl-s"],[41,42,"pl-ml"],[82,83,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[17,18,"pl-ml"],[26,27,"pl-ml"],[30,31,"pl-ml"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[19,20,"pl-ml"],[28,29,"pl-ml"],[32,33,"pl-ml"],[48,49,"pl-s"],[49,58,"pl-c1"],[58,59,"pl-s"],[61,62,"pl-s"],[62,77,"pl-c1"],[77,78,"pl-s"],[80,81,"pl-s"],[81,99,"pl-c1"],[99,100,"pl-s"],[102,103,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"],[26,27,"pl-ml"],[35,36,"pl-ml"],[39,40,"pl-ml"],[58,59,"pl-s"],[59,68,"pl-c1"],[68,69,"pl-s"],[71,72,"pl-s"],[72,82,"pl-c1"],[82,83,"pl-s"],[85,86,"pl-s"],[86,91,"pl-c1"],[91,92,"pl-s"],[94,95,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[19,20,"pl-ml"],[28,29,"pl-ml"],[32,33,"pl-ml"],[57,58,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"],[18,19,"pl-s"],[19,32,"pl-c1"],[32,33,"pl-s"],[34,35,"pl-ml"],[53,54,"pl-ml"],[57,58,"pl-ml"],[90,91,"pl-s"],[91,99,"pl-c1"],[99,100,"pl-s"],[102,103,"pl-s"],[103,109,"pl-c1"],[109,110,"pl-s"],[112,113,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[21,22,"pl-ml"],[31,32,"pl-ml"],[33,34,"pl-s"],[34,39,"pl-c1"],[39,40,"pl-s"],[41,42,"pl-ml"],[64,65,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[14,15,"pl-ml"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,32,"pl-c1"],[32,33,"pl-s"],[34,35,"pl-ml"],[71,72,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[15,16,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[28,32,"pl-c1"],[32,33,"pl-s"],[34,35,"pl-ml"],[49,50,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[17,18,"pl-ml"],[26,27,"pl-ml"],[30,31,"pl-ml"],[56,57,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[11,12,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,29,"pl-c1"],[29,30,"pl-s"],[31,32,"pl-ml"],[51,52,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[10,11,"pl-ml"],[19,20,"pl-ml"],[23,24,"pl-ml"],[41,42,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[20,21,"pl-ml"],[28,29,"pl-s"],[29,30,"pl-s"],[31,32,"pl-ml"],[35,36,"pl-ml"],[55,56,"pl-s"],[56,68,"pl-c1"],[68,69,"pl-s"],[71,72,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[15,16,"pl-ml"],[24,25,"pl-ml"],[28,29,"pl-ml"],[48,49,"pl-s"],[49,68,"pl-c1"],[68,69,"pl-s"],[71,72,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[15,16,"pl-ml"],[24,25,"pl-ml"],[28,29,"pl-ml"],[48,49,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,39,"pl-c1"],[39,40,"pl-s"],[41,42,"pl-ml"],[51,52,"pl-ml"],[53,54,"pl-s"],[54,59,"pl-c1"],[59,60,"pl-s"],[61,62,"pl-ml"],[106,107,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[31,32,"pl-ml"],[41,42,"pl-ml"],[43,44,"pl-s"],[44,49,"pl-c1"],[49,50,"pl-s"],[51,52,"pl-ml"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[17,18,"pl-ml"],[27,28,"pl-ml"],[29,30,"pl-s"],[30,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"],[69,70,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[13,14,"pl-s"],[14,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[31,32,"pl-s"],[32,33,"pl-s"],[34,35,"pl-ml"],[38,39,"pl-ml"],[69,70,"pl-ml"]],[],[[0,59,"pl-mh"],[4,59,"pl-en"],[8,9,"pl-s"],[9,29,"pl-c1"],[29,30,"pl-s"]],[],[[0,75,"pl-ent"],[0,2,"pl-ent"],[2,4,"pl-s"],[37,39,"pl-s"]],[[0,75,"pl-ent"],[0,2,"pl-ent"],[68,69,"pl-s"],[69,74,"pl-c1"],[74,75,"pl-s"]],[[0,78,"pl-ent"],[0,2,"pl-ent"]],[[0,76,"pl-ent"],[0,2,"pl-ent"],[63,64,"pl-s"],[64,75,"pl-c1"],[75,76,"pl-s"]],[[0,78,"pl-ent"],[0,2,"pl-ent"],[53,54,"pl-s"],[54,59,"pl-c1"],[59,60,"pl-s"]],[[0,27,"pl-ent"],[0,2,"pl-ent"],[18,19,"pl-s"],[19,25,"pl-c1"],[25,26,"pl-s"]],[[0,0,"pl-ent"]],[[19,20,"pl-s"],[20,44,"pl-c1"],[44,45,"pl-s"]],[[14,15,"pl-s"],[15,28,"pl-c1"],[28,29,"pl-s"]],[],[[0,1,"pl-ml"],[8,9,"pl-ml"],[15,16,"pl-ml"],[25,26,"pl-ml"],[39,40,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"],[21,22,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[12,13,"pl-ml"],[21,22,"pl-ml"],[25,26,"pl-ml"],[48,49,"pl-s"],[49,54,"pl-c1"],[54,55,"pl-s"],[56,57,"pl-s"],[57,63,"pl-c1"],[63,64,"pl-s"],[72,73,"pl-s"],[73,80,"pl-c1"],[80,81,"pl-s"],[82,83,"pl-s"],[83,91,"pl-c1"],[91,92,"pl-s"],[103,104,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[10,11,"pl-ml"],[19,20,"pl-ml"],[23,24,"pl-ml"],[46,47,"pl-s"],[47,76,"pl-c1"],[76,77,"pl-s"],[95,96,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,23,"pl-c1"],[23,24,"pl-s"],[25,26,"pl-ml"],[31,32,"pl-ml"],[33,34,"pl-s"],[34,38,"pl-c1"],[38,39,"pl-s"],[40,41,"pl-ml"],[80,81,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"],[22,23,"pl-ml"],[28,29,"pl-ml"],[30,31,"pl-s"],[31,37,"pl-c1"],[37,38,"pl-s"],[39,40,"pl-ml"],[81,82,"pl-s"],[82,96,"pl-c1"],[96,97,"pl-s"],[99,100,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[29,30,"pl-ml"],[31,32,"pl-s"],[32,36,"pl-c1"],[36,37,"pl-s"],[38,39,"pl-ml"],[53,54,"pl-s"],[54,75,"pl-c1"],[75,76,"pl-s"],[119,120,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,34,"pl-c1"],[34,35,"pl-s"],[36,37,"pl-ml"],[106,107,"pl-s"],[107,111,"pl-c1"],[111,112,"pl-s"],[126,127,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[20,21,"pl-ml"],[26,27,"pl-ml"],[28,29,"pl-s"],[29,36,"pl-c1"],[36,37,"pl-s"],[38,39,"pl-ml"],[112,113,"pl-s"],[113,117,"pl-c1"],[117,118,"pl-s"],[132,133,"pl-ml"]],[],[[0,22,"pl-mh"],[3,22,"pl-en"]],[],[[0,20,"pl-mh"],[4,20,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,3,"pl-k"],[5,16,"pl-smi"],[24,25,"pl-k"],[26,29,"pl-k"],[30,41,"pl-smi"]],[[4,59,"pl-c"],[4,6,"pl-c"]],[[4,20,"pl-k"],[9,19,"pl-smi"],[28,29,"pl-k"],[36,37,"pl-k"],[50,72,"pl-s"],[50,51,"pl-pds"],[71,72,"pl-pds"]],[[10,11,"pl-k"],[25,26,"pl-k"],[26,27,"pl-k"],[28,34,"pl-smi"],[34,35,"pl-k"],[38,39,"pl-k"],[52,53,"pl-k"],[63,64,"pl-k"],[65,71,"pl-s"],[65,66,"pl-pds"],[70,71,"pl-pds"],[72,73,"pl-k"],[79,80,"pl-k"]],[],[[0,3,"pl-s"]],[],[[0,25,"pl-mh"],[4,25,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,3,"pl-k"],[5,16,"pl-smi"],[24,25,"pl-k"],[26,29,"pl-k"],[30,41,"pl-smi"]],[[10,11,"pl-k"],[16,28,"pl-s"],[16,17,"pl-pds"],[27,28,"pl-pds"],[48,78,"pl-c"],[48,50,"pl-c"]],[[10,11,"pl-k"],[25,37,"pl-s"],[25,26,"pl-pds"],[36,37,"pl-pds"],[48,80,"pl-c"],[48,50,"pl-c"]],[[10,11,"pl-k"],[23,35,"pl-s"],[23,24,"pl-pds"],[34,35,"pl-pds"],[48,74,"pl-c"],[48,50,"pl-c"]],[[10,11,"pl-k"],[26,38,"pl-s"],[26,27,"pl-pds"],[37,38,"pl-pds"],[48,68,"pl-c"],[48,50,"pl-c"]],[[10,11,"pl-k"],[22,34,"pl-s"],[22,23,"pl-pds"],[33,34,"pl-pds"],[36,46,"pl-s"],[36,37,"pl-pds"],[45,46,"pl-pds"],[48,73,"pl-c"],[48,50,"pl-c"]],[[10,11,"pl-k"],[48,74,"pl-c"],[48,50,"pl-c"]],[],[[0,3,"pl-s"]],[],[[0,49,"pl-mh"],[4,49,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,6,"pl-k"],[7,60,"pl-smi"]],[[0,6,"pl-k"],[7,59,"pl-smi"]],[[0,6,"pl-k"],[7,60,"pl-smi"]],[[0,6,"pl-k"],[7,60,"pl-smi"]],[],[[0,20,"pl-smi"],[28,29,"pl-k"],[30,33,"pl-k"],[34,54,"pl-smi"]],[[6,7,"pl-k"],[18,40,"pl-s"],[18,19,"pl-pds"],[39,40,"pl-pds"],[45,90,"pl-c"],[45,47,"pl-c"]],[[6,7,"pl-k"],[16,34,"pl-s"],[16,17,"pl-pds"],[33,34,"pl-pds"]],[[6,7,"pl-k"],[28,35,"pl-c1"]],[],[[0,3,"pl-k"],[5,25,"pl-smi"],[33,34,"pl-k"],[35,38,"pl-k"],[39,59,"pl-smi"]],[[4,23,"pl-smi"],[31,32,"pl-k"],[39,40,"pl-k"],[48,68,"pl-smi"],[68,69,"pl-k"]],[[20,42,"pl-s"],[20,21,"pl-pds"],[41,42,"pl-pds"]],[[24,33,"pl-s"],[24,25,"pl-pds"],[32,33,"pl-pds"],[68,98,"pl-c"],[68,70,"pl-c"]],[[27,28,"pl-k"],[28,29,"pl-k"],[30,36,"pl-smi"],[36,37,"pl-k"],[40,41,"pl-k"],[68,100,"pl-c"],[68,70,"pl-c"]],[],[[4,10,"pl-smi"],[10,11,"pl-k"],[14,15,"pl-k"],[29,30,"pl-k"],[44,45,"pl-k"],[46,52,"pl-s"],[46,47,"pl-pds"],[51,52,"pl-pds"],[53,54,"pl-k"],[61,62,"pl-k"]],[],[[0,3,"pl-s"]],[],[[0,38,"pl-mh"],[4,38,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,3,"pl-k"],[5,25,"pl-smi"],[33,34,"pl-k"],[35,38,"pl-k"],[39,59,"pl-smi"]],[[4,25,"pl-k"],[9,24,"pl-smi"],[34,35,"pl-k"],[42,43,"pl-k"],[55,57,"pl-c1"]],[[4,19,"pl-smi"],[27,28,"pl-k"],[35,36,"pl-k"],[47,55,"pl-s"],[47,48,"pl-pds"],[54,55,"pl-pds"]],[[10,11,"pl-k"],[21,29,"pl-s"],[21,22,"pl-pds"],[28,29,"pl-pds"],[31,39,"pl-s"],[31,32,"pl-pds"],[38,39,"pl-pds"],[41,53,"pl-s"],[41,42,"pl-pds"],[52,53,"pl-pds"],[58,84,"pl-c"],[58,60,"pl-c"]],[[10,11,"pl-k"],[25,33,"pl-s"],[25,26,"pl-pds"],[32,33,"pl-pds"],[35,43,"pl-s"],[35,36,"pl-pds"],[42,43,"pl-pds"],[67,91,"pl-c"],[67,69,"pl-c"]],[[10,11,"pl-k"],[25,33,"pl-s"],[25,26,"pl-pds"],[32,33,"pl-pds"]],[[4,10,"pl-smi"],[15,16,"pl-k"],[23,24,"pl-k"],[32,44,"pl-s"],[32,33,"pl-pds"],[43,44,"pl-pds"],[46,49,"pl-smi"],[49,50,"pl-k"],[53,60,"pl-s"],[53,54,"pl-pds"],[59,60,"pl-pds"],[62,64,"pl-c1"],[68,83,"pl-c"],[68,70,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[[9,10,"pl-s"],[10,20,"pl-c1"],[20,21,"pl-s"]],[[0,1,"pl-s"],[1,10,"pl-c1"],[10,11,"pl-s"],[14,15,"pl-s"],[15,28,"pl-c1"],[28,29,"pl-s"]],[],[[0,1,"pl-s"],[1,35,"pl-c1"],[35,36,"pl-s"],[41,42,"pl-s"],[42,73,"pl-c1"],[73,74,"pl-s"]],[],[[17,18,"pl-s"],[18,30,"pl-c1"],[30,31,"pl-s"],[36,37,"pl-s"],[37,50,"pl-c1"],[50,51,"pl-s"],[57,58,"pl-s"],[58,68,"pl-c1"],[68,69,"pl-s"]],[[23,24,"pl-s"],[24,34,"pl-c1"],[34,35,"pl-s"],[38,39,"pl-s"],[39,53,"pl-c1"],[53,54,"pl-s"]],[[11,12,"pl-s"],[12,26,"pl-c1"],[26,27,"pl-s"]],[],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[15,16,"pl-s"],[16,21,"pl-c1"],[21,22,"pl-s"]],[[0,1,"pl-s"],[1,24,"pl-c1"],[24,25,"pl-s"]],[],[[0,21,"pl-mh"],[3,21,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[0,1,"pl-v"],[65,66,"pl-s"],[66,71,"pl-c1"],[71,72,"pl-s"]],[[38,39,"pl-s"],[39,45,"pl-c1"],[45,46,"pl-s"],[54,55,"pl-s"],[55,74,"pl-c1"],[74,75,"pl-s"]],[[0,1,"pl-v"],[58,59,"pl-s"],[59,72,"pl-c1"],[72,73,"pl-s"]],[],[[0,1,"pl-v"],[15,16,"pl-s"],[16,40,"pl-c1"],[40,41,"pl-s"]],[],[[0,28,"pl-mh"],[3,28,"pl-en"]],[],[[0,1,"pl-ml"],[9,10,"pl-ml"],[15,16,"pl-ml"],[25,26,"pl-ml"],[33,34,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[14,15,"pl-ml"],[21,22,"pl-ml"],[28,29,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,32,"pl-c1"],[32,33,"pl-s"],[34,35,"pl-ml"],[87,88,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,33,"pl-c1"],[33,34,"pl-s"],[35,36,"pl-ml"],[49,50,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-ml"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,33,"pl-c1"],[33,34,"pl-s"],[35,36,"pl-ml"],[49,50,"pl-ml"]],[],[[24,25,"pl-s"],[25,30,"pl-c1"],[30,31,"pl-s"]],[[70,71,"pl-s"],[71,76,"pl-c1"],[76,77,"pl-s"]],[[0,1,"pl-s"],[1,6,"pl-c1"],[6,7,"pl-s"]],[],[],[[0,29,"pl-mh"],[3,29,"pl-en"]],[],[],[],[[19,20,"pl-s"],[47,48,"pl-s"],[48,49,"pl-s"],[49,96,"pl-corl"],[96,97,"pl-s"]]],"colorizedLines":null}},"title":"codex-java-sdk/README.md at feature/1.0.x · easy-4-java/codex-java-sdk","appPayload":{},"meta":{"title":"codex-java-sdk/README.md at feature/1.0.x · easy-4-java/codex-java-sdk"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/easy-4-java/codex-java-sdk" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="SplitPageLayout" data-has-sidebar="true"><div class="prc-PageLayout-SidebarWrapper-kLG4B CopilotSidePanelSidebar-module__SidePanel__L3O0C CopilotSidePanelSidebar-module__HiddenSidePanel__TBRGn" style="--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="end" data-sticky="true" data-responsive-variant="fullscreen"><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-SidebarVerticalDivider-0Rl0V" data-component="PageLayout.VerticalDivider" data-variant="line" data-position="end" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="450" aria-valuemax="768" aria-valuenow="544" aria-valuetext="Pane width 544 pixels" tabindex="0"></div></div><div class="prc-PageLayout-Sidebar-iciWg" data-component="SplitPageLayout.Sidebar" data-resizable="true" style="--spacing:var(--spacing-normal);--pane-min-width:450px;--pane-max-width:768px;--pane-width-custom:544px;--pane-width-size:var(--pane-width-custom);--pane-width:544px"><div class="height-full" data-testid="copilot-code-view-side-panel"><div id="copilot-side-panel-content" class="height-full"></div></div></div></div><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div id="repos-file-tree-sidebar" class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="SplitPageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="SplitPageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" id="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_4lla9lik5_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="feature/1.0.x branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">feature/1.0.x</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/easy-4-java/codex-java-sdk/tree/feature/1.0.x" data-discover="true">codex-java-sdk</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lla9lik5_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_5ipla9lik5_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_5ipla9lik5_ _R_5ipla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_5ipla9lik5H1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_v4pla9lik5_" id="_R_14pla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_v4pla9lik5_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_v4tla9lik5_" id="_R_14tla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_v4tla9lik5_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/easy-4-java/codex-java-sdk/commits/feature/1.0.x/README.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/easy-4-java/codex-java-sdk/commits/feature/1.0.x/README.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_4mlala9lik5_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_4mlala9lik5_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="17.2 KB" style="--truncate-max-width:100%"><span>356 lines (286 loc) · 17.2 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="feature/1.0.x branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">feature/1.0.x</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/easy-4-java/codex-java-sdk/tree/feature/1.0.x" data-discover="true">codex-java-sdk</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lcpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lcpala9lik5_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-pressed="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="17.2 KB" style="--truncate-max-width:100%"><span>356 lines (286 loc) · 17.2 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/easy-4-java/codex-java-sdk/raw/refs/heads/feature/1.0.x/README.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">codex-java-sdk</h1><a id="user-content-codex-java-sdk" class="anchor" aria-label="Permalink: codex-java-sdk" href="#codex-java-sdk"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><a href="/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.md">English</a> | <a href="/easy-4-java/codex-java-sdk/blob/feature/1.0.x/README.zh-CN.md">简体中文</a></p>
<p dir="auto"><a href="https://github.com/easy-4-java/codex-java-sdk"><img src="https://camo.githubusercontent.com/73c8af188f1d95f850ffe7f7dffd6e1d0e9c08e0f140b3ba3d63ffc9c37a1b77/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6176612d32312d6f72616e6765" alt="Java" data-canonical-src="https://img.shields.io/badge/Java-21-orange" style="max-width: 100%;"></a> <a href="https://www.apache.org/licenses/LICENSE-2.0.txt" rel="nofollow"><img src="https://camo.githubusercontent.com/a21a9e0b02a2eaf1910bbf168de84e00ae1eb7b0fde8c5ceec0e7caa61920adf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d677265656e" alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202.0-green" style="max-width: 100%;"></a></p>
<blockquote>
<p dir="auto">Java SDK for the <a href="https://github.com/openai/codex">Codex CLI</a> with two
integration routes: a subprocess wrapper that drives the local <code>codex</code>
agent (exec, interactive sessions, session resume / fork / archive, doctor,
review), and a JSON-RPC 2.0 over WebSocket client for a remote Codex
app-server (<code>thread/start</code> → <code>turn/start</code> → notification stream).</p>
</blockquote>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Table of Contents</h2><a id="user-content-table-of-contents" class="anchor" aria-label="Permalink: Table of Contents" href="#table-of-contents"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><a href="#1-project-overview">1. Project Overview</a></li>
<li><a href="#2-features--status">2. Features &amp; Status</a></li>
<li><a href="#3-requirements--compatibility">3. Requirements &amp; Compatibility</a></li>
<li><a href="#4-architecture--modules">4. Architecture &amp; Modules</a></li>
<li><a href="#5-installation">5. Installation</a></li>
<li><a href="#6-quick-start">6. Quick Start</a></li>
<li><a href="#7-configuration">7. Configuration</a></li>
<li><a href="#8-core-usage--api">8. Core Usage / API</a></li>
<li><a href="#9-testing--build">9. Testing &amp; Build</a></li>
<li><a href="#10-versioning--branches">10. Versioning &amp; Branches</a></li>
<li><a href="#11-contributing--license">11. Contributing &amp; License</a></li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">1. Project Overview</h2><a id="user-content-1-project-overview" class="anchor" aria-label="Permalink: 1. Project Overview" href="#1-project-overview"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><code>codex-java-sdk</code> lets Java applications integrate the
<a href="https://github.com/openai/codex">Codex CLI</a> agent (<code>codex</code>) through two
routes. Neither route is a direct OpenAI API client.</p>
<ul dir="auto">
<li><strong>CLI route (local subprocess)</strong> — every call maps to a real <code>codex</code>
command line invocation.</li>
<li><strong>App-server route (remote long connection)</strong> — a JSON-RPC 2.0 over
WebSocket client for a running Codex app-server.</li>
</ul>
<p dir="auto">The SDK covers:</p>
<ul dir="auto">
<li><strong>Exec mode</strong> — <code>codex exec &lt;prompt&gt;</code> with model, sandbox, JSONL output, web
search, output files, output schema, images, config overrides and ephemeral runs.</li>
<li><strong>Interactive sessions</strong> — <code>codex [prompt]</code> and full session lifecycle:
<code>resume</code> / <code>resumeLast</code> / <code>fork</code> / <code>archive</code> / <code>unarchive</code>.</li>
<li><strong>Parsed models</strong> — <code>CodexEvent</code> (JSONL events), <code>CodexSession</code>, <code>CodexDoctorReport</code>.</li>
<li><strong>Utilities</strong> — <code>doctor</code>, <code>review</code>, <code>login</code> / <code>logout</code>, MCP management, <code>update</code>,
<code>features</code>, shell <code>completion</code>.</li>
<li><strong>App-server WebSocket route</strong> — <code>CodexAppServerClient</code> with per-turn
connections, <code>thread/start</code> / <code>thread/resume</code> reuse via a bounded
<code>sessionKey → threadId</code> LRU, streaming agent-message deltas and
<code>turn/completed</code> finalization.</li>
</ul>
<p dir="auto">What it is <strong>not</strong>:</p>
<ul dir="auto">
<li>Not an OpenAI API client (no direct HTTP calls to the OpenAI API).</li>
<li>Not a replacement for the <code>codex</code> binary — the CLI must be installed and runnable
(local route), or a Codex app-server must be reachable (WebSocket route).</li>
</ul>
<p dir="auto">Typical scenarios:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Scenario</th>
<th align="left">What you use</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">One-shot coding task</td>
<td align="left"><code>CodexClient.exec(prompt)</code></td>
</tr>
<tr>
<td align="left">Machine-readable event stream</td>
<td align="left"><code>execAndParse(prompt)</code> → <code>List&lt;CodexEvent&gt;</code></td>
</tr>
<tr>
<td align="left">Long-running interactive agent</td>
<td align="left"><code>startSession(prompt)</code> / <code>resumeSession(sessionId)</code></td>
</tr>
<tr>
<td align="left">Reproduce a session in a sandbox</td>
<td align="left"><code>forkSession(sessionId)</code> / <code>execResume(sessionId, prompt)</code></td>
</tr>
<tr>
<td align="left">Environment diagnostics</td>
<td align="left"><code>doctorSummary()</code> / <code>doctorJson()</code></td>
</tr>
<tr>
<td align="left">Remote agent with session continuity</td>
<td align="left"><code>CodexAppServerClient.runTurn(request)</code> with <code>sessionKey</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">2. Features &amp; Status</h2><a id="user-content-2-features--status" class="anchor" aria-label="Permalink: 2. Features &amp; Status" href="#2-features--status"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Capability</th>
<th align="left">Status</th>
<th align="left">Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>codex exec</code> non-interactive mode</td>
<td align="left">Active development</td>
<td align="left"><code>exec</code>, <code>exec(model)</code>, <code>exec(ExecOptions)</code></td>
</tr>
<tr>
<td align="left">Exec variants</td>
<td align="left">Active development</td>
<td align="left"><code>execInDir</code>, <code>execEphemeral</code>, <code>execWithSearch</code>, <code>execToFile</code>, <code>execWithSchema</code>, <code>execWithImage</code>, <code>execWithConfigOverrides</code>, <code>execDangerously</code>, <code>execBypassHookTrust</code>, <code>execWithEnable</code> / <code>execWithDisable</code></td>
</tr>
<tr>
<td align="left">JSONL event parsing</td>
<td align="left">Active development</td>
<td align="left"><code>execAndParse(prompt)</code> → <code>List&lt;CodexEvent&gt;</code></td>
</tr>
<tr>
<td align="left">Interactive sessions</td>
<td align="left">Active development</td>
<td align="left"><code>startSession()</code>, <code>startSession(prompt)</code>, <code>startSession(GlobalOptions, prompt)</code></td>
</tr>
<tr>
<td align="left">Session lifecycle</td>
<td align="left">Active development</td>
<td align="left"><code>resumeSession</code>, <code>resumeLastSession</code>, <code>forkSession</code>, <code>forkLastSession</code>, <code>archiveSession</code>, <code>unarchiveSession</code>, <code>execResume</code></td>
</tr>
<tr>
<td align="left">Doctor &amp; review</td>
<td align="left">Active development</td>
<td align="left"><code>doctor</code>, <code>doctorJson</code>, <code>doctorSummary</code>, <code>review</code>, <code>reviewCommit</code>, <code>reviewBase</code></td>
</tr>
<tr>
<td align="left">Auth / MCP / misc</td>
<td align="left">Active development</td>
<td align="left"><code>login</code>, <code>loginWithApiKey</code>, <code>loginWithAccessToken</code>, <code>loginDeviceAuth</code>, <code>loginStatus</code>, <code>logout</code>, <code>mcpList</code> / <code>mcpAdd</code> / <code>mcpGet</code> / <code>mcpRemove</code> / <code>mcpLogin</code> / <code>mcpLogout</code>, <code>update</code>, <code>features</code>, <code>completion</code>, <code>app</code></td>
</tr>
<tr>
<td align="left">Session admin</td>
<td align="left">Active development</td>
<td align="left"><code>archiveSession</code>, <code>unarchiveSession</code>, <code>queue</code>, <code>deleteSession</code>, <code>deleteSessionForce</code>, <code>agents</code>, <code>migrateRollouts</code></td>
</tr>
<tr>
<td align="left">App-server WebSocket route</td>
<td align="left">Active development</td>
<td align="left"><code>CodexAppServerClient.runTurn</code> / <code>runTurnAsync</code>, <code>thread/start</code> / <code>thread/resume</code>, agent-message deltas, <code>sessionKey → threadId</code> LRU (1000)</td>
</tr>
<tr>
<td align="left">App-server protocol surface</td>
<td align="left">Active development</td>
<td align="left"><code>thread/list</code> / <code>read</code> / <code>fork</code> / <code>archive</code> / <code>unarchive</code> / <code>delete</code>, <code>turn/interrupt</code> / <code>turn/steer</code>, <code>model/list</code>-style escape hatch <code>execRpc</code>; <code>turnId</code> exposed via <code>onTurnStarted</code> + <code>AppServerTurnResult</code></td>
</tr>
<tr>
<td align="left">CLI typed additions</td>
<td align="left">Active development</td>
<td align="left"><code>debugModels(Bundled)</code> / <code>debugPromptInput</code>, <code>mcpAddUrl(WithBearer)</code>, <code>pluginAdd/List/Remove</code> + <code>pluginMarketplace*</code>, <code>cloudExec</code> / <code>cloudList</code>, <code>featuresEnable/Disable/List</code>, <code>reviewPrompt</code></td>
</tr>
<tr>
<td align="left">Config model</td>
<td align="left">Active development</td>
<td align="left"><code>CodexClientConfig</code> POJO (plain, Spring-bindable), <code>CodexAppServerConfig</code> POJO</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<blockquote>
<p dir="auto"><strong>Note</strong>: <code>codex mcp-server</code> was removed upstream — <code>CodexClient.mcpServer()</code>
is deprecated in favour of <code>appServer(...)</code>. <code>ExecOptions</code> additionally
supports <code>--ignore-rules</code> / <code>--ignore-user-config</code>, and <code>GlobalOptions</code>
supports <code>--remote</code> / <code>--remote-auth-token-env</code> for daemon-backed TUI runs.</p>
</blockquote>
<blockquote>
<p dir="auto"><strong>Assumption</strong>: the capability statuses above reflect the current state of
the active branch; the module is under active development.</p>
</blockquote>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">3. Requirements &amp; Compatibility</h2><a id="user-content-3-requirements--compatibility" class="anchor" aria-label="Permalink: 3. Requirements &amp; Compatibility" href="#3-requirements--compatibility"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Requirement</th>
<th align="left">Version / Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">JDK</td>
<td align="left">21+</td>
</tr>
<tr>
<td align="left">Maven</td>
<td align="left">3.0+ (enforced; Maven Wrapper <code>./mvnw</code> included)</td>
</tr>
<tr>
<td align="left">Codex CLI</td>
<td align="left">Local route: <code>codex</code> must be installed and available (<code>localExecutable</code> configures the path)</td>
</tr>
<tr>
<td align="left">Codex app-server</td>
<td align="left">WebSocket route only: a reachable app-server (<code>baseUrl</code> accepts ws/wss/http/https)</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<blockquote>
<p dir="auto"><strong>Note</strong>: the app-server WebSocket route uses the JDK built-in
<code>java.net.http.HttpClient</code> (JDK 11+). It is available on the <code>feature/2.0.x</code>
and <code>feature/3.0.x</code> lines; the <code>feature/1.0.x</code> (JDK 8) line ships the CLI
route only.</p>
</blockquote>
<p dir="auto">Version lines:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Branch</th>
<th align="left">JDK</th>
<th align="left">Version</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>feature/1.0.x</code></td>
<td align="left">8</td>
<td align="left"><code>1.0.x.*</code></td>
</tr>
<tr>
<td align="left"><code>feature/2.0.x</code></td>
<td align="left">17</td>
<td align="left"><code>2.0.x.*</code></td>
</tr>
<tr>
<td align="left"><code>feature/3.0.x</code></td>
<td align="left">21</td>
<td align="left"><code>3.0.x.*</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">4. Architecture &amp; Modules</h2><a id="user-content-4-architecture--modules" class="anchor" aria-label="Permalink: 4. Architecture &amp; Modules" href="#4-architecture--modules"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="+------------------+   +---------------------------------------------+
| Java application |   | codex-java-sdk                               |
|                  |--&gt;|  Route 1 (local): CodexClient (facade)       |
| prompt / options |   |    | CodexCli (command mapping)             |
|                  |   |    |   | CodexCliExecutor                   |
|                  |   |    |   |   `codex` child process            |
|                  |   |    |   CodexCliResult                       |
|                  |   |  Route 2 (remote): CodexAppServerClient      |
|                  |   |    | JSON-RPC 2.0 over WebSocket            |
|                  |   |    | thread/start -&gt; turn/start -&gt; events   |
|                  |   | CodexEvent/CodexSession/CodexDoctorReport    |
+------------------+   +-------------------+-------------------------+
                                           |
                                           v
                     +-------------------------------------------+
                     | Local `codex` CLI (route 1) or remote     |
                     | Codex app-server (route 2)                |
                     +-------------------------------------------+"><pre lang="text" class="notranslate"><code>+------------------+   +---------------------------------------------+
| Java application |   | codex-java-sdk                               |
|                  |--&gt;|  Route 1 (local): CodexClient (facade)       |
| prompt / options |   |    | CodexCli (command mapping)             |
|                  |   |    |   | CodexCliExecutor                   |
|                  |   |    |   |   `codex` child process            |
|                  |   |    |   CodexCliResult                       |
|                  |   |  Route 2 (remote): CodexAppServerClient      |
|                  |   |    | JSON-RPC 2.0 over WebSocket            |
|                  |   |    | thread/start -&gt; turn/start -&gt; events   |
|                  |   | CodexEvent/CodexSession/CodexDoctorReport    |
+------------------+   +-------------------+-------------------------+
                                           |
                                           v
                     +-------------------------------------------+
                     | Local `codex` CLI (route 1) or remote     |
                     | Codex app-server (route 2)                |
                     +-------------------------------------------+
</code></pre></div>
<p dir="auto">Single-module Maven project (<code>packaging: jar</code>). No child modules.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Artifact</th>
<th align="left">Responsibility</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>io.github.easy4j:codex-java-sdk</code></td>
<td align="left">CLI facade, command mapping, subprocess executor, WebSocket app-server client, results &amp; parsed models</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Key packages:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Package</th>
<th align="left">Contents</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>io.github.easy4j.codex</code></td>
<td align="left"><code>CodexClient</code>, <code>CodexClientConfig</code></td>
</tr>
<tr>
<td align="left"><code>io.github.easy4j.codex.cli</code></td>
<td align="left"><code>CodexCli</code>, <code>CodexCliExecutor</code>, <code>CodexCliResult</code></td>
</tr>
<tr>
<td align="left"><code>io.github.easy4j.codex.appserver</code></td>
<td align="left"><code>CodexAppServerClient</code>, <code>CodexAppServerConfig</code>, <code>AppServerTurnRequest</code>, <code>AppServerTurnResult</code>, <code>ThreadMappingCache</code>, <code>CodexAppServerException</code></td>
</tr>
<tr>
<td align="left"><code>io.github.easy4j.codex.model</code></td>
<td align="left"><code>CodexEvent</code>, <code>CodexSession</code>, <code>CodexDoctorReport</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">5. Installation</h2><a id="user-content-5-installation" class="anchor" aria-label="Permalink: 5. Installation" href="#5-installation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The project is <strong>not yet published to Maven Central</strong>. Snapshots/releases are
distributed through the Aliyun Maven repository and GitHub Releases.</p>
<p dir="auto">Maven:</p>
<div class="highlight highlight-text-xml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="&lt;dependency&gt;
    &lt;groupId&gt;io.github.easy4j&lt;/groupId&gt;
    &lt;artifactId&gt;codex-java-sdk&lt;/artifactId&gt;
    &lt;version&gt;3.0.x.x.20260630-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;"><pre>&lt;<span class="pl-ent">dependency</span>&gt;
    &lt;<span class="pl-ent">groupId</span>&gt;io.github.easy4j&lt;/<span class="pl-ent">groupId</span>&gt;
    &lt;<span class="pl-ent">artifactId</span>&gt;codex-java-sdk&lt;/<span class="pl-ent">artifactId</span>&gt;
    &lt;<span class="pl-ent">version</span>&gt;3.0.x.x.20260630-SNAPSHOT&lt;/<span class="pl-ent">version</span>&gt;
&lt;/<span class="pl-ent">dependency</span>&gt;</pre></div>
<p dir="auto">Gradle:</p>
<div class="highlight highlight-source-groovy notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="implementation 'io.github.easy4j:codex-java-sdk:3.0.x.x.20260630-SNAPSHOT'"><pre>implementation <span class="pl-s"><span class="pl-pds">'</span>io.github.easy4j:codex-java-sdk:3.0.x.x.20260630-SNAPSHOT<span class="pl-pds">'</span></span></pre></div>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">6. Quick Start</h2><a id="user-content-6-quick-start" class="anchor" aria-label="Permalink: 6. Quick Start" href="#6-quick-start"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import io.github.easy4j.codex.CodexClient;
import io.github.easy4j.codex.CodexClientConfig;
import io.github.easy4j.codex.cli.CodexCliResult;

public class CodexDemo {

    public static void main(String[] args) {
        CodexClientConfig config = new CodexClientConfig();
        config.setLocalExecutable(&quot;codex&quot;);   // or an absolute path
        config.setLocalTimeoutSeconds(600);

        try (CodexClient client = new CodexClient(config)) {
            CodexCliResult result = client.exec(&quot;Write a Java hello world&quot;);
            System.out.println(&quot;exit=&quot; + result.getExitCode());
            System.out.println(result.getStdout());
        }
    }
}"><pre><span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">CodexClient</span>;
<span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">CodexClientConfig</span>;
<span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">cli</span>.<span class="pl-s1">CodexCliResult</span>;

<span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">CodexDemo</span> {

    <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">void</span> <span class="pl-en">main</span>(<span class="pl-smi">String</span>[] <span class="pl-s1">args</span>) {
        <span class="pl-smi">CodexClientConfig</span> <span class="pl-s1">config</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexClientConfig</span>();
        <span class="pl-s1">config</span>.<span class="pl-en">setLocalExecutable</span>(<span class="pl-s">"codex"</span>);   <span class="pl-c">// or an absolute path</span>
        <span class="pl-s1">config</span>.<span class="pl-en">setLocalTimeoutSeconds</span>(<span class="pl-c1">600</span>);

        <span class="pl-k">try</span> (<span class="pl-smi">CodexClient</span> <span class="pl-s1">client</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexClient</span>(<span class="pl-s1">config</span>)) {
            <span class="pl-smi">CodexCliResult</span> <span class="pl-s1">result</span> = <span class="pl-s1">client</span>.<span class="pl-en">exec</span>(<span class="pl-s">"Write a Java hello world"</span>);
            <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">"exit="</span> + <span class="pl-s1">result</span>.<span class="pl-en">getExitCode</span>());
            <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s1">result</span>.<span class="pl-en">getStdout</span>());
        }
    }
}</pre></div>
<p dir="auto">Expected result: <code>codex exec "Write a Java hello world"</code> runs locally;
<code>result.getExitCode()</code> is <code>0</code> on success and <code>result.getStdout()</code> contains the
agent's answer.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">7. Configuration</h2><a id="user-content-7-configuration" class="anchor" aria-label="Permalink: 7. Configuration" href="#7-configuration"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><code>CodexClientConfig</code> is a plain POJO (Spring <code>@ConfigurationProperties</code>-bindable).
There is no configuration file of its own. Key fields:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="left">Default</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>localExecutable</code></td>
<td align="left">String</td>
<td align="left"><code>codex</code></td>
<td align="left">CLI executable name or absolute path</td>
</tr>
<tr>
<td align="left"><code>localTimeoutSeconds</code></td>
<td align="left">int</td>
<td align="left"><code>600</code></td>
<td align="left">Command execution timeout (seconds)</td>
</tr>
<tr>
<td align="left"><code>localProbeTimeoutSeconds</code></td>
<td align="left">int</td>
<td align="left"><code>5</code></td>
<td align="left">Timeout for the CLI availability probe</td>
</tr>
<tr>
<td align="left"><code>defaultModel</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Default model</td>
</tr>
<tr>
<td align="left"><code>defaultSandbox</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Sandbox mode (<code>read-only</code>, <code>workspace-write</code>, <code>danger-full-access</code>)</td>
</tr>
<tr>
<td align="left"><code>defaultApprovalPolicy</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Approval policy (<code>untrusted</code>, <code>on-request</code>, <code>never</code>)</td>
</tr>
<tr>
<td align="left"><code>defaultProfile</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Default config profile</td>
</tr>
<tr>
<td align="left"><code>ossProvider</code> / <code>localProvider</code></td>
<td align="left">boolean / String</td>
<td align="left">-</td>
<td align="left">OSS provider / local provider (<code>lmstudio</code>, <code>ollama</code>)</td>
</tr>
<tr>
<td align="left"><code>skipGitRepoCheck</code></td>
<td align="left">boolean</td>
<td align="left"><code>false</code></td>
<td align="left">Skip git repo checks</td>
</tr>
<tr>
<td align="left"><code>ephemeral</code></td>
<td align="left">boolean</td>
<td align="left"><code>false</code></td>
<td align="left">Ephemeral session (no persistence)</td>
</tr>
<tr>
<td align="left"><code>jsonOutput</code></td>
<td align="left">boolean</td>
<td align="left"><code>true</code></td>
<td align="left">JSONL output</td>
</tr>
<tr>
<td align="left"><code>outputSchema</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Output schema file path</td>
</tr>
<tr>
<td align="left"><code>search</code></td>
<td align="left">boolean</td>
<td align="left"><code>false</code></td>
<td align="left">Enable web search</td>
</tr>
<tr>
<td align="left"><code>image</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Image file path</td>
</tr>
<tr>
<td align="left"><code>configOverrides</code></td>
<td align="left">String[]</td>
<td align="left">-</td>
<td align="left">Config overrides (<code>-c key=value</code>)</td>
</tr>
<tr>
<td align="left"><code>outputFile</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Output file path (<code>output-last-message</code>)</td>
</tr>
<tr>
<td align="left"><code>workingDir</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Working directory</td>
</tr>
<tr>
<td align="left"><code>dangerouslyBypassApprovalsAndSandbox</code></td>
<td align="left">boolean</td>
<td align="left"><code>false</code></td>
<td align="left">Skip all approvals and sandbox (dangerous)</td>
</tr>
<tr>
<td align="left"><code>dangerouslyBypassHookTrust</code></td>
<td align="left">boolean</td>
<td align="left"><code>false</code></td>
<td align="left">Skip hook trust checks</td>
</tr>
<tr>
<td align="left"><code>strictConfig</code></td>
<td align="left">boolean</td>
<td align="left"><code>false</code></td>
<td align="left">Fail on unknown config fields</td>
</tr>
<tr>
<td align="left"><code>enable</code> / <code>disable</code></td>
<td align="left">String[]</td>
<td align="left">-</td>
<td align="left">Features to enable / disable</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">7.1 <code>CodexAppServerConfig</code> (app-server WebSocket route)</h3><a id="user-content-71-codexappserverconfig-app-server-websocket-route" class="anchor" aria-label="Permalink: 7.1 CodexAppServerConfig (app-server WebSocket route)" href="#71-codexappserverconfig-app-server-websocket-route"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<blockquote>
<p dir="auto"><strong>Upgrade notes (3.0.x.x.20260630+)</strong>: CLI-route arguments are now passed
to the child process raw — multi-word prompts no longer arrive at <code>codex</code>
wrapped in embedded literal quotes. Non-zero CLI exits now preserve the real
exit code and both captured streams instead of collapsing to <code>exitCode=-1</code>
with empty output. A bearer token over a plaintext <code>ws://</code> connection logs a
warning; prefer <code>wss://</code>.</p>
</blockquote>
<p dir="auto">Plain POJO (Spring <code>@ConfigurationProperties</code>-bindable). Field names mirror the
commonly used <code>CodexEndpoint</code> binding:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Field</th>
<th align="left">Type</th>
<th align="left">Default</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>baseUrl</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">App-server base URL (<code>ws://</code>/<code>wss://</code> as-is, <code>http://</code>/<code>https://</code> upgraded)</td>
</tr>
<tr>
<td align="left"><code>token</code></td>
<td align="left">String</td>
<td align="left">-</td>
<td align="left">Bearer token sent as <code>Authorization: Bearer &lt;token&gt;</code> on the handshake</td>
</tr>
<tr>
<td align="left"><code>connectTimeoutMillis</code></td>
<td align="left">int</td>
<td align="left"><code>5000</code></td>
<td align="left">TCP/TLS + WebSocket handshake timeout</td>
</tr>
<tr>
<td align="left"><code>readTimeoutMillis</code></td>
<td align="left">int</td>
<td align="left"><code>120000</code></td>
<td align="left">Upper bound for a whole turn (connect → <code>turn/completed</code>)</td>
</tr>
<tr>
<td align="left"><code>maxSessionMappings</code></td>
<td align="left">int</td>
<td align="left"><code>1000</code></td>
<td align="left">Bound of the <code>sessionKey → threadId</code> LRU; evicted sessions start fresh threads</td>
</tr>
<tr>
<td align="left"><code>maxFrameChars</code></td>
<td align="left">int</td>
<td align="left"><code>1048576</code></td>
<td align="left">Frame accumulation hard cap; oversized server frames fail the turn (<code>&lt;= 0</code> = unbounded)</td>
</tr>
<tr>
<td align="left"><code>maxContentChars</code></td>
<td align="left">int</td>
<td align="left"><code>1048576</code></td>
<td align="left">Per-turn agent-message content cap; excess is truncated with a warning (<code>&lt;= 0</code> = unbounded)</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">8. Core Usage / API</h2><a id="user-content-8-core-usage--api" class="anchor" aria-label="Permalink: 8. Core Usage / API" href="#8-core-usage--api"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">8.1 JSONL events</h3><a id="user-content-81-jsonl-events" class="anchor" aria-label="Permalink: 8.1 JSONL events" href="#81-jsonl-events"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="try (CodexClient client = new CodexClient(config)) {
    // codex exec --json &lt;prompt&gt;, parsed into typed events
    List&lt;CodexEvent&gt; events = client.execAndParse(&quot;Fix the failing test&quot;);
    events.forEach(event -&gt; System.out.println(event.getType() + &quot; -&gt; &quot; + event.getMessage()));
}"><pre><span class="pl-k">try</span> (<span class="pl-smi">CodexClient</span> <span class="pl-s1">client</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexClient</span>(<span class="pl-s1">config</span>)) {
    <span class="pl-c">// codex exec --json &lt;prompt&gt;, parsed into typed events</span>
    <span class="pl-smi">List</span>&lt;<span class="pl-smi">CodexEvent</span>&gt; <span class="pl-s1">events</span> = <span class="pl-s1">client</span>.<span class="pl-en">execAndParse</span>(<span class="pl-s">"Fix the failing test"</span>);
    <span class="pl-s1">events</span>.<span class="pl-en">forEach</span>(<span class="pl-s1">event</span> -&gt; <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s1">event</span>.<span class="pl-en">getType</span>() + <span class="pl-s">" -&gt; "</span> + <span class="pl-s1">event</span>.<span class="pl-en">getMessage</span>()));
}</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">8.2 Session lifecycle</h3><a id="user-content-82-session-lifecycle" class="anchor" aria-label="Permalink: 8.2 Session lifecycle" href="#82-session-lifecycle"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="try (CodexClient client = new CodexClient(config)) {
    client.exec(&quot;first task&quot;);                  // creates a persisted session
    client.resumeSession(&quot;session-id&quot;);         // resume an interactive session
    client.forkSession(&quot;session-id&quot;);           // fork into a new session
    client.archiveSession(&quot;session-id&quot;);        // archive a session
    client.execResume(&quot;session-id&quot;, &quot;continue&quot;);// non-interactive resume
    client.doctorSummary();                     // environment diagnostics
}"><pre><span class="pl-k">try</span> (<span class="pl-smi">CodexClient</span> <span class="pl-s1">client</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexClient</span>(<span class="pl-s1">config</span>)) {
    <span class="pl-s1">client</span>.<span class="pl-en">exec</span>(<span class="pl-s">"first task"</span>);                  <span class="pl-c">// creates a persisted session</span>
    <span class="pl-s1">client</span>.<span class="pl-en">resumeSession</span>(<span class="pl-s">"session-id"</span>);         <span class="pl-c">// resume an interactive session</span>
    <span class="pl-s1">client</span>.<span class="pl-en">forkSession</span>(<span class="pl-s">"session-id"</span>);           <span class="pl-c">// fork into a new session</span>
    <span class="pl-s1">client</span>.<span class="pl-en">archiveSession</span>(<span class="pl-s">"session-id"</span>);        <span class="pl-c">// archive a session</span>
    <span class="pl-s1">client</span>.<span class="pl-en">execResume</span>(<span class="pl-s">"session-id"</span>, <span class="pl-s">"continue"</span>);<span class="pl-c">// non-interactive resume</span>
    <span class="pl-s1">client</span>.<span class="pl-en">doctorSummary</span>();                     <span class="pl-c">// environment diagnostics</span>
}</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">8.3 App-server WebSocket route (remote Codex)</h3><a id="user-content-83-app-server-websocket-route-remote-codex" class="anchor" aria-label="Permalink: 8.3 App-server WebSocket route (remote Codex)" href="#83-app-server-websocket-route-remote-codex"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import io.github.easy4j.codex.appserver.AppServerTurnRequest;
import io.github.easy4j.codex.appserver.AppServerTurnResult;
import io.github.easy4j.codex.appserver.CodexAppServerClient;
import io.github.easy4j.codex.appserver.CodexAppServerConfig;

CodexAppServerConfig config = new CodexAppServerConfig();
config.setBaseUrl(&quot;ws://codex-host:8081&quot;);   // http(s) is upgraded to ws(s) automatically
config.setToken(&quot;capability-token&quot;);
config.setReadTimeoutMillis(120_000);

try (CodexAppServerClient client = new CodexAppServerClient(config)) {
    AppServerTurnResult result = client.runTurn(AppServerTurnRequest.builder()
            .prompt(&quot;Fix the failing test&quot;)
            .sessionKey(&quot;chat-42&quot;)                                  // enables thread/resume reuse
            .onDelta(delta -&gt; System.out.print(delta))              // agentMessage deltas, in order
            .build());
    System.out.println(result.getThreadId() + &quot; -&gt; &quot; + result.getContent());
}"><pre><span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">appserver</span>.<span class="pl-s1">AppServerTurnRequest</span>;
<span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">appserver</span>.<span class="pl-s1">AppServerTurnResult</span>;
<span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">appserver</span>.<span class="pl-s1">CodexAppServerClient</span>;
<span class="pl-k">import</span> <span class="pl-s1">io</span>.<span class="pl-s1">github</span>.<span class="pl-s1">easy4j</span>.<span class="pl-s1">codex</span>.<span class="pl-s1">appserver</span>.<span class="pl-s1">CodexAppServerConfig</span>;

<span class="pl-smi">CodexAppServerConfig</span> <span class="pl-s1">config</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexAppServerConfig</span>();
<span class="pl-s1">config</span>.<span class="pl-en">setBaseUrl</span>(<span class="pl-s">"ws://codex-host:8081"</span>);   <span class="pl-c">// http(s) is upgraded to ws(s) automatically</span>
<span class="pl-s1">config</span>.<span class="pl-en">setToken</span>(<span class="pl-s">"capability-token"</span>);
<span class="pl-s1">config</span>.<span class="pl-en">setReadTimeoutMillis</span>(<span class="pl-c1">120_000</span>);

<span class="pl-k">try</span> (<span class="pl-smi">CodexAppServerClient</span> <span class="pl-s1">client</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexAppServerClient</span>(<span class="pl-s1">config</span>)) {
    <span class="pl-smi">AppServerTurnResult</span> <span class="pl-s1">result</span> = <span class="pl-s1">client</span>.<span class="pl-en">runTurn</span>(<span class="pl-smi">AppServerTurnRequest</span>.<span class="pl-en">builder</span>()
            .<span class="pl-en">prompt</span>(<span class="pl-s">"Fix the failing test"</span>)
            .<span class="pl-en">sessionKey</span>(<span class="pl-s">"chat-42"</span>)                                  <span class="pl-c">// enables thread/resume reuse</span>
            .<span class="pl-en">onDelta</span>(<span class="pl-s1">delta</span> -&gt; <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">print</span>(<span class="pl-s1">delta</span>))              <span class="pl-c">// agentMessage deltas, in order</span>
            .<span class="pl-en">build</span>());
    <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s1">result</span>.<span class="pl-en">getThreadId</span>() + <span class="pl-s">" -&gt; "</span> + <span class="pl-s1">result</span>.<span class="pl-en">getContent</span>());
}</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">8.4 App-server protocol operations</h3><a id="user-content-84-app-server-protocol-operations" class="anchor" aria-label="Permalink: 8.4 App-server protocol operations" href="#84-app-server-protocol-operations"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="try (CodexAppServerClient client = new CodexAppServerClient(config)) {
    List&lt;AppServerThread&gt; threads = client.listThreads(20);
    AppServerThread forked = client.forkThread(&quot;th_123&quot;);
    client.steerTurn(&quot;th_123&quot;, &quot;turn_9&quot;, &quot;也检查一下测试覆盖率&quot;);   // redirect a running turn
    client.interruptTurn(&quot;th_123&quot;, &quot;turn_9&quot;);                      // cancel a running turn
    client.archiveThread(&quot;th_123&quot;);
    String raw = client.execRpc(&quot;model/list&quot;, Map.of(&quot;limit&quot;, 10)); // escape hatch
}"><pre><span class="pl-k">try</span> (<span class="pl-smi">CodexAppServerClient</span> <span class="pl-s1">client</span> = <span class="pl-k">new</span> <span class="pl-smi">CodexAppServerClient</span>(<span class="pl-s1">config</span>)) {
    <span class="pl-smi">List</span>&lt;<span class="pl-smi">AppServerThread</span>&gt; <span class="pl-s1">threads</span> = <span class="pl-s1">client</span>.<span class="pl-en">listThreads</span>(<span class="pl-c1">20</span>);
    <span class="pl-smi">AppServerThread</span> <span class="pl-s1">forked</span> = <span class="pl-s1">client</span>.<span class="pl-en">forkThread</span>(<span class="pl-s">"th_123"</span>);
    <span class="pl-s1">client</span>.<span class="pl-en">steerTurn</span>(<span class="pl-s">"th_123"</span>, <span class="pl-s">"turn_9"</span>, <span class="pl-s">"也检查一下测试覆盖率"</span>);   <span class="pl-c">// redirect a running turn</span>
    <span class="pl-s1">client</span>.<span class="pl-en">interruptTurn</span>(<span class="pl-s">"th_123"</span>, <span class="pl-s">"turn_9"</span>);                      <span class="pl-c">// cancel a running turn</span>
    <span class="pl-s1">client</span>.<span class="pl-en">archiveThread</span>(<span class="pl-s">"th_123"</span>);
    <span class="pl-smi">String</span> <span class="pl-s1">raw</span> = <span class="pl-s1">client</span>.<span class="pl-en">execRpc</span>(<span class="pl-s">"model/list"</span>, <span class="pl-smi">Map</span>.<span class="pl-en">of</span>(<span class="pl-s">"limit"</span>, <span class="pl-c1">10</span>)); <span class="pl-c">// escape hatch</span>
}</pre></div>
<p dir="auto">Lifecycle calls run over a short-lived connection with the documented
tolerant <code>initialize</code> handshake; thread state is server-side, so
<code>steerTurn</code> / <code>interruptTurn</code> work while the original turn connection is
still streaming. Running turns expose their id via
<code>AppServerTurnRequest.onTurnStarted</code> and <code>AppServerTurnResult.getTurnId()</code>.</p>
<p dir="auto">The turn maps to <code>thread/start</code> (or <code>thread/resume</code> when <code>sessionKey</code> already
maps to a thread id) → <code>turn/start</code> → <code>item/completed</code> (only agent messages
surface) → <code>turn/completed</code>. Unknown notifications are logged at debug level
and never interrupt the turn. Failures — connection, JSON-RPC error,
<code>turn/failed</code>, <code>error</code>, premature close or read timeout — surface as
<code>CodexAppServerException</code>.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">9. Testing &amp; Build</h2><a id="user-content-9-testing--build" class="anchor" aria-label="Permalink: 9. Testing &amp; Build" href="#9-testing--build"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="./mvnw clean verify"><pre>./mvnw clean verify</pre></div>
<ul dir="auto">
<li>The build is configured with the JaCoCo Maven plugin (report + <code>check</code> goal with a
90% line-coverage rule bound to the <code>verify</code> phase; <code>haltOnFailure=false</code>).</li>
<li>The active branch ships a full test suite (206 tests on <code>feature/3.0.x</code>), including
end-to-end WebSocket contract tests against an in-process fake app-server.</li>
<li>CI workflow: <code>.github/workflows/ci.yml</code>.</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">10. Versioning &amp; Branches</h2><a id="user-content-10-versioning--branches" class="anchor" aria-label="Permalink: 10. Versioning &amp; Branches" href="#10-versioning--branches"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th align="left">Branch</th>
<th align="left">JDK</th>
<th align="left">Version</th>
<th align="left">Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>feature/1.0.x</code></td>
<td align="left">8</td>
<td align="left"><code>1.0.x.*</code></td>
<td align="left">Current branch, JDK 8 baseline, active development</td>
</tr>
<tr>
<td align="left"><code>feature/2.0.x</code></td>
<td align="left">17</td>
<td align="left"><code>2.0.x.*</code></td>
<td align="left">JDK 17 line</td>
</tr>
<tr>
<td align="left"><code>feature/3.0.x</code></td>
<td align="left">21</td>
<td align="left"><code>3.0.x.*</code></td>
<td align="left">JDK 21 line</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Maintenance policy: the <code>1.0.x</code> line receives bug fixes and compatibility updates
for the JDK 8 baseline. New features targeting newer JDKs land on the <code>2.0.x</code> /
<code>3.0.x</code> lines. Releases are published to the Aliyun Maven repository and as
GitHub Releases; the project is not yet published to Maven Central.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">11. Contributing &amp; License</h2><a id="user-content-11-contributing--license" class="anchor" aria-label="Permalink: 11. Contributing &amp; License" href="#11-contributing--license"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Contributions are welcome — please open issues or pull requests on GitHub.</p>
<p dir="auto">Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0.txt" rel="nofollow">Apache License, Version 2.0</a>.</p>
</article></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer f6 color-fg-muted color-border-subtle tmp-pt-7 tmp-pb-6 p-responsive" role="contentinfo"  >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>


            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
            </li>

            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
            </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          
<li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
      Manage cookies
    </button>
  </cookie-consent-link>
</li>

  <li class="mx-2">
    <cookie-consent-link>
      <button
        type="button"
        class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
        data-action="click:cookie-consent-link#showConsentManagement"
        data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
      >
        Do not share my personal information
      </button>
    </cookie-consent-link>
  </li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="true"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

